version 1.22, 2009/08/19 14:44:35 |
version 1.26, 2009/09/24 13:03:32 |
|
|
* There's no limit to the number or arguments that may be allocated. |
* There's no limit to the number or arguments that may be allocated. |
*/ |
*/ |
|
|
#define ARGS_DELIM (1 << 1) |
|
#define ARGS_TABSEP (1 << 2) |
|
|
|
#define ARGV_NONE (1 << 0) |
#define ARGV_NONE (1 << 0) |
#define ARGV_SINGLE (1 << 1) |
#define ARGV_SINGLE (1 << 1) |
#define ARGV_MULTI (1 << 2) |
#define ARGV_MULTI (1 << 2) |
Line 63 static int mdoc_argvflags[MDOC_ARG_MAX] = { |
|
Line 60 static int mdoc_argvflags[MDOC_ARG_MAX] = { |
|
ARGV_NONE, /* MDOC_Unfilled */ |
ARGV_NONE, /* MDOC_Unfilled */ |
ARGV_NONE, /* MDOC_Literal */ |
ARGV_NONE, /* MDOC_Literal */ |
ARGV_NONE, /* MDOC_File */ |
ARGV_NONE, /* MDOC_File */ |
ARGV_SINGLE, /* MDOC_Offset */ |
ARGV_OPT_SINGLE, /* MDOC_Offset */ |
ARGV_NONE, /* MDOC_Bullet */ |
ARGV_NONE, /* MDOC_Bullet */ |
ARGV_NONE, /* MDOC_Dash */ |
ARGV_NONE, /* MDOC_Dash */ |
ARGV_NONE, /* MDOC_Hyphen */ |
ARGV_NONE, /* MDOC_Hyphen */ |
Line 77 static int mdoc_argvflags[MDOC_ARG_MAX] = { |
|
Line 74 static int mdoc_argvflags[MDOC_ARG_MAX] = { |
|
ARGV_MULTI, /* MDOC_Column */ |
ARGV_MULTI, /* MDOC_Column */ |
ARGV_SINGLE, /* MDOC_Width */ |
ARGV_SINGLE, /* MDOC_Width */ |
ARGV_NONE, /* MDOC_Compact */ |
ARGV_NONE, /* MDOC_Compact */ |
ARGV_OPT_SINGLE, /* MDOC_Std */ |
ARGV_NONE, /* MDOC_Std */ |
ARGV_NONE, /* MDOC_Filled */ |
ARGV_NONE, /* MDOC_Filled */ |
ARGV_NONE, /* MDOC_Words */ |
ARGV_NONE, /* MDOC_Words */ |
ARGV_NONE, /* MDOC_Emphasis */ |
ARGV_NONE, /* MDOC_Emphasis */ |
Line 312 mdoc_argv_free(struct mdoc_arg *p) |
|
Line 309 mdoc_argv_free(struct mdoc_arg *p) |
|
for (i = 0; i < (int)p->argc; i++) { |
for (i = 0; i < (int)p->argc; i++) { |
if (0 == p->argv[i].sz) |
if (0 == p->argv[i].sz) |
continue; |
continue; |
|
if (NULL == p->argv[i].value) |
|
continue; |
|
|
/* LINTED */ |
/* LINTED */ |
for (j = 0; j < (int)p->argv[i].sz; j++) |
for (j = 0; j < (int)p->argv[i].sz; j++) |
free(p->argv[i].value[j]); |
if (p->argv[i].value[j]) |
|
free(p->argv[i].value[j]); |
|
|
free(p->argv[i].value); |
free(p->argv[i].value); |
} |
} |
Line 325 mdoc_argv_free(struct mdoc_arg *p) |
|
Line 326 mdoc_argv_free(struct mdoc_arg *p) |
|
|
|
|
|
int |
int |
mdoc_zargs(struct mdoc *m, int line, int *pos, char *buf, char **v) |
mdoc_zargs(struct mdoc *m, int line, int *pos, |
|
char *buf, int flags, char **v) |
{ |
{ |
|
|
return(args(m, line, pos, buf, 0, v)); |
return(args(m, line, pos, buf, flags, v)); |
} |
} |
|
|
|
|
Line 377 args(struct mdoc *m, int line, int *pos, |
|
Line 379 args(struct mdoc *m, int line, int *pos, |
|
int i; |
int i; |
char *p, *pp; |
char *p, *pp; |
|
|
|
/* |
|
* Parse out the terms (like `val' in `.Xx -arg val' or simply |
|
* `.Xx val'), which can have all sorts of properties: |
|
* |
|
* ARGS_DELIM: use special handling if encountering trailing |
|
* delimiters in the form of [[::delim::][ ]+]+. |
|
* |
|
* ARGS_NOWARN: don't post warnings. This is only used when |
|
* re-parsing delimiters, as the warnings have already been |
|
* posted. |
|
* |
|
* ARGS_TABSEP: use special handling for tab/`Ta' separated |
|
* phrases like in `Bl -column'. |
|
*/ |
|
|
assert(*pos); |
assert(*pos); |
assert(' ' != buf[*pos]); |
assert(' ' != buf[*pos]); |
|
|
Line 401 args(struct mdoc *m, int line, int *pos, |
|
Line 418 args(struct mdoc *m, int line, int *pos, |
|
i++; |
i++; |
} |
} |
|
|
/* FIXME: warn about trailing whitespace. */ |
|
|
|
if (0 == buf[i]) { |
if (0 == buf[i]) { |
*v = &buf[*pos]; |
*v = &buf[*pos]; |
|
if (' ' != buf[i - 1]) |
|
return(ARGS_PUNCT); |
|
if (ARGS_NOWARN & fl) |
|
return(ARGS_PUNCT); |
|
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
|
return(ARGS_ERROR); |
return(ARGS_PUNCT); |
return(ARGS_PUNCT); |
} |
} |
} |
} |
Line 448 args(struct mdoc *m, int line, int *pos, |
|
Line 469 args(struct mdoc *m, int line, int *pos, |
|
p = strchr(*v, 0); |
p = strchr(*v, 0); |
|
|
/* Whitespace check for eoln case... */ |
/* Whitespace check for eoln case... */ |
if (0 == *p && ' ' == *(p - 1)) |
if (0 == *p && ' ' == *(p - 1) && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
Line 488 args(struct mdoc *m, int line, int *pos, |
|
Line 509 args(struct mdoc *m, int line, int *pos, |
|
} |
} |
|
|
if (0 == buf[*pos]) { |
if (0 == buf[*pos]) { |
|
if (ARGS_NOWARN & fl) |
|
return(ARGS_QWORD); |
if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) |
if ( ! mdoc_pwarn(m, line, *pos, EQUOTTERM)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
return(ARGS_QWORD); |
return(ARGS_QWORD); |
Line 501 args(struct mdoc *m, int line, int *pos, |
|
Line 524 args(struct mdoc *m, int line, int *pos, |
|
while (' ' == buf[*pos]) |
while (' ' == buf[*pos]) |
(*pos)++; |
(*pos)++; |
|
|
if (0 == buf[*pos]) |
if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
Line 525 args(struct mdoc *m, int line, int *pos, |
|
Line 548 args(struct mdoc *m, int line, int *pos, |
|
while (' ' == buf[*pos]) |
while (' ' == buf[*pos]) |
(*pos)++; |
(*pos)++; |
|
|
if (0 == buf[*pos]) |
if (0 == buf[*pos] && ! (ARGS_NOWARN & fl)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|