summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/m4/eval.c17
-rw-r--r--usr.bin/m4/extern.h6
-rw-r--r--usr.bin/m4/m4.15
-rw-r--r--usr.bin/m4/main.c13
-rw-r--r--usr.bin/m4/misc.c22
5 files changed, 47 insertions, 16 deletions
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
index c5fb8231935..3708d4caf91 100644
--- a/usr.bin/m4/eval.c
+++ b/usr.bin/m4/eval.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eval.c,v 1.27 2000/07/24 23:08:24 espie Exp $ */
+/* $OpenBSD: eval.c,v 1.28 2000/07/27 17:44:32 espie Exp $ */
/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
/*
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
#else
-static char rcsid[] = "$OpenBSD: eval.c,v 1.27 2000/07/24 23:08:24 espie Exp $";
+static char rcsid[] = "$OpenBSD: eval.c,v 1.28 2000/07/27 17:44:32 espie Exp $";
#endif
#endif /* not lint */
@@ -743,7 +743,14 @@ dodiv(n)
int fd;
oindex = n;
- if (n < 0 || n >= MAXOUT)
+ if (n >= maxout) {
+ if (mimic_gnu)
+ resizedivs(n + 10);
+ else
+ n = 0; /* bitbucket */
+ }
+
+ if (n < 0)
n = 0; /* bitbucket */
if (outfile[n] == NULL) {
char fname[] = _PATH_DIVNAME;
@@ -772,13 +779,13 @@ doundiv(argv, argc)
if (argc > 2) {
for (ind = 2; ind < argc; ind++) {
n = atoi(argv[ind]);
- if (n > 0 && n < MAXOUT && outfile[n] != NULL)
+ if (n > 0 && n < maxout && outfile[n] != NULL)
getdiv(n);
}
}
else
- for (n = 1; n < MAXOUT; n++)
+ for (n = 1; n < maxout; n++)
if (outfile[n] != NULL)
getdiv(n);
}
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
index 264803e583f..1f4f2a8860d 100644
--- a/usr.bin/m4/extern.h
+++ b/usr.bin/m4/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.20 2000/07/24 23:08:25 espie Exp $ */
+/* $OpenBSD: extern.h,v 1.21 2000/07/27 17:44:33 espie Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@@ -86,6 +86,7 @@ extern void putback __P((int));
extern void *xalloc __P((size_t));
extern char *xstrdup __P((const char *));
extern void usage __P((void));
+extern void resizedivs __P((int n));
extern int obtain_char __P((struct input_file *));
extern void set_input __P((struct input_file *, FILE *, const char *));
@@ -97,7 +98,8 @@ extern stae *mstack; /* stack of m4 machine */
extern char *sstack; /* shadow stack, for string space extension */
extern FILE *active; /* active output file pointer */
extern struct input_file infile[];/* input file stack (0=stdin) */
-extern FILE *outfile[]; /* diversion array(0=bitbucket) */
+extern FILE **outfile; /* diversion array(0=bitbucket) */
+extern int maxout; /* maximum number of diversions */
extern int fp; /* m4 call frame pointer */
extern int ilevel; /* input file stack pointer */
extern int oindex; /* diversion index. */
diff --git a/usr.bin/m4/m4.1 b/usr.bin/m4/m4.1
index 957fd988dd6..7d1affa2be1 100644
--- a/usr.bin/m4/m4.1
+++ b/usr.bin/m4/m4.1
@@ -1,4 +1,4 @@
-.\" @(#) $OpenBSD: m4.1,v 1.18 2000/07/24 23:08:25 espie Exp $
+.\" @(#) $OpenBSD: m4.1,v 1.19 2000/07/27 17:44:33 espie Exp $
.\"
.\"
.Dd January 26, 1993
@@ -70,7 +70,8 @@ to the include path.
Activate GNU-m4 compatibility mode.
In this mode, changequote with
two empty parameters deactivates quotes, translit handles simple character
-ranges (e.g., a-z) and regular expressions mimic emacs behavior.
+ranges (e.g., a-z), regular expressions mimic emacs behavior,
+and the number of diversions is unlimited.
.El
.Sh SYNTAX
.Nm m4
diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c
index 68db31e7a65..143386b190e 100644
--- a/usr.bin/m4/main.c
+++ b/usr.bin/m4/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.35 2000/07/24 23:08:25 espie Exp $ */
+/* $OpenBSD: main.c,v 1.36 2000/07/27 17:44:33 espie Exp $ */
/* $NetBSD: main.c,v 1.12 1997/02/08 23:54:49 cgd Exp $ */
/*-
@@ -47,7 +47,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: main.c,v 1.35 2000/07/24 23:08:25 espie Exp $";
+static char rcsid[] = "$OpenBSD: main.c,v 1.36 2000/07/27 17:44:33 espie Exp $";
#endif
#endif /* not lint */
@@ -80,7 +80,8 @@ static size_t STACKMAX; /* current maximum size of stack */
int sp; /* current m4 stack pointer */
int fp; /* m4 call frame pointer */
struct input_file infile[MAXINP];/* input file stack (0=stdin) */
-FILE *outfile[MAXOUT]; /* diversion array(0=bitbucket)*/
+FILE **outfile; /* diversion array(0=bitbucket)*/
+int maxout;
FILE *active; /* active output file pointer */
int ilevel = 0; /* input file stack pointer */
int oindex = 0; /* diversion index.. */
@@ -188,6 +189,10 @@ main(argc,argv)
mstack = (stae *)xalloc(sizeof(stae) * STACKMAX);
sstack = (char *)xalloc(STACKMAX);
+ maxout = 0;
+ outfile = NULL;
+ resizedivs(MAXOUT);
+
while ((c = getopt(argc, argv, "gtD:U:o:I:")) != -1)
switch(c) {
@@ -246,7 +251,7 @@ main(argc,argv)
if (active != stdout)
active = stdout; /* reset output just in case */
- for (n = 1; n < MAXOUT; n++) /* default wrap-up: undivert */
+ for (n = 1; n < maxout; n++) /* default wrap-up: undivert */
if (outfile[n] != NULL)
getdiv(n);
/* remove bitbucket if used */
diff --git a/usr.bin/m4/misc.c b/usr.bin/m4/misc.c
index bbe95b31f9c..ca9ce89b884 100644
--- a/usr.bin/m4/misc.c
+++ b/usr.bin/m4/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.19 2000/07/02 01:17:00 espie Exp $ */
+/* $OpenBSD: misc.c,v 1.20 2000/07/27 17:44:33 espie Exp $ */
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
/*
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: misc.c,v 1.19 2000/07/02 01:17:00 espie Exp $";
+static char rcsid[] = "$OpenBSD: misc.c,v 1.20 2000/07/27 17:44:33 espie Exp $";
#endif
#endif /* not lint */
@@ -254,12 +254,28 @@ killdiv()
{
int n;
- for (n = 0; n < MAXOUT; n++)
+ for (n = 0; n < maxout; n++)
if (outfile[n] != NULL) {
(void) fclose(outfile[n]);
}
}
+/*
+ * resizedivs: allocate more diversion files */
+void
+resizedivs(n)
+ int n;
+{
+ int i;
+
+ outfile = (FILE **)realloc(outfile, sizeof(FILE *) * n);
+ if (outfile == NULL)
+ errx(1, "too many diverts %d", n);
+ for (i = maxout; i < n; i++)
+ outfile[i] = NULL;
+ maxout = n;
+}
+
void *
xalloc(n)
size_t n;