=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.9 retrieving revision 1.16 diff -u -p -r1.9 -r1.16 --- mandoc/mdoc_argv.c 2009/07/06 09:21:24 1.9 +++ mandoc/mdoc_argv.c 2009/07/17 12:28:38 1.16 @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.9 2009/07/06 09:21:24 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.16 2009/07/17 12:28:38 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -33,12 +33,10 @@ */ /* FIXME .Bf Li raises "macro-like parameter". */ -/* FIXME .Bl -column should deprecate old-groff syntax. */ #define ARGS_QUOTED (1 << 0) #define ARGS_DELIM (1 << 1) #define ARGS_TABSEP (1 << 2) -#define ARGS_ARGVLIKE (1 << 3) #define ARGV_NONE (1 << 0) #define ARGV_SINGLE (1 << 1) @@ -47,19 +45,6 @@ #define MULTI_STEP 5 -enum mwarn { - WQUOTPARM, - WARGVPARM, - WCOLEMPTY, - WTAILWS -}; - -enum merr { - EQUOTTERM, - EMALLOC, - EARGVAL -}; - static int argv_a2arg(int, const char *); static int args(struct mdoc *, int, int *, char *, int, char **); @@ -71,11 +56,7 @@ static int argv_opt_single(struct mdoc *, int, struct mdoc_argv *, int *, char *); static int argv_multi(struct mdoc *, int, struct mdoc_argv *, int *, char *); -static int pwarn(struct mdoc *, int, int, enum mwarn); -static int perr(struct mdoc *, int, int, enum merr); -#define verr(m, t) perr((m), (m)->last->line, (m)->last->pos, (t)) - /* Per-argument flags. */ static int mdoc_argvflags[MDOC_ARG_MAX] = { @@ -145,7 +126,7 @@ static int mdoc_argflags[MDOC_MAX] = { 0, /* Ot */ ARGS_DELIM, /* Pa */ 0, /* Rv */ - ARGS_DELIM | ARGS_ARGVLIKE, /* St */ + ARGS_DELIM, /* St */ ARGS_DELIM, /* Va */ ARGS_DELIM, /* Vt */ ARGS_DELIM, /* Xr */ @@ -226,6 +207,8 @@ static int mdoc_argflags[MDOC_MAX] = { 0, /* En */ 0, /* Dx */ ARGS_QUOTED, /* %Q */ + 0, /* br */ + 0, /* sp */ }; @@ -235,10 +218,9 @@ static int mdoc_argflags[MDOC_MAX] = { * one mandatory value, an optional single value, or no value. */ int -mdoc_argv(struct mdoc *mdoc, int line, int tok, +mdoc_argv(struct mdoc *m, int line, int tok, struct mdoc_arg **v, int *pos, char *buf) { - int i; char *p, sv; struct mdoc_argv tmp; struct mdoc_arg *arg; @@ -248,12 +230,8 @@ mdoc_argv(struct mdoc *mdoc, int line, int tok, assert(' ' != buf[*pos]); - if ('-' != buf[*pos] || ARGS_ARGVLIKE & mdoc_argflags[tok]) - return(ARGV_WORD); - /* Parse through to the first unescaped space. */ - i = *pos; p = &buf[++(*pos)]; assert(*pos > 0); @@ -284,21 +262,19 @@ mdoc_argv(struct mdoc *mdoc, int line, int tok, /* XXX - restore saved zeroed byte. */ if (sv) buf[*pos - 1] = sv; - if ( ! pwarn(mdoc, line, i, WARGVPARM)) - return(ARGV_ERROR); return(ARGV_WORD); } while (buf[*pos] && ' ' == buf[*pos]) (*pos)++; - if ( ! argv(mdoc, line, &tmp, pos, buf)) + if ( ! argv(m, line, &tmp, pos, buf)) return(ARGV_ERROR); if (NULL == (arg = *v)) { *v = calloc(1, sizeof(struct mdoc_arg)); if (NULL == *v) { - (void)verr(mdoc, EMALLOC); + (void)mdoc_nerr(m, m->last, EMALLOC); return(ARGV_ERROR); } arg = *v; @@ -309,7 +285,7 @@ mdoc_argv(struct mdoc *mdoc, int line, int tok, sizeof(struct mdoc_argv)); if (NULL == arg->argv) { - (void)verr(mdoc, EMALLOC); + (void)mdoc_nerr(m, m->last, EMALLOC); return(ARGV_ERROR); } @@ -351,59 +327,8 @@ mdoc_argv_free(struct mdoc_arg *p) } - -static int -perr(struct mdoc *mdoc, int line, int pos, enum merr code) -{ - char *p; - - p = NULL; - switch (code) { - case (EMALLOC): - p = "memory exhausted"; - break; - case (EQUOTTERM): - p = "unterminated quoted parameter"; - break; - case (EARGVAL): - p = "argument requires a value"; - break; - } - - assert(p); - return(mdoc_perr(mdoc, line, pos, p)); -} - - -static int -pwarn(struct mdoc *mdoc, int line, int pos, enum mwarn code) -{ - char *p; - - p = NULL; - - switch (code) { - case (WQUOTPARM): - p = "unexpected quoted parameter"; - break; - case (WARGVPARM): - p = "argument-like parameter"; - break; - case (WCOLEMPTY): - p = "last list column is empty"; - break; - case (WTAILWS): - p = "trailing whitespace"; - break; - } - - assert(p); - return(mdoc_pwarn(mdoc, line, pos, p)); -} - - int -mdoc_args(struct mdoc *mdoc, int line, +mdoc_args(struct mdoc *m, int line, int *pos, char *buf, int tok, char **v) { int fl, c, i; @@ -419,7 +344,7 @@ mdoc_args(struct mdoc *mdoc, int line, switch (tok) { case (MDOC_It): - for (n = mdoc->last; n; n = n->parent) + for (n = m->last; n; n = n->parent) if (MDOC_BLOCK == n->type && MDOC_Bl == n->tok) break; @@ -454,13 +379,13 @@ mdoc_args(struct mdoc *mdoc, int line, break; } - return(args(mdoc, line, pos, buf, fl, v)); + return(args(m, line, pos, buf, fl, v)); } static int -args(struct mdoc *mdoc, int line, - int *pos, char *buf, int fl, char **v) +args(struct mdoc *m, int line, int *pos, + char *buf, int fl, char **v) { int i; char *p, *pp; @@ -471,13 +396,9 @@ args(struct mdoc *mdoc, int line, return(ARGS_EOLN); if ('\"' == buf[*pos] && ! (fl & ARGS_QUOTED)) - if ( ! pwarn(mdoc, line, *pos, WQUOTPARM)) + if ( ! mdoc_pwarn(m, line, *pos, EQUOTPARM)) return(ARGS_ERROR); - if ( ! (fl & ARGS_ARGVLIKE) && '-' == buf[*pos]) - if ( ! pwarn(mdoc, line, *pos, WARGVPARM)) - return(ARGS_ERROR); - /* * If the first character is a delimiter and we're to look for * delimited strings, then pass down the buffer seeing if it @@ -567,11 +488,11 @@ args(struct mdoc *mdoc, int line, } if (p && 0 == *p) - if ( ! pwarn(mdoc, line, *pos, WCOLEMPTY)) - return(0); + if ( ! mdoc_pwarn(m, line, *pos, ECOLEMPTY)) + return(ARGS_ERROR); if (p && 0 == *p && p > *v && ' ' == *(p - 1)) - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) - return(0); + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + return(ARGS_ERROR); if (p) return(ARGS_PHRASE); @@ -582,8 +503,8 @@ args(struct mdoc *mdoc, int line, assert(p); if (p > *v && ' ' == *(p - 1)) - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) - return(0); + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + return(ARGS_ERROR); *pos += (int)(p - *v); return(ARGS_PHRASE); @@ -614,7 +535,7 @@ args(struct mdoc *mdoc, int line, if (buf[*pos]) return(ARGS_WORD); - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(ARGS_ERROR); return(ARGS_WORD); @@ -632,7 +553,7 @@ args(struct mdoc *mdoc, int line, (*pos)++; if (0 == buf[*pos]) { - (void)perr(mdoc, line, *pos, EQUOTTERM); + (void)mdoc_perr(m, line, *pos, EQUOTTERM); return(ARGS_ERROR); } @@ -646,7 +567,7 @@ args(struct mdoc *mdoc, int line, if (buf[*pos]) return(ARGS_QWORD); - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(ARGS_ERROR); return(ARGS_QWORD); @@ -752,7 +673,7 @@ argv_a2arg(int tok, const char *argv) static int -argv_multi(struct mdoc *mdoc, int line, +argv_multi(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) { int c; @@ -761,7 +682,7 @@ argv_multi(struct mdoc *mdoc, int line, for (v->sz = 0; ; v->sz++) { if ('-' == buf[*pos]) break; - c = args(mdoc, line, pos, buf, ARGS_QUOTED, &p); + c = args(m, line, pos, buf, ARGS_QUOTED, &p); if (ARGS_ERROR == c) return(0); else if (ARGS_EOLN == c) @@ -771,12 +692,12 @@ argv_multi(struct mdoc *mdoc, int line, v->value = realloc(v->value, (v->sz + MULTI_STEP) * sizeof(char *)); if (NULL == v->value) { - (void)verr(mdoc, EMALLOC); + (void)mdoc_nerr(m, m->last, EMALLOC); return(ARGV_ERROR); } } if (NULL == (v->value[(int)v->sz] = strdup(p))) - return(verr(mdoc, EMALLOC)); + return(mdoc_nerr(m, m->last, EMALLOC)); } return(1); @@ -784,7 +705,7 @@ argv_multi(struct mdoc *mdoc, int line, static int -argv_opt_single(struct mdoc *mdoc, int line, +argv_opt_single(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) { int c; @@ -793,7 +714,7 @@ argv_opt_single(struct mdoc *mdoc, int line, if ('-' == buf[*pos]) return(1); - c = args(mdoc, line, pos, buf, ARGS_QUOTED, &p); + c = args(m, line, pos, buf, ARGS_QUOTED, &p); if (ARGS_ERROR == c) return(0); if (ARGS_EOLN == c) @@ -801,9 +722,9 @@ argv_opt_single(struct mdoc *mdoc, int line, v->sz = 1; if (NULL == (v->value = calloc(1, sizeof(char *)))) - return(verr(mdoc, EMALLOC)); + return(mdoc_nerr(m, m->last, EMALLOC)); if (NULL == (v->value[0] = strdup(p))) - return(verr(mdoc, EMALLOC)); + return(mdoc_nerr(m, m->last, EMALLOC)); return(1); } @@ -813,7 +734,7 @@ argv_opt_single(struct mdoc *mdoc, int line, * Parse a single, mandatory value from the stream. */ static int -argv_single(struct mdoc *mdoc, int line, +argv_single(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) { int c, ppos; @@ -821,17 +742,17 @@ argv_single(struct mdoc *mdoc, int line, ppos = *pos; - c = args(mdoc, line, pos, buf, ARGS_QUOTED, &p); + c = args(m, line, pos, buf, ARGS_QUOTED, &p); if (ARGS_ERROR == c) return(0); if (ARGS_EOLN == c) - return(perr(mdoc, line, ppos, EARGVAL)); + return(mdoc_perr(m, line, ppos, EARGVAL)); v->sz = 1; if (NULL == (v->value = calloc(1, sizeof(char *)))) - return(verr(mdoc, EMALLOC)); + return(mdoc_nerr(m, m->last, EMALLOC)); if (NULL == (v->value[0] = strdup(p))) - return(verr(mdoc, EMALLOC)); + return(mdoc_nerr(m, m->last, EMALLOC)); return(1); }