for the .de parsing routine, roff_block(),
to correctly handle names terminated by escape sequences.
Besides, this saves us 20 lines of code.
-/* $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>
/*
* Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
static enum rofferr
roff_block(ROFF_ARGS)
{
static enum rofferr
roff_block(ROFF_ARGS)
{
- int sv;
- size_t sz;
- char *name;
+ char *name, *cp;
+ size_t namesz;
+ name = cp = *bufp + pos;
+ namesz = 0;
- if ('\0' == (*bufp)[pos]) {
mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL);
return(ROFF_IGN);
}
mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL);
return(ROFF_IGN);
}
if (ROFF_de1 == tok)
tok = ROFF_de;
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);
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);
roffnode_push(r, tok, name, ln, ppos);
* appended from roff_block_text() in multiline mode.
*/
* 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])
return(ROFF_IGN);
/* If present, process the custom end-of-line marker. */
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])
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);
return(ROFF_IGN);
mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL);
return(ROFF_IGN);