shithub: neatroff

Download patch

ref: 4ccdb4dffdc98afe8ce65caa9d124f41a8705148
parent: 8626cedf2864bf52786f0df30aad70e10a24ef91
author: Ali Gholami Rudi <ali@rudi.ir>
date: Thu Apr 25 17:46:20 EDT 2013

tr: evaluate if condition if everything else fails

--- a/tr.c
+++ b/tr.c
@@ -184,25 +184,30 @@
 	return ret;
 }
 
-/* evaluate .if condition */
+/* evaluate .if condition letters */
 static int if_cond(void)
 {
+	switch (cp_next()) {
+	case 'o':
+		return n_pg % 2;
+	case 'e':
+		return !(n_pg % 2);
+	case 't':
+		return 1;
+	case 'n':
+		return 0;
+	}
+	return 0;
+}
+
+/* evaluate .if condition */
+static int if_eval(void)
+{
 	struct sbuf sbuf;
-	char *s;
 	int ret;
 	sbuf_init(&sbuf);
 	read_until(&sbuf, ' ');
-	s = sbuf_buf(&sbuf);
-	if (s[0] == 'o' && s[1] == '\0')
-		ret = n_pg % 2;
-	else if (s[0] == 'e' && s[1] == '\0')
-		ret = !(n_pg % 2);
-	else if (s[0] == 't' && s[1] == '\0')
-		ret = 1;
-	else if (s[0] == 'n' && s[1] == '\0')
-		ret = 0;
-	else
-		ret = eval(s, '\0') > 0;
+	ret = eval(sbuf_buf(&sbuf), '\0') > 0;
 	sbuf_done(&sbuf);
 	return ret;
 }
@@ -222,12 +227,13 @@
 		neg = 1;
 		c = cp_next();
 	}
-	if (!isdigit(c) && !strchr("-+*/%<=>&:.|()", c)) {
-		cp_back(c);
+	cp_back(c);
+	if (strchr("oetn", c)) {
+		ret = if_cond();
+	} else if (!isdigit(c) && !strchr("-+*/%<=>&:.|()", c)) {
 		ret = if_strcmp();
 	} else {
-		cp_back(c);
-		ret = if_cond();
+		ret = if_eval();
 	}
 	if (args[0][1] == 'i' && args[0][2] == 'e')	/* .ie command */
 		if (ie_depth < NIES)