=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_argv.c,v retrieving revision 1.62 retrieving revision 1.63 diff -c -r1.62 -r1.63 *** src/usr.bin/mandoc/mdoc_argv.c 2015/10/15 22:45:07 1.62 --- src/usr.bin/mandoc/mdoc_argv.c 2015/10/17 00:19:58 1.63 *************** *** 1,4 **** ! /* $OpenBSD: mdoc_argv.c,v 1.62 2015/10/15 22:45:07 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2014, 2015 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: mdoc_argv.c,v 1.63 2015/10/17 00:19:58 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2014, 2015 Ingo Schwarze *************** *** 447,457 **** { char *p; int pairs; - enum margserr rc; if (buf[*pos] == '\0') { if (mdoc->flags & MDOC_PHRASELIT && ! ! (mdoc->flags & MDOC_PPHRASE)) { mandoc_msg(MANDOCERR_ARG_QUOTE, mdoc->parse, line, *pos, NULL); mdoc->flags &= ~MDOC_PHRASELIT; --- 447,456 ---- { char *p; int pairs; if (buf[*pos] == '\0') { if (mdoc->flags & MDOC_PHRASELIT && ! ! (mdoc->flags & MDOC_PHRASE)) { mandoc_msg(MANDOCERR_ARG_QUOTE, mdoc->parse, line, *pos, NULL); mdoc->flags &= ~MDOC_PHRASELIT; *************** *** 471,488 **** if (fl == ARGSFL_TABSEP) { if ((p = strchr(*v, '\t')) != NULL) { ! /* Skip any blank characters after the tab. */ *pos += (int)(p - *v) + 1; ! while (buf[*pos] == ' ') (*pos)++; ! rc = ARGS_PPHRASE; } else { p = strchr(*v, '\0'); if (p[-1] == ' ') mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse, line, *pos, NULL); *pos += (int)(p - *v); - rc = ARGS_PEND; } /* Skip any trailing blank characters. */ --- 470,510 ---- if (fl == ARGSFL_TABSEP) { if ((p = strchr(*v, '\t')) != NULL) { ! ! /* ! * Words right before and right after ! * tab characters are not parsed, ! * unless there is a blank in between. ! */ ! ! if (p[-1] != ' ') ! mdoc->flags |= MDOC_PHRASEQL; ! if (p[1] != ' ') ! mdoc->flags |= MDOC_PHRASEQN; ! ! /* ! * One or more blanks after a tab cause ! * one leading blank in the next column. ! * So skip all but one of them. ! */ ! *pos += (int)(p - *v) + 1; ! while (buf[*pos] == ' ' && buf[*pos + 1] == ' ') (*pos)++; ! ! /* ! * A tab at the end of an input line ! * switches to the next column. ! */ ! ! if (buf[*pos] == '\0' || buf[*pos + 1] == '\0') ! mdoc->flags |= MDOC_PHRASEQN; } else { p = strchr(*v, '\0'); if (p[-1] == ' ') mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse, line, *pos, NULL); *pos += (int)(p - *v); } /* Skip any trailing blank characters. */ *************** *** 491,497 **** p--; *p = '\0'; ! return rc; } /* --- 513,519 ---- p--; *p = '\0'; ! return ARGS_PHRASE; } /* *************** *** 502,512 **** * 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; pairs = 0; --- 524,534 ---- * Whitespace is NOT involved in literal termination. */ ! if (mdoc->flags & MDOC_PHRASELIT || buf[*pos] == '\"') { ! if ( ! (mdoc->flags & MDOC_PHRASELIT)) *v = &buf[++(*pos)]; ! if (mdoc->flags & MDOC_PHRASE) mdoc->flags |= MDOC_PHRASELIT; pairs = 0; *************** *** 526,536 **** if (pairs) buf[*pos - pairs] = '\0'; ! if ('\0' == buf[*pos]) { ! if (MDOC_PPHRASE & mdoc->flags) ! return ARGS_QWORD; ! mandoc_msg(MANDOCERR_ARG_QUOTE, ! mdoc->parse, line, *pos, NULL); return ARGS_QWORD; } --- 548,557 ---- if (pairs) buf[*pos - pairs] = '\0'; ! if (buf[*pos] == '\0') { ! if ( ! (mdoc->flags & MDOC_PHRASE)) ! mandoc_msg(MANDOCERR_ARG_QUOTE, ! mdoc->parse, line, *pos, NULL); return ARGS_QWORD; } *************** *** 553,558 **** --- 574,588 ---- p = &buf[*pos]; *v = mandoc_getarg(mdoc->parse, &p, line, pos); + /* + * After parsing the last word in this phrase, + * tell lookup() whether or not to interpret it. + */ + + if (*p == '\0' && mdoc->flags & MDOC_PHRASEQL) { + mdoc->flags &= ~MDOC_PHRASEQL; + mdoc->flags |= MDOC_PHRASEQF; + } return ARGS_WORD; }