version 1.20, 2009/07/20 14:09:38 |
version 1.22, 2009/08/19 14:44:35 |
|
|
* 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. |
*/ |
*/ |
|
|
/* FIXME .Bf Li raises "macro-like parameter". */ |
|
|
|
#define ARGS_DELIM (1 << 1) |
#define ARGS_DELIM (1 << 1) |
#define ARGS_TABSEP (1 << 2) |
#define ARGS_TABSEP (1 << 2) |
|
|
|
|
args(struct mdoc *m, int line, int *pos, |
args(struct mdoc *m, int line, int *pos, |
char *buf, int fl, char **v) |
char *buf, int fl, char **v) |
{ |
{ |
int i, psv; |
int i; |
char *p, *pp; |
char *p, *pp; |
|
|
assert(*pos); |
assert(*pos); |
Line 421 args(struct mdoc *m, int line, int *pos, |
|
Line 419 args(struct mdoc *m, int line, int *pos, |
|
*/ |
*/ |
|
|
if (ARGS_TABSEP & fl) { |
if (ARGS_TABSEP & fl) { |
psv = *pos; |
|
|
|
/* Scan ahead to tab (can't be escaped). */ |
/* Scan ahead to tab (can't be escaped). */ |
p = strchr(*v, '\t'); |
p = strchr(*v, '\t'); |
|
|
Line 436 args(struct mdoc *m, int line, int *pos, |
|
Line 432 args(struct mdoc *m, int line, int *pos, |
|
break; |
break; |
} |
} |
|
|
|
/* |
|
* Adjust new-buffer position to be beyond delimiter |
|
* mark (e.g., Ta -> end + 2). |
|
*/ |
if (p && pp) { |
if (p && pp) { |
*pos += pp < p ? 2 : 1; |
*pos += pp < p ? 2 : 1; |
p = pp < p ? pp : p; |
p = pp < p ? pp : p; |
Line 447 args(struct mdoc *m, int line, int *pos, |
|
Line 447 args(struct mdoc *m, int line, int *pos, |
|
} else |
} else |
p = strchr(*v, 0); |
p = strchr(*v, 0); |
|
|
|
/* Whitespace check for eoln case... */ |
if (0 == *p && ' ' == *(p - 1)) |
if (0 == *p && ' ' == *(p - 1)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
if ( ! mdoc_pwarn(m, line, *pos, ETAILWS)) |
return(ARGS_ERROR); |
return(ARGS_ERROR); |
|
|
*p = 0; |
|
*pos += (int)(p - *v); |
*pos += (int)(p - *v); |
|
|
/* Strip delimiter's preceding whitespace. */ |
/* Strip delimiter's preceding whitespace. */ |
|
|
pp = p - 1; |
pp = p - 1; |
while (pp > *v && ' ' == *pp) { |
while (pp > *v && ' ' == *pp) { |
if (pp > *v && '\\' == *(pp - 1)) |
if (pp > *v && '\\' == *(pp - 1)) |
Line 465 args(struct mdoc *m, int line, int *pos, |
|
Line 464 args(struct mdoc *m, int line, int *pos, |
|
*(pp + 1) = 0; |
*(pp + 1) = 0; |
|
|
/* Strip delimiter's proceeding whitespace. */ |
/* Strip delimiter's proceeding whitespace. */ |
|
|
for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++) |
for (pp = &buf[*pos]; ' ' == *pp; pp++, (*pos)++) |
/* Skip ahead. */ ; |
/* Skip ahead. */ ; |
|
|