=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.54 retrieving revision 1.55 diff -c -r1.54 -r1.55 *** src/usr.bin/mandoc/mdoc_validate.c 2010/05/15 18:25:51 1.54 --- src/usr.bin/mandoc/mdoc_validate.c 2010/05/23 22:45:01 1.55 *************** *** 1,4 **** ! /* $Id: mdoc_validate.c,v 1.54 2010/05/15 18:25:51 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: mdoc_validate.c,v 1.55 2010/05/23 22:45:01 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * *************** *** 22,27 **** --- 22,28 ---- #include #include + #include "mandoc.h" #include "libmdoc.h" #include "libmandoc.h" *************** *** 317,324 **** int want, const char *v, int has) { ! return(mdoc_vwarn(m, m->last->line, m->last->pos, ! "suggests %s %s %d (has %d)", v, k, want, has)); } --- 318,326 ---- int want, const char *v, int has) { ! return(mdoc_vmsg(m, MANDOCERR_ARGCOUNT, ! m->last->line, m->last->pos, ! "%s %s %d (have %d)", v, k, want, has)); } *************** *** 327,334 **** int want, const char *v, int has) { ! return(mdoc_verr(m, m->last->line, m->last->pos, ! "requires %s %s %d (has %d)", v, k, want, has)); } --- 329,339 ---- int want, const char *v, int has) { ! mdoc_vmsg(m, MANDOCERR_SYNTARGCOUNT, ! m->last->line, m->last->pos, ! "%s %s %d (have %d)", ! v, k, want, has); ! return(0); } *************** *** 401,407 **** if (n->args && 1 == n->args->argc) if (MDOC_Std == n->args->argv[0].arg) return(1); ! return(mdoc_nwarn(mdoc, n, EARGVAL)); } --- 406,412 ---- if (n->args && 1 == n->args->argc) if (MDOC_Std == n->args->argv[0].arg) return(1); ! return(mdoc_nmsg(mdoc, n, MANDOCERR_NOARGV)); } *************** *** 433,442 **** return(0); if (MDOC_Std == v->arg) { - /* `Nm' name must be set. */ if (v->sz || m->meta.name) return(1); ! return(mdoc_nerr(m, n, ENAME)); } return(1); --- 438,447 ---- return(0); if (MDOC_Std == v->arg) { if (v->sz || m->meta.name) return(1); ! if ( ! mdoc_nmsg(m, n, MANDOCERR_NONAME)) ! return(0); } return(1); *************** *** 451,460 **** for ( ; *p; p++, pos++) { if ('\t' == *p) { if ( ! (MDOC_LITERAL & mdoc->flags)) ! if ( ! mdoc_pwarn(mdoc, line, pos, EPRINT)) return(0); } else if ( ! isprint((u_char)*p)) ! if ( ! mdoc_pwarn(mdoc, line, pos, EPRINT)) return(0); if ('\\' != *p) --- 456,465 ---- for ( ; *p; p++, pos++) { if ('\t' == *p) { if ( ! (MDOC_LITERAL & mdoc->flags)) ! if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR)) return(0); } else if ( ! isprint((u_char)*p)) ! if ( ! mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADCHAR)) return(0); if ('\\' != *p) *************** *** 466,475 **** pos += c - 1; continue; } ! if ( ! (MDOC_IGN_ESCAPE & mdoc->pflags)) ! return(mdoc_perr(mdoc, line, pos, EESCAPE)); ! if ( ! mdoc_pwarn(mdoc, line, pos, EESCAPE)) ! return(0); } return(1); --- 471,480 ---- pos += c - 1; continue; } ! ! c = mdoc_pmsg(mdoc, line, pos, MANDOCERR_BADESCAPE); ! if ( ! (MDOC_IGN_ESCAPE & mdoc->pflags) && ! c) ! return(c); } return(1); *************** *** 487,494 **** (t == n->parent->type)) return(1); ! return(mdoc_verr(mdoc, n->line, n->pos, "require parent %s", ! MDOC_ROOT == t ? "" : mdoc_macronames[tok])); } --- 492,502 ---- (t == n->parent->type)) return(1); ! mdoc_vmsg(mdoc, MANDOCERR_SYNTCHILD, ! n->line, n->pos, "want parent %s", ! MDOC_ROOT == t ? "" : ! mdoc_macronames[tok]); ! return(0); } *************** *** 511,517 **** if (NULL == node) return(1); ! return(mdoc_nerr(mdoc, n, ENESTDISP)); } --- 519,526 ---- if (NULL == node) return(1); ! mdoc_nmsg(mdoc, n, MANDOCERR_NESTEDDISP); ! return(0); } *************** *** 522,529 **** if (MDOC_BLOCK != n->type) return(1); ! if (NULL == n->args) ! return(mdoc_nerr(mdoc, n, ELISTTYPE)); /* Make sure that only one type of list is specified. */ --- 531,540 ---- if (MDOC_BLOCK != n->type) return(1); ! if (NULL == n->args) { ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTTYPE); ! return(0); ! } /* Make sure that only one type of list is specified. */ *************** *** 563,569 **** * FIXME: this should occur in mdoc_action.c. */ if (type >= 0) { ! if ( ! mdoc_nwarn(mdoc, n, EMULTILIST)) return(0); mdoc_argn_free(n->args, pos); break; --- 574,580 ---- * FIXME: this should occur in mdoc_action.c. */ if (type >= 0) { ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTREP)) return(0); mdoc_argn_free(n->args, pos); break; *************** *** 571,590 **** type = n->args->argv[pos].arg; break; case (MDOC_Compact): ! if (type < 0 && ! mdoc_nwarn(mdoc, n, ENOTYPE)) return(0); break; case (MDOC_Width): if (width >= 0) ! return(mdoc_nerr(mdoc, n, EARGREP)); ! if (type < 0 && ! mdoc_nwarn(mdoc, n, ENOTYPE)) return(0); width = n->args->argv[pos].arg; break; case (MDOC_Offset): if (offset >= 0) ! return(mdoc_nerr(mdoc, n, EARGREP)); ! if (type < 0 && ! mdoc_nwarn(mdoc, n, ENOTYPE)) return(0); offset = n->args->argv[pos].arg; break; --- 582,603 ---- type = n->args->argv[pos].arg; break; case (MDOC_Compact): ! if (type < 0 && ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTFIRST)) return(0); break; case (MDOC_Width): if (width >= 0) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP)) ! return(0); ! if (type < 0 && ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTFIRST)) return(0); width = n->args->argv[pos].arg; break; case (MDOC_Offset): if (offset >= 0) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP)) ! return(0); ! if (type < 0 && ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTFIRST)) return(0); offset = n->args->argv[pos].arg; break; *************** *** 592,599 **** break; } ! if (type < 0) ! return(mdoc_nerr(mdoc, n, ELISTTYPE)); /* * Validate the width field. Some list types don't need width --- 605,614 ---- break; } ! if (type < 0) { ! mdoc_nmsg(mdoc, n, MANDOCERR_LISTTYPE); ! return(0); ! } /* * Validate the width field. Some list types don't need width *************** *** 603,609 **** switch (type) { case (MDOC_Tag): ! if (width < 0 && ! mdoc_nwarn(mdoc, n, EMISSWIDTH)) return(0); break; case (MDOC_Column): --- 618,624 ---- switch (type) { case (MDOC_Tag): ! if (width < 0 && ! mdoc_nmsg(mdoc, n, MANDOCERR_NOWIDTHARG)) return(0); break; case (MDOC_Column): *************** *** 615,621 **** case (MDOC_Inset): /* FALLTHROUGH */ case (MDOC_Item): ! if (width >= 0 && ! mdoc_nwarn(mdoc, n, ENOWIDTH)) return(0); break; default: --- 630,636 ---- case (MDOC_Inset): /* FALLTHROUGH */ case (MDOC_Item): ! if (width >= 0 && ! mdoc_nmsg(mdoc, n, MANDOCERR_WIDTHARG)) return(0); break; default: *************** *** 633,640 **** if (MDOC_BLOCK != n->type) return(1); ! if (NULL == n->args) ! return(mdoc_nerr(mdoc, n, EDISPTYPE)); /* Make sure that only one type of display is specified. */ --- 648,657 ---- if (MDOC_BLOCK != n->type) return(1); ! if (NULL == n->args) { ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE); ! return(0); ! } /* Make sure that only one type of display is specified. */ *************** *** 653,666 **** case (MDOC_Literal): if (0 == type++) break; ! return(mdoc_nerr(mdoc, n, EMULTIDISP)); default: break; } if (type) return(1); ! return(mdoc_nerr(mdoc, n, EDISPTYPE)); } --- 670,686 ---- case (MDOC_Literal): if (0 == type++) break; ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP)) ! return(0); ! break; default: break; } if (type) return(1); ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE); ! return(0); } *************** *** 690,695 **** --- 710,719 ---- if (MDOC_BLOCK != n->type) return(1); + /* + * FIXME: this can probably be lifted if we make the It into + * something else on-the-fly? + */ return(check_parent(mdoc, n, MDOC_Bl, MDOC_BODY)); } *************** *** 700,707 **** if (NULL == n->args || 1 == n->args->argc) return(1); ! return(mdoc_verr(mdoc, n->line, n->pos, ! "only one argument allowed")); } --- 724,734 ---- if (NULL == n->args || 1 == n->args->argc) return(1); ! mdoc_vmsg(mdoc, MANDOCERR_SYNTARGCOUNT, ! n->line, n->pos, ! "line arguments == 1 (have %d)", ! n->args->argc); ! return(0); } *************** *** 720,729 **** /* FIXME: make sure is capitalised. */ if (0 == mdoc->meta.date || mdoc->meta.os) ! if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) return(0); if (mdoc->meta.title) ! if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) return(0); return(1); } --- 747,756 ---- /* FIXME: make sure is capitalised. */ if (0 == mdoc->meta.date || mdoc->meta.os) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO)) return(0); if (mdoc->meta.title) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP)) return(0); return(1); } *************** *** 734,743 **** { if (NULL == mdoc->meta.title || 0 == mdoc->meta.date) ! if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) return(0); if (mdoc->meta.os) ! if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) return(0); return(1); } --- 761,770 ---- { if (NULL == mdoc->meta.title || 0 == mdoc->meta.date) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO)) return(0); if (mdoc->meta.os) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP)) return(0); return(1); } *************** *** 748,757 **** { if (mdoc->meta.title || mdoc->meta.os) ! if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) return(0); if (mdoc->meta.date) ! if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) return(0); return(1); } --- 775,784 ---- { if (mdoc->meta.title || mdoc->meta.os) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGOOO)) return(0); if (mdoc->meta.date) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_PROLOGREP)) return(0); return(1); } *************** *** 768,780 **** head = mdoc->last->head; ! if (mdoc->last->args && head->child) ! return(mdoc_nerr(mdoc, mdoc->last, ELINE)); ! else if (mdoc->last->args) return(1); ! if (NULL == head->child || MDOC_TEXT != head->child->type) ! return(mdoc_nerr(mdoc, mdoc->last, ELINE)); p = head->child->string; --- 795,812 ---- head = mdoc->last->head; ! if (mdoc->last->args && head->child) { ! /* FIXME: this should provide a default. */ ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SYNTARGVCOUNT); ! return(0); ! } else if (mdoc->last->args) return(1); ! if (NULL == head->child || MDOC_TEXT != head->child->type) { ! /* FIXME: this should provide a default. */ ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SYNTARGVCOUNT); ! return(0); ! } p = head->child->string; *************** *** 785,791 **** else if (0 == strcmp(p, "Sy")) return(1); ! return(mdoc_nerr(mdoc, head, EFONT)); } --- 817,824 ---- else if (0 == strcmp(p, "Sy")) return(1); ! mdoc_nmsg(mdoc, head, MANDOCERR_FONTTYPE); ! return(0); } *************** *** 795,801 **** if (mdoc_a2lib(mdoc->last->child->string)) return(1); ! return(mdoc_nwarn(mdoc, mdoc->last, ELIB)); } --- 828,834 ---- if (mdoc_a2lib(mdoc->last->child->string)) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADLIB)); } *************** *** 818,824 **** for (n = mdoc->last->child; n; n = n->next) if (MDOC_TEXT != n->type) ! if ( ! mdoc_nwarn(mdoc, n, EBADCHILD)) return(0); return(1); --- 851,857 ---- for (n = mdoc->last->child; n; n = n->next) if (MDOC_TEXT != n->type) ! if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_CHILD)) return(0); return(1); *************** *** 833,839 **** return(1); if (mdoc->meta.name) return(1); ! return(mdoc_nerr(mdoc, mdoc->last, ENAME)); } --- 866,872 ---- return(1); if (mdoc->meta.name) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME)); } *************** *** 843,853 **** if (NULL == mdoc->last->child) return(1); ! if (MDOC_TEXT != mdoc->last->child->type) ! return(mdoc_nerr(mdoc, mdoc->last, EATT)); if (mdoc_a2att(mdoc->last->child->string)) return(1); ! return(mdoc_nwarn(mdoc, mdoc->last, EATT)); } --- 876,885 ---- if (NULL == mdoc->last->child) return(1); ! assert(MDOC_TEXT == mdoc->last->child->type); if (mdoc_a2att(mdoc->last->child->string)) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT)); } *************** *** 858,869 **** if (mdoc->last->args) { if (NULL == mdoc->last->child) return(1); ! return(mdoc_nerr(mdoc, mdoc->last, ENOLINE)); } if (mdoc->last->child) return(1); ! return(mdoc_nerr(mdoc, mdoc->last, ELINE)); } --- 890,901 ---- if (mdoc->last->args) { if (NULL == mdoc->last->child) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGCOUNT)); } if (mdoc->last->child) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)); } *************** *** 877,884 **** return(1); n = mdoc->last->parent->parent; ! if (NULL == n->args) ! return(mdoc_nerr(mdoc, mdoc->last, ELISTTYPE)); /* Some types require block-head, some not. */ --- 909,918 ---- return(1); n = mdoc->last->parent->parent; ! if (NULL == n->args) { ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE); ! return(0); ! } /* Some types require block-head, some not. */ *************** *** 915,927 **** break; } ! if (-1 == type) ! return(mdoc_nerr(mdoc, mdoc->last, ELISTTYPE)); switch (type) { case (MDOC_Tag): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) return(0); break; case (MDOC_Hang): --- 949,963 ---- break; } ! if (-1 == type) { ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE); ! return(0); ! } switch (type) { case (MDOC_Tag): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) return(0); break; case (MDOC_Hang): *************** *** 932,941 **** /* FALLTHROUGH */ case (MDOC_Diag): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) return(0); if (NULL == mdoc->last->body->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, EMULTILINE)) return(0); break; case (MDOC_Bullet): --- 968,977 ---- /* FALLTHROUGH */ case (MDOC_Diag): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) return(0); if (NULL == mdoc->last->body->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) return(0); break; case (MDOC_Bullet): *************** *** 948,983 **** /* FALLTHROUGH */ case (MDOC_Item): if (mdoc->last->head->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ENOLINE)) return(0); if (NULL == mdoc->last->body->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, EMULTILINE)) return(0); break; case (MDOC_Column): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) return(0); if (mdoc->last->body->child) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ENOMULTILINE)) return(0); c = mdoc->last->child; for (i = 0; c && MDOC_HEAD == c->type; c = c->next) i++; if (i < cols) { ! if ( ! mdoc_vwarn(mdoc, mdoc->last->line, ! mdoc->last->pos, "column " ! "mismatch: have %d, want %d", ! i, cols)) return(0); break; } else if (i == cols || i == cols + 1) break; ! return(mdoc_verr(mdoc, mdoc->last->line, ! mdoc->last->pos, "column mismatch: " ! "have %d, want %d", i, cols)); default: break; } --- 984,1021 ---- /* FALLTHROUGH */ case (MDOC_Item): if (mdoc->last->head->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST)) return(0); if (NULL == mdoc->last->body->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) return(0); break; case (MDOC_Column): if (NULL == mdoc->last->head->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) return(0); if (mdoc->last->body->child) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BODYLOST)) return(0); c = mdoc->last->child; for (i = 0; c && MDOC_HEAD == c->type; c = c->next) i++; if (i < cols) { ! if ( ! mdoc_vmsg(mdoc, MANDOCERR_ARGCOUNT, ! mdoc->last->line, ! mdoc->last->pos, ! "columns == %d (have %d)", ! cols, i)) return(0); break; } else if (i == cols || i == cols + 1) break; ! mdoc_vmsg(mdoc, MANDOCERR_SYNTARGCOUNT, ! mdoc->last->line, mdoc->last->pos, ! "columns == %d (have %d)", cols, i); ! return(0); default: break; } *************** *** 1000,1006 **** a = &n->args->argv[i]; if (a->arg == MDOC_Column) { if (a->sz && mdoc->last->nchild) ! return(mdoc_nerr(mdoc, n, ECOLMIS)); return(1); } } --- 1038,1044 ---- a = &n->args->argv[i]; if (a->arg == MDOC_Column) { if (a->sz && mdoc->last->nchild) ! return(mdoc_nmsg(mdoc, n, MANDOCERR_COLUMNS)); return(1); } } *************** *** 1035,1041 **** continue; if (MDOC_Sm == n->tok) continue; ! return(mdoc_nerr(mdoc, n, EBADCHILD)); } return(1); --- 1073,1080 ---- continue; if (MDOC_Sm == n->tok) continue; ! mdoc_nmsg(mdoc, n, MANDOCERR_SYNTCHILD); ! return(0); } return(1); *************** *** 1060,1066 **** if (NULL == n) return(1); ! return(mdoc_nerr(mdoc, n, EBOOL)); } --- 1099,1105 ---- if (NULL == n) return(1); ! return(mdoc_nmsg(mdoc, n, MANDOCERR_BADBOOL)); } *************** *** 1069,1084 **** { if (NULL == mdoc->first->child) ! return(mdoc_nerr(mdoc, mdoc->first, ENODAT)); ! if ( ! (MDOC_PBODY & mdoc->flags)) ! return(mdoc_nerr(mdoc, mdoc->first, ENOPROLOGUE)); ! if (MDOC_BLOCK != mdoc->first->child->type) ! return(mdoc_nerr(mdoc, mdoc->first, ENODAT)); ! if (MDOC_Sh != mdoc->first->child->tok) ! return(mdoc_nerr(mdoc, mdoc->first, ENODAT)); ! ! return(1); } --- 1108,1124 ---- { if (NULL == mdoc->first->child) ! mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCBODY); ! else if ( ! (MDOC_PBODY & mdoc->flags)) ! mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCPROLOG); ! else if (MDOC_BLOCK != mdoc->first->child->type) ! mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCBODY); ! else if (MDOC_Sh != mdoc->first->child->tok) ! mdoc_nmsg(mdoc, mdoc->first, MANDOCERR_NODOCBODY); ! else ! return(1); ! return(0); } *************** *** 1088,1094 **** if (mdoc_a2st(mdoc->last->child->string)) return(1); ! return(mdoc_nwarn(mdoc, mdoc->last, EBADSTAND)); } --- 1128,1134 ---- if (mdoc_a2st(mdoc->last->child->string)) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD)); } *************** *** 1131,1137 **** case(MDOC__V): break; default: ! return(mdoc_nerr(mdoc, nn, EBADCHILD)); } return(1); --- 1171,1178 ---- case(MDOC__V): break; default: ! mdoc_nmsg(mdoc, nn, MANDOCERR_SYNTCHILD); ! return(0); } return(1); *************** *** 1166,1186 **** */ if (NULL == (n = mdoc->last->child)) ! return(mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)); for ( ; n && n->next; n = n->next) { if (MDOC_ELEM == n->type && MDOC_Nm == n->tok) continue; if (MDOC_TEXT == n->type) continue; ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)) return(0); } assert(n); if (MDOC_BLOCK == n->type && MDOC_Nd == n->tok) return(1); ! return(mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)); } --- 1207,1227 ---- */ if (NULL == (n = mdoc->last->child)) ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC)); for ( ; n && n->next; n = n->next) { if (MDOC_ELEM == n->type && MDOC_Nm == n->tok) continue; if (MDOC_TEXT == n->type) continue; ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC)) return(0); } assert(n); if (MDOC_BLOCK == n->type && MDOC_Nd == n->tok) return(1); ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADNAMESEC)); } *************** *** 1198,1215 **** * certain manual sections. */ ! buf[0] = 0; for (n = mdoc->last->child; n; n = n->next) { /* XXX - copied from compact(). */ assert(MDOC_TEXT == n->type); ! if (strlcat(buf, n->string, 64) >= 64) ! return(mdoc_nerr(mdoc, n, ETOOLONG)); if (NULL == n->next) continue; ! if (strlcat(buf, " ", 64) >= 64) ! return(mdoc_nerr(mdoc, n, ETOOLONG)); } sec = mdoc_str2sec(buf); --- 1239,1265 ---- * certain manual sections. */ ! buf[0] = '\0'; + /* + * FIXME: yes, these can use a dynamic buffer, but I don't do so + * in the interests of simplicity. + */ + for (n = mdoc->last->child; n; n = n->next) { /* XXX - copied from compact(). */ assert(MDOC_TEXT == n->type); ! if (strlcat(buf, n->string, 64) >= 64) { ! mdoc_nmsg(mdoc, n, MANDOCERR_MEM); ! return(0); ! } if (NULL == n->next) continue; ! if (strlcat(buf, " ", 64) >= 64) { ! mdoc_nmsg(mdoc, n, MANDOCERR_MEM); ! return(0); ! } } sec = mdoc_str2sec(buf); *************** *** 1220,1237 **** */ if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECNAME)) return(0); if (SEC_CUSTOM == sec) return(1); if (sec == mdoc->lastnamed) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECREP)) return(0); if (sec < mdoc->lastnamed) ! if ( ! mdoc_nwarn(mdoc, mdoc->last, ESECOOO)) return(0); /* --- 1270,1287 ---- */ if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NAMESECFIRST)) return(0); if (SEC_CUSTOM == sec) return(1); if (sec == mdoc->lastnamed) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECREP)) return(0); if (sec < mdoc->lastnamed) ! if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECOOO)) return(0); /* *************** *** 1248,1254 **** break; if (*mdoc->meta.msec == '9') break; ! return(mdoc_nwarn(mdoc, mdoc->last, EWRONGMSEC)); default: break; } --- 1298,1304 ---- break; if (*mdoc->meta.msec == '9') break; ! return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_SECMSEC)); default: break; }