summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2014-03-23 15:14:30 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2014-03-23 15:14:30 +0000
commit4fef91dac76600b3e376f48755249e53f730ecbd (patch)
tree9e9ea534a2ef3d497de3e00420c4c1951d1b710b
parent264e4c5997cbcfd5bc288d0356c3dd63581b9f1f (diff)
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.
-rw-r--r--usr.bin/mandoc/mdoc_validate.c105
1 files changed, 27 insertions, 78 deletions
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 <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -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)
{