summaryrefslogtreecommitdiffstatshomepage
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
commit24b4a7d475e7f3fa5f5aeb456984285e5938c35c (patch)
treeba527c515f84c5caa50cf65cfec8f131f687b8e7 /man.c
parent29086c29fdd989b9c086bf25e0790ba21243c4ff (diff)
downloadmandoc-24b4a7d475e7f3fa5f5aeb456984285e5938c35c.tar.gz
mandoc-24b4a7d475e7f3fa5f5aeb456984285e5938c35c.tar.zst
mandoc-24b4a7d475e7f3fa5f5aeb456984285e5938c35c.zip
Strip trailing, unescaped whitespace from free-form, non-literal lines (like groff).
Diffstat (limited to 'man.c')
-rw-r--r--man.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/man.c b/man.c
index a92fac8d..385ccaf5 100644
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/* $Id: man.c,v 1.62 2010/05/08 07:30:19 kristaps Exp $ */
+/* $Id: man.c,v 1.63 2010/05/08 08:36:44 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -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);