From 4fef91dac76600b3e376f48755249e53f730ecbd Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Sun, 23 Mar 2014 15:14:30 +0000 Subject: Retire the old concat() function. For .Sh, i wasn't even needed at all. For .Dd, .Nm, and .Os, use the new mdoc_deroff() instead. This gets rid of the last limited-size static buffers in this file, hence eliminates the last explicit MANDOCERR_MEM throwers here, and it shortens the code by 50 lines. --- usr.bin/mandoc/mdoc_validate.c | 105 +++++++++++------------------------------ 1 file changed, 27 insertions(+), 78 deletions(-) (limited to 'usr.bin/mandoc') diff --git a/usr.bin/mandoc/mdoc_validate.c b/usr.bin/mandoc/mdoc_validate.c index b1baac9cc3f..89b1e499f80 100644 --- a/usr.bin/mandoc/mdoc_validate.c +++ b/usr.bin/mandoc/mdoc_validate.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_validate.c,v 1.123 2014/03/21 22:52:21 schwarze Exp $ */ +/* $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,7 +42,6 @@ #define POST_ARGS struct mdoc *mdoc #define NUMSIZ 32 -#define DATESIZE 32 enum check_ineq { CHECK_LT, @@ -70,7 +69,6 @@ static void check_text(struct mdoc *, int, int, char *); 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); @@ -1119,31 +1117,15 @@ post_vt(POST_ARGS) 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. */ + mdoc_deroff(&mdoc->meta.name, mdoc->last); - 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): + if (NULL == mdoc->meta.name) { mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME); mdoc->meta.name = mandoc_strdup("UNKNOWN"); - break; - default: - mdoc->meta.name = mandoc_strdup(buf); - break; } return(1); } @@ -1961,10 +1943,9 @@ post_sh_body(POST_ARGS) static int post_sh_head(POST_ARGS) { - char buf[BUFSIZ]; struct mdoc_node *n; + const char *secname; enum mdoc_sec sec; - int c; /* * Process a new section. Sections are either "named" or @@ -1973,13 +1954,17 @@ post_sh_head(POST_ARGS) * manual sections. */ + secname = NULL; 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); + 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,7 +2038,7 @@ post_sh_head(POST_ARGS) if (*mdoc->meta.msec == '9') break; mandoc_msg(MANDOCERR_SECMSEC, mdoc->parse, - mdoc->last->line, mdoc->last->pos, buf); + mdoc->last->line, mdoc->last->pos, secname); break; default: break; @@ -2174,9 +2159,8 @@ pre_literal(PRE_ARGS) static int post_dd(POST_ARGS) { - char buf[DATESIZE]; struct mdoc_node *n; - int c; + char *datestr; if (mdoc->meta.date) free(mdoc->meta.date); @@ -2188,16 +2172,15 @@ post_dd(POST_ARGS) return(1); } - buf[0] = '\0'; - if (-1 == (c = concat(buf, n->child, DATESIZE))) { - mdoc_nmsg(mdoc, n->child, MANDOCERR_MEM); - return(0); + 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); } - - assert(c); - mdoc->meta.date = mdoc->quick ? mandoc_strdup(buf) : - mandoc_normdate(mdoc->parse, buf, n->line, n->pos); - return(1); } @@ -2347,13 +2330,11 @@ post_bx(POST_ARGS) 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; @@ -2367,19 +2348,10 @@ post_os(POST_ARGS) */ 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); + 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); @@ -2431,29 +2403,6 @@ post_std(POST_ARGS) 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); -} - static enum mdoc_sec a2sec(const char *p) { -- cgit v1.2.3