aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/man.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-17 13:06:16 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-17 13:06:16 +0000
commit2fa768dd3258ecc39730b020f47e705a97c74d79 (patch)
treefc8959d9b49eeade80a7f7450bf11cffa45c796d /man.c
parent936ee863554c8349abc92544d5db2de95d83f48b (diff)
downloadmandoc-2fa768dd3258ecc39730b020f47e705a97c74d79.tar.gz
mandoc-2fa768dd3258ecc39730b020f47e705a97c74d79.tar.zst
mandoc-2fa768dd3258ecc39730b020f47e705a97c74d79.zip
correct handling of blank lines after \c
Diffstat (limited to 'man.c')
-rw-r--r--man.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/man.c b/man.c
index f2ba1bdb..a24c10d8 100644
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/* $Id: man.c,v 1.174 2017/06/03 15:55:24 schwarze Exp $ */
+/* $Id: man.c,v 1.175 2017/06/17 13:06:16 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -76,6 +76,8 @@ static int
man_ptext(struct roff_man *man, int line, char *buf, int offs)
{
int i;
+ const char *cp, *sp;
+ char *ep;
/* Literal free-form text whitespace is preserved. */
@@ -89,19 +91,36 @@ man_ptext(struct roff_man *man, int line, char *buf, int offs)
/* Skip leading whitespace. */ ;
/*
- * Blank lines are ignored in next line scope and right
- * after headings but add a single vertical space elsewhere.
+ * Blank lines are ignored in next line scope
+ * and right after headings and cancel preceding \c,
+ * but add a single vertical space elsewhere.
*/
if (buf[i] == '\0') {
- if (man->flags & (MAN_ELINE | MAN_BLINE))
+ if (man->flags & (MAN_ELINE | MAN_BLINE)) {
mandoc_msg(MANDOCERR_BLK_BLANK, man->parse,
line, 0, NULL);
- else if (man->last->tok != MAN_SH &&
- man->last->tok != MAN_SS) {
- roff_elem_alloc(man, line, offs, ROFF_sp);
- man->next = ROFF_NEXT_SIBLING;
+ return 1;
}
+ if (man->last->tok == MAN_SH || man->last->tok == MAN_SS)
+ return 1;
+ switch (man->last->type) {
+ case ROFFT_TEXT:
+ sp = man->last->string;
+ cp = ep = strchr(sp, '\0') - 2;
+ if (cp < sp || cp[0] != '\\' || cp[1] != 'c')
+ break;
+ while (cp > sp && cp[-1] == '\\')
+ cp--;
+ if ((ep - cp) % 2)
+ break;
+ *ep = '\0';
+ return 1;
+ default:
+ break;
+ }
+ roff_elem_alloc(man, line, offs, ROFF_sp);
+ man->next = ROFF_NEXT_SIBLING;
return 1;
}