version 1.24, 2009/01/21 17:56:32 |
version 1.25, 2009/01/22 12:21:03 |
Line 46 static int parse_multi(struct mdoc *, int, |
|
Line 46 static int parse_multi(struct mdoc *, int, |
|
static int postparse(struct mdoc *, int, |
static int postparse(struct mdoc *, int, |
const struct mdoc_arg *, int); |
const struct mdoc_arg *, int); |
static int pwarn(struct mdoc *, int, int, int); |
static int pwarn(struct mdoc *, int, int, int); |
|
static int perr(struct mdoc *, int, int, int); |
|
|
#define WQUOTPARM (0) |
#define WQUOTPARM (0) |
#define WARGVPARM (1) |
#define WARGVPARM (1) |
|
#define WCOLEMPTY (2) |
|
#define WTAILWS (3) |
|
|
|
#define EQUOTTERM (0) |
|
#define EOFFSET (1) |
|
#define EARGVAL (2) |
|
#define EARGMANY (3) |
|
|
static int mdoc_argflags[MDOC_MAX] = { |
static int mdoc_argflags[MDOC_MAX] = { |
0, /* \" */ |
0, /* \" */ |
0, /* Dd */ |
0, /* Dd */ |
Line 161 static int mdoc_argflags[MDOC_MAX] = { |
|
Line 169 static int mdoc_argflags[MDOC_MAX] = { |
|
|
|
|
|
static int |
static int |
|
perr(struct mdoc *mdoc, int line, int pos, int code) |
|
{ |
|
int c; |
|
|
|
switch (code) { |
|
case (EQUOTTERM): |
|
c = mdoc_perr(mdoc, line, pos, |
|
"unterminated quoted parameter"); |
|
break; |
|
case (EOFFSET): |
|
c = mdoc_perr(mdoc, line, pos, |
|
"invalid value for offset argument"); |
|
break; |
|
case (EARGVAL): |
|
c = mdoc_perr(mdoc, line, pos, |
|
"argument requires a value"); |
|
break; |
|
case (EARGMANY): |
|
c = mdoc_perr(mdoc, line, pos, |
|
"too many values for argument"); |
|
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
|
} |
|
return(c); |
|
} |
|
|
|
|
|
static int |
pwarn(struct mdoc *mdoc, int line, int pos, int code) |
pwarn(struct mdoc *mdoc, int line, int pos, int code) |
{ |
{ |
int c; |
int c; |
Line 174 pwarn(struct mdoc *mdoc, int line, int pos, int code) |
|
Line 212 pwarn(struct mdoc *mdoc, int line, int pos, int code) |
|
c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX, |
c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX, |
"argument-like parameter"); |
"argument-like parameter"); |
break; |
break; |
|
case (WCOLEMPTY): |
|
c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX, |
|
"last list column is empty"); |
|
break; |
|
case (WTAILWS): |
|
c = mdoc_pwarn(mdoc, line, pos, WARN_COMPAT, |
|
"trailing whitespace"); |
|
break; |
default: |
default: |
abort(); |
abort(); |
/* NOTREACHED */ |
/* NOTREACHED */ |
Line 318 mdoc_args(struct mdoc *mdoc, int line, |
|
Line 364 mdoc_args(struct mdoc *mdoc, int line, |
|
p++; |
p++; |
if (0 != *p) |
if (0 != *p) |
*(p - 1) = 0; |
*(p - 1) = 0; |
else if (0 == *p) |
|
if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_SYNTAX, "empty final token")) /* FIXME: verbiage */ |
|
return(0); |
|
*pos += p - *v; |
*pos += p - *v; |
} |
} |
|
|
|
if (p && 0 == *p) |
|
if ( ! pwarn(mdoc, line, *pos, WCOLEMPTY)) |
|
return(0); |
|
if (p && 0 == *p && p > *v && ' ' == *(p - 1)) |
|
if ( ! pwarn(mdoc, line, *pos, WTAILWS)) |
|
return(0); |
|
|
/* Configure the eoln case, too. */ |
/* Configure the eoln case, too. */ |
|
|
if (NULL == p) { |
if (NULL == p) { |
p = strchr(*v, 0); |
p = strchr(*v, 0); |
assert(p); |
assert(p); |
|
|
/*if (p > *v && ' ' == *(p - 1)) |
if (p > *v && ' ' == *(p - 1)) |
Warn about whitespace. */ |
if ( ! pwarn(mdoc, line, *pos, WTAILWS)) |
|
return(0); |
*pos += p - *v; |
*pos += p - *v; |
} |
} |
|
|
Line 364 mdoc_args(struct mdoc *mdoc, int line, |
|
Line 414 mdoc_args(struct mdoc *mdoc, int line, |
|
if (buf[*pos]) |
if (buf[*pos]) |
return(ARGS_WORD); |
return(ARGS_WORD); |
|
|
if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_COMPAT, "whitespace at end-of-line")) |
if ( ! pwarn(mdoc, line, *pos, WTAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
return(ARGS_WORD); |
return(ARGS_WORD); |
Line 382 mdoc_args(struct mdoc *mdoc, int line, |
|
Line 432 mdoc_args(struct mdoc *mdoc, int line, |
|
(*pos)++; |
(*pos)++; |
|
|
if (0 == buf[*pos]) { |
if (0 == buf[*pos]) { |
(void)mdoc_perr(mdoc, line, *pos, "unterminated quoted parameter"); |
(void)perr(mdoc, line, *pos, EQUOTTERM); |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
} |
} |
|
|
Line 396 mdoc_args(struct mdoc *mdoc, int line, |
|
Line 446 mdoc_args(struct mdoc *mdoc, int line, |
|
if (buf[*pos]) |
if (buf[*pos]) |
return(ARGS_QWORD); |
return(ARGS_QWORD); |
|
|
if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_COMPAT, "whitespace at end-of-line")) |
if ( ! pwarn(mdoc, line, *pos, WTAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
return(ARGS_QWORD); |
return(ARGS_QWORD); |
Line 585 postparse(struct mdoc *mdoc, int line, const struct md |
|
Line 635 postparse(struct mdoc *mdoc, int line, const struct md |
|
break; |
break; |
if (xstrcmp(v->value[0], "indent-two")) |
if (xstrcmp(v->value[0], "indent-two")) |
break; |
break; |
return(mdoc_perr(mdoc, line, pos, "invalid offset value")); |
return(perr(mdoc, line, pos, EOFFSET)); |
default: |
default: |
break; |
break; |
} |
} |
Line 622 parse_multi(struct mdoc *mdoc, int line, |
|
Line 672 parse_multi(struct mdoc *mdoc, int line, |
|
return(1); |
return(1); |
|
|
free(v->value); |
free(v->value); |
return(mdoc_perr(mdoc, line, ppos, 0 == v->sz ? |
if (0 == v->sz) |
"argument requires a value" : |
return(perr(mdoc, line, ppos, EARGVAL)); |
"too many values to argument")); |
|
|
return(perr(mdoc, line, ppos, EARGMANY)); |
} |
} |
|
|
|
|
Line 641 parse_single(struct mdoc *mdoc, int line, |
|
Line 692 parse_single(struct mdoc *mdoc, int line, |
|
if (ARGS_ERROR == c) |
if (ARGS_ERROR == c) |
return(0); |
return(0); |
if (ARGS_EOLN == c) |
if (ARGS_EOLN == c) |
return(mdoc_perr(mdoc, line, ppos, "argument requires a value")); |
return(perr(mdoc, line, ppos, EARGVAL)); |
|
|
v->sz = 1; |
v->sz = 1; |
v->value = xcalloc(1, sizeof(char *)); |
v->value = xcalloc(1, sizeof(char *)); |
Line 710 mdoc_argv(struct mdoc *mdoc, int line, int tok, |
|
Line 761 mdoc_argv(struct mdoc *mdoc, int line, int tok, |
|
buf[(*pos)++] = 0; |
buf[(*pos)++] = 0; |
|
|
if (MDOC_ARG_MAX == (v->arg = lookup(tok, argv))) { |
if (MDOC_ARG_MAX == (v->arg = lookup(tok, argv))) { |
if ( ! mdoc_pwarn(mdoc, line, i, WARN_SYNTAX, "argument-like parameter")) |
if ( ! pwarn(mdoc, line, i, WARGVPARM)) |
return(ARGV_ERROR); |
return(ARGV_ERROR); |
return(ARGV_WORD); |
return(ARGV_WORD); |
} |
} |