=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.212 retrieving revision 1.213 diff -c -r1.212 -r1.213 *** src/usr.bin/mandoc/mdoc_validate.c 2015/10/12 21:25:36 1.212 --- src/usr.bin/mandoc/mdoc_validate.c 2015/10/19 20:03:57 1.213 *************** *** 1,4 **** ! /* $OpenBSD: mdoc_validate.c,v 1.212 2015/10/12 21:25:36 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: mdoc_validate.c,v 1.213 2015/10/19 20:03:57 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze *************** *** 757,763 **** post_bf(POST_ARGS) { struct roff_node *np, *nch; - enum mdocargt arg; /* * Unlike other data pointers, these are "housed" by the HEAD --- 757,762 ---- *************** *** 769,813 **** return; assert(np->parent->type == ROFFT_BLOCK); ! assert(MDOC_Bf == np->parent->tok); /* Check the number of arguments. */ nch = np->child; ! if (NULL == np->parent->args) { ! if (NULL == nch) { mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse, np->line, np->pos, "Bf"); return; } nch = nch->next; } ! if (NULL != nch) mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse, nch->line, nch->pos, "Bf ... %s", nch->string); /* Extract argument into data. */ ! if (np->parent->args) { ! arg = np->parent->args->argv[0].arg; ! if (MDOC_Emphasis == arg) np->norm->Bf.font = FONT_Em; ! else if (MDOC_Literal == arg) np->norm->Bf.font = FONT_Li; ! else if (MDOC_Symbolic == arg) np->norm->Bf.font = FONT_Sy; ! else abort(); return; } /* Extract parameter into data. */ ! if (0 == strcmp(np->child->string, "Em")) np->norm->Bf.font = FONT_Em; ! else if (0 == strcmp(np->child->string, "Li")) np->norm->Bf.font = FONT_Li; ! else if (0 == strcmp(np->child->string, "Sy")) np->norm->Bf.font = FONT_Sy; else mandoc_vmsg(MANDOCERR_BF_BADFONT, mdoc->parse, --- 768,816 ---- return; assert(np->parent->type == ROFFT_BLOCK); ! assert(np->parent->tok == MDOC_Bf); /* Check the number of arguments. */ nch = np->child; ! if (np->parent->args == NULL) { ! if (nch == NULL) { mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse, np->line, np->pos, "Bf"); return; } nch = nch->next; } ! if (nch != NULL) mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse, nch->line, nch->pos, "Bf ... %s", nch->string); /* Extract argument into data. */ ! if (np->parent->args != NULL) { ! switch (np->parent->args->argv[0].arg) { ! case MDOC_Emphasis: np->norm->Bf.font = FONT_Em; ! break; ! case MDOC_Literal: np->norm->Bf.font = FONT_Li; ! break; ! case MDOC_Symbolic: np->norm->Bf.font = FONT_Sy; ! break; ! default: abort(); + } return; } /* Extract parameter into data. */ ! if ( ! strcmp(np->child->string, "Em")) np->norm->Bf.font = FONT_Em; ! else if ( ! strcmp(np->child->string, "Li")) np->norm->Bf.font = FONT_Li; ! else if ( ! strcmp(np->child->string, "Sy")) np->norm->Bf.font = FONT_Sy; else mandoc_vmsg(MANDOCERR_BF_BADFONT, mdoc->parse, *************** *** 834,840 **** const struct roff_node *n; n = mdoc->last; ! if (n->child) mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, n->line, n->pos, "%s %s", mdoc_macronames[n->tok], --- 837,843 ---- const struct roff_node *n; n = mdoc->last; ! if (n->child != NULL) mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, n->line, n->pos, "%s %s", mdoc_macronames[n->tok], *************** *** 923,934 **** n->last->tok == MDOC_Lp)) mdoc_node_relink(mdoc, n->last); ! if (NULL != mdoc->meta.name) return; deroff(&mdoc->meta.name, n); ! if (NULL == mdoc->meta.name) mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, n->line, n->pos, "Nm"); } --- 926,937 ---- n->last->tok == MDOC_Lp)) mdoc_node_relink(mdoc, n->last); ! if (mdoc->meta.name != NULL) return; deroff(&mdoc->meta.name, n); ! if (mdoc->meta.name == NULL) mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, n->line, n->pos, "Nm"); } *************** *** 1000,1006 **** * gets an empty string. */ ! if (mdoc->last->child) return; nn = mdoc->last; --- 1003,1009 ---- * gets an empty string. */ ! if (mdoc->last->child != NULL) return; nn = mdoc->last; *************** *** 1044,1050 **** n = n->child; assert(n->type == ROFFT_TEXT); ! if (NULL == (std_att = mdoc_a2att(n->string))) { mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse, n->line, n->pos, "At %s", n->string); mandoc_asprintf(&att, "AT&T UNIX %s", n->string); --- 1047,1053 ---- n = n->child; assert(n->type == ROFFT_TEXT); ! if ((std_att = mdoc_a2att(n->string)) == NULL) { mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse, n->line, n->pos, "At %s", n->string); mandoc_asprintf(&att, "AT&T UNIX %s", n->string); *************** *** 1133,1139 **** assert(nit->head->child == NULL); ! for (i = 0, nch = nit->child; nch; nch = nch->next) if (nch->type == ROFFT_BODY) i++; --- 1136,1143 ---- assert(nit->head->child == NULL); ! i = 0; ! for (nch = nit->child; nch != NULL; nch = nch->next) if (nch->type == ROFFT_BODY) i++; *************** *** 1162,1178 **** n = mdoc->last; ! if (LIST_tag == n->norm->Bl.type && ! NULL == n->norm->Bl.width) { post_bl_block_tag(mdoc); ! assert(n->norm->Bl.width); } ! for (ni = n->body->child; ni; ni = ni->next) { ! if (NULL == ni->body) continue; nc = ni->body->last; ! while (NULL != nc) { switch (nc->tok) { case MDOC_Pp: case MDOC_Lp: --- 1166,1182 ---- n = mdoc->last; ! if (n->norm->Bl.type == LIST_tag && ! n->norm->Bl.width == NULL) { post_bl_block_tag(mdoc); ! assert(n->norm->Bl.width != NULL); } ! for (ni = n->body->child; ni != NULL; ni = ni->next) { ! if (ni->body == NULL) continue; nc = ni->body->last; ! while (nc != NULL) { switch (nc->tok) { case MDOC_Pp: case MDOC_Lp: *************** *** 1182,1194 **** nc = NULL; continue; } ! if (NULL == ni->next) { mandoc_msg(MANDOCERR_PAR_MOVE, mdoc->parse, nc->line, nc->pos, mdoc_macronames[nc->tok]); mdoc_node_relink(mdoc, nc); ! } else if (0 == n->norm->Bl.comp && ! LIST_column != n->norm->Bl.type) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, nc->line, nc->pos, "%s before It", --- 1186,1198 ---- nc = NULL; continue; } ! if (ni->next == NULL) { mandoc_msg(MANDOCERR_PAR_MOVE, mdoc->parse, nc->line, nc->pos, mdoc_macronames[nc->tok]); mdoc_node_relink(mdoc, nc); ! } else if (n->norm->Bl.comp == 0 && ! n->norm->Bl.type != LIST_column) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, nc->line, nc->pos, "%s before It", *************** *** 1242,1249 **** sz = 10; n = mdoc->last; ! for (nn = n->body->child; nn; nn = nn->next) { ! if (MDOC_It != nn->tok) continue; assert(nn->type == ROFFT_BLOCK); --- 1246,1253 ---- sz = 10; n = mdoc->last; ! for (nn = n->body->child; nn != NULL; nn = nn->next) { ! if (nn->tok != MDOC_It) continue; assert(nn->type == ROFFT_BLOCK); *************** *** 1272,1278 **** * We're guaranteed that a MDOC_Width doesn't already exist. */ ! assert(n->args); i = (int)(n->args->argc)++; n->args->argv = mandoc_reallocarray(n->args->argv, --- 1276,1282 ---- * We're guaranteed that a MDOC_Width doesn't already exist. */ ! assert(n->args != NULL); i = (int)(n->args->argc)++; n->args->argv = mandoc_reallocarray(n->args->argv, *************** *** 1405,1415 **** * Unlink this child. */ ! assert(NULL == nchild->prev); ! if (0 == --nbody->nchild) { nbody->child = NULL; nbody->last = NULL; ! assert(NULL == nnext); } else { nbody->child = nnext; nnext->prev = NULL; --- 1409,1419 ---- * Unlink this child. */ ! assert(nchild->prev == NULL); ! if (--nbody->nchild == 0) { nbody->child = NULL; nbody->last = NULL; ! assert(nnext == NULL); } else { nbody->child = nnext; nnext->prev = NULL; *************** *** 1425,1431 **** nblock->prev = nchild; nparent->nchild++; ! if (NULL == nprev) nparent->child = nchild; else nprev->next = nchild; --- 1429,1435 ---- nblock->prev = nchild; nparent->nchild++; ! if (nprev == NULL) nparent->child = nchild; else nprev->next = nchild; *************** *** 1449,1455 **** } static void ! post_sm(struct roff_man *mdoc) { struct roff_node *nch; --- 1453,1459 ---- } static void ! post_sm(POST_ARGS) { struct roff_node *nch; *************** *** 1530,1536 **** assert(nch->type == ROFFT_TEXT); ! if (NULL == (p = mdoc_a2st(nch->string))) { mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, nch->line, nch->pos, "St %s", nch->string); roff_node_delete(mdoc, n); --- 1534,1540 ---- assert(nch->type == ROFFT_TEXT); ! if ((p = mdoc_a2st(nch->string)) == NULL) { mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, nch->line, nch->pos, "St %s", nch->string); roff_node_delete(mdoc, n); *************** *** 1658,1664 **** post_ns(POST_ARGS) { ! if (MDOC_LINE & mdoc->last->flags) mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse, mdoc->last->line, mdoc->last->pos, NULL); } --- 1662,1668 ---- post_ns(POST_ARGS) { ! if (mdoc->last->flags & MDOC_LINE) mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse, mdoc->last->line, mdoc->last->pos, NULL); } *************** *** 1863,1869 **** mdoc->last->parent->sec = sec; mdoc->last->sec = sec; ! for (n = mdoc->last->child; n; n = n->next) n->sec = sec; /* We don't care about custom sections after this. */ --- 1867,1873 ---- mdoc->last->parent->sec = sec; mdoc->last->sec = sec; ! for (n = mdoc->last->child; n != NULL; n = n->next) n->sec = sec; /* We don't care about custom sections after this. */ *************** *** 1945,1952 **** return; } ! if (NULL != (np = mdoc->last->child)) ! if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, np->line, np->pos, "%s after %s", mdoc_macronames[np->tok], --- 1949,1956 ---- return; } ! if ((np = mdoc->last->child) != NULL) ! if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, np->line, np->pos, "%s after %s", mdoc_macronames[np->tok], *************** *** 1954,1961 **** roff_node_delete(mdoc, np); } ! if (NULL != (np = mdoc->last->last)) ! if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, np->line, np->pos, "%s at the end of %s", mdoc_macronames[np->tok], --- 1958,1965 ---- roff_node_delete(mdoc, np); } ! if ((np = mdoc->last->last) != NULL) ! if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, np->line, np->pos, "%s at the end of %s", mdoc_macronames[np->tok], *************** *** 2013,2025 **** mdoc->parse, np->line, np->pos, "%s %s", mdoc_macronames[np->tok], np->child->string); ! if (NULL == (np = mdoc->last->prev)) { np = mdoc->last->parent; ! if (MDOC_Sh != np->tok && MDOC_Ss != np->tok) return; ! } else if (MDOC_Pp != np->tok && MDOC_Lp != np->tok && ! (MDOC_br != mdoc->last->tok || ! (MDOC_sp != np->tok && MDOC_br != np->tok))) return; mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, --- 2017,2029 ---- mdoc->parse, np->line, np->pos, "%s %s", mdoc_macronames[np->tok], np->child->string); ! if ((np = mdoc->last->prev) == NULL) { np = mdoc->last->parent; ! if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) return; ! } else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp && ! (mdoc->last->tok != MDOC_br || ! (np->tok != MDOC_sp && np->tok != MDOC_br))) return; mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, *************** *** 2068,2074 **** free(mdoc->meta.date); n = mdoc->last; ! if (NULL == n->child || '\0' == n->child->string[0]) { mdoc->meta.date = mdoc->quick ? mandoc_strdup("") : mandoc_normdate(mdoc->parse, NULL, n->line, n->pos); goto out; --- 2072,2078 ---- free(mdoc->meta.date); n = mdoc->last; ! if (n->child == NULL || n->child->string[0] == '\0') { mdoc->meta.date = mdoc->quick ? mandoc_strdup("") : mandoc_normdate(mdoc->parse, NULL, n->line, n->pos); goto out; *************** *** 2183,2190 **** * uppercase blindly. */ ! n = mdoc->last->child; ! if (n && NULL != (n = n->next)) *n->string = (char)toupper((unsigned char)*n->string); } --- 2187,2193 ---- * uppercase blindly. */ ! if ((n = mdoc->last->child) != NULL && (n = n->next) != NULL) *n->string = (char)toupper((unsigned char)*n->string); } *************** *** 2222,2229 **** #ifdef OSNAME mdoc->meta.os = mandoc_strdup(OSNAME); #else /*!OSNAME */ ! if (NULL == defbuf) { ! if (-1 == uname(&utsname)) { mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse, n->line, n->pos, "Os"); defbuf = mandoc_strdup("UNKNOWN"); --- 2225,2232 ---- #ifdef OSNAME mdoc->meta.os = mandoc_strdup(OSNAME); #else /*!OSNAME */ ! if (defbuf == NULL) { ! if (uname(&utsname) == -1) { mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse, n->line, n->pos, "Os"); defbuf = mandoc_strdup("UNKNOWN"); *************** *** 2249,2255 **** n = mdoc->last; ! if (n->child) return; if (mdoc->meta.name == NULL) { --- 2252,2258 ---- n = mdoc->last; ! if (n->child != NULL) return; if (mdoc->meta.name == NULL) {