-/* $Id: mdoc_argv.c,v 1.45 2010/05/09 21:06:50 kristaps Exp $ */
+/* $Id: mdoc_argv.c,v 1.49 2010/05/17 22:11:42 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
#include <stdio.h>
#include <string.h>
+#include "mandoc.h"
#include "libmdoc.h"
#include "libmandoc.h"
assert(*pos);
assert(' ' != buf[*pos]);
- if ('\0' == buf[*pos])
+ 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)
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE))
+ return(ARGS_ERROR);
+
+ m->flags &= ~MDOC_PHRASELIT;
return(ARGS_EOLN);
+ }
/*
* If the first character is a closing delimiter and we're to
* we ONLY care about closing delimiters.
*/
- if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos]) > 1) {
+ if ((fl & ARGS_DELIM) && DELIM_CLOSE == mdoc_iscdelim(buf[*pos])) {
for (i = *pos; buf[i]; ) {
- if ( mdoc_iscdelim(buf[i]) < 2)
+ enum mdelim d = mdoc_iscdelim(buf[i]);
+ if (DELIM_NONE == d || DELIM_OPEN == d)
break;
i++;
if ('\0' == buf[i] || ' ' != buf[i])
return(ARGS_PUNCT);
if (ARGS_NOWARN & fl)
return(ARGS_PUNCT);
- if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
return(ARGS_ERROR);
return(ARGS_PUNCT);
}
if (ARGS_TABSEP & fl) {
/* Scan ahead to tab (can't be escaped). */
p = strchr(*v, '\t');
+ pp = NULL;
/* Scan ahead to unescaped `Ta'. */
- for (pp = *v; ; pp++) {
- if (NULL == (pp = strstr(pp, "Ta")))
- break;
- if (pp > *v && ' ' != *(pp - 1))
- continue;
- if (' ' == *(pp + 2) || 0 == *(pp + 2))
- break;
- }
+ if ( ! (MDOC_PHRASELIT & m->flags))
+ for (pp = *v; ; pp++) {
+ if (NULL == (pp = strstr(pp, "Ta")))
+ break;
+ if (pp > *v && ' ' != *(pp - 1))
+ continue;
+ if (' ' == *(pp + 2) || 0 == *(pp + 2))
+ break;
+ }
/* By default, assume a phrase. */
rc = ARGS_PHRASE;
/* Whitespace check for eoln case... */
if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl))
- if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
return(ARGS_ERROR);
*pos += (int)(p - *v);
* Whitespace is NOT involved in literal termination.
*/
- if ('\"' == buf[*pos]) {
- *v = &buf[++(*pos)];
+ 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])
(*pos)++;
}
- if (0 == buf[*pos]) {
- if (ARGS_NOWARN & fl)
+ if ('\0' == buf[*pos]) {
+ if (ARGS_NOWARN & fl || MDOC_PPHRASE & m->flags)
return(ARGS_QWORD);
- if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM))
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_BADQUOTE))
return(ARGS_ERROR);
return(ARGS_QWORD);
}
- buf[(*pos)++] = 0;
+ m->flags &= ~MDOC_PHRASELIT;
+ buf[(*pos)++] = '\0';
- if (0 == buf[*pos])
+ if ('\0' == buf[*pos])
return(ARGS_QWORD);
while (' ' == buf[*pos])
(*pos)++;
if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
- if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
return(ARGS_ERROR);
return(ARGS_QWORD);
if (' ' == buf[*pos] && '\\' != buf[*pos - 1])
break;
- if (0 == buf[*pos])
+ if ('\0' == buf[*pos])
return(ARGS_WORD);
- buf[(*pos)++] = 0;
+ buf[(*pos)++] = '\0';
while (' ' == buf[*pos])
(*pos)++;
- if (0 == buf[*pos] && ! (ARGS_NOWARN & fl))
- if ( ! mdoc_pwarn(m, line, *pos, ETAILWS))
+ if ('\0' == buf[*pos] && ! (ARGS_NOWARN & fl))
+ if ( ! mdoc_pmsg(m, line, *pos, MANDOCERR_EOLNSPACE))
return(ARGS_ERROR);
return(ARGS_WORD);
ppos = *pos;
ac = args(m, line, pos, buf, 0, &p);
- if (ARGS_ERROR == ac)
+ if (ARGS_EOLN == ac) {
+ mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTARGVCOUNT);
+ return(0);
+ } else if (ARGS_ERROR == ac)
return(0);
- if (ARGS_EOLN == ac)
- return(mdoc_perr(m, line, ppos, EARGVAL));
v->sz = 1;
v->value = mandoc_malloc(sizeof(char *));