summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/m4/eval.c60
-rw-r--r--usr.bin/m4/extern.h3
-rw-r--r--usr.bin/m4/m4.19
-rw-r--r--usr.bin/m4/main.c9
4 files changed, 73 insertions, 8 deletions
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
index 508417e9f03..ed8d15a4e04 100644
--- a/usr.bin/m4/eval.c
+++ b/usr.bin/m4/eval.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eval.c,v 1.25 2000/03/11 15:54:43 espie Exp $ */
+/* $OpenBSD: eval.c,v 1.26 2000/03/18 01:06:55 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.25 2000/03/11 15:54:43 espie Exp $";
+static char rcsid[] = "$OpenBSD: eval.c,v 1.26 2000/03/18 01:06:55 espie Exp $";
#endif
#endif /* not lint */
@@ -77,6 +77,7 @@ static void dodiv __P((int));
static void doundiv __P((const char *[], int));
static void dosub __P((const char *[], int));
static void map __P((char *, const char *, const char *, const char *));
+static const char *handledash __P((char *, char *, const char *));
/*
* eval - evaluate built-in macros.
* argc - number of elements in argv.
@@ -677,6 +678,15 @@ dochq(argv, argc)
const char *argv[];
int argc;
{
+ /* In gnu-m4 mode, having two empty arguments means no quotes at
+ * all. */
+ if (mimic_gnu) {
+ if (argc > 3 && !*argv[2] && !*argv[3]) {
+ lquote[0] = EOS;
+ rquote[0] = EOS;
+ return;
+ }
+ }
if (argc > 2) {
if (*argv[2])
strlcpy(lquote, argv[2], sizeof(lquote));
@@ -833,6 +843,8 @@ map(dest, src, from, to)
{
const char *tmp;
unsigned char sch, dch;
+ static char frombis[257];
+ static char tobis[257];
static unsigned char mapvec[256] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
@@ -855,6 +867,13 @@ map(dest, src, from, to)
};
if (*src) {
+ if (mimic_gnu) {
+ /*
+ * expand character ranges on the fly
+ */
+ from = handledash(frombis, frombis + 256, from);
+ to = handledash(tobis, tobis + 256, to);
+ }
tmp = from;
/*
* create a mapping between "from" and
@@ -884,3 +903,40 @@ map(dest, src, from, to)
}
*dest = '\0';
}
+
+
+/*
+ * handledash:
+ * use buffer to copy the src string, expanding character ranges
+ * on the way.
+ */
+static const char *
+handledash(buffer, end, src)
+ char *buffer;
+ char *end;
+ const char *src;
+{
+ char *p;
+
+ p = buffer;
+ while(*src) {
+ if (src[1] == '-' && src[2]) {
+ unsigned char i;
+ for (i = (unsigned char)src[0];
+ i <= (unsigned char)src[2]; i++) {
+ *p++ = i;
+ if (p == end) {
+ *p = '\0';
+ return buffer;
+ }
+ }
+ src += 3;
+ } else
+ *p++ = *src++;
+ if (p == end)
+ break;
+ }
+ *p = '\0';
+ return buffer;
+}
+
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
index 69eb8e14030..a94f75abe49 100644
--- a/usr.bin/m4/extern.h
+++ b/usr.bin/m4/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.17 2000/03/11 15:54:44 espie Exp $ */
+/* $OpenBSD: extern.h,v 1.18 2000/03/18 01:06:55 espie Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@@ -111,3 +111,4 @@ extern char *null; /* as it says.. just a null. */
extern char rquote[MAXCCHARS+1];/* right quote character (') */
extern char scommt[MAXCCHARS+1];/* start character for comment */
+extern int mimic_gnu; /* behaves like gnu-m4 */
diff --git a/usr.bin/m4/m4.1 b/usr.bin/m4/m4.1
index 18f0d956b5d..f9bf2dabbed 100644
--- a/usr.bin/m4/m4.1
+++ b/usr.bin/m4/m4.1
@@ -1,4 +1,4 @@
-.\" @(#) $OpenBSD: m4.1,v 1.11 2000/03/11 15:54:44 espie Exp $
+.\" @(#) $OpenBSD: m4.1,v 1.12 2000/03/18 01:06:55 espie Exp $
.\"
.\"
.Dd January 26, 1993
@@ -9,6 +9,7 @@
.Nd macro language processor
.Sh SYNOPSIS
.Nm m4
+.Op Fl g
.Oo
.Fl D Ns Ar name Ns Op Ar =value
.Oc
@@ -46,7 +47,7 @@ You can change the quote characters with the
.Ic changequote
built-in macro.
.Pp
-Some built-ins don't make any sense without arguments, and hence are not
+Most built-ins don't make any sense without arguments, and hence are not
recognized as special when not followed by an open parenthesis.
.Pp
The options are as follows:
@@ -65,6 +66,10 @@ Undefine the symbol
Add directory
.Ar dirname
to the include path.
+.It Fl g
+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.
.Sh SYNTAX
.Nm m4
provides the following built-in macros.
diff --git a/usr.bin/m4/main.c b/usr.bin/m4/main.c
index af4a0120446..3bac2f59fa0 100644
--- a/usr.bin/m4/main.c
+++ b/usr.bin/m4/main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: main.c,v 1.31 2000/03/11 15:54:44 espie Exp $ */
+/* $OpenBSD: main.c,v 1.32 2000/03/18 01:06:56 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.31 2000/03/11 15:54:44 espie Exp $";
+static char rcsid[] = "$OpenBSD: main.c,v 1.32 2000/03/18 01:06:56 espie Exp $";
#endif
#endif /* not lint */
@@ -178,7 +178,7 @@ main(argc,argv)
initkwds();
initspaces();
- while ((c = getopt(argc, argv, "tD:U:o:I:")) != -1)
+ while ((c = getopt(argc, argv, "gtD:U:o:I:")) != -1)
switch(c) {
case 'D': /* define something..*/
@@ -195,6 +195,9 @@ main(argc,argv)
case 'U': /* undefine... */
remhash(optarg, TOP);
break;
+ case 'g':
+ mimic_gnu = 1;
+ break;
case 'o': /* specific output */
case '?':
usage();