diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2017-06-17 13:06:16 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2017-06-17 13:06:16 +0000 |
commit | 8b829c3fb9f3b6e04849fd535eeb826b618e533a (patch) | |
tree | feb2614c572040eb7b2243865dae197c6991c68a /mdoc.c | |
parent | 559c18edcfbf60d30aedce9d3c81d132f3e77621 (diff) | |
download | mandoc-8b829c3fb9f3b6e04849fd535eeb826b618e533a.tar.gz |
correct handling of blank lines after \c
Diffstat (limited to 'mdoc.c')
-rw-r--r-- | mdoc.c | 28 |
1 files changed, 22 insertions, 6 deletions
@@ -179,6 +179,7 @@ static int mdoc_ptext(struct roff_man *mdoc, int line, char *buf, int offs) { struct roff_node *n; + const char *cp, *sp; char *c, *ws, *end; n = mdoc->last; @@ -244,15 +245,30 @@ mdoc_ptext(struct roff_man *mdoc, int line, char *buf, int offs) mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse, line, (int)(ws-buf), NULL); + /* + * Blank lines are allowed in no-fill mode + * and cancel preceding \c, + * but add a single vertical space elsewhere. + */ + if (buf[offs] == '\0' && ! (mdoc->flags & MDOC_LITERAL)) { + switch (mdoc->last->type) { + case ROFFT_TEXT: + sp = mdoc->last->string; + cp = end = strchr(sp, '\0') - 2; + if (cp < sp || cp[0] != '\\' || cp[1] != 'c') + break; + while (cp > sp && cp[-1] == '\\') + cp--; + if ((end - cp) % 2) + break; + *end = '\0'; + return 1; + default: + break; + } mandoc_msg(MANDOCERR_FI_BLANK, mdoc->parse, line, (int)(c - buf), NULL); - - /* - * Insert a `sp' in the case of a blank line. Technically, - * blank lines aren't allowed, but enough manuals assume this - * behaviour that we want to work around it. - */ roff_elem_alloc(mdoc, line, offs, ROFF_sp); mdoc->last->flags |= NODE_VALID | NODE_ENDED; mdoc->next = ROFF_NEXT_SIBLING; |