-/* $Id: argv.c,v 1.28 2009/02/23 15:19:47 kristaps Exp $ */
+/* $Id: argv.c,v 1.35 2009/03/03 22:28:21 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
#define ARGS_DELIM (1 << 1)
#define ARGS_TABSEP (1 << 2)
-static int lookup(int, const char *);
+static int argv_a2arg(int, const char *);
static int args(struct mdoc *, int, int *,
char *, int, char **);
static int argv(struct mdoc *, int,
0, /* Ed */
0, /* Bl */
0, /* El */
- ARGS_DELIM, /* It */
+ 0, /* It */
ARGS_DELIM, /* Ad */
ARGS_DELIM, /* An */
ARGS_DELIM, /* Ar */
/* LINTED */
for (i = 0; i < c; i++) {
- if (MDOC_Column != n->data.block.argv[i].arg)
- continue;
- fl |= ARGS_TABSEP;
- fl &= ~ARGS_DELIM;
- break;
+ switch (n->data.block.argv[i].arg) {
+ case (MDOC_Column):
+ fl |= ARGS_TABSEP;
+ fl &= ~ARGS_DELIM;
+ i = c;
+ break;
+ case (MDOC_Diag):
+ fl |= ARGS_QUOTED;
+ i = c;
+ break;
+ default:
+ break;
+ }
}
}
args(struct mdoc *mdoc, int line,
int *pos, char *buf, int fl, char **v)
{
- int i, c;
+ int i;
char *p, *pp;
assert(*pos > 0);
*/
if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos])) {
- for (i = *pos; (c = buf[i]); ) {
- if ( ! mdoc_iscdelim(c))
+ for (i = *pos; buf[i]; ) {
+ if ( ! mdoc_iscdelim(buf[i]))
break;
i++;
- if (0 == buf[i] || ! isspace(c))
+ /* There must be at least one space... */
+ if (0 == buf[i] || ! isspace((int)buf[i]))
break;
i++;
- while (buf[i] && isspace(c))
+ while (buf[i] && isspace((int)buf[i]))
i++;
}
if (0 == buf[i]) {
p++;
if (0 != *p)
*(p - 1) = 0;
- *pos += p - *v;
+ *pos += (int)(p - *v);
}
if (p && 0 == *p)
if (p > *v && ' ' == *(p - 1))
if ( ! pwarn(mdoc, line, *pos, WTAILWS))
return(0);
- *pos += p - *v;
+ *pos += (int)(p - *v);
return(ARGS_WORD);
}
/* Do non-tabsep look-ahead here. */
if ( ! (ARGS_TABSEP & fl))
- while ((c = buf[*pos])) {
- if (isspace(c))
+ while (buf[*pos]) {
+ if (isspace((int)buf[*pos]))
if ('\\' != buf[*pos - 1])
break;
(*pos)++;
static int
-lookup(int tok, const char *argv)
+argv_a2arg(int tok, const char *argv)
{
switch (tok) {
return(0);
} else if (ARGS_EOLN == c)
break;
- v->value[v->sz] = p;
+ v->value[(int)v->sz] = p;
}
if (0 < v->sz && v->sz < MDOC_LINEARG_MAX)
mdoc_argv(struct mdoc *mdoc, int line, int tok,
struct mdoc_arg *v, int *pos, char *buf)
{
- int i, ppos;
+ int i;
char *p;
(void)memset(v, 0, sizeof(struct mdoc_arg));
if (buf[*pos])
buf[(*pos)++] = 0;
- if (MDOC_ARG_MAX == (v->arg = lookup(tok, p))) {
+ if (MDOC_ARG_MAX == (v->arg = argv_a2arg(tok, p))) {
if ( ! pwarn(mdoc, line, i, WARGVPARM))
return(ARGV_ERROR);
return(ARGV_WORD);
/* FIXME: whitespace if no value. */
- ppos = *pos;
if ( ! argv(mdoc, line, v, pos, buf))
return(ARGV_ERROR);