=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.9 retrieving revision 1.11 diff -u -p -r1.9 -r1.11 --- mandoc/mdoc_argv.c 2009/07/06 09:21:24 1.9 +++ mandoc/mdoc_argv.c 2009/07/06 13:04:52 1.11 @@ -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.11 2009/07/06 13:04:52 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -47,19 +47,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 +58,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] = { @@ -235,7 +218,7 @@ 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; @@ -284,7 +267,7 @@ 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)) + if ( ! mdoc_pwarn(m, line, i, EARGVPARM)) return(ARGV_ERROR); return(ARGV_WORD); } @@ -292,13 +275,13 @@ mdoc_argv(struct mdoc *mdoc, int line, int tok, 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 +292,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 +334,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 +351,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,12 +386,12 @@ 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, +args(struct mdoc *m, int line, int *pos, char *buf, int fl, char **v) { int i; @@ -471,11 +403,11 @@ 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)) + if ( ! mdoc_pwarn(m, line, *pos, EARGVPARM)) return(ARGS_ERROR); /* @@ -567,10 +499,10 @@ args(struct mdoc *mdoc, int line, } if (p && 0 == *p) - if ( ! pwarn(mdoc, line, *pos, WCOLEMPTY)) + if ( ! mdoc_pwarn(m, line, *pos, ECOLEMPTY)) return(0); if (p && 0 == *p && p > *v && ' ' == *(p - 1)) - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(0); if (p) @@ -582,7 +514,7 @@ args(struct mdoc *mdoc, int line, assert(p); if (p > *v && ' ' == *(p - 1)) - if ( ! pwarn(mdoc, line, *pos, WTAILWS)) + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(0); *pos += (int)(p - *v); @@ -614,7 +546,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 +564,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 +578,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 +684,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 +693,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 +703,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 +716,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 +725,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 +733,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 +745,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 +753,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); }