=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.46 retrieving revision 1.51 diff -u -p -r1.46 -r1.51 --- mandoc/mdoc_argv.c 2010/05/14 12:55:22 1.46 +++ mandoc/mdoc_argv.c 2010/05/31 10:28:04 1.51 @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.46 2010/05/14 12:55:22 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.51 2010/05/31 10:28:04 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -26,6 +26,7 @@ #include #include +#include "mandoc.h" #include "libmdoc.h" #include "libmandoc.h" @@ -209,6 +210,7 @@ static int mdoc_argflags[MDOC_MAX] = { 0, /* br */ 0, /* sp */ 0, /* %U */ + 0, /* Ta */ }; @@ -338,7 +340,7 @@ enum margserr mdoc_args(struct mdoc *m, int line, int *pos, char *buf, enum mdoct tok, char **v) { - int fl, c, i; + int fl; struct mdoc_node *n; fl = mdoc_argflags[tok]; @@ -346,26 +348,20 @@ mdoc_args(struct mdoc *m, int line, int *pos, if (MDOC_It != tok) return(args(m, line, pos, buf, fl, v)); - /* - * The `It' macro is a special case, as it acquires parameters from its - * parent `Bl' context, specifically, we're concerned with -column. + /* + * We know that we're in an `It', so it's reasonable to expect + * us to be sitting in a `Bl'. Someday this may not be the case + * (if we allow random `It's sitting out there), so provide a + * safe fall-back into the default behaviour. */ for (n = m->last; n; n = n->parent) - if (MDOC_BLOCK == n->type && MDOC_Bl == n->tok) + if (MDOC_Bl == n->tok) break; - assert(n); - c = (int)(n->args ? n->args->argc : 0); - assert(c > 0); - - /* LINTED */ - for (i = 0; i < c; i++) { - if (MDOC_Column != n->args->argv[i].arg) - continue; + if (n && LIST_column == n->data.list) { fl |= ARGS_TABSEP; fl &= ~ARGS_DELIM; - break; } return(args(m, line, pos, buf, fl, v)); @@ -399,7 +395,7 @@ args(struct mdoc *m, int line, int *pos, assert(' ' != buf[*pos]); if ('\0' == buf[*pos]) { - if (ARGS_PPHRASED & fl) + if (MDOC_PPHRASE & m->flags) return(ARGS_EOLN); /* * If we're not in a partial phrase and the flag for @@ -407,7 +403,7 @@ args(struct mdoc *m, int line, int *pos, * is unterminated. */ if (MDOC_PHRASELIT & m->flags) - if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE)) return(ARGS_ERROR); m->flags &= ~MDOC_PHRASELIT; @@ -421,9 +417,10 @@ args(struct mdoc *m, int line, int *pos, * we ONLY care about closing delimiters. */ - if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos]) > 1) { + if ((fl & ARGS_DELIM) && DELIM_CLOSE == mdoc_iscdelim(buf[*pos])) { for (i = *pos; buf[i]; ) { - if (mdoc_iscdelim(buf[i]) < 2) + enum mdelim d = mdoc_iscdelim(buf[i]); + if (DELIM_NONE == d || DELIM_OPEN == d) break; i++; if ('\0' == buf[i] || ' ' != buf[i]) @@ -439,7 +436,7 @@ args(struct mdoc *m, int line, int *pos, return(ARGS_PUNCT); if (ARGS_NOWARN & fl) return(ARGS_PUNCT); - if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) return(ARGS_ERROR); return(ARGS_PUNCT); } @@ -466,7 +463,7 @@ args(struct mdoc *m, int line, int *pos, break; if (pp > *v && ' ' != *(pp - 1)) continue; - if (' ' == *(pp + 2) || 0 == *(pp + 2)) + if (' ' == *(pp + 2) || '\0' == *(pp + 2)) break; } @@ -494,7 +491,7 @@ args(struct mdoc *m, int line, int *pos, /* Whitespace check for eoln case... */ if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl)) - if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) return(ARGS_ERROR); *pos += (int)(p - *v); @@ -525,7 +522,7 @@ args(struct mdoc *m, int line, int *pos, if ( ! (MDOC_PHRASELIT & m->flags)) *v = &buf[++(*pos)]; - if (ARGS_PPHRASED & fl) + if (MDOC_PPHRASE & m->flags) m->flags |= MDOC_PHRASELIT; for ( ; buf[*pos]; (*pos)++) { @@ -537,9 +534,9 @@ args(struct mdoc *m, int line, int *pos, } if ('\0' == buf[*pos]) { - if (ARGS_NOWARN & fl || ARGS_PPHRASED & fl) + if (ARGS_NOWARN & fl || MDOC_PPHRASE & m->flags) return(ARGS_QWORD); - if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE)) return(ARGS_ERROR); return(ARGS_QWORD); } @@ -554,7 +551,7 @@ args(struct mdoc *m, int line, int *pos, (*pos)++; if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) - if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) return(ARGS_ERROR); return(ARGS_QWORD); @@ -578,7 +575,7 @@ args(struct mdoc *m, int line, int *pos, (*pos)++; if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl)) - if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE)) return(ARGS_ERROR); return(ARGS_WORD); @@ -750,10 +747,11 @@ argv_single(struct mdoc *m, int line, ppos = *pos; ac = args(m, line, pos, buf, 0, &p); - if (ARGS_ERROR == ac) + if (ARGS_EOLN == ac) { + mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTARGVCOUNT); return(0); - if (ARGS_EOLN == ac) - return(mdoc_perr(m, line, ppos, EARGVAL)); + } else if (ARGS_ERROR == ac) + return(0); v->sz = 1; v->value = mandoc_malloc(sizeof(char *));