+ int i, j;
+ char sv;
+
+ /* Literal free-form text whitespace is preserved. */
+
+ if (MAN_LITERAL & m->flags) {
+ if ( ! man_word_alloc(m, line, 0, buf))
+ return(0);
+ goto descope;
+ }
+
+ /* First de-chunk and allocate words. */
+
+ for (i = 0; ' ' == buf[i]; i++)
+ /* Skip leading whitespace. */ ;
+
+ if ('\0' == buf[i]) {
+ /* Trailing whitespace? */
+ if (i && ' ' == buf[i - 1])
+ if ( ! man_pwarn(m, line, i - 1, WTSPACE))
+ return(0);
+ if ( ! pstring(m, line, 0, &buf[i], 0))
+ return(0);
+ goto descope;
+ }
+
+ for (j = i; buf[i]; i++) {
+ if (' ' != buf[i])
+ continue;
+
+ /* Escaped whitespace. */
+ if (i && ' ' == buf[i] && '\\' == buf[i - 1])
+ continue;
+
+ sv = buf[i];
+ buf[i++] = '\0';
+
+ if ( ! pstring(m, line, j, &buf[j], (size_t)(i - j)))
+ return(0);
+
+ /* Trailing whitespace? Check at overwritten byte. */
+
+ if (' ' == sv && '\0' == buf[i])
+ if ( ! man_pwarn(m, line, i - 1, WTSPACE))
+ return(0);
+
+ for ( ; ' ' == buf[i]; i++)
+ /* Skip trailing whitespace. */ ;
+
+ j = i;
+
+ /* Trailing whitespace? */