source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* pod2mdoc: In text mode, do not print whitespace *after* printing a word
@ 2015-02-13 18:02 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2015-02-13 18:02 UTC (permalink / raw)
  To: source

Log Message:
-----------
In text mode, do not print whitespace *after* printing a word
because that may end up at the end of a line if a macro follows.
Instead, delay printing whitespace until before printing the next word.
Requires being a bit more careful about the wantws flag in the
function formatcode().

Modified Files:
--------------
    pod2mdoc:
        pod2mdoc.c

Revision Data
-------------
Index: pod2mdoc.c
===================================================================
RCS file: /home/cvs/mdocml/pod2mdoc/pod2mdoc.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -Lpod2mdoc.c -Lpod2mdoc.c -u -p -r1.39 -r1.40
--- pod2mdoc.c
+++ pod2mdoc.c
@@ -160,7 +160,6 @@ outbuf_addchar(struct state *st)
 	if ('\\' == last)
 		st->outbuf[st->outbuflen++] = 'e';
 	st->outbuf[st->outbuflen] = '\0';
-	st->wantws = 0;
 }
 
 static void
@@ -174,7 +173,6 @@ outbuf_addstr(struct state *st, const ch
 	memcpy(st->outbuf + st->outbuflen, str, slen+1);
 	st->outbuflen += slen;
 	last = str[slen - 1];
-	st->wantws = 0;
 }
 
 static void
@@ -184,6 +182,9 @@ outbuf_flush(struct state *st)
 	if (0 == st->outbuflen)
 		return;
 
+	if (OUST_TXT == st->oust && st->wantws)
+		putchar(' ');
+
 	fputs(st->outbuf, stdout);
 	*st->outbuf = '\0';
 	st->outbuflen = 0;
@@ -477,8 +478,9 @@ static int
 formatcode(struct state *st, const char *buf, size_t *start, 
 	size_t end, int nomacro, int pos)
 {
-	enum fmt	 fmt;
 	size_t		 i, j, dsz;
+	enum fmt	 fmt;
+	int		 wantws;
 	unsigned char	 uc;
 
 	assert(*start + 1 < end);
@@ -563,7 +565,8 @@ formatcode(struct state *st, const char 
 		 * allows to break at this point as well.
 		 */
 
-		st->wantws |= ' ' == buf[*start];
+		wantws = ' ' == buf[*start] ||
+		    (OUST_MAC == st->oust ? st->wantws : ! st->outbuflen);
 
 		/*
 		 * If we are on a text line and there is no
@@ -573,22 +576,23 @@ formatcode(struct state *st, const char 
 		 * lest we clobber out output state.
 		 */
 
-		if (OUST_MAC != st->oust && !st->wantws) {
+		if (OUST_MAC != st->oust && ! wantws) {
 			if (OUST_NL != st->oust)
 				putchar('\n');
 			printf(".Pf ");
+			st->wantws = 0;
 		}
 
 		outbuf_flush(st);
 
 		/* Whitespace is easier to suppress on macro lines. */
 
-		if (OUST_MAC == st->oust && !st->wantws)
+		if (OUST_MAC == st->oust && ! wantws)
 			printf(" Ns ");
 
 		/* Unless we are on a macro line, start one. */
 
-		if (OUST_MAC != st->oust && st->wantws) {
+		if (OUST_MAC != st->oust && wantws) {
 			if (OUST_NL != st->oust)
 				putchar('\n');
 			putchar('.');
@@ -687,7 +691,8 @@ formatcode(struct state *st, const char 
 		}
 		if (*start + 1 < end && '<' == buf[*start + 1] &&
 		    'A' <= buf[*start] && 'Z' >= buf[*start]) {
-			formatcode(st, buf, start, end, nomacro, 1);
+			if ( ! formatcode(st, buf, start, end, nomacro, 1))
+				st->wantws = 1;
 			continue;
 		}
 
@@ -729,14 +734,11 @@ formatcode(struct state *st, const char 
 			putchar('e');
 	}
 
-	if (FMT__MAX == fmt)
-		return(0);
-
 	if ( ! nomacro && FMT_CODE == fmt)
 		printf(" Qc ");
 
 	st->wantws = ' ' == last;
-	return(1);
+	return(FMT__MAX != fmt);
 }
 
 /*
@@ -1309,7 +1311,8 @@ donamenm(struct state *st, const char *b
  *
  * Uses formatcode() to go to OUST_MAC mode
  * and outbuf_flush() to go to OUST_TXT mode.
- * Main text mode wantws handling is in this function.
+ * In text mode, wantws requests white space before the text
+ * currently contained in the outbuf, not before upcoming text.
  * Must make sure to go back to OUST_NL/wantws mode before returning.
  */
 static void
@@ -1385,7 +1388,7 @@ ordinary(struct state *st, const char *b
 			/*
 			 * On whitespace, flush the output buffer
 			 * and allow breaking to a macro line.
-			 * Otherwise, buffer text and clear wantws.
+			 * Otherwise, merely buffer text.
 			 */
 
 			last = buf[start++];
@@ -1407,8 +1410,10 @@ ordinary(struct state *st, const char *b
 			}
 
 			outbuf_flush(st);
-			putchar(' ');
-			st->wantws = 1;
+			if (OUST_MAC == st->oust)
+				mdoc_newln(st);
+			else
+				st->wantws = 1;
 		}
 
 		if (start < end - 1 && '<' == buf[start + 1] &&
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2015-02-13 18:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-13 18:02 pod2mdoc: In text mode, do not print whitespace *after* printing a word schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).