From 9950b2b9fc5ab7d01626ea94dfb14ce446cf5927 Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Thu, 12 Mar 2009 06:32:17 +0000 Subject: Removed segfault with empty word. Initial "full" -column support. --- macro.c | 45 +++++++++++++++++++++++++++++++++------------ mdocterm.c | 4 ++-- term.c | 2 +- validate.c | 8 +++----- 4 files changed, 39 insertions(+), 20 deletions(-) diff --git a/macro.c b/macro.c index 0a641c8d..bc7ea24d 100644 --- a/macro.c +++ b/macro.c @@ -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); } diff --git a/mdocterm.c b/mdocterm.c index fb4b31de..a2fb262a 100644 --- a/mdocterm.c +++ b/mdocterm.c @@ -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)) diff --git a/term.c b/term.c index f0951c7b..dc27281b 100644 --- a/term.c +++ b/term.c @@ -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): diff --git a/validate.c b/validate.c index 7da4a197..e453352f 100644 --- a/validate.c +++ b/validate.c @@ -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; } -- cgit