version 1.74, 2018/12/14 06:33:03 |
version 1.75, 2018/12/21 16:58:49 |
|
|
char *buf, enum roff_tok tok, char **v) |
char *buf, enum roff_tok tok, char **v) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
char *v_local; |
|
enum argsflag fl; |
enum argsflag fl; |
|
|
if (v == NULL) |
|
v = &v_local; |
|
fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok - MDOC_Dd].flags; |
fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok - MDOC_Dd].flags; |
|
|
/* |
/* |
|
|
char *buf, enum argsflag fl, char **v) |
char *buf, enum argsflag fl, char **v) |
{ |
{ |
char *p; |
char *p; |
|
char *v_local; |
int pairs; |
int pairs; |
|
|
if (buf[*pos] == '\0') { |
if (buf[*pos] == '\0') { |
|
|
return ARGS_EOLN; |
return ARGS_EOLN; |
} |
} |
|
|
|
if (v == NULL) |
|
v = &v_local; |
*v = buf + *pos; |
*v = buf + *pos; |
|
|
if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos)) |
if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos)) |
|
|
* Whitespace is NOT involved in literal termination. |
* Whitespace is NOT involved in literal termination. |
*/ |
*/ |
|
|
if (mdoc->flags & MDOC_PHRASELIT || buf[*pos] == '\"') { |
if (mdoc->flags & MDOC_PHRASELIT || |
if ( ! (mdoc->flags & MDOC_PHRASELIT)) |
(mdoc->flags & MDOC_PHRASE && buf[*pos] == '\"')) { |
|
if ((mdoc->flags & MDOC_PHRASELIT) == 0) { |
*v = &buf[++(*pos)]; |
*v = &buf[++(*pos)]; |
|
|
if (mdoc->flags & MDOC_PHRASE) |
|
mdoc->flags |= MDOC_PHRASELIT; |
mdoc->flags |= MDOC_PHRASELIT; |
|
} |
pairs = 0; |
pairs = 0; |
for ( ; buf[*pos]; (*pos)++) { |
for ( ; buf[*pos]; (*pos)++) { |
/* Move following text left after quoted quotes. */ |
/* Move following text left after quoted quotes. */ |
|
|
} |
} |
|
|
p = &buf[*pos]; |
p = &buf[*pos]; |
*v = mandoc_getarg(&p, line, pos); |
*v = roff_getarg(mdoc->roff, &p, line, pos); |
|
if (v == &v_local) |
|
free(*v); |
|
|
/* |
/* |
* After parsing the last word in this phrase, |
* After parsing the last word in this phrase, |
|
|
mdoc->flags &= ~MDOC_PHRASEQL; |
mdoc->flags &= ~MDOC_PHRASEQL; |
mdoc->flags |= MDOC_PHRASEQF; |
mdoc->flags |= MDOC_PHRASEQF; |
} |
} |
return ARGS_WORD; |
return ARGS_ALLOC; |
} |
} |
|
|
/* |
/* |
|
|
v->value = mandoc_reallocarray(v->value, |
v->value = mandoc_reallocarray(v->value, |
v->sz + MULTI_STEP, sizeof(char *)); |
v->sz + MULTI_STEP, sizeof(char *)); |
|
|
v->value[(int)v->sz] = mandoc_strdup(p); |
if (ac != ARGS_ALLOC) |
|
p = mandoc_strdup(p); |
|
v->value[(int)v->sz] = p; |
} |
} |
} |
} |
|
|
|
|
if (ac == ARGS_EOLN) |
if (ac == ARGS_EOLN) |
return; |
return; |
|
|
|
if (ac != ARGS_ALLOC) |
|
p = mandoc_strdup(p); |
|
|
v->sz = 1; |
v->sz = 1; |
v->value = mandoc_malloc(sizeof(char *)); |
v->value = mandoc_malloc(sizeof(char *)); |
v->value[0] = mandoc_strdup(p); |
v->value[0] = p; |
} |
} |