=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.69 retrieving revision 1.75 diff -u -p -r1.69 -r1.75 --- mandoc/mdoc_argv.c 2011/03/17 11:09:36 1.69 +++ mandoc/mdoc_argv.c 2011/04/17 09:13:01 1.75 @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.69 2011/03/17 11:09:36 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.75 2011/04/17 09:13:01 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * @@ -26,6 +26,7 @@ #include #include +#include "mdoc.h" #include "mandoc.h" #include "libmdoc.h" #include "libmandoc.h" @@ -45,6 +46,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 void argn_free(struct mdoc_arg *, int); enum argvflag { ARGV_NONE, /* no args to flag (e.g., -split) */ @@ -207,6 +209,60 @@ static const int argflags[MDOC_MAX] = { 0, /* Ta */ }; +static const enum mdocargt args_Ex[] = { + MDOC_Std, + MDOC_ARG_MAX +}; + +static const enum mdocargt args_An[] = { + MDOC_Split, + MDOC_Nosplit, + MDOC_ARG_MAX +}; + +static const enum mdocargt args_Bd[] = { + MDOC_Ragged, + MDOC_Unfilled, + MDOC_Filled, + MDOC_Literal, + MDOC_File, + MDOC_Offset, + MDOC_Compact, + MDOC_Centred, + MDOC_ARG_MAX +}; + +static const enum mdocargt args_Bf[] = { + MDOC_Emphasis, + MDOC_Literal, + MDOC_Symbolic, + MDOC_ARG_MAX +}; + +static const enum mdocargt args_Bk[] = { + MDOC_Words, + MDOC_ARG_MAX +}; + +static const enum mdocargt args_Bl[] = { + MDOC_Bullet, + MDOC_Dash, + MDOC_Hyphen, + MDOC_Item, + MDOC_Enum, + MDOC_Tag, + MDOC_Diag, + MDOC_Hang, + MDOC_Ohang, + MDOC_Inset, + MDOC_Column, + MDOC_Width, + MDOC_Offset, + MDOC_Compact, + MDOC_Nested, + MDOC_ARG_MAX +}; + /* * Parse an argument from line text. This comes in the form of -key * [value0...], which may either have a single mandatory value, at least @@ -295,14 +351,14 @@ mdoc_argv_free(struct mdoc_arg *p) assert(p->argc); for (i = (int)p->argc - 1; i >= 0; i--) - mdoc_argn_free(p, i); + argn_free(p, i); free(p->argv); free(p); } -void -mdoc_argn_free(struct mdoc_arg *p, int iarg) +static void +argn_free(struct mdoc_arg *p, int iarg) { struct mdoc_argv *arg; int j; @@ -512,26 +568,10 @@ args(struct mdoc *m, int line, int *pos, return(ARGS_QWORD); } - /* - * A non-quoted term progresses until either the end of line or - * a non-escaped whitespace. - */ + p = &buf[*pos]; + *v = mandoc_getarg(m->parse, &p, line, + ! (ARGS_NOWARN & fl), pos); - for ( ; buf[*pos]; (*pos)++) - if (*pos && ' ' == buf[*pos] && '\\' != buf[*pos - 1]) - break; - - if ('\0' == buf[*pos]) - return(ARGS_WORD); - - buf[(*pos)++] = '\0'; - - while (' ' == buf[*pos]) - (*pos)++; - - if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl)) - mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE); - return(ARGS_WORD); } @@ -557,7 +597,7 @@ args_checkpunct(struct mdoc *m, const char *buf, int i return(0); dbuf[j] = '\0'; - if (DELIM_CLOSE != mandoc_isdelim(dbuf)) + if (DELIM_CLOSE != mdoc_isdelim(dbuf)) return(0); while (' ' == buf[i]) @@ -574,7 +614,7 @@ args_checkpunct(struct mdoc *m, const char *buf, int i return(0); dbuf[j] = '\0'; - d = mandoc_isdelim(dbuf); + d = mdoc_isdelim(dbuf); if (DELIM_NONE == d || DELIM_OPEN == d) return(0); @@ -596,63 +636,40 @@ args_checkpunct(struct mdoc *m, const char *buf, int i static enum mdocargt argv_a2arg(enum mdoct tok, const char *p) { - enum mdocargt args[MDOC_ARG_MAX]; - int i, len; + const enum mdocargt *argsp; - len = 0; + argsp = NULL; switch (tok) { case (MDOC_An): - args[len++] = MDOC_Split; - args[len++] = MDOC_Nosplit; + argsp = args_An; break; case (MDOC_Bd): - args[len++] = MDOC_Ragged; - args[len++] = MDOC_Unfilled; - args[len++] = MDOC_Filled; - args[len++] = MDOC_Literal; - args[len++] = MDOC_File; - args[len++] = MDOC_Offset; - args[len++] = MDOC_Compact; - args[len++] = MDOC_Centred; + argsp = args_Bd; break; case (MDOC_Bf): - args[len++] = MDOC_Emphasis; - args[len++] = MDOC_Literal; - args[len++] = MDOC_Symbolic; + argsp = args_Bf; break; case (MDOC_Bk): - args[len++] = MDOC_Words; + argsp = args_Bk; break; case (MDOC_Bl): - args[len++] = MDOC_Bullet; - args[len++] = MDOC_Dash; - args[len++] = MDOC_Hyphen; - args[len++] = MDOC_Item; - args[len++] = MDOC_Enum; - args[len++] = MDOC_Tag; - args[len++] = MDOC_Diag; - args[len++] = MDOC_Hang; - args[len++] = MDOC_Ohang; - args[len++] = MDOC_Inset; - args[len++] = MDOC_Column; - args[len++] = MDOC_Width; - args[len++] = MDOC_Offset; - args[len++] = MDOC_Compact; - args[len++] = MDOC_Nested; + argsp = args_Bl; break; case (MDOC_Rv): /* FALLTHROUGH */ case (MDOC_Ex): - args[len++] = MDOC_Std; + argsp = args_Ex; break; default: - break; + return(MDOC_ARG_MAX); } - for (i = 0; i < len; i++) - if (0 == strcmp(p, mdoc_argnames[args[i]])) - return(args[i]); + assert(argsp); + + for ( ; MDOC_ARG_MAX != *argsp ; argsp++) + if (0 == strcmp(p, mdoc_argnames[*argsp])) + return(*argsp); return(MDOC_ARG_MAX); }