shithub: neatroff

Download patch

ref: e6e6b5d4881caa47502e8daa881a120d322091b7
parent: 500811612324dff317ec872d62d6f1f59559c35c
author: Ali Gholami Rudi <ali@rudi.ir>
date: Fri Apr 27 17:00:13 EDT 2018

tr: unify the signature of functions for parsing requests and macros

--- a/tr.c
+++ b/tr.c
@@ -929,8 +929,8 @@
 	}
 }
 
-/* read a macro argument */
-static int tr_arg(struct sbuf *sbuf, int brk, int (*next)(void), void (*back)(int))
+/* read a single macro argument */
+static int macroarg(struct sbuf *sbuf, int brk, int (*next)(void), void (*back)(int))
 {
 	int quoted = 0;
 	int c;
@@ -966,37 +966,38 @@
 	return 0;
 }
 
-/* read macro arguments; free the returned pointer when done */
-char *tr_args(char **args, int brk, int (*next)(void), void (*back)(int))
+/* split the arguments in sbuf, after calling one of mkargs_*() */
+static void chopargs(struct sbuf *sbuf, char **args)
 {
-	struct sbuf sbuf;
-	char *s, *e;
+	char *s = sbuf_buf(sbuf);
+	char *e = s + sbuf_len(sbuf);
 	int n = 0;
-	sbuf_init(&sbuf);
-	while (!tr_arg(&sbuf, brk, next, back))
-		;
-	s = sbuf_buf(&sbuf);
-	e = s + sbuf_len(&sbuf);
 	while (n < NARGS && s && s < e) {
 		args[n++] = s;
 		if ((s = memchr(s, '\0', e - s)))
 			s++;
 	}
+}
+
+/* read macro arguments; free the returned pointer when done */
+char *tr_args(char **args, int brk, int (*next)(void), void (*back)(int))
+{
+	struct sbuf sbuf;
+	sbuf_init(&sbuf);
+	while (!macroarg(&sbuf, brk, next, back))
+		;
+	chopargs(&sbuf, args);
 	return sbuf_out(&sbuf);
 }
 
-/* split the arguments in sbuf */
-static int tr_argschop(struct sbuf *sbuf, char **args)
+/* read regular macro arguments */
+static void mkargs_macro(struct sbuf *sbuf)
 {
-	char *s = sbuf_buf(sbuf);
-	char *e = s + sbuf_len(sbuf);
-	int n = 0;
-	while (n < NARGS && s && s < e) {
-		args[n++] = s;
-		if ((s = memchr(s, '\0', e - s)))
-			s++;
-	}
-	return n;
+	cp_copymode(1);
+	while (!macroarg(sbuf, -1, cp_next, cp_back))
+		;
+	jmp_eol();
+	cp_copymode(0);
 }
 
 /* read request arguments; trims tabs too */
@@ -1228,30 +1229,23 @@
 {
 	char *args[NARGS + 3] = {arg0};
 	struct cmd *req = str_dget(map(mac));
+	char *str = str_get(map(mac));
 	struct sbuf sbuf;
-	if (req) {
-		sbuf_init(&sbuf);
-		if (readargs) {
-			if (req->args)
-				req->args(&sbuf);
-			else
-				mkargs_req(&sbuf);
-			tr_argschop(&sbuf, args + 1);
-		}
-		req->f(args);
-		sbuf_done(&sbuf);
-	} else {
-		char *buf = NULL;
-		if (readargs) {
-			cp_copymode(1);
-			buf = tr_args(args + 1, -1, cp_next, cp_back);
-			jmp_eol();
-			cp_copymode(0);
-		}
-		if (str_get(map(mac)))
-			in_push(str_get(map(mac)), args);
-		free(buf);
+	sbuf_init(&sbuf);
+	if (readargs) {
+		if (req && req->args)
+			req->args(&sbuf);
+		if (req && !req->args)
+			mkargs_req(&sbuf);
+		if (!req)
+			mkargs_macro(&sbuf);
+		chopargs(&sbuf, args + 1);
 	}
+	if (str)
+		in_push(str, args);
+	if (!str && req)
+		req->f(args);
+	sbuf_done(&sbuf);
 }
 
 /* read the next troff request; return zero if a request was executed. */
@@ -1273,7 +1267,7 @@
 			cp_copymode(1);
 			mkargs_eol(&sbuf);
 			cp_copymode(0);
-			tr_argschop(&sbuf, args + 1);
+			chopargs(&sbuf, args + 1);
 			tr_transparent(args);
 			sbuf_done(&sbuf);
 			return 0;