shithub: neatroff

Download patch

ref: 2687b67734c845f405ca9d820c5bd6f8af513bb0
parent: 07e35081b3f754c61e9a081f320db0e942f72e4a
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sat Jun 22 15:51:20 EDT 2013

wb: handle \( and \C characters when hyphenating

--- a/wb.c
+++ b/wb.c
@@ -309,31 +309,33 @@
 static char *hyphpos(char *s, int w, struct wb *w1, int flg)
 {
 	char word[ILNLEN];
+	char *map[ILNLEN];	/* mapping from word to s */
 	char hyph[ILNLEN];
 	char d[ILNLEN];
+	char *prev_s = s;
 	char *r = NULL;
-	char *hy_beg, *hy_wid = NULL, *hy_end = NULL;
+	int fit = 0;
 	char *wp = word, *we = word + sizeof(word);
 	int beg, end;
 	int i, c;
 	skipreqs(&s, w1);
-	hy_beg = s;
 	while ((c = out_readc(&s, d)) == 0 && wp + strlen(d) + 1 < we) {
 		wb_putc(w1, c, d);
-		if (wb_wid(w1) + wb_dashwid(w1) <= w)
-			hy_wid = s;
-		hy_end = s;
 		strcpy(wp, d);
-		wp = strchr(wp, '\0');
+		while (*wp)
+			map[wp++ - word] = prev_s;
+		if (wb_wid(w1) + wb_dashwid(w1) <= w)
+			fit = wp - word;
+		prev_s = s;
 	}
 	if (strlen(word) < 4)
 		return NULL;
 	hyphenate(hyph, word);
 	beg = flg & HY_FIRSTTWO ? 3 : 2;
-	end = hy_end - hy_beg - (flg & HY_FINAL ? 1 : 0);
+	end = strlen(word) - (flg & HY_FINAL ? 2 : 1);
 	for (i = beg; i < end; i++)
-		if (hyph[i] && (hy_beg + i <= hy_wid || ((flg & HY_ANY) && !r)))
-			r = hy_beg + i;
+		if (hyph[i] && (i <= fit || ((flg & HY_ANY) && !r)))
+			r = map[i];
 	return r;
 }