summaryrefslogtreecommitdiffstatshomepage
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
commit8b8c158fd8de44ca79949d5f916da9eb54a0566a (patch)
tree2b6cb5fa29beab27a3bc27e2515dd811d6638735 /macro.c
parent79712733ab4bcabb671c2ec700a2dc90c6d460d4 (diff)
downloadmandoc-8b8c158fd8de44ca79949d5f916da9eb54a0566a.tar.gz
mandoc-8b8c158fd8de44ca79949d5f916da9eb54a0566a.tar.zst
mandoc-8b8c158fd8de44ca79949d5f916da9eb54a0566a.zip
Removed segfault with empty word.
Initial "full" -column support.
Diffstat (limited to 'macro.c')
-rw-r--r--macro.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/macro.c b/macro.c
index a6b2ab30..9c4e393c 100644
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $Id: macro.c,v 1.67 2009/03/12 02:57:36 kristaps Exp $ */
+/* $Id: macro.c,v 1.68 2009/03/12 06:32:17 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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);
}