m4-patches
[Top][All Lists]
Advanced

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

FYI: 4-gary-macro-formal-parameter-preparation.patch


From: Gary V. Vaughan
Subject: FYI: 4-gary-macro-formal-parameter-preparation.patch
Date: Fri, 06 Jun 2003 12:23:42 +0100
User-agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.3) Gecko/20030312

I'm adding formal parameter support as a GNU extension:

  define(`foo(bar, baz)', `arg2: $baz, arg1: $1')
  foo(quux, quuux)
  => arg2: quuux, arg1: quux

This patch rearranges a bunch of stuff to make adding it easier.
--
  ())_. Gary V. Vaughan     gary@(oranda.demon.co.uk|gnu.org)
  ( '/  Research Scientist  http://www.oranda.demon.co.uk       ,_())____
  / )=  GNU Hacker          http://www.gnu.org/software/libtool  \'      `&
`(_~)_  Tech' Author        http://sources.redhat.com/autobook   =`---d__/
Index: ChangeLog
from  Gary V. Vaughan  <address@hidden>
        Begin preparations for supporting formal parameters in m4 macros.

        * m4/m4private.h (struct m4_token_arg): Placeholder for holding
        the details of a formal parameter.
        (m4_token): Add an arg_signature member to hold a hash table for
        looking up formal parameters.
        * m4/input.c: Update more bitrotted comments.
        (m4_push_builtin): Initialise arg_signature member.
        (init_builtin_token): Copy arg_signature member.
        * m4/m4module.h (m4_builtin_pushdef, m4_builtin_define)
        (m4_macro_pushdef, m4_macro_define): Rewritten as macros to
        replace...
        * m4/builtin.c (m4_builtin_pushdef, m4_builtin_define)
        (m4_macro_pushdef, m4_macro_define): ...these, And...
        (m4_symbol_token): ...wrapped around this new function, which
        vastly simplifies the arguments required by the functions it
        replaces.
        Changed all callers.

Index: m4/builtin.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/builtin.c,v
retrieving revision 1.14
diff -u -p -u -r1.14 builtin.c
--- m4/builtin.c 12 Oct 2001 19:57:29 -0000 1.14
+++ m4/builtin.c 5 Jun 2003 16:10:19 -0000
@@ -71,39 +71,43 @@ m4_builtin_find_by_func (const m4_builti
 }
 
 m4_symbol *
-m4_builtin_pushdef (const char *name, lt_dlhandle handle,
-                   m4_builtin_func *func, int flags, int min_args,
-                   int max_args)
+m4_symbol_token (const char *name, m4_data_t type, m4_token *token,
+                m4_symbol *(*getter) (const char *name),
+                m4_symbol *(*setter) (m4_symbol *, m4_token *))
 {
   m4_symbol *symbol;
 
   assert (name);
-  assert (handle);
-  assert (func);
+  assert (!token || (TOKEN_TYPE (token) == type));
+  assert (getter);
+  assert (setter);
 
-  symbol = m4_symbol_pushdef (name);
+  symbol = (*getter) (name);
 
   if (symbol)
-    m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args);
-
-  return symbol;
-}
-
-m4_symbol *
-m4_builtin_define (const char *name, lt_dlhandle handle,
-                  m4_builtin_func *func, int flags,
-                  int min_args, int max_args)
-{
-  m4_symbol *symbol;
+    {
+      m4_token empty;
 
-  assert (name);
-  assert (handle);
-  assert (func);
+      if (!token)
+       {
+         bzero (&empty, sizeof (m4_token));
+         TOKEN_TYPE (&empty) = type;
+         switch (type)
+           {
+           case M4_TOKEN_TEXT:
+             TOKEN_TEXT (&empty) = "";
+             break;
+
+           case M4_TOKEN_FUNC:
+           case M4_TOKEN_VOID:
+             break;
+           }
 
-  symbol = m4_symbol_define (name);
+         token = &empty;
+       }
 
-  if (symbol)
-    m4_symbol_builtin (symbol, handle, func, flags, min_args, max_args);
+      (*setter) (symbol, token);
+    }
 
   return symbol;
 }
@@ -112,77 +116,59 @@ void
 m4_builtin_table_install (lt_dlhandle handle, const m4_builtin *table)
 {
   const m4_builtin *bp;
+  m4_token token;
 
   assert (handle);
   assert (table);
 
+  bzero (&token, sizeof (m4_token));
+  TOKEN_TYPE (&token)          = M4_TOKEN_FUNC;
+  TOKEN_HANDLE (&token)                = handle;
+
   for (bp = table; bp->name != NULL; bp++)
     {
       int flags = 0;
-      char *key;
+      char *name;
 
       if (prefix_all_builtins)
        {
          static const char prefix[] = "m4_";
          size_t len = strlen (prefix) + strlen (bp->name);
 
-         key = (char *) xmalloc (1+ len);
-         snprintf (key, 1+ len, "%s%s", prefix, bp->name);
+         name = (char *) xmalloc (1+ len);
+         snprintf (name, 1+ len, "%s%s", prefix, bp->name);
        }
       else
-       key = (char *) bp->name;
+       name = (char *) bp->name;
 
       if (bp->groks_macro_args) BIT_SET (flags, TOKEN_MACRO_ARGS_BIT);
       if (bp->blind_if_no_args) BIT_SET (flags, TOKEN_BLIND_ARGS_BIT);
 
-      m4_builtin_pushdef (key, handle, bp->func, flags,
-                         bp->min_args, bp->max_args);
+      TOKEN_FUNC (&token)      = bp->func;
+      TOKEN_FLAGS (&token)     = flags;
+      TOKEN_MIN_ARGS (&token)  = bp->min_args;
+      TOKEN_MAX_ARGS (&token)  = bp->max_args;
+
+      m4_builtin_pushdef (name, &token);
 
       if (prefix_all_builtins)
-       xfree (key);
+       xfree (name);
     }
 }
 
-m4_symbol *
-m4_macro_pushdef (const char *name, lt_dlhandle handle, const char *text,
-                 int flags, int min_args, int max_args)
-{
-  m4_symbol *symbol;
-
-  assert (name);
-  assert (text);
-
-  symbol = m4_symbol_pushdef (name);
-
-  if (symbol)
-    m4_symbol_macro (symbol, handle, text, flags, min_args, max_args);
-
-  return symbol;
-}
-
-m4_symbol *
-m4_macro_define (const char *name, lt_dlhandle handle, const char *text,
-                int flags, int min_args, int max_args)
-{
-  m4_symbol *symbol;
-
-  assert (name);
-  assert (text);
-
-  symbol = m4_symbol_define (name);
-
-  if (symbol)
-    m4_symbol_macro (symbol, handle, text, flags, min_args, max_args);
-
-  return symbol;
-}
-
-
 void
 m4_macro_table_install (lt_dlhandle handle, const m4_macro *table)
 {
   const m4_macro *mp;
+  m4_token token;
+
+  bzero (&token, sizeof (m4_token));
+  TOKEN_TYPE (&token)          = M4_TOKEN_TEXT;
+  TOKEN_HANDLE (&token)                = handle;
 
   for (mp = table; mp->name != NULL; mp++)
-    m4_macro_pushdef (mp->name, handle, mp->value, 0, 0, -1);
+    {
+      TOKEN_TEXT (&token)      = (char *) mp->value;
+      m4_macro_pushdef (mp->name, &token);
+    }
 }
Index: m4/input.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/input.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 input.c
--- m4/input.c 4 Jun 2003 10:56:32 -0000 1.22
+++ m4/input.c 5 Jun 2003 16:10:19 -0000
@@ -325,6 +325,7 @@ m4_push_builtin (m4_token *td)
 
   i->u.u_b.func                = TOKEN_FUNC (td);
   i->u.u_b.handle      = TOKEN_HANDLE (td);
+  i->u.u_b.arg_signature= TOKEN_ARG_SIGNATURE (td);
   i->u.u_b.min_args    = TOKEN_MIN_ARGS (td);
   i->u.u_b.max_args    = TOKEN_MAX_ARGS (td);
   i->u.u_b.flags       = TOKEN_FLAGS (td);
@@ -530,6 +531,7 @@ init_builtin_token (m4_token *td)
   TOKEN_FUNC (td)              = isp->u.u_b.func;
   TOKEN_HANDLE (td)            = isp->u.u_b.handle;
   TOKEN_FLAGS (td)             = isp->u.u_b.flags;
+  TOKEN_ARG_SIGNATURE(td)      = isp->u.u_b.arg_signature;
   TOKEN_MIN_ARGS (td)          = isp->u.u_b.min_args;
   TOKEN_MAX_ARGS (td)          = isp->u.u_b.max_args;
 }
@@ -570,7 +572,7 @@ next_char (void)
     }
 }
 
-/* The function peek_input () is used to look at the next character in
+/* The function m4_peek_input () is used to look at the next character in
    the input stream.  At any given time, it reads from the input_block
    on the top of the current input stack.  */
 int
@@ -730,12 +732,12 @@ m4_input_exit (void)
 
 
 /* Parse and return a single token from the input stream.  A token can
-   either be TOKEN_EOF, if the input_stack is empty; it can be TOKEN_STRING
-   for a quoted string; TOKEN_WORD for something that is a potential macro
-   name; and TOKEN_SIMPLE for any single character that is not a part of
-   any of the previous types.
+   either be M4_TOKEN_EOF, if the input_stack is empty; it can be
+   M4_TOKEN_STRING for a quoted string; M4_TOKEN_WORD for something that
+   is a potential macro name; and M4_TOKEN_SIMPLE for any single character
+   that is not a part of any of the previous types.
 
-   Next_token () return the token type, and passes back a pointer to the
+   M4_next_token () returns the token type, and passes back a pointer to the
    token data through TD.  The token text is collected on the obstack
    token_stack, which never contains more than one token text at a time.
    The storage pointed to by the fields in TD is therefore subject to
Index: m4/m4module.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4module.h,v
retrieving revision 1.40
diff -u -p -u -r1.40 m4module.h
--- m4/m4module.h 4 Jun 2003 10:56:32 -0000 1.40
+++ m4/m4module.h 5 Jun 2003 16:10:19 -0000
@@ -79,33 +79,6 @@ extern lt_dlhandle  m4_module_find_by_bu
 
 
 
-/* --- MACRO (and builtin) MANAGEMENT --- */
-
-extern m4_symbol *m4_macro_pushdef     (const char *name, lt_dlhandle handle,
-                                        const char *text, int flags,
-                                        int min_args, int max_args);
-extern m4_symbol *m4_macro_define      (const char *name, lt_dlhandle handle,
-                                        const char *text, int flags,
-                                        int min_args, int max_args);
-extern void      m4_macro_table_install (lt_dlhandle handle,
-                                         const m4_macro *table);
-
-extern m4_symbol *m4_builtin_pushdef   (const char *name, lt_dlhandle handle,
-                                        m4_builtin_func *func, int flags,
-                                        int min_args, int max_args);
-extern m4_symbol *m4_builtin_define    (const char *name, lt_dlhandle handle,
-                                        m4_builtin_func *func, int flags,
-                                        int min_args, int max_args);
-extern void      m4_builtin_table_install (lt_dlhandle handle,
-                                        const m4_builtin *table);
-
-extern const m4_builtin *m4_builtin_find_by_name (
-                               const m4_builtin *, const char *);
-extern const m4_builtin *m4_builtin_find_by_func (
-                               const m4_builtin *, m4_builtin_func *);
-
-
-
 /* --- SYMBOL TABLE MANAGEMENT --- */
 
 extern m4_hash *m4_symtab;
@@ -120,12 +93,8 @@ extern m4_symbol *m4_symbol_pushdef (con
 extern m4_symbol *m4_symbol_define     (const char *);
 extern void       m4_symbol_popdef     (const char *);
 extern void       m4_symbol_delete     (const char *);
-extern void      m4_symbol_builtin     (m4_symbol *symbol, lt_dlhandle handle,
-                                        m4_builtin_func *func, int flags,
-                                        int min_args, int max_args);
-extern void      m4_symbol_macro       (m4_symbol *symbol, lt_dlhandle handle,
-                                        const char *text, int flags,
-                                        int min_args, int max_args);
+extern m4_symbol *m4_symbol_builtin    (m4_symbol *symbol, m4_token *token);
+extern m4_symbol *m4_symbol_macro      (m4_symbol *symbol, m4_token *token);
 
 
 /* Various different token types.  */
@@ -145,6 +114,39 @@ typedef enum {
   M4_TOKEN_TEXT,
   M4_TOKEN_FUNC
 } m4_data_t;
+
+
+
+
+/* --- MACRO (and builtin) MANAGEMENT --- */
+
+extern m4_symbol *m4_symbol_token (const char *name, m4_data_t type,
+                       m4_token *token,
+                       m4_symbol *(*getter) (const char *name),
+                       m4_symbol *(*setter) (m4_symbol *, m4_token *));
+
+extern void      m4_macro_table_install (lt_dlhandle handle,
+                                         const m4_macro *table);
+extern void      m4_builtin_table_install (lt_dlhandle handle,
+                                        const m4_builtin *table);
+
+extern const m4_builtin *m4_builtin_find_by_name (
+                               const m4_builtin *, const char *);
+extern const m4_builtin *m4_builtin_find_by_func (
+                               const m4_builtin *, m4_builtin_func *);
+
+#define m4_macro_pushdef(name, macro)                                  \
+       m4_symbol_token ((name), M4_TOKEN_TEXT, (macro),                \
+                        m4_symbol_pushdef, m4_symbol_macro)
+#define m4_macro_define(name, macro)                                   \
+       m4_symbol_token ((name), M4_TOKEN_TEXT, (macro),                \
+                        m4_symbol_define, m4_symbol_macro)
+#define m4_builtin_pushdef(name, builtin)                              \
+       m4_symbol_token ((name), M4_TOKEN_FUNC, (builtin),              \
+                        m4_symbol_pushdef, m4_symbol_builtin)
+#define m4_builtin_define(name, builtin)                               \
+       m4_symbol_token ((name), M4_TOKEN_FUNC, (builtin),              \
+                        m4_symbol_define, m4_symbol_builtin)
 
 extern m4_token_t      m4_token_type     (m4_token *);
 extern char           *m4_token_text     (m4_token *);
Index: m4/m4private.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4private.h,v
retrieving revision 1.16
diff -u -p -u -r1.16 m4private.h
--- m4/m4private.h 4 Jun 2003 10:56:32 -0000 1.16
+++ m4/m4private.h 5 Jun 2003 16:10:19 -0000
@@ -41,10 +41,23 @@ struct m4_module_data {
   m4_macro         *mp;        /* `m4_macro_table' address */
 };
 
+struct m4_token_arg {
+  int          index;
+  int          flags;
+  char *       default_val;
+};
+
+/* m4_token_arg.flags bit masks:  */
+
+#define TOKEN_ARG_REST_BIT     (1 << 0)
+#define TOKEN_ARG_KEY_BIT      (1 << 1)
+
 struct m4_token {
   m4_token *   next;
   lt_dlhandle          handle;
   int                  flags;
+
+  m4_hash *            arg_signature;
   int                  min_args, max_args;
 
   m4_data_t            type;
@@ -57,6 +70,7 @@ struct m4_token {
 #define TOKEN_NEXT(T)          ((T)->next)
 #define TOKEN_HANDLE(T)        ((T)->handle)
 #define TOKEN_FLAGS(T)         ((T)->flags)
+#define TOKEN_ARG_SIGNATURE(T)         ((T)->arg_signature)
 #define TOKEN_MIN_ARGS(T)      ((T)->min_args)
 #define TOKEN_MAX_ARGS(T)      ((T)->max_args)
 #define TOKEN_TYPE(T)          ((T)->type)
@@ -91,6 +105,7 @@ struct m4_symbol
 #define SYMBOL_NEXT(S)         (TOKEN_NEXT          (SYMBOL_TOKEN (S)))
 #define SYMBOL_HANDLE(S)       (TOKEN_HANDLE        (SYMBOL_TOKEN (S)))
 #define SYMBOL_FLAGS(S)                (TOKEN_FLAGS         (SYMBOL_TOKEN (S)))
+#define SYMBOL_ARG_SIGNATURE(S)        (TOKEN_ARG_SIGNATURE (SYMBOL_TOKEN (S)))
 #define SYMBOL_MIN_ARGS(S)     (TOKEN_MIN_ARGS      (SYMBOL_TOKEN (S)))
 #define SYMBOL_MAX_ARGS(S)     (TOKEN_MAX_ARGS      (SYMBOL_TOKEN (S)))
 #define SYMBOL_TYPE(S)         (TOKEN_TYPE          (SYMBOL_TOKEN (S)))
Index: m4/symtab.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/symtab.c,v
retrieving revision 1.29
diff -u -p -u -r1.29 symtab.c
--- m4/symtab.c 28 May 2002 21:46:37 -0000 1.29
+++ m4/symtab.c 5 Jun 2003 16:10:19 -0000
@@ -270,42 +270,49 @@ m4_symbol_delete (const char *name)
    arguments.  This function is usually passed a newly pushdef()d symbol
    that is already interned in the symbol table.  The traced bit should
    be appropriately set by the caller.  */
-void
-m4_symbol_builtin (m4_symbol *symbol, lt_dlhandle handle,
-                  m4_builtin_func *func, int flags,
-                  int min_args, int max_args)
+m4_symbol *
+m4_symbol_builtin (m4_symbol *symbol, m4_token *token)
 {
   assert (symbol);
-  assert (handle);
-  assert (func);
+  assert (token);
+  assert (TOKEN_FUNC (token));
+  assert (TOKEN_HANDLE (token));
+  assert (TOKEN_TYPE (token) == M4_TOKEN_FUNC);
 
   if (SYMBOL_TYPE (symbol) == M4_TOKEN_TEXT)
     xfree (SYMBOL_TEXT (symbol));
 
-  SYMBOL_TYPE (symbol)         = M4_TOKEN_FUNC;
-  SYMBOL_FUNC (symbol)         = func;
-  SYMBOL_HANDLE (symbol)       = handle;
-  SYMBOL_FLAGS (symbol)                = flags;
-  SYMBOL_MIN_ARGS (symbol)     = min_args;
-  SYMBOL_MAX_ARGS (symbol)     = max_args;
+  SYMBOL_TYPE (symbol)         = TOKEN_TYPE (token);
+  SYMBOL_FUNC (symbol)         = TOKEN_FUNC (token);
+  SYMBOL_HANDLE (symbol)       = TOKEN_HANDLE (token);
+  SYMBOL_FLAGS (symbol)                = TOKEN_FLAGS (token);
+  SYMBOL_ARG_SIGNATURE (symbol)        = TOKEN_ARG_SIGNATURE (token);
+  SYMBOL_MIN_ARGS (symbol)     = TOKEN_MIN_ARGS (token);
+  SYMBOL_MAX_ARGS (symbol)     = TOKEN_MAX_ARGS (token);
+
+  return symbol;
 }
 
 /* ...and similarly for macro valued symbols.  */
-void
-m4_symbol_macro (m4_symbol *symbol, lt_dlhandle handle,
-                const char *text, int flags, int min_args, int max_args)
+m4_symbol *
+m4_symbol_macro (m4_symbol *symbol, m4_token *token)
 {
   assert (symbol);
+  assert (TOKEN_TEXT (token));
+  assert (TOKEN_TYPE (token) == M4_TOKEN_TEXT);
 
   if (SYMBOL_TYPE (symbol) == M4_TOKEN_TEXT)
     xfree (SYMBOL_TEXT (symbol));
 
-  SYMBOL_TYPE (symbol)                 = M4_TOKEN_TEXT;
-  SYMBOL_TEXT (symbol)                 = xstrdup (text);
-  SYMBOL_HANDLE (symbol)       = handle;
-  SYMBOL_FLAGS (symbol)                = flags;
-  SYMBOL_MIN_ARGS (symbol)     = min_args;
-  SYMBOL_MAX_ARGS (symbol)     = max_args;
+  SYMBOL_TYPE (symbol)         = TOKEN_TYPE (token);
+  SYMBOL_TEXT (symbol)                 = xstrdup (TOKEN_TEXT (token));
+  SYMBOL_HANDLE (symbol)       = TOKEN_HANDLE (token);
+  SYMBOL_FLAGS (symbol)                = TOKEN_FLAGS (token);
+  SYMBOL_ARG_SIGNATURE (symbol)        = TOKEN_ARG_SIGNATURE (token);
+  SYMBOL_MIN_ARGS (symbol)     = TOKEN_MIN_ARGS (token);
+  SYMBOL_MAX_ARGS (symbol)     = TOKEN_MAX_ARGS (token);
+
+  return symbol;
 }
 
 
Index: modules/m4.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/m4.c,v
retrieving revision 1.33
diff -u -p -u -r1.33 m4.c
--- modules/m4.c 4 Jun 2003 10:56:32 -0000 1.33
+++ modules/m4.c 5 Jun 2003 16:10:19 -0000
@@ -153,22 +153,18 @@ M4BUILTIN_HANDLER (define)
 
   if (argc == 2)
     {
-      m4_macro_define (M4ARG (1), NULL, "", 0, 0, -1);
+      m4_macro_define (M4ARG (1), NULL);
       return;
     }
 
   switch (TOKEN_TYPE (argv[2]))
     {
     case M4_TOKEN_TEXT:
-      m4_macro_define (M4ARG (1), TOKEN_HANDLE (argv[2]),
-                      TOKEN_TEXT (argv[2]), TOKEN_FLAGS (argv[2]),
-                      TOKEN_MIN_ARGS (argv[2]), TOKEN_MAX_ARGS (argv[2]));
+      m4_macro_define (M4ARG (1), argv[2]);
       return;
 
     case M4_TOKEN_FUNC:
-      m4_builtin_define (M4ARG (1), TOKEN_HANDLE (argv[2]),
-                        TOKEN_FUNC (argv[2]), TOKEN_FLAGS (argv[2]),
-                        TOKEN_MIN_ARGS (argv[2]), TOKEN_MAX_ARGS (argv[2]));
+      m4_builtin_define (M4ARG (1), argv[2]);
       return;
     }
 
@@ -192,22 +188,18 @@ M4BUILTIN_HANDLER (pushdef)
 
   if (argc == 2)
     {
-      m4_macro_pushdef (M4ARG (1), NULL, "", 0, 0, -1);
+      m4_macro_pushdef (M4ARG (1), NULL);
       return;
     }
 
   switch (TOKEN_TYPE (argv[2]))
     {
     case M4_TOKEN_TEXT:
-      m4_macro_pushdef (M4ARG (1), TOKEN_HANDLE (argv[2]),
-                       TOKEN_TEXT (argv[2]), TOKEN_FLAGS (argv[2]),
-                       TOKEN_MIN_ARGS (argv[2]), TOKEN_MAX_ARGS (argv[2]));
+      m4_macro_pushdef (M4ARG (1), argv[2]);
       return;
 
     case M4_TOKEN_FUNC:
-      m4_builtin_pushdef (M4ARG (1), TOKEN_HANDLE (argv[2]),
-                         TOKEN_FUNC (argv[2]), TOKEN_FLAGS (argv[2]),
-                         TOKEN_MIN_ARGS (argv[2]), TOKEN_MAX_ARGS (argv[2]));
+      m4_builtin_pushdef (M4ARG (1), argv[2]);
       return;
     }
 
Index: src/freeze.c
===================================================================
RCS file: /cvsroot/m4/m4/src/freeze.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 freeze.c
--- src/freeze.c 13 Oct 2001 08:56:48 -0000 1.22
+++ src/freeze.c 5 Jun 2003 16:10:20 -0000
@@ -473,6 +473,7 @@ reload_frozen_state (const char *name)
 
          if (bp)
            {
+             m4_token token;
              int flags = 0;
 
              if (bp->groks_macro_args)
@@ -480,8 +481,15 @@ reload_frozen_state (const char *name)
              if (bp->blind_if_no_args)
                BIT_SET (flags, TOKEN_BLIND_ARGS_BIT);
 
-             m4_builtin_pushdef (string[0], handle, bp->func, flags,
-                                 bp->min_args, bp->max_args);
+             bzero (&token, sizeof (m4_token));
+             TOKEN_TYPE (&token)       = M4_TOKEN_FUNC;
+             TOKEN_FUNC (&token)       = bp->func;
+             TOKEN_HANDLE (&token)     = handle;
+             TOKEN_FLAGS (&token)      = flags;
+             TOKEN_MIN_ARGS (&token)   = bp->min_args;
+             TOKEN_MAX_ARGS (&token)   = bp->max_args;
+
+             m4_builtin_pushdef (string[0], &token);
            }
          else
            M4ERROR ((warning_status, 0,
@@ -650,6 +658,7 @@ reload_frozen_state (const char *name)
 
        /* Enter a macro having an expansion text as a definition.  */
        {
+         m4_token token;
          lt_dlhandle handle = 0;
 
          if (number[2] > 0)
@@ -657,7 +666,13 @@ reload_frozen_state (const char *name)
              if (strcmp (m4_module_name (handle), string[2]) == 0)
                break;
 
-         m4_macro_pushdef (string[0], handle, string[1], 0, 0, -1);
+         bzero (&token, sizeof (m4_token));
+         TOKEN_TYPE (&token)           = M4_TOKEN_TEXT;
+         TOKEN_TEXT (&token)           = string[1];
+         TOKEN_HANDLE (&token)         = handle;
+         TOKEN_MAX_ARGS (&token)       = -1;
+
+         m4_macro_pushdef (string[0], &token);
        }
        break;
 
Index: src/main.c
===================================================================
RCS file: /cvsroot/m4/m4/src/main.c,v
retrieving revision 1.34
diff -u -p -u -r1.34 main.c
--- src/main.c 30 May 2003 15:13:32 -0000 1.34
+++ src/main.c 5 Jun 2003 16:10:20 -0000
@@ -416,49 +416,56 @@ warranty; not even for MERCHANTABILITY o
 
   /* Handle deferred command line macro definitions.  Must come after
      initialisation of the symbol table.  */
+  {
+    m4_token token;
 
-  defines = head;
+    bzero (&token, sizeof (token));
+    TOKEN_TYPE (&token)                = M4_TOKEN_TEXT;
 
-  while (defines != NULL)
-    {
-      macro_definition *next;
-      char *macro_value;
-      m4_symbol *symbol;
-
-      switch (defines->code)
-       {
-       case 'D':
-         macro_value = strchr (defines->macro, '=');
-         if (macro_value == NULL)
-           macro_value = "";
-         else
-           *macro_value++ = '\0';
-         m4_macro_define (defines->macro, NULL, macro_value, 0x0, 0, -1);
-         break;
-
-       case 'U':
-         m4_symbol_delete (defines->macro);
-         break;
-
-       case 't':
-         symbol = m4_symbol_define (defines->macro);
-         SYMBOL_TRACED (symbol) = TRUE;
-         break;
-
-       case 'm':
-         m4_module_load (defines->macro, 0);
-         break;
-
-       default:
-         M4ERROR ((warning_status, 0,
-                   "INTERNAL ERROR: Bad code in deferred arguments"));
-         abort ();
-       }
-
-      next = defines->next;
-      xfree ((void *) defines);
-      defines = next;
-    }
+    defines = head;
+
+    while (defines != NULL)
+      {
+       macro_definition *next;
+       char *macro_value;
+       m4_symbol *symbol;
+
+       switch (defines->code)
+         {
+         case 'D':
+           macro_value = strchr (defines->macro, '=');
+           if (macro_value == NULL)
+             macro_value = "";
+           else
+             *macro_value++ = '\0';
+           TOKEN_TEXT (&token) = macro_value;
+           m4_macro_define (defines->macro, &token);
+           break;
+
+         case 'U':
+           m4_symbol_delete (defines->macro);
+           break;
+
+         case 't':
+           symbol = m4_symbol_define (defines->macro);
+           SYMBOL_TRACED (symbol) = TRUE;
+           break;
+
+         case 'm':
+           m4_module_load (defines->macro, 0);
+           break;
+
+         default:
+           M4ERROR ((warning_status, 0,
+                     "INTERNAL ERROR: Bad code in deferred arguments"));
+           abort ();
+         }
+
+       next = defines->next;
+       xfree ((void *) defines);
+       defines = next;
+      }
+  }
 
   /* Interactive mode means unbuffered output, and interrupts ignored.  */
 

reply via email to

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