diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-12 06:32:17 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-12 06:32:17 +0000 |
commit | 9950b2b9fc5ab7d01626ea94dfb14ce446cf5927 (patch) | |
tree | 5d61e3240d93f97b918b5e5b0cb3e191531c3345 | |
parent | 6cef110ea7c9248b1b0e3caead715fbe248dadac (diff) | |
download | mandoc-9950b2b9fc5ab7d01626ea94dfb14ce446cf5927.tar.gz |
Removed segfault with empty word.
Initial "full" -column support.
-rw-r--r-- | macro.c | 45 | ||||
-rw-r--r-- | mdocterm.c | 4 | ||||
-rw-r--r-- | term.c | 2 | ||||
-rw-r--r-- | validate.c | 8 |
4 files changed, 39 insertions, 20 deletions
@@ -40,7 +40,7 @@ static int macro_text(MACRO_PROT_ARGS); static int macro_scoped(MACRO_PROT_ARGS); static int macro_scoped_close(MACRO_PROT_ARGS); static int macro_scoped_line(MACRO_PROT_ARGS); -static int macro_phrase(struct mdoc *, int, char *); +static int macro_phrase(struct mdoc *, int, int, char *); #define REWIND_REWIND (1 << 0) #define REWIND_NOHALT (1 << 1) @@ -1004,7 +1004,7 @@ macro_scoped(MACRO_PROT_ARGS) * in the columnar output of a macro. They need * special handling. */ - if ( ! macro_phrase(mdoc, line, p)) + if ( ! macro_phrase(mdoc, line, lastarg, buf)) return(0); if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) return(0); @@ -1459,19 +1459,40 @@ macro_phrase(struct mdoc *mdoc, int line, int ppos, char *buf) { int i, la, c; - i = ppos; + for (i = ppos; buf[i]; ) { + assert(' ' != buf[i]); -again: - la = i; - while (buf[i] && ! isspace((unsigned char)buf[i])) - i++; + la = i; + if ('\"' == buf[i]) { + la = ++i; + while (buf[i] && '\"' != buf[i]) + i++; + if (0 == buf[i]) + return(mdoc_err(mdoc, "unterminated quoted parameter")); + } else + while (buf[i] && ! isspace ((unsigned char)buf[i])) + i++; - if (0 == buf[i]) - return(mdoc_word_alloc(mdoc, line, la, buf)); + if (buf[i]) + buf[i++] = 0; - buf[i] = 0; + while (buf[i] && isspace((unsigned char)buf[i])) + i++; - if (MDOC_MAX == (c = mdoc_tokhash_find(mdoc->htab, p))) { - if ( ! mdoc_word_alloc(mdoc, line, + if (MDOC_MAX != (c = mdoc_tokhash_find(mdoc->htab, &buf[la]))) { + if ( ! mdoc_macro(mdoc, c, line, la, &i, buf)) + return(0); + + return(1); + } + + if ( ! mdoc_word_alloc(mdoc, line, la, &buf[la])) + return(0); + mdoc->next = MDOC_NEXT_SIBLING; + + while (buf[i] && isspace((unsigned char)buf[i])) + i++; } + + return(1); } @@ -430,8 +430,8 @@ word(struct termp *p, const char *word) return; } - len = strlen(word); - assert(len > 0); + if (0 == (len = strlen(word))) + errx(1, "blank line not in literal context"); if (mdoc_isdelim(word)) { if ( ! (p->flags & TERMP_IGNDELIM)) @@ -531,7 +531,7 @@ termp_it_pre(DECL_ARGS) case (MDOC_Enum): /* FALLTHROUGH */ case (MDOC_Hyphen): - if (width > 4) + if (width < 4) width = 4; break; case (MDOC_Tag): @@ -1187,15 +1187,13 @@ post_it(POST_ARGS) if (mdoc->last->body->child) if ( ! mwarn(mdoc, WNOMULTILINE)) return(0); - c = mdoc->last->head; + c = mdoc->last->child; for (i = 0; c && MDOC_HEAD == c->type; c = c->next) i++; if (i == cols) break; - if ( ! mdoc_warn(mdoc, WARN_SYNTAX, - "column mismatch (have %d, want %d)", i, cols)) - return(0); - break; + return(mdoc_err(mdoc, "column mismatch (have " + "%d, want %d)", i, cols)); default: break; } |