=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.78 retrieving revision 1.80 diff -u -p -r1.78 -r1.80 --- mandoc/mdoc_argv.c 2011/06/18 16:18:04 1.78 +++ mandoc/mdoc_argv.c 2011/06/18 16:53:27 1.80 @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.78 2011/06/18 16:18:04 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.80 2011/06/18 16:53:27 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -52,18 +51,16 @@ struct mdocarg { const enum mdocargt *argvs; }; +static void argn_free(struct mdoc_arg *, int); static enum margserr args(struct mdoc *, int, int *, char *, enum argsflag, char **); static int args_checkpunct(const char *, int); -static int argv(struct mdoc *, int, +static int argv_multi(struct mdoc *, int, struct mdoc_argv *, int *, char *); -static int argv_single(struct mdoc *, int, - struct mdoc_argv *, int *, char *); static int argv_opt_single(struct mdoc *, int, struct mdoc_argv *, int *, char *); -static int argv_multi(struct mdoc *, int, +static int argv_single(struct mdoc *, int, struct mdoc_argv *, int *, char *); -static void argn_free(struct mdoc_arg *, int); static const enum argvflag argvflags[MDOC_ARG_MAX] = { ARGV_NONE, /* MDOC_Split */ @@ -292,9 +289,9 @@ mdoc_argv(struct mdoc *m, int line, enum mdoct tok, return(ARGV_EOLN); else if (NULL == (ap = mdocargs[tok].argvs)) return(ARGV_WORD); + else if ('-' != buf[*pos]) + return(ARGV_WORD); - assert(' ' != buf[*pos]); - /* Seek to the first unescaped space. */ p = &buf[++(*pos)]; @@ -345,8 +342,22 @@ mdoc_argv(struct mdoc *m, int line, enum mdoct tok, while (buf[*pos] && ' ' == buf[*pos]) (*pos)++; - if ( ! argv(m, line, &tmp, pos, buf)) - return(ARGV_ERROR); + switch (argvflags[tmp.arg]) { + case (ARGV_SINGLE): + if ( ! argv_single(m, line, &tmp, pos, buf)) + return(ARGV_ERROR); + break; + case (ARGV_MULTI): + if ( ! argv_multi(m, line, &tmp, pos, buf)) + return(ARGV_ERROR); + break; + case (ARGV_OPT_SINGLE): + if ( ! argv_opt_single(m, line, &tmp, pos, buf)) + return(ARGV_ERROR); + break; + case (ARGV_NONE): + break; + } if (NULL == (arg = *v)) arg = *v = mandoc_calloc(1, sizeof(struct mdoc_arg)); @@ -680,9 +691,6 @@ argv_opt_single(struct mdoc *m, int line, return(1); } -/* - * Parse a single, mandatory value from the stream. - */ static int argv_single(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) @@ -703,36 +711,6 @@ argv_single(struct mdoc *m, int line, v->sz = 1; v->value = mandoc_malloc(sizeof(char *)); v->value[0] = mandoc_strdup(p); - - return(1); -} - -/* - * Determine rules for parsing arguments. Arguments can either accept - * no parameters, an optional single parameter, one parameter, or - * multiple parameters. - */ -static int -argv(struct mdoc *mdoc, int line, - struct mdoc_argv *v, int *pos, char *buf) -{ - - v->sz = 0; - v->value = NULL; - - switch (argvflags[v->arg]) { - case (ARGV_SINGLE): - return(argv_single(mdoc, line, v, pos, buf)); - case (ARGV_MULTI): - return(argv_multi(mdoc, line, v, pos, buf)); - case (ARGV_OPT_SINGLE): - return(argv_opt_single(mdoc, line, v, pos, buf)); - case (ARGV_NONE): - break; - default: - abort(); - /* NOTREACHED */ - } return(1); }