summaryrefslogtreecommitdiffstats
path: root/macro.c
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 /macro.c
parent6cef110ea7c9248b1b0e3caead715fbe248dadac (diff)
downloadmandoc-9950b2b9fc5ab7d01626ea94dfb14ce446cf5927.tar.gz
Removed segfault with empty word.
Initial "full" -column support.
Diffstat (limited to 'macro.c')
-rw-r--r--macro.c45
1 files changed, 33 insertions, 12 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);
}