summaryrefslogtreecommitdiffstats
path: root/mdoc.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-05-08 08:36:44 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-05-08 08:36:44 +0000
commitd0924326c0c8e754370d5d2d2142366c3a75ae70 (patch)
treef6e7eb3799bf9f4b01e6f4c70cbf361a3640630c /mdoc.c
parentc10df4f63596660b1a585dd712a0778b88ec5874 (diff)
downloadmandoc-d0924326c0c8e754370d5d2d2142366c3a75ae70.tar.gz
Strip trailing, unescaped whitespace from free-form, non-literal lines (like groff).
Diffstat (limited to 'mdoc.c')
-rw-r--r--mdoc.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/mdoc.c b/mdoc.c
index 9bb391a2..1a6d23f8 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -665,16 +665,30 @@ mdoc_ptext(struct mdoc *m, int line, char *buf)
return(1);
}
- /* Warn if the last un-escaped character is whitespace. */
+ /*
+ * Warn if the last un-escaped character is whitespace. Then
+ * strip away the remaining spaces (tabs stay!).
+ */
i = (int)strlen(buf);
assert(i);
- if (' ' == buf[i - 1] || '\t' == buf[i - 1])
- if (1 == i || ('\\' != buf[i - 2]))
+ if (' ' == buf[i - 1] || '\t' == buf[i - 1]) {
+ assert(i > 1);
+ if ('\\' != buf[i - 2])
if ( ! mdoc_pwarn(m, line, i - 1, ETAILWS))
return(0);
+ for (--i; i && ' ' == buf[i]; i--)
+ /* Spin back to non-space. */ ;
+
+ /* Jump ahead of escaped whitespace. */
+ assert(i);
+ i += '\\' == buf[i] ? 2 : 1;
+
+ buf[i] = '\0';
+ }
+
/* Allocate the whole word. */
return(mdoc_word_alloc(m, line, 0, buf));