Last needed m4 changes to bootstrap autoconf without gnu-m4.
authorespie <espie@openbsd.org>
Sat, 18 Mar 2000 01:06:55 +0000 (01:06 +0000)
committerespie <espie@openbsd.org>
Sat, 18 Mar 2000 01:06:55 +0000 (01:06 +0000)
usr.bin/m4/eval.c
usr.bin/m4/extern.h
usr.bin/m4/m4.1
usr.bin/m4/main.c

index 508417e..ed8d15a 100644 (file)
@@ -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;
+}
+                           
index 69eb8e1..a94f75a 100644 (file)
@@ -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 */
index 18f0d95..f9bf2da 100644 (file)
@@ -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.
index af4a012..3bac2f5 100644 (file)
@@ -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();