aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--roff.c58
1 files changed, 19 insertions, 39 deletions
diff --git a/roff.c b/roff.c
index 2b01f593..91448da3 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.212 2014/06/29 22:14:10 schwarze Exp $ */
+/* $Id: roff.c,v 1.213 2014/06/29 22:38:47 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -910,14 +910,14 @@ roff_ccond(struct roff *r, int ln, int ppos)
static enum rofferr
roff_block(ROFF_ARGS)
{
- int sv;
- size_t sz;
- char *name;
+ char *name, *cp;
+ size_t namesz;
- name = NULL;
+ name = cp = *bufp + pos;
+ namesz = 0;
if (ROFF_ig != tok) {
- if ('\0' == (*bufp)[pos]) {
+ if ('\0' == *cp) {
mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL);
return(ROFF_IGN);
}
@@ -929,18 +929,14 @@ roff_block(ROFF_ARGS)
if (ROFF_de1 == tok)
tok = ROFF_de;
- if (ROFF_de == tok)
- name = *bufp + pos;
- else
+ else if (ROFF_de != tok)
mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos,
roffs[tok].name);
- while ((*bufp)[pos] && ! isspace((unsigned char)(*bufp)[pos]))
- pos++;
-
- while (isspace((unsigned char)(*bufp)[pos]))
- (*bufp)[pos++] = '\0';
- }
+ namesz = roff_getname(r, &cp, ln, ppos);
+ name[namesz] = '\0';
+ } else
+ name = NULL;
roffnode_push(r, tok, name, ln, ppos);
@@ -950,36 +946,20 @@ roff_block(ROFF_ARGS)
* appended from roff_block_text() in multiline mode.
*/
- if (ROFF_de == tok)
- roff_setstr(r, name, "", 0);
+ if (namesz && ROFF_de == tok)
+ roff_setstrn(&r->strtab, name, namesz, "", 0, 0);
- if ('\0' == (*bufp)[pos])
+ if ('\0' == *cp)
return(ROFF_IGN);
/* If present, process the custom end-of-line marker. */
- sv = pos;
- while ((*bufp)[pos] && ! isspace((unsigned char)(*bufp)[pos]))
- pos++;
+ name = cp;
+ namesz = roff_getname(r, &cp, ln, ppos);
+ if (namesz)
+ r->last->end = mandoc_strndup(name, namesz);
- /*
- * Note: groff does NOT like escape characters in the input.
- * Instead of detecting this, we're just going to let it fly and
- * to hell with it.
- */
-
- assert(pos > sv);
- sz = (size_t)(pos - sv);
-
- if (1 == sz && '.' == (*bufp)[sv])
- return(ROFF_IGN);
-
- r->last->end = mandoc_malloc(sz + 1);
-
- memcpy(r->last->end, *bufp + sv, sz);
- r->last->end[(int)sz] = '\0';
-
- if ((*bufp)[pos])
+ if ('\0' != *cp)
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);
return(ROFF_IGN);