=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_argv.c,v retrieving revision 1.41 retrieving revision 1.42 diff -c -r1.41 -r1.42 *** src/usr.bin/mandoc/mdoc_argv.c 2012/11/16 18:40:39 1.41 --- src/usr.bin/mandoc/mdoc_argv.c 2012/11/17 00:25:20 1.42 *************** *** 1,4 **** ! /* $Id: mdoc_argv.c,v 1.41 2012/11/16 18:40:39 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012 Ingo Schwarze --- 1,4 ---- ! /* $Id: mdoc_argv.c,v 1.42 2012/11/17 00:25:20 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012 Ingo Schwarze *************** *** 271,277 **** * one mandatory value, an optional single value, or no value. */ enum margverr ! mdoc_argv(struct mdoc *m, int line, enum mdoct tok, struct mdoc_arg **v, int *pos, char *buf) { char *p, sv; --- 271,277 ---- * one mandatory value, an optional single value, or no value. */ enum margverr ! mdoc_argv(struct mdoc *mdoc, int line, enum mdoct tok, struct mdoc_arg **v, int *pos, char *buf) { char *p, sv; *************** *** 338,348 **** 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_NONE): --- 338,348 ---- switch (argvflags[tmp.arg]) { case (ARGV_SINGLE): ! if ( ! argv_single(mdoc, line, &tmp, pos, buf)) return(ARGV_ERROR); break; case (ARGV_MULTI): ! if ( ! argv_multi(mdoc, line, &tmp, pos, buf)) return(ARGV_ERROR); break; case (ARGV_NONE): *************** *** 403,416 **** } enum margserr ! mdoc_zargs(struct mdoc *m, int line, int *pos, char *buf, char **v) { ! return(args(m, line, pos, buf, ARGSFL_NONE, v)); } enum margserr ! mdoc_args(struct mdoc *m, int line, int *pos, char *buf, enum mdoct tok, char **v) { enum argsflag fl; --- 403,416 ---- } enum margserr ! mdoc_zargs(struct mdoc *mdoc, int line, int *pos, char *buf, char **v) { ! return(args(mdoc, line, pos, buf, ARGSFL_NONE, v)); } enum margserr ! mdoc_args(struct mdoc *mdoc, int line, int *pos, char *buf, enum mdoct tok, char **v) { enum argsflag fl; *************** *** 419,425 **** fl = mdocargs[tok].flags; if (MDOC_It != tok) ! return(args(m, line, pos, buf, fl, v)); /* * We know that we're in an `It', so it's reasonable to expect --- 419,425 ---- fl = mdocargs[tok].flags; if (MDOC_It != tok) ! return(args(mdoc, line, pos, buf, fl, v)); /* * We know that we're in an `It', so it's reasonable to expect *************** *** 428,462 **** * safe fall-back into the default behaviour. */ ! for (n = m->last; n; n = n->parent) if (MDOC_Bl == n->tok) if (LIST_column == n->norm->Bl.type) { fl = ARGSFL_TABSEP; break; } ! return(args(m, line, pos, buf, fl, v)); } static enum margserr ! args(struct mdoc *m, int line, int *pos, char *buf, enum argsflag fl, char **v) { char *p, *pp; enum margserr rc; if ('\0' == buf[*pos]) { ! if (MDOC_PPHRASE & m->flags) return(ARGS_EOLN); /* * If we're not in a partial phrase and the flag for * being a phrase literal is still set, the punctuation * is unterminated. */ ! if (MDOC_PHRASELIT & m->flags) ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE); ! m->flags &= ~MDOC_PHRASELIT; return(ARGS_EOLN); } --- 428,462 ---- * safe fall-back into the default behaviour. */ ! for (n = mdoc->last; n; n = n->parent) if (MDOC_Bl == n->tok) if (LIST_column == n->norm->Bl.type) { fl = ARGSFL_TABSEP; break; } ! return(args(mdoc, line, pos, buf, fl, v)); } static enum margserr ! args(struct mdoc *mdoc, int line, int *pos, char *buf, enum argsflag fl, char **v) { char *p, *pp; enum margserr rc; if ('\0' == buf[*pos]) { ! if (MDOC_PPHRASE & mdoc->flags) return(ARGS_EOLN); /* * If we're not in a partial phrase and the flag for * being a phrase literal is still set, the punctuation * is unterminated. */ ! if (MDOC_PHRASELIT & mdoc->flags) ! mdoc_pmsg(mdoc, line, *pos, MANDOCERR_BADQUOTE); ! mdoc->flags &= ~MDOC_PHRASELIT; return(ARGS_EOLN); } *************** *** 479,485 **** pp = NULL; /* Scan ahead to unescaped `Ta'. */ ! if ( ! (MDOC_PHRASELIT & m->flags)) for (pp = *v; ; pp++) { if (NULL == (pp = strstr(pp, "Ta"))) break; --- 479,485 ---- pp = NULL; /* Scan ahead to unescaped `Ta'. */ ! if ( ! (MDOC_PHRASELIT & mdoc->flags)) for (pp = *v; ; pp++) { if (NULL == (pp = strstr(pp, "Ta"))) break; *************** *** 513,519 **** /* Whitespace check for eoln case... */ if ('\0' == *p && ' ' == *(p - 1)) ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE); *pos += (int)(p - *v); --- 513,519 ---- /* Whitespace check for eoln case... */ if ('\0' == *p && ' ' == *(p - 1)) ! mdoc_pmsg(mdoc, line, *pos, MANDOCERR_EOLNSPACE); *pos += (int)(p - *v); *************** *** 539,550 **** * Whitespace is NOT involved in literal termination. */ ! if (MDOC_PHRASELIT & m->flags || '\"' == buf[*pos]) { ! if ( ! (MDOC_PHRASELIT & m->flags)) *v = &buf[++(*pos)]; ! if (MDOC_PPHRASE & m->flags) ! m->flags |= MDOC_PHRASELIT; for ( ; buf[*pos]; (*pos)++) { if ('\"' != buf[*pos]) --- 539,550 ---- * Whitespace is NOT involved in literal termination. */ ! if (MDOC_PHRASELIT & mdoc->flags || '\"' == buf[*pos]) { ! if ( ! (MDOC_PHRASELIT & mdoc->flags)) *v = &buf[++(*pos)]; ! if (MDOC_PPHRASE & mdoc->flags) ! mdoc->flags |= MDOC_PHRASELIT; for ( ; buf[*pos]; (*pos)++) { if ('\"' != buf[*pos]) *************** *** 555,567 **** } if ('\0' == buf[*pos]) { ! if (MDOC_PPHRASE & m->flags) return(ARGS_QWORD); ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE); return(ARGS_QWORD); } ! m->flags &= ~MDOC_PHRASELIT; buf[(*pos)++] = '\0'; if ('\0' == buf[*pos]) --- 555,567 ---- } if ('\0' == buf[*pos]) { ! if (MDOC_PPHRASE & mdoc->flags) return(ARGS_QWORD); ! mdoc_pmsg(mdoc, line, *pos, MANDOCERR_BADQUOTE); return(ARGS_QWORD); } ! mdoc->flags &= ~MDOC_PHRASELIT; buf[(*pos)++] = '\0'; if ('\0' == buf[*pos]) *************** *** 571,583 **** (*pos)++; if ('\0' == buf[*pos]) ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE); return(ARGS_QWORD); } p = &buf[*pos]; ! *v = mandoc_getarg(m->parse, &p, line, pos); return(ARGS_WORD); } --- 571,583 ---- (*pos)++; if ('\0' == buf[*pos]) ! mdoc_pmsg(mdoc, line, *pos, MANDOCERR_EOLNSPACE); return(ARGS_QWORD); } p = &buf[*pos]; ! *v = mandoc_getarg(mdoc->parse, &p, line, pos); return(ARGS_WORD); } *************** *** 633,639 **** } static int ! argv_multi(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) { enum margserr ac; --- 633,639 ---- } static int ! argv_multi(struct mdoc *mdoc, int line, struct mdoc_argv *v, int *pos, char *buf) { enum margserr ac; *************** *** 642,648 **** for (v->sz = 0; ; v->sz++) { if ('-' == buf[*pos]) break; ! ac = args(m, line, pos, buf, ARGSFL_NONE, &p); if (ARGS_ERROR == ac) return(0); else if (ARGS_EOLN == ac) --- 642,648 ---- for (v->sz = 0; ; v->sz++) { if ('-' == buf[*pos]) break; ! ac = args(mdoc, line, pos, buf, ARGSFL_NONE, &p); if (ARGS_ERROR == ac) return(0); else if (ARGS_EOLN == ac) *************** *** 659,671 **** } static int ! argv_single(struct mdoc *m, int line, struct mdoc_argv *v, int *pos, char *buf) { enum margserr ac; char *p; ! ac = args(m, line, pos, buf, ARGSFL_NONE, &p); if (ARGS_ERROR == ac) return(0); if (ARGS_EOLN == ac) --- 659,671 ---- } static int ! argv_single(struct mdoc *mdoc, int line, struct mdoc_argv *v, int *pos, char *buf) { enum margserr ac; char *p; ! ac = args(mdoc, line, pos, buf, ARGSFL_NONE, &p); if (ARGS_ERROR == ac) return(0); if (ARGS_EOLN == ac)