shithub: neatroff

Download patch

ref: d4a6c339e2825fa9bd57b0c8588096aa623c3bdd
parent: 05a16d44cffef2f7d906f50532fd56c9e0726585
author: Ali Gholami Rudi <ali@rudi.ir>
date: Tue Apr 16 08:14:25 EDT 2013

ren: add .mk and .rt

--- a/reg.c
+++ b/reg.c
@@ -76,10 +76,14 @@
 	return numbuf;
 }
 
-void num_set(int id, int val, int inc)
+void num_set(int id, int val)
 {
 	*nreg(id) = val;
-	nregs_inc[id] = inc;
+}
+
+void num_inc(int id, int val)
+{
+	nregs_inc[id] = val;
 }
 
 void num_del(int id)
--- a/ren.c
+++ b/ren.c
@@ -12,6 +12,7 @@
 	int reg;		/* diversion register */
 	int dl;			/* diversion width */
 	int prev_d;		/* previous \(.d value */
+	int prev_mk;		/* previous .mk internal register */
 	int tpos;		/* diversion trap position */
 	int treg;		/* diversion trap register */
 };
@@ -61,6 +62,7 @@
 		sbuf_init(&cdiv->sbuf);
 		cdiv->reg = REG(args[1][0], args[1][1]);
 		cdiv->prev_d = n_d;
+		cdiv->prev_mk = n_mk;
 		cdiv->treg = -1;
 		if (args[0][2] == 'a' && str_get(cdiv->reg))	/* .da */
 			sbuf_append(&cdiv->sbuf, str_get(cdiv->reg));
@@ -76,6 +78,7 @@
 		n_dl = cdiv->dl;
 		n_dn = n_d;
 		n_d = cdiv->prev_d;
+		n_mk = cdiv->prev_mk;
 		cdiv = cdiv > divs ? cdiv - 1 : NULL;
 		ren_f = 0;
 		ren_s = 0;
@@ -242,6 +245,21 @@
 	if (args[0][0] == '.')
 		ren_br(1);
 	down(args[1] ? eval(args[1], 0, 'v') : n_v);
+}
+
+void tr_mk(char **args)
+{
+	if (args[1])
+		num_set(REG(args[1][0], args[1][1]), n_d);
+	else
+		n_mk = n_d;
+}
+
+void tr_rt(char **args)
+{
+	int n = args[1] ? eval(args[1], n_d, 'v') : n_mk;
+	if (n >= 0 && n < n_d)
+		ren_sp(n - n_d);
 }
 
 void tr_ne(char **args)
--- a/tr.c
+++ b/tr.c
@@ -33,8 +33,8 @@
 	if (!args[2])
 		return;
 	id = REG(args[1][0], args[1][1]);
-	num_set(id, eval(args[2], num_get(id, 0), 'u'),
-			args[3] ? eval(args[3], 0, 'u') : 0);
+	num_set(id, eval(args[2], num_get(id, 0), 'u'));
+	num_inc(id, args[3] ? eval(args[3], 0, 'u') : 0);
 }
 
 static void tr_rr(char **args)
@@ -469,6 +469,7 @@
 	{"ig", tr_ig},
 	{"in", tr_in},
 	{"ll", tr_ll},
+	{"mk", tr_mk},
 	{"na", tr_na},
 	{"ne", tr_ne},
 	{"nf", tr_nf},
@@ -480,6 +481,7 @@
 	{"rm", tr_rm},
 	{"rn", tr_rn},
 	{"rr", tr_rr},
+	{"rt", tr_rt},
 	{"so", tr_so},
 	{"sp", tr_sp},
 	{"ti", tr_ti},
--- a/xroff.h
+++ b/xroff.h
@@ -26,7 +26,8 @@
 
 /* number registers */
 int num_get(int id, int inc);
-void num_set(int id, int val, int inc);
+void num_set(int id, int val);
+void num_inc(int id, int val);
 void num_del(int id);
 char *num_str(int id);
 int *nreg(int id);
@@ -127,10 +128,12 @@
 void tr_ft(char **args);
 void tr_in(char **args);
 void tr_ll(char **args);
+void tr_mk(char **args);
 void tr_ne(char **args);
 void tr_nf(char **args);
 void tr_pn(char **args);
 void tr_ps(char **args);
+void tr_rt(char **args);
 void tr_sp(char **args);
 void tr_ti(char **args);
 void tr_wh(char **args);
@@ -202,6 +205,7 @@
 #define n_f0		(*nreg(REG(0, 'f')))	/* last .f */
 #define n_i0		(*nreg(REG(0, 'i')))	/* last .i */
 #define n_l0		(*nreg(REG(0, 'l')))	/* last .l */
+#define n_mk		(*nreg(REG(0, 'm')))	/* .mk internal register */
 #define n_na		(*nreg(REG(0, 'n')))	/* .na mode */
 #define n_o0		(*nreg(REG(0, 'o')))	/* last .o */
 #define n_s0		(*nreg(REG(0, 's')))	/* last .s */