ref: af5f4e16da8242be88bd1cfdd241ec54264e737c
parent: d2f835e905fcbe8fba2d08b80eca0a360be677fa
author: Ali Gholami Rudi <ali@rudi.ir>
date: Fri Aug 2 18:59:20 EDT 2013
cp: allow \$[] and more than 9 arguments
--- a/cp.c
+++ b/cp.c
@@ -6,28 +6,32 @@
static int cp_sblk[NIES]; /* skip \} escape at this depth, if set */
static int cp_widreq = 1; /* inline \w requests */
-static int regid(void)
+static void cparg(char *d)
{
- char key[NMLEN];
+ int c = cp_next();
int i = 0;
- int c1;
- int c2 = 0;
- c1 = cp_next();
- if (c1 == '(') {
- c1 = cp_next();
- c2 = cp_next();
- } else if (!n_cp && c1 == '[') {
- c1 = cp_next();
- while (i < NMLEN - 1 && c1 >= 0 && c1 != ']') {
- key[i++] = c1;
- c1 = cp_next();
+ if (c == '(') {
+ d[i++] = cp_next();
+ d[i++] = cp_next();
+ } else if (!n_cp && c == '[') {
+ c = cp_next();
+ while (i < NMLEN - 1 && c >= 0 && c != ']') {
+ d[i++] = c;
+ c = cp_next();
}
- key[i] = '\0';
- return map(key);
+ } else {
+ d[i++] = c;
}
- return REG(c1, c2);
+ d[i] = '\0';
}
+static int regid(void)
+{
+ char regname[NMLEN];
+ cparg(regname);
+ return map(regname);
+}
+
static void cp_num(void)
{
int id;
@@ -55,11 +59,13 @@
static void cp_arg(void)
{
- int c;
+ char argname[NMLEN];
char *arg = NULL;
- c = cp_next();
- if (c >= '1' && c <= '9')
- arg = in_arg(c - '0');
+ int argnum;
+ cparg(argname);
+ argnum = atoi(argname);
+ if (argnum > 0 && argnum < NARGS + 1)
+ arg = in_arg(argnum);
if (arg)
in_push(arg, NULL);
}
--- a/roff.h
+++ b/roff.h
@@ -19,7 +19,7 @@
#define ILNLEN 1000 /* line limit of input files */
#define LNLEN 4000 /* line buffer length (ren.c/out.c) */
#define NWORDS 256 /* number of words in line buffer */
-#define NARGS 9 /* number of macro arguments */
+#define NARGS 16 /* number of macro arguments */
#define NPREV 16 /* environment stack depth */
#define NTRAPS 1024 /* number of traps per page */
#define NIES 128 /* number of nested .ie commands */