=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.123 retrieving revision 1.124 diff -c -r1.123 -r1.124 *** src/usr.bin/mandoc/mdoc_validate.c 2014/03/21 22:52:21 1.123 --- src/usr.bin/mandoc/mdoc_validate.c 2014/03/23 15:14:29 1.124 *************** *** 1,4 **** ! /* $Id: mdoc_validate.c,v 1.123 2014/03/21 22:52:21 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze --- 1,4 ---- ! /* $Id: mdoc_validate.c,v 1.124 2014/03/23 15:14:29 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze *************** *** 42,48 **** #define POST_ARGS struct mdoc *mdoc #define NUMSIZ 32 - #define DATESIZE 32 enum check_ineq { CHECK_LT, --- 42,47 ---- *************** *** 70,76 **** static void check_argv(struct mdoc *, struct mdoc_node *, struct mdoc_argv *); static void check_args(struct mdoc *, struct mdoc_node *); - static int concat(char *, const struct mdoc_node *, size_t); static enum mdoc_sec a2sec(const char *); static size_t macro2len(enum mdoct); --- 69,74 ---- *************** *** 1119,1149 **** static int post_nm(POST_ARGS) { - char buf[BUFSIZ]; - int c; if (NULL != mdoc->meta.name) return(1); ! /* Try to use our children for setting the meta name. */ ! if (NULL != mdoc->last->child) { ! buf[0] = '\0'; ! c = concat(buf, mdoc->last->child, BUFSIZ); ! } else ! c = 0; ! ! switch (c) { ! case (-1): ! mdoc_nmsg(mdoc, mdoc->last->child, MANDOCERR_MEM); ! return(0); ! case (0): mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME); mdoc->meta.name = mandoc_strdup("UNKNOWN"); - break; - default: - mdoc->meta.name = mandoc_strdup(buf); - break; } return(1); } --- 1117,1131 ---- static int post_nm(POST_ARGS) { if (NULL != mdoc->meta.name) return(1); ! mdoc_deroff(&mdoc->meta.name, mdoc->last); ! if (NULL == mdoc->meta.name) { mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME); mdoc->meta.name = mandoc_strdup("UNKNOWN"); } return(1); } *************** *** 1961,1970 **** static int post_sh_head(POST_ARGS) { - char buf[BUFSIZ]; struct mdoc_node *n; enum mdoc_sec sec; - int c; /* * Process a new section. Sections are either "named" or --- 1943,1951 ---- static int post_sh_head(POST_ARGS) { struct mdoc_node *n; + const char *secname; enum mdoc_sec sec; /* * Process a new section. Sections are either "named" or *************** *** 1973,1985 **** * manual sections. */ sec = SEC_CUSTOM; ! buf[0] = '\0'; ! if (-1 == (c = concat(buf, mdoc->last->child, BUFSIZ))) { ! mdoc_nmsg(mdoc, mdoc->last->child, MANDOCERR_MEM); ! return(0); ! } else if (1 == c) ! sec = a2sec(buf); /* The NAME should be first. */ --- 1954,1970 ---- * manual sections. */ + secname = NULL; sec = SEC_CUSTOM; ! n = mdoc->last; ! if (n->child) { ! assert(1 == n->nchild); ! n = n->child; ! assert(NULL != n); ! assert(MDOC_TEXT == n->type); ! secname = n->string; ! sec = a2sec(secname); ! } /* The NAME should be first. */ *************** *** 2053,2059 **** if (*mdoc->meta.msec == '9') break; mandoc_msg(MANDOCERR_SECMSEC, mdoc->parse, ! mdoc->last->line, mdoc->last->pos, buf); break; default: break; --- 2038,2044 ---- if (*mdoc->meta.msec == '9') break; mandoc_msg(MANDOCERR_SECMSEC, mdoc->parse, ! mdoc->last->line, mdoc->last->pos, secname); break; default: break; *************** *** 2174,2182 **** static int post_dd(POST_ARGS) { - char buf[DATESIZE]; struct mdoc_node *n; ! int c; if (mdoc->meta.date) free(mdoc->meta.date); --- 2159,2166 ---- static int post_dd(POST_ARGS) { struct mdoc_node *n; ! char *datestr; if (mdoc->meta.date) free(mdoc->meta.date); *************** *** 2188,2203 **** return(1); } ! buf[0] = '\0'; ! if (-1 == (c = concat(buf, n->child, DATESIZE))) { ! mdoc_nmsg(mdoc, n->child, MANDOCERR_MEM); ! return(0); } - - assert(c); - mdoc->meta.date = mdoc->quick ? mandoc_strdup(buf) : - mandoc_normdate(mdoc->parse, buf, n->line, n->pos); - return(1); } --- 2172,2186 ---- return(1); } ! datestr = NULL; ! mdoc_deroff(&datestr, n); ! if (mdoc->quick) ! mdoc->meta.date = datestr; ! else { ! mdoc->meta.date = mandoc_normdate(mdoc->parse, ! datestr, n->line, n->pos); ! free(datestr); } return(1); } *************** *** 2347,2359 **** static int post_os(POST_ARGS) { - char buf[BUFSIZ]; #ifndef OSNAME struct utsname utsname; static char *defbuf; #endif struct mdoc_node *n; - int c; n = mdoc->last; --- 2330,2340 ---- *************** *** 2367,2385 **** */ free(mdoc->meta.os); ! ! buf[0] = '\0'; ! if (-1 == (c = concat(buf, n->child, BUFSIZ))) { ! mdoc_nmsg(mdoc, n->child, MANDOCERR_MEM); ! return(0); ! } ! ! assert(c); ! ! if ('\0' != *buf) { ! mdoc->meta.os = mandoc_strdup(buf); return(1); - } if (mdoc->defos) { mdoc->meta.os = mandoc_strdup(mdoc->defos); --- 2348,2357 ---- */ free(mdoc->meta.os); ! mdoc->meta.os = NULL; ! mdoc_deroff(&mdoc->meta.os, n); ! if (mdoc->meta.os) return(1); if (mdoc->defos) { mdoc->meta.os = mandoc_strdup(mdoc->defos); *************** *** 2428,2456 **** return(0); mdoc->last = nn; - return(1); - } - - /* - * Concatenate a node, stopping at the first non-text. - * Concatenation is separated by a single whitespace. - * Returns -1 on fatal (string overrun) error, 0 if child nodes were - * encountered, 1 otherwise. - */ - static int - concat(char *p, const struct mdoc_node *n, size_t sz) - { - - for ( ; NULL != n; n = n->next) { - if (MDOC_TEXT != n->type) - return(0); - if ('\0' != p[0] && strlcat(p, " ", sz) >= sz) - return(-1); - if (strlcat(p, n->string, sz) >= sz) - return(-1); - concat(p, n->child, sz); - } - return(1); } --- 2400,2405 ----