m4-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

branch-1_4 builtin vs. defn


From: Eric Blake
Subject: branch-1_4 builtin vs. defn
Date: Fri, 13 Oct 2006 06:58:45 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Thunderbird/1.5.0.7 Mnenhy/0.7.4.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I found it annoying that builtin(`define', `foo', defn(`dnl')) didn't work
the same way as define(`foo', defn(`dnl')).  I will be porting this to
head as well.

2006-10-13  Eric Blake  <address@hidden>

        * src/builtin.c (m4_builtin, m4_indir): Allow transparent
        handling of defn results.
        * doc/m4.texinfo (Builtin, Indir): Add test cases.
        * NEWS: Document this.

- --
Life is short - so eat dessert first!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.1 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFL42F84KuGfSFAYARAv3TAJ94L8+7xrp0ahq7v0A2+EJIb3IA4ACgq6Oz
suDwj8XYQuuo7PM08W/kNTU=
=RMLZ
-----END PGP SIGNATURE-----
Index: NEWS
===================================================================
RCS file: /sources/m4/m4/NEWS,v
retrieving revision 1.1.1.1.2.70
diff -u -p -r1.1.1.1.2.70 NEWS
--- NEWS        11 Oct 2006 23:34:21 -0000      1.1.1.1.2.70
+++ NEWS        13 Oct 2006 12:56:28 -0000
@@ -20,6 +20,8 @@ Version 1.4.8 - ?? ??? 2006, by ??  (CVS
   rather than changing to line 0 and the empty string for a file.  The
   macros `__line__' and `__file__' now work correctly even as the last
   token in an included file.
+* The `builtin' and `indir' macros now transparently handle builtin
+  tokens generated by `defn'.
 
 Version 1.4.7 - 25 September 2006, by Eric Blake  (CVS version 1.4.6a)
 
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.1.1.1.2.83
diff -u -p -r1.1.1.1.2.83 m4.texinfo
--- doc/m4.texinfo      12 Oct 2006 14:10:35 -0000      1.1.1.1.2.83
+++ doc/m4.texinfo      13 Oct 2006 12:56:29 -0000
@@ -1768,6 +1768,27 @@ indir(`f', undefine(`f'))
 @result{}
 @end example
 
+When handed the result of @code{defn} (@pxref{Defn}) as one of its
+arguments, @code{indir} defers to the invoked @var{name} for whether a
+token representing a builtin is recognized or flattened to the empty
+string.
+
address@hidden
+indir(defn(`defn'), `divnum')
address@hidden:stdin:1: Warning: indir: invalid macro name ignored
address@hidden
+indir(`define', defn(`defn'), `divnum')
address@hidden:stdin:2: Warning: define: invalid macro name ignored
address@hidden
+indir(`define', `foo', defn(`divnum'))
address@hidden
+foo
address@hidden
+indir(`divert', defn(`foo'))
address@hidden:stdin:5: empty string treated as 0 in builtin `divert'
address@hidden
address@hidden example
+
 @node Builtin
 @section Indirect call of builtins
 
@@ -1798,6 +1819,10 @@ define(`foo', `bar')
 @result{}hidden
 foo
 @result{}foo
+builtin(`define', `foo', defn(`divnum'))
address@hidden
+foo
address@hidden
 builtin(`define', `foo', `BAR')
 @result{}
 foo
Index: src/builtin.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/builtin.c,v
retrieving revision 1.1.1.1.2.41
diff -u -p -r1.1.1.1.2.41 builtin.c
--- src/builtin.c       10 Oct 2006 03:54:26 -0000      1.1.1.1.2.41
+++ src/builtin.c       13 Oct 2006 12:56:29 -0000
@@ -19,7 +19,7 @@
    02110-1301  USA
 */
 
-/* Code for all builtin macros, initialisation of symbol table, and
+/* Code for all builtin macros, initialization of symbol table, and
    expansion of user defined macros.  */
 
 #include "m4.h"
@@ -34,8 +34,8 @@ extern FILE *popen ();
 
 #define ARG(i) (argc > (i) ? TOKEN_DATA_TEXT (argv[i]) : "")
 
-/* Initialisation of builtin and predefined macros.  The table
-   "builtin_tab" is both used for initialisation, and by the "builtin"
+/* Initialization of builtin and predefined macros.  The table
+   "builtin_tab" is both used for initialization, and by the "builtin"
    builtin.  */
 
 #define DECLARE(name) \
@@ -99,7 +99,7 @@ builtin_tab[] =
   { "__file__",                TRUE,   FALSE,  FALSE,  m4___file__ },
   { "__line__",                TRUE,   FALSE,  FALSE,  m4___line__ },
   { "__program__",     TRUE,   FALSE,  FALSE,  m4___program__ },
-  { "builtin",         TRUE,   FALSE,  TRUE,   m4_builtin },
+  { "builtin",         TRUE,   TRUE,   TRUE,   m4_builtin },
   { "changecom",       FALSE,  FALSE,  FALSE,  m4_changecom },
   { "changequote",     FALSE,  FALSE,  FALSE,  m4_changequote },
 #ifdef ENABLE_CHANGEWORD
@@ -123,7 +123,7 @@ builtin_tab[] =
   { "include",         FALSE,  FALSE,  TRUE,   m4_include },
   { "incr",            FALSE,  FALSE,  TRUE,   m4_incr },
   { "index",           FALSE,  FALSE,  TRUE,   m4_index },
-  { "indir",           TRUE,   FALSE,  TRUE,   m4_indir },
+  { "indir",           TRUE,   TRUE,   TRUE,   m4_indir },
   { "len",             FALSE,  FALSE,  TRUE,   m4_len },
   { "m4exit",          FALSE,  FALSE,  FALSE,  m4_m4exit },
   { "m4wrap",          FALSE,  FALSE,  TRUE,   m4_m4wrap },
@@ -239,7 +239,7 @@ define_user_macro (const char *name, con
 }
 
 /*-----------------------------------------------.
-| Initialise all builtin and predefined macros.         |
+| Initialize all builtin and predefined macros.         |
 `-----------------------------------------------*/
 
 void
@@ -712,17 +712,34 @@ static void
 m4_builtin (struct obstack *obs, int argc, token_data **argv)
 {
   const builtin *bp;
-  const char *name = ARG (1);
+  const char *name;
 
   if (bad_argc (argv[0], argc, 2, -1))
     return;
+  if (TOKEN_DATA_TYPE (argv[1]) != TOKEN_TEXT)
+    {
+      M4ERROR ((warning_status, 0,
+               "Warning: %s: invalid macro name ignored", ARG (0)));
+      return;
+    }
 
+  name = ARG (1);
   bp = find_builtin_by_name (name);
   if (bp->func == m4_placeholder)
     M4ERROR ((warning_status, 0,
              "undefined builtin `%s'", name));
   else
-    (*bp->func) (obs, argc - 1, argv + 1);
+    {
+      int i;
+      if (! bp->groks_macro_args)
+       for (i = 2; i < argc; i++)
+         if (TOKEN_DATA_TYPE (argv[i]) != TOKEN_TEXT)
+           {
+             TOKEN_DATA_TYPE (argv[i]) = TOKEN_TEXT;
+             TOKEN_DATA_TEXT (argv[i]) = "";
+           }
+      bp->func (obs, argc - 1, argv + 1);
+    }
 }
 
 /*------------------------------------------------------------------------.
@@ -736,23 +753,40 @@ static void
 m4_indir (struct obstack *obs, int argc, token_data **argv)
 {
   symbol *s;
-  const char *name = ARG (1);
+  const char *name;
 
   if (bad_argc (argv[0], argc, 2, -1))
     return;
+  if (TOKEN_DATA_TYPE (argv[1]) != TOKEN_TEXT)
+    {
+      M4ERROR ((warning_status, 0,
+               "Warning: %s: invalid macro name ignored", ARG (0)));
+      return;
+    }
 
+  name = ARG (1);
   s = lookup_symbol (name, SYMBOL_LOOKUP);
   if (s == NULL || SYMBOL_TYPE (s) == TOKEN_VOID)
     M4ERROR ((warning_status, 0,
              "undefined macro `%s'", name));
   else
-    call_macro (s, argc - 1, argv + 1, obs);
+    {
+      int i;
+      if (! SYMBOL_MACRO_ARGS (s))
+       for (i = 2; i < argc; i++)
+         if (TOKEN_DATA_TYPE (argv[i]) != TOKEN_TEXT)
+           {
+             TOKEN_DATA_TYPE (argv[i]) = TOKEN_TEXT;
+             TOKEN_DATA_TEXT (argv[i]) = "";
+           }
+      call_macro (s, argc - 1, argv + 1, obs);
+    }
 }
 
 /*-------------------------------------------------------------------------.
 | The macro "defn" returns the quoted definition of the macro named by the |
 | first argument.  If the macro is builtin, it will push a special        |
-| macro-definition token on ht input stack.                               |
+| macro-definition token on the input stack.                              |
 `-------------------------------------------------------------------------*/
 
 static void

reply via email to

[Prev in Thread] Current Thread [Next in Thread]