=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_strings.c,v retrieving revision 1.3 retrieving revision 1.25 diff -u -p -r1.3 -r1.25 --- mandoc/Attic/mdoc_strings.c 2009/04/12 19:45:26 1.3 +++ mandoc/Attic/mdoc_strings.c 2011/03/17 01:23:29 1.25 @@ -1,6 +1,6 @@ -/* $Id: mdoc_strings.c,v 1.3 2009/04/12 19:45:26 kristaps Exp $ */ +/* $Id: mdoc_strings.c,v 1.25 2011/03/17 01:23:29 kristaps Exp $ */ /* - * Copyright (c) 2008 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,222 +14,106 @@ * 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 #include -#include #include #include #include +#include +#include "mandoc.h" #include "libmdoc.h" -/* - * Various string-literal operations: converting scalars to and from - * strings, etc. - */ - -struct mdoc_secname { - const char *name; - int flag; -#define MSECNAME_META (1 << 0) +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 }; -/* Section names corresponding to mdoc_sec. */ - -static const struct mdoc_secname secnames[] = { - { "PROLOGUE", MSECNAME_META }, - { "BODY", MSECNAME_META }, - { "NAME", 0 }, - { "LIBRARY", 0 }, - { "SYNOPSIS", 0 }, - { "DESCRIPTION", 0 }, - { "IMPLEMENTATION NOTES", 0 }, - { "RETURN VALUES", 0 }, - { "ENVIRONMENT", 0 }, - { "FILES", 0 }, - { "EXAMPLES", 0 }, - { "DIAGNOSTICS", 0 }, - { "COMPATIBILITY", 0 }, - { "ERRORS", 0 }, - { "SEE ALSO", 0 }, - { "STANDARDS", 0 }, - { "HISTORY", 0 }, - { "AUTHORS", 0 }, - { "CAVEATS", 0 }, - { "BUGS", 0 }, - { NULL, 0 } -}; - -#ifdef __linux__ -extern char *strptime(const char *, const char *, struct tm *); -#endif - - -size_t -mdoc_isescape(const char *p) +enum mdelim +mdoc_isdelim(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); + if ('\0' == p[0]) + return(DELIM_NONE); + + if ('\0' == p[1]) + switch (p[0]) { + case('('): + /* FALLTHROUGH */ + case('['): + return(DELIM_OPEN); + case('|'): + return(DELIM_MIDDLE); + case('.'): + /* FALLTHROUGH */ + case(','): + /* FALLTHROUGH */ + case(';'): + /* FALLTHROUGH */ + case(':'): + /* FALLTHROUGH */ + case('?'): + /* FALLTHROUGH */ + case('!'): + /* FALLTHROUGH */ + case(')'): + /* FALLTHROUGH */ + case(']'): + return(DELIM_CLOSE); default: - break; + return(DELIM_NONE); } - 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); + /* + * 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); } -int -mdoc_iscdelim(char p) -{ - - switch (p) { - case('.'): - /* FALLTHROUGH */ - case(','): - /* FALLTHROUGH */ - case(';'): - /* FALLTHROUGH */ - case(':'): - /* FALLTHROUGH */ - case('?'): - /* FALLTHROUGH */ - case('!'): - /* FALLTHROUGH */ - case('('): - /* FALLTHROUGH */ - case(')'): - /* FALLTHROUGH */ - case('['): - /* FALLTHROUGH */ - case(']'): - /* FALLTHROUGH */ - case('{'): - /* FALLTHROUGH */ - case('}'): - return(1); - default: - break; - } - - return(0); -} - - -int -mdoc_isdelim(const char *p) -{ - - if (0 == *p) - return(0); - if (0 != *(p + 1)) - return(0); - return(mdoc_iscdelim(*p)); -} - - enum mdoc_sec -mdoc_atosec(const char *p) +mdoc_str2sec(const char *p) { - const struct mdoc_secname *n; - int i; + int i; - for (i = 0, n = secnames; n->name; n++, i++) - if ( ! (n->flag & MSECNAME_META)) - if (0 == strcmp(p, n->name)) - return((enum mdoc_sec)i); + 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; - - (void)memset(&tm, 0, sizeof(struct tm)); - - if (0 == strcmp(p, "$Mdocdate: April 12 2009 $")) - return(time(NULL)); - if ((pp = strptime(p, "$Mdocdate: April 12 2009 $", &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) { @@ -262,7 +146,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):