shithub: neatroff

Download patch

ref: 5d3333450b2456279531d67e9ca11ce08446da9a
parent: c0958e44843f678a014c3ede1b5f4d857fa10784
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sun Nov 19 18:35:23 EST 2017

cp: invoking built-in requests like \*[nr reg 10]

--- a/cp.c
+++ b/cp.c
@@ -66,17 +66,17 @@
 static void cp_str(void)
 {
 	char reg[NMLEN];
-	char *args[NARGS + 1] = {NULL};
+	char *args[NARGS + 2] = {reg};
+	char *buf = NULL;
 	if (cparg(reg, sizeof(reg))) {
-		char *buf = tr_args(args, ']', cp_noninext, cp_back);
+		buf = tr_args(args + 1, ']', cp_noninext, cp_back);
 		cp_noninext();
-		if (str_get(map(reg)))
-			in_push(str_get(map(reg)), args);
-		free(buf);
-	} else {
-		if (str_get(map(reg)))
-			in_push(str_get(map(reg)), NULL);
 	}
+	if (str_get(map(reg)))
+		in_push(str_get(map(reg)), buf ? args + 1 : NULL);
+	else if (!n_cp)
+		tr_req(map(reg), args);
+	free(buf);
 }
 
 /* interpolate \g(xy */
--- a/roff.h
+++ b/roff.h
@@ -202,6 +202,7 @@
 void cp_copymode(int mode);	/* do not interpret \w and \E */
 #define cp_back		in_back	/* cp.c is stateless */
 int tr_nextreq(void);		/* read the next troff request */
+void tr_req(int reg, char **args);	/* execute a built-in troff request */
 
 /* variable length string buffer */
 struct sbuf {
--- a/tr.c
+++ b/tr.c
@@ -1132,6 +1132,14 @@
 	return out;
 }
 
+/* execute a built-in request */
+void tr_req(int reg, char **args)
+{
+	struct cmd *req = str_dget(reg);
+	if (req)
+		req->f(args);
+}
+
 /* read the next troff request; return zero if a request was executed. */
 int tr_nextreq(void)
 {