summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-12 06:32:17 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-12 06:32:17 +0000
commit9950b2b9fc5ab7d01626ea94dfb14ce446cf5927 (patch)
tree5d61e3240d93f97b918b5e5b0cb3e191531c3345
parent6cef110ea7c9248b1b0e3caead715fbe248dadac (diff)
downloadmandoc-9950b2b9fc5ab7d01626ea94dfb14ce446cf5927.tar.gz
Removed segfault with empty word.
Initial "full" -column support.
-rw-r--r--macro.c45
-rw-r--r--mdocterm.c4
-rw-r--r--term.c2
-rw-r--r--validate.c8
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;
}