shithub: neatroff

Download patch

ref: 8bf0eab2238dbe21bccc8e079dd35285b2dc9a66
parent: c442e7df2875ac2b71baa69b0f6f9b11195a78cc
author: Ali Gholami Rudi <ali@rudi.ir>
date: Mon Apr 15 13:53:11 EDT 2013

tr: add .ig

--- a/tr.c
+++ b/tr.c
@@ -90,24 +90,13 @@
 
 static char *arg_regname(char *s, int len);
 
-static void tr_de(char **args)
+static void macrobody(struct sbuf *sbuf, char *end)
 {
-	struct sbuf sbuf;
 	char buf[4];
-	int end[4] = {'.'};
-	int id, c, i;
-	if (!args[1])
-		return;
-	if (args[2]) {
-		end[0] = args[2][0];
-		end[1] = args[2][1];
-	}
-	id = REG(args[1][0], args[1][1]);
-	sbuf_init(&sbuf);
-	if (args[0][1] == 'a' && args[0][2] == 'm' && str_get(id))
-		sbuf_append(&sbuf, str_get(id));
+	int i, c;
 	while ((c = cp_next()) >= 0) {
-		sbuf_add(&sbuf, c);
+		if (sbuf)
+			sbuf_add(sbuf, c);
 		if (c == '\n') {
 			c = cp_next();
 			if (c == '.') {
@@ -116,19 +105,39 @@
 					jmp_eol();
 					break;
 				}
-				sbuf_add(&sbuf, '.');
+				if (!sbuf)
+					continue;
+				sbuf_add(sbuf, '.');
 				for (i = 0; buf[i]; i++)
-					sbuf_add(&sbuf, (unsigned char) buf[i]);
-			} else {
-				if (c >= 0)
-					sbuf_add(&sbuf, c);
+					sbuf_add(sbuf, (unsigned char) buf[i]);
+				continue;
 			}
+			if (sbuf && c >= 0)
+				sbuf_add(sbuf, c);
 		}
 	}
+}
+
+static void tr_de(char **args)
+{
+	struct sbuf sbuf;
+	int id;
+	if (!args[1])
+		return;
+	id = REG(args[1][0], args[1][1]);
+	sbuf_init(&sbuf);
+	if (args[0][1] == 'a' && args[0][2] == 'm' && str_get(id))
+		sbuf_append(&sbuf, str_get(id));
+	macrobody(&sbuf, args[2] ? args[2] : ".");
 	str_set(id, sbuf_buf(&sbuf));
 	sbuf_done(&sbuf);
 }
 
+static void tr_ig(char **args)
+{
+	macrobody(NULL, args[1] ? args[1] : ".");
+}
+
 /* read into sbuf until stop */
 static void read_until(struct sbuf *sbuf, int stop)
 {
@@ -455,6 +464,7 @@
 	{"ft", tr_ft},
 	{"ie", tr_if, mkargs_null},
 	{"if", tr_if, mkargs_null},
+	{"ig", tr_ig},
 	{"in", tr_in},
 	{"ll", tr_ll},
 	{"na", tr_na},