summaryrefslogtreecommitdiffstats
path: root/man.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 /man.c
parentc10df4f63596660b1a585dd712a0778b88ec5874 (diff)
downloadmandoc-d0924326c0c8e754370d5d2d2142366c3a75ae70.tar.gz
Strip trailing, unescaped whitespace from free-form, non-literal lines (like groff).
Diffstat (limited to 'man.c')
-rw-r--r--man.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/man.c b/man.c
index 828698d7..28c72df6 100644
--- a/man.c
+++ b/man.c
@@ -395,16 +395,30 @@ man_ptext(struct man *m, int line, char *buf)
goto descope;
}
- /* 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 ( ! man_pwarn(m, line, i - 1, WTSPACE))
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';
+ }
+
if ( ! man_word_alloc(m, line, 0, buf))
return(0);