=================================================================== RCS file: /cvs/mandoc/mdoc_argv.c,v retrieving revision 1.20 retrieving revision 1.24 diff -u -p -r1.20 -r1.24 --- mandoc/mdoc_argv.c 2009/07/20 14:09:38 1.20 +++ mandoc/mdoc_argv.c 2009/08/20 09:07:24 1.24 @@ -1,4 +1,4 @@ -/* $Id: mdoc_argv.c,v 1.20 2009/07/20 14:09:38 kristaps Exp $ */ +/* $Id: mdoc_argv.c,v 1.24 2009/08/20 09:07:24 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -32,11 +32,6 @@ * There's no limit to the number or arguments that may be allocated. */ -/* FIXME .Bf Li raises "macro-like parameter". */ - -#define ARGS_DELIM (1 << 1) -#define ARGS_TABSEP (1 << 2) - #define ARGV_NONE (1 << 0) #define ARGV_SINGLE (1 << 1) #define ARGV_MULTI (1 << 2) @@ -327,10 +322,11 @@ mdoc_argv_free(struct mdoc_arg *p) int -mdoc_zargs(struct mdoc *m, int line, int *pos, char *buf, char **v) +mdoc_zargs(struct mdoc *m, int line, int *pos, + char *buf, int flags, char **v) { - return(args(m, line, pos, buf, 0, v)); + return(args(m, line, pos, buf, flags, v)); } @@ -376,9 +372,24 @@ static int args(struct mdoc *m, int line, int *pos, char *buf, int fl, char **v) { - int i, psv; + int i; char *p, *pp; + /* + * Parse out the terms (like `val' in `.Xx -arg val' or simply + * `.Xx val'), which can have all sorts of properties: + * + * ARGS_DELIM: use special handling if encountering trailing + * delimiters in the form of [[::delim::][ ]+]+. + * + * ARGS_NOWARN: don't post warnings. This is only used when + * re-parsing delimiters, as the warnings have already been + * posted. + * + * ARGS_TABSEP: use special handling for tab/`Ta' separated + * phrases like in `Bl -column'. + */ + assert(*pos); assert(' ' != buf[*pos]); @@ -403,10 +414,14 @@ args(struct mdoc *m, int line, int *pos, i++; } - /* FIXME: warn about trailing whitespace. */ - if (0 == buf[i]) { *v = &buf[*pos]; + if (' ' != buf[i - 1]) + return(ARGS_PUNCT); + if (ARGS_NOWARN & fl) + return(ARGS_PUNCT); + if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) + return(ARGS_ERROR); return(ARGS_PUNCT); } } @@ -421,8 +436,6 @@ args(struct mdoc *m, int line, int *pos, */ if (ARGS_TABSEP & fl) { - psv = *pos; - /* Scan ahead to tab (can't be escaped). */ p = strchr(*v, '\t'); @@ -436,6 +449,10 @@ args(struct mdoc *m, int line, int *pos, break; } + /* + * Adjust new-buffer position to be beyond delimiter + * mark (e.g., Ta -> end + 2). + */ if (p && pp) { *pos += pp < p ? 2 : 1; p = pp < p ? pp : p; @@ -447,15 +464,14 @@ args(struct mdoc *m, int line, int *pos, } else p = strchr(*v, 0); - if (0 == *p && ' ' == *(p - 1)) + /* Whitespace check for eoln case... */ + if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl)) if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(ARGS_ERROR); - *p = 0; *pos += (int)(p - *v); /* Strip delimiter's preceding whitespace. */ - pp = p - 1; while (pp > *v && ' ' == *pp) { if (pp > *v && '\\' == *(pp - 1)) @@ -465,7 +481,6 @@ args(struct mdoc *m, int line, int *pos, *(pp + 1) = 0; /* Strip delimiter's proceeding whitespace. */ - for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++) /* Skip ahead. */ ; @@ -490,6 +505,8 @@ args(struct mdoc *m, int line, int *pos, } if (0 == buf[*pos]) { + if (ARGS_NOWARN & fl) + return(ARGS_QWORD); if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) return(ARGS_ERROR); return(ARGS_QWORD); @@ -503,7 +520,7 @@ args(struct mdoc *m, int line, int *pos, while (' ' == buf[*pos]) (*pos)++; - if (0 == buf[*pos]) + if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(ARGS_ERROR); @@ -527,7 +544,7 @@ args(struct mdoc *m, int line, int *pos, while (' ' == buf[*pos]) (*pos)++; - if (0 == buf[*pos]) + if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) return(ARGS_ERROR);