X-Git-Url: https://git.cameronkatri.com/mandoc.git/blobdiff_plain/112069844468772da75bff132e76dc021a0d51cc..dc0bf00a26ef3d7cd4b3df5bc0cb9f7c55e02479:/mdoc_strings.c?ds=sidebyside

diff --git a/mdoc_strings.c b/mdoc_strings.c
index e9e0b409..e7ced1fe 100644
--- a/mdoc_strings.c
+++ b/mdoc_strings.c
@@ -1,6 +1,6 @@
-/*	$Id: mdoc_strings.c,v 1.7 2009/06/17 10:53:32 kristaps Exp $ */
+/*	$Id: mdoc_strings.c,v 1.24 2010/07/31 23:52:58 schwarze Exp $ */
 /*
- * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -14,134 +14,61 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <sys/types.h>
 
 #include <assert.h>
-#include <ctype.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 
+#include "mandoc.h"
 #include "libmdoc.h"
 
-/* FIXME: this file is poorly named. */
-
-struct mdoc_secname {
-	const char	*name;	/* Name of section. */
-	enum mdoc_sec	 sec;	/* Corresponding section. */
+static	const char * const secnames[SEC__MAX] = {
+	NULL,
+	"NAME",
+	"LIBRARY",
+	"SYNOPSIS",
+	"DESCRIPTION",
+	"IMPLEMENTATION NOTES",
+	"RETURN VALUES",
+	"ENVIRONMENT",
+	"FILES",
+	"EXIT STATUS",
+	"EXAMPLES",
+	"DIAGNOSTICS",
+	"COMPATIBILITY",
+	"ERRORS",
+	"SEE ALSO",
+	"STANDARDS",
+	"HISTORY",
+	"AUTHORS",
+	"CAVEATS",
+	"BUGS",
+	"SECURITY CONSIDERATIONS",
+	NULL
 };
 
-#define	SECNAME_MAX	(18)
-
-static	const struct mdoc_secname secnames[SECNAME_MAX] = {
-	{ "NAME", SEC_NAME },
-	{ "LIBRARY", SEC_LIBRARY },
-	{ "SYNOPSIS", SEC_SYNOPSIS },
-	{ "DESCRIPTION", SEC_DESCRIPTION },
-	{ "IMPLEMENTATION NOTES", SEC_IMPLEMENTATION },
-	{ "RETURN VALUES", SEC_RETURN_VALUES },
-	{ "ENVIRONMENT", SEC_ENVIRONMENT },
-	{ "FILES", SEC_FILES },
-	{ "EXAMPLES", SEC_EXAMPLES },
-	{ "DIAGNOSTICS", SEC_DIAGNOSTICS },
-	{ "COMPATIBILITY", SEC_COMPATIBILITY },
-	{ "ERRORS", SEC_ERRORS },
-	{ "SEE ALSO", SEC_SEE_ALSO },
-	{ "STANDARDS", SEC_STANDARDS },
-	{ "HISTORY", SEC_HISTORY },
-	{ "AUTHORS", SEC_AUTHORS },
-	{ "CAVEATS", SEC_CAVEATS },
-	{ "BUGS", SEC_BUGS },
-};
-
-#ifdef __linux__
-extern	char		*strptime(const char *, const char *, struct tm *);
-#endif
-
-
-size_t
-mdoc_isescape(const char *p)
-{
-	size_t		 c;
-	
-	if ('\\' != *p++)
-		return(0);
-
-	switch (*p) {
-	case ('\\'):
-		/* FALLTHROUGH */
-	case ('\''):
-		/* FALLTHROUGH */
-	case ('`'):
-		/* FALLTHROUGH */
-	case ('q'):
-		/* FALLTHROUGH */
-	case ('-'):
-		/* FALLTHROUGH */
-	case ('~'):
-		/* FALLTHROUGH */
-	case ('^'):
-		/* FALLTHROUGH */
-	case ('%'):
-		/* FALLTHROUGH */
-	case ('0'):
-		/* FALLTHROUGH */
-	case (' '):
-		/* FALLTHROUGH */
-	case ('|'):
-		/* FALLTHROUGH */
-	case ('&'):
-		/* FALLTHROUGH */
-	case ('.'):
-		/* FALLTHROUGH */
-	case (':'):
-		/* FALLTHROUGH */
-	case ('e'):
-		return(2);
-	case ('*'):
-		if (0 == *++p || ! isgraph((u_char)*p))
-			return(0);
-		switch (*p) {
-		case ('('):
-			if (0 == *++p || ! isgraph((u_char)*p))
-				return(0);
-			return(4);
-		case ('['):
-			for (c = 3, p++; *p && ']' != *p; p++, c++)
-				if ( ! isgraph((u_char)*p))
-					break;
-			return(*p == ']' ? c : 0);
-		default:
-			break;
-		}
-		return(3);
-	case ('('):
-		if (0 == *++p || ! isgraph((u_char)*p))
-			return(0);
-		if (0 == *++p || ! isgraph((u_char)*p))
-			return(0);
-		return(4);
-	case ('['):
-		break;
-	default:
-		return(0);
-	}
-
-	for (c = 3, p++; *p && ']' != *p; p++, c++)
-		if ( ! isgraph((u_char)*p))
-			break;
-
-	return(*p == ']' ? c : 0);
-}
-
-
-int
+/* 
+ * FIXME: this is repeated in print_text() (html.c) and term_word()
+ * (term.c).
+ */
+enum mdelim
 mdoc_iscdelim(char p)
 {
 
 	switch (p) {
-	case('|'):
+	case('('):
 		/* FALLTHROUGH */
+	case('['):
+		return(DELIM_OPEN);
+	case('|'):
+		return(DELIM_MIDDLE);
 	case('.'):
 		/* FALLTHROUGH */
 	case(','):
@@ -154,75 +81,52 @@ mdoc_iscdelim(char p)
 		/* FALLTHROUGH */
 	case('!'):
 		/* FALLTHROUGH */
-	case('('):
-		/* FALLTHROUGH */
 	case(')'):
 		/* FALLTHROUGH */
-	case('['):
-		/* FALLTHROUGH */
 	case(']'):
-		/* FALLTHROUGH */
-	case('{'):
-		/* FALLTHROUGH */
-	case('}'):
-		return(1);
+		return(DELIM_CLOSE);
 	default:
 		break;
 	}
 
-	return(0);
+	return(DELIM_NONE);
 }
 
 
-int
+enum mdelim
 mdoc_isdelim(const char *p)
 {
 
-	if (0 == *p)
-		return(0);
-	if (0 != *(p + 1))
-		return(0);
-	return(mdoc_iscdelim(*p));
+	if ('\0' == p[0])
+		return(DELIM_NONE);
+	if ('\0' == p[1])
+		return(mdoc_iscdelim(p[0]));
+
+	/*
+	 * XXX; account for groff bubu where the \*(Ba reserved string
+	 * is treated in exactly the same way as the vertical bar.  This
+	 * is the only function that checks for this.
+	 */
+	return(strcmp(p, "\\*(Ba") ? DELIM_NONE : DELIM_MIDDLE);
 }
 
 
 enum mdoc_sec 
-mdoc_atosec(const char *p)
+mdoc_str2sec(const char *p)
 {
 	int		 i;
 
-	for (i = 0; i < SECNAME_MAX; i++) 
-		if (0 == strcmp(p, secnames[i].name))
-			return(secnames[i].sec);
+	for (i = 0; i < (int)SEC__MAX; i++) 
+		if (secnames[i] && 0 == strcmp(p, secnames[i]))
+			return((enum mdoc_sec)i);
 
 	return(SEC_CUSTOM);
 }
 
 
-time_t
-mdoc_atotime(const char *p)
-{
-	struct tm	 tm;
-	char		*pp;
-
-	bzero(&tm, sizeof(struct tm));
-
-	if (0 == strcmp(p, "$" "Mdocdate$"))
-		return(time(NULL));
-	if ((pp = strptime(p, "$" "Mdocdate: %b %d %Y $", &tm)) && 0 == *pp)
-		return(mktime(&tm));
-	/* XXX - this matches "June 1999", which is wrong. */
-	if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
-		return(mktime(&tm));
-	if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
-		return(mktime(&tm));
-
-	return(0);
-}
-
-
+/* FIXME: move this into an editable .in file. */
 size_t
-mdoc_macro2len(int macro)
+mdoc_macro2len(enum mdoct macro)
 {
 
 	switch (macro) {
@@ -255,7 +159,7 @@ mdoc_macro2len(int macro)
 	case(MDOC_Em):
 		return(10);
 	case(MDOC_Er):
-		return(12);
+		return(17);
 	case(MDOC_Ev):
 		return(15);
 	case(MDOC_Fa):