=================================================================== RCS file: /cvs/mandoc/man_validate.c,v retrieving revision 1.64 retrieving revision 1.68 diff -u -p -r1.64 -r1.68 --- mandoc/man_validate.c 2011/03/17 11:56:17 1.64 +++ mandoc/man_validate.c 2011/04/09 15:29:40 1.68 @@ -1,4 +1,4 @@ -/* $Id: man_validate.c,v 1.64 2011/03/17 11:56:17 kristaps Exp $ */ +/* $Id: man_validate.c,v 1.68 2011/04/09 15:29:40 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze @@ -30,6 +30,7 @@ #include #include +#include "man.h" #include "mandoc.h" #include "libman.h" #include "libmandoc.h" @@ -53,7 +54,7 @@ static int check_par(CHKARGS); static int check_part(CHKARGS); static int check_root(CHKARGS); static int check_sec(CHKARGS); -static int check_text(CHKARGS); +static void check_text(CHKARGS); static int post_AT(CHKARGS); static int post_fi(CHKARGS); @@ -150,7 +151,8 @@ man_valid_post(struct man *m) switch (m->last->type) { case (MAN_TEXT): - return(check_text(m, m->last)); + check_text(m, m->last); + return(1); case (MAN_ROOT): return(check_root(m, m->last)); case (MAN_EQN): @@ -196,58 +198,63 @@ check_root(CHKARGS) m->meta.title = mandoc_strdup("unknown"); m->meta.msec = mandoc_strdup("1"); - m->meta.date = mandoc_normdate(NULL, - m->msg, m->data, n->line, n->pos); + m->meta.date = mandoc_normdate + (m->parse, NULL, n->line, n->pos); } return(1); } - -static int +static void check_text(CHKARGS) { - char *p; - int pos, c; + char *p, *pp, *cpp; + int pos; size_t sz; - for (p = n->string, pos = n->pos + 1; *p; p++, pos++) { + p = n->string; + pos = n->pos + 1; + + while ('\0' != *p) { sz = strcspn(p, "\t\\"); - p += (int)sz; - if ('\0' == *p) - break; - + p += (int)sz; pos += (int)sz; if ('\t' == *p) { - if (MAN_LITERAL & m->flags) - continue; - man_pmsg(m, n->line, pos, MANDOCERR_BADTAB); + if ( ! (MAN_LITERAL & m->flags)) + man_pmsg(m, n->line, pos, MANDOCERR_BADTAB); + p++; + pos++; continue; - } + } else if ('\0' == *p) + break; - /* Check the special character. */ + pos++; + pp = ++p; - c = mandoc_special(p); - if (c) { - p += c - 1; - pos += c - 1; - } else + if (ESCAPE_ERROR == mandoc_escape + ((const char **)&pp, NULL, NULL)) { man_pmsg(m, n->line, pos, MANDOCERR_BADESCAPE); - } + break; + } - return(1); + cpp = p; + while (NULL != (cpp = memchr(cpp, ASCII_HYPH, pp - cpp))) + *cpp = '-'; + + pos += pp - p; + p = pp; + } } - #define INEQ_DEFINE(x, ineq, name) \ static int \ check_##name(CHKARGS) \ { \ if (n->nchild ineq (x)) \ return(1); \ - man_vmsg(m, MANDOCERR_ARGCOUNT, n->line, n->pos, \ + mandoc_vmsg(MANDOCERR_ARGCOUNT, m->parse, n->line, n->pos, \ "line arguments %s %d (have %d)", \ #ineq, (x), n->nchild); \ return(1); \ @@ -299,14 +306,17 @@ check_ft(CHKARGS) } if (0 == ok) { - man_vmsg(m, MANDOCERR_BADFONT, - n->line, n->pos, "%s", cp); + mandoc_vmsg + (MANDOCERR_BADFONT, m->parse, + n->line, n->pos, "%s", cp); *cp = '\0'; } if (1 < n->nchild) - man_vmsg(m, MANDOCERR_ARGCOUNT, n->line, n->pos, - "want one child (have %d)", n->nchild); + mandoc_vmsg + (MANDOCERR_ARGCOUNT, m->parse, n->line, + n->pos, "want one child (have %d)", + n->nchild); return(1); } @@ -319,7 +329,8 @@ check_sec(CHKARGS) man_nmsg(m, n, MANDOCERR_SYNTARGCOUNT); return(0); } else if (MAN_BODY == n->type && 0 == n->nchild) - man_nmsg(m, n, MANDOCERR_NOBODY); + mandoc_msg(MANDOCERR_ARGCWARN, m->parse, n->line, + n->pos, "want children (have none)"); return(1); } @@ -330,7 +341,8 @@ check_part(CHKARGS) { if (MAN_BODY == n->type && 0 == n->nchild) - man_nmsg(m, n, MANDOCERR_NOBODY); + mandoc_msg(MANDOCERR_ARGCWARN, m->parse, n->line, + n->pos, "want children (have none)"); return(1); } @@ -426,8 +438,8 @@ post_TH(CHKARGS) n = n->next; if (n) pos = n->pos; - m->meta.date = mandoc_normdate(n ? n->string : NULL, - m->msg, m->data, line, pos); + m->meta.date = mandoc_normdate + (m->parse, n ? n->string : NULL, line, pos); /* TITLE MSEC DATE ->SOURCE<- VOL */