From ffd36f32dbbe968941923914f7f8630c797a1206 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Tue, 20 Jan 2009 13:05:28 +0000 Subject: Quoted-literals handled correctly. --- argv.c | 6 +++--- macro.c | 60 ++++++++++++++++++++++++++++++++---------------------------- mdoc.c | 1 + private.h | 1 + 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/argv.c b/argv.c index b0a33c13..bd050efb 100644 --- a/argv.c +++ b/argv.c @@ -148,18 +148,18 @@ mdoc_args(struct mdoc *mdoc, int line, int *pos, char *buf, int fl, char **v) buf[(*pos)++] = 0; if (0 == buf[*pos]) - return(ARGS_WORD); + return(ARGS_QWORD); while (buf[*pos] && isspace(buf[*pos])) (*pos)++; if (buf[*pos]) - return(ARGS_WORD); + return(ARGS_QWORD); if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_COMPAT, "whitespace at end-of-line")) return(ARGS_ERROR); - return(ARGS_WORD); + return(ARGS_QWORD); } diff --git a/macro.c b/macro.c index 9851f60c..f2febe0f 100644 --- a/macro.c +++ b/macro.c @@ -574,7 +574,7 @@ macro_scoped_close(MACRO_PROT_ARGS) int macro_text(MACRO_PROT_ARGS) { - int la, lastpunct, c, fl, argc; + int la, lastpunct, c, w, fl, argc; struct mdoc_arg argv[MDOC_LINEARG_MAX]; char *p; @@ -617,35 +617,38 @@ macro_text(MACRO_PROT_ARGS) lastpunct = 0; for (;;) { la = *pos; - c = mdoc_args(mdoc, line, pos, buf, fl, &p); - if (ARGS_ERROR == c) { + w = mdoc_args(mdoc, line, pos, buf, fl, &p); + if (ARGS_ERROR == w) { mdoc_argv_free(argc, argv); return(0); } - if (ARGS_EOLN == c) + if (ARGS_EOLN == w) break; - if (ARGS_PUNCT == c) + if (ARGS_PUNCT == w) break; - if (-1 == (c = lookup(mdoc, line, la, tok, p))) - return(0); - else if (MDOC_MAX != c) { + c = ARGS_QWORD == w ? MDOC_MAX : + lookup(mdoc, line, la, tok, p); + + if (MDOC_MAX != c && -1 != c) { if (0 == lastpunct && ! rewind_elem(mdoc, tok)) { mdoc_argv_free(argc, argv); return(0); } mdoc_argv_free(argc, argv); - c = mdoc_macro(mdoc, c, line, la, pos, buf); if (0 == c) return(0); if (ppos > 1) return(1); return(append_delims(mdoc, line, pos, buf)); + } else if (-1 == c) { + mdoc_argv_free(argc, argv); + return(0); } - if (mdoc_isdelim(p)) { + if (ARGS_QWORD != w && mdoc_isdelim(p)) { if (0 == lastpunct && ! rewind_elem(mdoc, tok)) { mdoc_argv_free(argc, argv); return(0); @@ -1113,23 +1116,19 @@ macro_constant_delimited(MACRO_PROT_ARGS) int macro_constant(MACRO_PROT_ARGS) { - int c, lastarg, argc, fl; + int c, w, la, argc, fl; struct mdoc_arg argv[MDOC_LINEARG_MAX]; char *p; assert( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)); - fl = 0; - if (MDOC_QUOTABLE & mdoc_macros[tok].flags) - fl = ARGS_QUOTED; - for (argc = 0; argc < MDOC_LINEARG_MAX; argc++) { - lastarg = *pos; + la = *pos; c = mdoc_argv(mdoc, line, tok, &argv[argc], pos, buf); if (ARGV_EOLN == c) break; if (ARGV_WORD == c) { - *pos = lastarg; + *pos = la; break; } else if (ARGV_ARG == c) continue; @@ -1151,24 +1150,29 @@ macro_constant(MACRO_PROT_ARGS) mdoc->next = MDOC_NEXT_CHILD; + fl = 0; + if (MDOC_QUOTABLE & mdoc_macros[tok].flags) + fl = ARGS_QUOTED; + for (;;) { - lastarg = *pos; - c = mdoc_args(mdoc, line, pos, buf, fl, &p); - if (ARGS_ERROR == c) + la = *pos; + w = mdoc_args(mdoc, line, pos, buf, fl, &p); + if (ARGS_ERROR == w) return(0); - if (ARGS_EOLN == c) + if (ARGS_EOLN == w) break; - if (-1 == (c = lookup(mdoc, line, lastarg, tok, p))) - return(0); - else if (MDOC_MAX != c) { + c = ARGS_QWORD == w ? MDOC_MAX : + lookup(mdoc, line, la, tok, p); + + if (MDOC_MAX != c && -1 != c) { if ( ! rewind_elem(mdoc, tok)) return(0); - return(mdoc_macro(mdoc, c, line, - lastarg, pos, buf)); - } + return(mdoc_macro(mdoc, c, line, la, pos, buf)); + } else if (-1 == c) + return(0); - if ( ! mdoc_word_alloc(mdoc, line, lastarg, p)) + if ( ! mdoc_word_alloc(mdoc, line, la, p)) return(0); mdoc->next = MDOC_NEXT_SIBLING; } diff --git a/mdoc.c b/mdoc.c index 67350c40..ca45b4ae 100644 --- a/mdoc.c +++ b/mdoc.c @@ -432,6 +432,7 @@ mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *p) break; } + /* This sort-of works (re-opening of text macros...). */ if (mdoc->linetok > MDOC_LINEARG_SOFTMAX) if ( ! mdoc_nwarn(mdoc, p, WARN_COMPAT, "suggested %d tokens per line exceeded (has %d)", diff --git a/private.h b/private.h index cf894321..2af41f52 100644 --- a/private.h +++ b/private.h @@ -157,6 +157,7 @@ int mdoc_args(struct mdoc *, int, #define ARGS_EOLN (0) #define ARGS_WORD (1) #define ARGS_PUNCT (2) +#define ARGS_QWORD (3) #define ARGS_QUOTED (1 << 0) #define ARGS_DELIM (1 << 1) -- cgit