m4-patches
[Top][All Lists]
Advanced

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

FYI: 16-gary-refactor-symbol-api.patch


From: Gary V. Vaughan
Subject: FYI: 16-gary-refactor-symbol-api.patch
Date: Wed, 25 Jun 2003 13:42:11 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030617

Applied to HEAD about a week ago, but the FYI didn't seem to make it to here last time.
--
  ())_.  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>

        Tie down the interface to libm4 some more.  Make more structures
        opaque to modules by moving them to m4private.h, and writing
        setters and getters.  To win back the speed penalty for doing this
        also wrote macroized versions that do know about structure layout
        in m4private.h and #include that file into modules when NDEBUG is
        defined at compile time.  There are still some accessor macros in
        m4private.h that need to go, but that is not necessary to clean
        the module api up.

        * m4/m4module.h (m4_symbol_type): Moved...
        * m4/m4private.h (m4__symbol_type): ...to here.
        * m4/symtab.c (m4_get_symbol_value, m4_get_symbol_traced)
        (m4_set_symbol_traced, m4_set_symbol_name_traced)
        (m4_is_symbol_text, m4_is_symbol_func, m4_get_symbol_text)
        (m4_get_symbol_func, m4_symbol_value_create)
        (m4_symbol_value_delete, m4_set_symbol_value_text)
        (m4_set_symbol_value_func): New exported api to symbols.
        (m4_get_symbol_value_type): Replaced by m4_is_symbol_value_text
        and m4_is_symbol_value_func.
        * m4/m4module.h: Prototype these guys.
        * m4/module.c (m4_set_module_macro_table)
        (m4_set_module_builtin_table): Make these static, there is no
        reason to pollute the api with them.
        * m4/m4private.h: Reformatting.
        (m4_get_symtab): Only define when NDEBUG is defined.
        (m4_get_symbol_value, m4_get_symbol_traced)
        (m4_set_symbol_traced, m4_set_symbol_name_traced)
        (m4_is_symbol_text, m4_is_symbol_func, m4_get_symbol_text)
        (m4_get_symbol_func, m4_symbol_value_create)
        (m4_symbol_value_delete, m4_set_symbol_value_text)
        (m4_set_symbol_value_func): Macro implementations of the new
        functions when NDEBUG is defined.
        (SYMBOL_TRACED, SYMBOL_VALUE, SYMBOL_TYPE, SYMBOL_TEXT)
        (SYMBOL_FUNC, VALUE_TYPE, VALUE_TEXT, VALUE_FUNC): Removed.
        Superceded by the above.  All callers changed.
        (M4ARG): Removed.  This is no longer different to the
        m4/m4module.h definition.
        * modules/gnu.c, modules/m4.c: Only include m4private.h when
        NDEBUG is defined.  That way we exercise the same (albeit slower)
        api that external modules must use.

Index: m4/debug.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/debug.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 debug.c
--- m4/debug.c 18 Jun 2003 16:21:54 -0000 1.12
+++ m4/debug.c 19 Jun 2003 14:50:44 -0000
@@ -343,14 +343,14 @@ m4_trace_pre (const char *name, int id, 
          if (i != 1)
            m4_trace_format (", ");
 
-         switch (VALUE_TYPE (argv[i]))
+         if (m4_is_symbol_value_text (argv[i]))
            {
-           case M4_SYMBOL_TEXT:
              m4_trace_format ("%l%S%r", M4ARG (i));
-             break;
-
-           case M4_SYMBOL_FUNC:
-             bp = m4_builtin_find_by_func (NULL, VALUE_FUNC (argv[i]));
+           }
+         else if (m4_is_symbol_value_func (argv[i]))
+           {
+             bp = m4_builtin_find_by_func (NULL,
+                                           m4_get_symbol_value_func(argv[i]));
              if (bp == NULL)
                {
                  M4ERROR ((warning_status, 0, "\
@@ -358,14 +358,13 @@ INTERNAL ERROR: Builtin not found in bui
                  abort ();
                }
              m4_trace_format ("<%s>", bp->name);
-             break;
-
-           case M4_SYMBOL_VOID:
+           }
+         else
+           {
              M4ERROR ((warning_status, 0,
                        "INTERNAL ERROR: Bad token data type (m4_trace_pre 
())"));
              abort ();
            }
-
        }
       m4_trace_format (")");
     }
@@ -380,8 +379,8 @@ INTERNAL ERROR: Builtin not found in bui
 /* Format the final part of a trace line and print it all.  Used from
    expand_macro ().  */
 void
-m4_trace_post (const char *name, int id, int argc, m4_symbol_value **argv,
-           const char *expanded)
+m4_trace_post (const char *name, int id,
+              int argc, m4_symbol_value **argv, const char *expanded)
 {
   if (debug_level & M4_DEBUG_TRACE_CALL)
     {
Index: m4/input.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/input.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 input.c
--- m4/input.c 18 Jun 2003 16:21:54 -0000 1.26
+++ m4/input.c 19 Jun 2003 14:50:44 -0000
@@ -311,7 +311,7 @@ m4_push_builtin (m4_symbol_value *token)
   input_block *i;
 
   /* Make sure we were passed a builtin function type token.  */
-  assert (VALUE_TYPE (token) == M4_SYMBOL_FUNC);
+  assert (m4_is_symbol_value_func (token));
 
   if (next != NULL)
     {
@@ -323,7 +323,7 @@ m4_push_builtin (m4_symbol_value *token)
                                     sizeof (struct input_block));
   i->funcs = &builtin_funcs;
 
-  i->u.u_b.func                = VALUE_FUNC (token);
+  i->u.u_b.func                = m4_get_symbol_value_func (token);
   i->u.u_b.handle      = VALUE_HANDLE (token);
   i->u.u_b.arg_signature= VALUE_ARG_SIGNATURE (token);
   i->u.u_b.min_args    = VALUE_MIN_ARGS (token);
@@ -527,8 +527,7 @@ init_builtin_token (m4_symbol_value *tok
       abort ();
     }
 
-  VALUE_TYPE (token)           = M4_SYMBOL_FUNC;
-  VALUE_FUNC (token)           = isp->u.u_b.func;
+  m4_set_symbol_value_func (token, isp->u.u_b.func);
   VALUE_HANDLE (token)         = isp->u.u_b.handle;
   VALUE_FLAGS (token)          = isp->u.u_b.flags;
   VALUE_ARG_SIGNATURE(token)   = isp->u.u_b.arg_signature;
@@ -941,9 +940,7 @@ m4__next_token (m4_symbol_value *token)
 
   bzero (token, sizeof (m4_symbol_value));
 
-  VALUE_TYPE (token)   = M4_SYMBOL_TEXT;
-  VALUE_TEXT (token)   = obstack_finish (&token_stack);
-  VALUE_MIN_ARGS (token)       = -1;
+  m4_set_symbol_value_text (token, obstack_finish (&token_stack));
   VALUE_MAX_ARGS (token)       = -1;
 
 #ifdef DEBUG_INPUT
Index: m4/m4.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4.c,v
retrieving revision 1.1
diff -u -p -u -r1.1 m4.c
--- m4/m4.c 16 Jun 2003 10:43:45 -0000 1.1
+++ m4/m4.c 19 Jun 2003 14:50:44 -0000
@@ -25,7 +25,7 @@ m4_create (void)
 {
   m4 *context = XMALLOC (m4, 1);
 
-  M4_SYMTAB (context) = m4_symtab_create (0);
+  context->symtab = m4_symtab_create (0);
 
   return context;
 }
@@ -35,11 +35,10 @@ m4_delete (m4 *context)
 {
   assert (context);
 
-  if (M4_SYMTAB (context))
-    m4_symtab_delete (M4_SYMTAB (context));
+  if (context->symtab)
+    m4_symtab_delete (context->symtab);
 
   xfree (context);
-
 }
 
 #undef m4_get_symtab
@@ -47,6 +46,5 @@ m4_symtab *
 m4_get_symtab (m4 *context)
 {
   assert (context);
-
-  return m4_get_symtab (context);
+  return context->symtab;
 }
Index: m4/m4module.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4module.h,v
retrieving revision 1.49
diff -u -p -u -r1.49 m4module.h
--- m4/m4module.h 18 Jun 2003 16:21:54 -0000 1.49
+++ m4/m4module.h 19 Jun 2003 14:50:44 -0000
@@ -31,20 +31,14 @@ BEGIN_C_DECLS
 /* Various declarations.  */
 
 typedef struct m4              m4;
-typedef struct m4_symbol       m4_symbol;
-typedef struct m4_symbol_value         m4_symbol_value;
 typedef struct m4_hash         m4_symtab;
-
+typedef struct m4_symbol       m4_symbol;
+typedef struct m4_symbol_value m4_symbol_value;
 
 typedef void m4_builtin_func (m4 *, struct obstack *, int, m4_symbol_value **);
 typedef void *m4_module_func (const char *);
 
 typedef struct {
-    unsigned char *string;     /* characters of the string */
-    size_t length;             /* length of the string */
-} m4_string;
-
-typedef struct {
   const char *name;
   const char *value;
 } m4_macro;
@@ -80,10 +74,6 @@ extern const char  *m4_get_module_name               
 extern m4_builtin  *m4_get_module_builtin_table        (lt_dlhandle);
 extern m4_macro           *m4_get_module_macro_table   (lt_dlhandle);
 
-extern void    m4_set_module_macro_table   (m4 *context, lt_dlhandle handle,
-                                            const m4_macro *table);
-extern void    m4_set_module_builtin_table (m4 *context, lt_dlhandle handle,
-                                            const m4_builtin *table);
 
 
 /* --- SYMBOL TABLE MANAGEMENT --- */
@@ -110,17 +100,31 @@ extern void       m4_symbol_delete  (m4_
        while (m4_symbol_lookup ((symtab), (name)))                     \
            m4_symbol_popdef ((symtab), (name));        } M4_STMT_END
 
-extern void      m4_set_symbol_traced (m4_symtab*, const char *);
-
-
-
-/* The data for a token, a macro argument, and a macro definition.  */
-typedef enum {
-  M4_SYMBOL_VOID,
-  M4_SYMBOL_TEXT,
-  M4_SYMBOL_FUNC
-} m4_symbol_type;
-
+extern m4_symbol_value *m4_get_symbol_value      (m4_symbol *symbol);
+extern boolean         m4_get_symbol_traced      (m4_symbol*);
+extern boolean         m4_set_symbol_traced      (m4_symbol*, boolean);
+extern boolean         m4_set_symbol_name_traced (m4_symtab*, const char *);
+
+#define m4_is_symbol_text(symbol)                                      \
+       (m4_is_symbol_value_text (m4_get_symbol_value (symbol)))
+#define m4_is_symbol_func(symbol)                                      \
+       (m4_is_symbol_value_func (m4_get_symbol_value (symbol)))
+#define m4_get_symbol_text(symbol)                                     \
+       (m4_get_symbol_value_text (m4_get_symbol_value (symbol)))
+#define m4_get_symbol_func(symbol)                                     \
+       (m4_get_symbol_value_func (m4_get_symbol_value (symbol)))
+
+extern m4_symbol_value *m4_symbol_value_create   (void);
+extern void            m4_symbol_value_delete    (m4_symbol_value *);
+extern void            m4_symbol_value_copy      (m4_symbol_value *,
+                                                  m4_symbol_value *);
+extern boolean         m4_is_symbol_value_text   (m4_symbol_value *);
+extern boolean         m4_is_symbol_value_func   (m4_symbol_value *);
+extern char           *m4_get_symbol_value_text  (m4_symbol_value *);
+extern m4_builtin_func *m4_get_symbol_value_func  (m4_symbol_value *);
+extern void            m4_set_symbol_value_text  (m4_symbol_value *, char *);
+extern void            m4_set_symbol_value_func  (m4_symbol_value *,
+                                                  m4_builtin_func *);
 
 
 
@@ -131,10 +135,6 @@ extern const m4_builtin *m4_builtin_find
 extern const m4_builtin *m4_builtin_find_by_func (
                                const m4_builtin *, m4_builtin_func *);
 
-extern m4_symbol_type  m4_get_symbol_value_type (m4_symbol_value *);
-extern char           *m4_get_symbol_value_text (m4_symbol_value *);
-extern m4_builtin_func *m4_get_symbol_value_func (m4_symbol_value *);
-
 #define M4ARG(i)       (argc > (i) ? m4_get_symbol_value_text (argv[i]) : "")
 
 #define M4BUILTIN(name)                                        \
@@ -188,6 +188,11 @@ extern int nesting_limit;          /* -L */
 extern int discard_comments;           /* -c */
 
 /* left and right quote, begin and end comment */
+typedef struct {
+    unsigned char *string;     /* characters of the string */
+    size_t length;             /* length of the string */
+} m4_string;
+
 extern m4_string lquote;
 extern m4_string rquote;
 
@@ -401,7 +406,6 @@ extern int m4_current_line;
 extern void    m4_input_init   (void);
 extern void    m4_input_exit   (void);
 extern int     m4_peek_input   (void);
-extern void    m4_symbol_value_copy    (m4_symbol_value *dest, m4_symbol_value 
*src);
 extern void    m4_skip_line    (void);
 
 /* push back input */
Index: m4/m4private.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4private.h,v
retrieving revision 1.23
diff -u -p -u -r1.23 m4private.h
--- m4/m4private.h 18 Jun 2003 16:21:54 -0000 1.23
+++ m4/m4private.h 19 Jun 2003 14:50:44 -0000
@@ -25,8 +25,18 @@
 #endif
 
 #include <assert.h>
-#include <m4module.h>
 
+#include "m4module.h"
+
+typedef enum {
+  M4_SYMBOL_VOID,
+  M4_SYMBOL_TEXT,
+  M4_SYMBOL_FUNC
+} m4__symbol_type;
+
+#define BIT_TEST(flags, bit)   (((flags) & (bit)) == (bit))
+#define BIT_SET(flags, bit)    ((flags) |= (bit))
+#define BIT_RESET(flags, bit)  ((flags) &= ~(bit))
 
 
 /* --- CONTEXT MANAGEMENT --- */
@@ -35,10 +45,9 @@ struct m4 {
   m4_symtab *symtab;
 };
 
-#define M4_SYMTAB(context) ((context)->symtab)
-
-#define m4_get_symtab(context) ((context)->symtab)
-
+#ifdef NDEBUG
+#  define m4_get_symtab(context)       ((context)->symtab)
+#endif
 
 
 /* --- MODULE MANAGEMENT --- */
@@ -58,33 +67,12 @@ extern void     m4__module_exit (m4 *con
 
 /* --- SYMBOL TABLE MANAGEMENT --- */
 
-extern void    m4__symtab_remove_module_references (m4_symtab*, lt_dlhandle);
-
-
-/* TRUE iff strlen(rquote) == strlen(lquote) == 1 */
-extern boolean m4__single_quotes;
-
-/* TRUE iff strlen(bcomm) == strlen(ecomm) == 1 */
-extern boolean m4__single_comments;
-
-/* TRUE iff some character has M4_SYNTAX_ESCAPE */
-extern boolean m4__use_macro_escape;
-
-struct m4_symbol_arg {
-  int          index;
-  int          flags;
-  char *       default_val;
+struct m4_symbol
+{
+  boolean              traced;
+  m4_symbol_value *    value;
 };
 
-#define SYMBOL_ARG_INDEX(A)    ((A)->index)
-#define SYMBOL_ARG_FLAGS(A)    ((A)->flags)
-#define SYMBOL_ARG_DEFAULT(A)  ((A)->default_val)
-
-/* m4_symbol_arg.flags bit masks:  */
-
-#define SYMBOL_ARG_REST_BIT    (1 << 0)
-#define SYMBOL_ARG_KEY_BIT     (1 << 1)
-
 struct m4_symbol_value {
   m4_symbol_value *    next;
   lt_dlhandle          handle;
@@ -93,7 +81,7 @@ struct m4_symbol_value {
   m4_hash *            arg_signature;
   int                  min_args, max_args;
 
-  m4_symbol_type       type;
+  m4__symbol_type      type;
   union {
     char *             text;
     m4_builtin_func *  func;
@@ -106,45 +94,68 @@ struct m4_symbol_value {
 #define VALUE_ARG_SIGNATURE(T)         ((T)->arg_signature)
 #define VALUE_MIN_ARGS(T)      ((T)->min_args)
 #define VALUE_MAX_ARGS(T)      ((T)->max_args)
-#define VALUE_TYPE(T)          ((T)->type)
-#define VALUE_TEXT(T)          ((T)->u.text)
-#define VALUE_FUNC(T)          ((T)->u.func)
+
+#define SYMBOL_NEXT(S)         (VALUE_NEXT          ((S)->value))
+#define SYMBOL_HANDLE(S)       (VALUE_HANDLE        ((S)->value))
+#define SYMBOL_FLAGS(S)                (VALUE_FLAGS         ((S)->value))
+#define SYMBOL_ARG_SIGNATURE(S)        (VALUE_ARG_SIGNATURE ((S)->value))
+#define SYMBOL_MIN_ARGS(S)     (VALUE_MIN_ARGS      ((S)->value))
+#define SYMBOL_MAX_ARGS(S)     (VALUE_MAX_ARGS      ((S)->value))
+
+#ifdef NDEBUG
+#  define m4_get_symbol_traced(S)      ((S)->traced)
+#  define m4_set_symbol_traced(S, V)   ((S)->traced = (V))
+
+#  define m4_symbol_value_create()     (XCALLOC (m4_symbol_value, 1))
+#  define m4_symbol_value_delete(V)    (XFREE (V))
+
+#  define m4_is_symbol_value_text(V)   ((V)->type == M4_SYMBOL_TEXT)
+#  define m4_is_symbol_value_func(V)   ((V)->type == M4_SYMBOL_FUNC)
+#  define m4_get_symbol_value_text(V)  ((V)->u.text)
+#  define m4_get_symbol_value_func(V)  ((V)->u.func)
+
+#  define m4_set_symbol_value_text(V, T)                               \
+       ((V)->type = M4_SYMBOL_TEXT, (V)->u.text = (T))
+#  define m4_set_symbol_value_func(V, F)                               \
+       ((V)->type = M4_SYMBOL_FUNC, (V)->u.func = (F))
+#endif
+
+
 
 /* m4_symbol_value.flags bit masks:  */
 
 #define VALUE_MACRO_ARGS_BIT   (1 << 0)
 #define VALUE_BLIND_ARGS_BIT   (1 << 1)
 
-#define BIT_TEST(flags, bit)   (((flags) & (bit)) == (bit))
-#define BIT_SET(flags, bit)    ((flags) |= (bit))
-#define BIT_RESET(flags, bit)  ((flags) &= ~(bit))
 
+struct m4_symbol_arg {
+  int          index;
+  int          flags;
+  char *       default_val;
+};
 
-/* Redefine the exported function to this faster
-   macro based version for internal use by the m4 code. */
-#undef M4ARG
-#define M4ARG(i)       (argc > (i) ? VALUE_TEXT (argv[i]) : "")
+#define SYMBOL_ARG_INDEX(A)    ((A)->index)
+#define SYMBOL_ARG_FLAGS(A)    ((A)->flags)
+#define SYMBOL_ARG_DEFAULT(A)  ((A)->default_val)
 
+/* m4_symbol_arg.flags bit masks:  */
 
-struct m4_symbol
-{
-  boolean              traced;
-  m4_symbol_value *    value;
-};
+#define SYMBOL_ARG_REST_BIT    (1 << 0)
+#define SYMBOL_ARG_KEY_BIT     (1 << 1)
+
+extern void    m4__symtab_remove_module_references (m4_symtab*, lt_dlhandle);
 
-#define SYMBOL_TRACED(S)       ((S)->traced)
-#define SYMBOL_VALUE(S)                ((S)->value)
 
-#define SYMBOL_NEXT(S)         (VALUE_NEXT          (SYMBOL_VALUE (S)))
-#define SYMBOL_HANDLE(S)       (VALUE_HANDLE        (SYMBOL_VALUE (S)))
-#define SYMBOL_FLAGS(S)                (VALUE_FLAGS         (SYMBOL_VALUE (S)))
-#define SYMBOL_ARG_SIGNATURE(S)        (VALUE_ARG_SIGNATURE (SYMBOL_VALUE (S)))
-#define SYMBOL_MIN_ARGS(S)     (VALUE_MIN_ARGS      (SYMBOL_VALUE (S)))
-#define SYMBOL_MAX_ARGS(S)     (VALUE_MAX_ARGS      (SYMBOL_VALUE (S)))
-#define SYMBOL_TYPE(S)         (VALUE_TYPE          (SYMBOL_VALUE (S)))
-#define SYMBOL_TEXT(S)         (VALUE_TEXT          (SYMBOL_VALUE (S)))
-#define SYMBOL_FUNC(S)         (VALUE_FUNC          (SYMBOL_VALUE (S)))
 
+
+/* TRUE iff strlen(rquote) == strlen(lquote) == 1 */
+extern boolean m4__single_quotes;
+
+/* TRUE iff strlen(bcomm) == strlen(ecomm) == 1 */
+extern boolean m4__single_comments;
+
+/* TRUE iff some character has M4_SYNTAX_ESCAPE */
+extern boolean m4__use_macro_escape;
 
 /* Various different token types.  */
 typedef enum {
Index: m4/macro.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/macro.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 macro.c
--- m4/macro.c 18 Jun 2003 16:21:54 -0000 1.27
+++ m4/macro.c 19 Jun 2003 14:50:44 -0000
@@ -61,7 +61,7 @@ expand_token (m4 *context, struct obstac
              m4__token_type type, m4_symbol_value *token)
 {
   m4_symbol *symbol;
-  char *text = xstrdup (VALUE_TEXT (token));
+  char *text = xstrdup (m4_get_symbol_value_text (token));
 
   switch (type)
     {                          /* TOKSW */
@@ -84,8 +84,8 @@ expand_token (m4 *context, struct obstac
 
        symbol = m4_symbol_lookup (M4SYMTAB, textp);
        if (symbol == NULL
-           || SYMBOL_TYPE (symbol) == M4_SYMBOL_VOID
-           || (SYMBOL_TYPE (symbol) == M4_SYMBOL_FUNC
+           || symbol->value->type == M4_SYMBOL_VOID
+           || (symbol->value->type == M4_SYMBOL_FUNC
                && BIT_TEST (SYMBOL_FLAGS (symbol), VALUE_BLIND_ARGS_BIT)
                && !M4_IS_OPEN (m4_peek_input ())))
          {
@@ -123,7 +123,7 @@ expand_argument (m4 *context, struct obs
   const char *current_file = m4_current_file;
   int current_line = m4_current_line;
 
-  VALUE_TYPE (argp) = M4_SYMBOL_VOID;
+  argp->type = M4_SYMBOL_VOID;
 
   /* Skip leading white space.  */
   do
@@ -137,7 +137,7 @@ expand_argument (m4 *context, struct obs
       switch (type)
        {                       /* TOKSW */
        case M4_TOKEN_SIMPLE:
-         text = VALUE_TEXT (&token);
+         text = m4_get_symbol_value_text (&token);
          if ((M4_IS_COMMA (*text) || M4_IS_CLOSE (*text)) && paren_level == 0)
            {
 
@@ -145,12 +145,11 @@ expand_argument (m4 *context, struct obs
              obstack_1grow (obs, '\0');
              text = obstack_finish (obs);
 
-             if (VALUE_TYPE (argp) == M4_SYMBOL_VOID)
+             if (argp->type == M4_SYMBOL_VOID)
                {
-                 VALUE_TYPE (argp) = M4_SYMBOL_TEXT;
-                 VALUE_TEXT (argp) = text;
+                 m4_set_symbol_value_text (argp, text);
                }
-             return (boolean) (M4_IS_COMMA (*VALUE_TEXT (&token)));
+             return (boolean) (M4_IS_COMMA (*m4_get_symbol_value_text 
(&token)));
            }
 
          if (M4_IS_OPEN (*text))
@@ -215,7 +214,8 @@ ERROR: Recursion limit of %d exceeded, u
   macro_call_id++;
   my_call_id = macro_call_id;
 
-  traced = (boolean) ((debug_level & M4_DEBUG_TRACE_ALL) || SYMBOL_TRACED 
(symbol));
+  traced = (boolean) ((debug_level & M4_DEBUG_TRACE_ALL)
+                     || m4_get_symbol_traced (symbol));
 
   obstack_init (&argptr);
   obstack_init (&arguments);
@@ -261,8 +261,7 @@ collect_arguments (m4 *context, const ch
 
   groks_macro_args = BIT_TEST (SYMBOL_FLAGS (symbol), VALUE_MACRO_ARGS_BIT);
 
-  VALUE_TYPE (&token) = M4_SYMBOL_TEXT;
-  VALUE_TEXT (&token) = (char *) name;
+  m4_set_symbol_value_text (&token, (char *) name);
   tokenp = (m4_symbol_value *) obstack_copy (arguments, (void *) &token,
                                      sizeof (token));
   obstack_grow (argptr, (void *) &tokenp, sizeof (tokenp));
@@ -275,10 +274,9 @@ collect_arguments (m4 *context, const ch
        {
          more_args = expand_argument (context, arguments, &token);
 
-         if (!groks_macro_args && VALUE_TYPE (&token) == M4_SYMBOL_FUNC)
+         if (!groks_macro_args && m4_is_symbol_value_func (&token))
            {
-             VALUE_TYPE (&token) = M4_SYMBOL_TEXT;
-             VALUE_TEXT (&token) = "";
+             m4_set_symbol_value_text (&token, "");
            }
          tokenp = (m4_symbol_value *)
            obstack_copy (arguments, (void *) &token, sizeof (token));
@@ -299,17 +297,16 @@ void
 m4_call_macro (m4_symbol *symbol, m4 *context, struct obstack *expansion,
               int argc, m4_symbol_value **argv)
 {
-  switch (SYMBOL_TYPE (symbol))
+  if (m4_is_symbol_text (symbol))
     {
-    case M4_SYMBOL_FUNC:
-      (*SYMBOL_FUNC (symbol)) (context, expansion, argc, argv);
-      break;
-
-    case M4_SYMBOL_TEXT:
       m4_process_macro (symbol, context, expansion, argc, argv);
-      break;
-
-    case M4_SYMBOL_VOID:
+    }
+  else if (m4_is_symbol_func (symbol))
+    {
+      (*m4_get_symbol_func (symbol)) (context, expansion, argc, argv);
+    }
+  else
+    {
       M4ERROR ((warning_status, 0,
                "INTERNAL ERROR: Bad symbol type in call_macro ()"));
       abort ();
@@ -328,7 +325,7 @@ m4_process_macro (m4_symbol *symbol, m4 
   const unsigned char *text;
   int i;
 
-  for (text = SYMBOL_TEXT (symbol); *text != '\0';)
+  for (text = m4_get_symbol_text (symbol); *text != '\0';)
     {
       if (*text != '$')
        {
Index: m4/module.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/module.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 module.c
--- m4/module.c 18 Jun 2003 16:21:54 -0000 1.22
+++ m4/module.c 19 Jun 2003 14:50:44 -0000
@@ -52,13 +52,13 @@
  * NULL on failure or else a libtool module handle for the newly mapped
  * vm segment containing the module code.  If the module is not already
  * loaded, m4_module_load() retrieves its value for the symbol
- * `m4_builtin_table', which is installed using m4_set_module_builtin_table().
+ * `m4_builtin_table', which is installed using set_module_builtin_table().
  *
  * In addition to builtin functions, you can also define static macro
  * expansions in the `m4_macro_table' symbol.  If you define this symbol
  * in your modules, it should be an array of `m4_macro's, mapping macro
  * names to the expansion text.  Any macros defined in `m4_macro_table'
- * are installed into the M4 symbol table with m4_set_module_macro_table().
+ * are installed into the M4 symbol table with set_module_macro_table().
  *
  * Each time a module is loaded, the module function prototyped as
  * "M4INIT_HANDLER (<module name>)" is called, if defined.  Any value
@@ -90,6 +90,9 @@ static int        module_remove  (m4 *conte
 static void        module_close   (m4 *context, lt_dlhandle handle,
                                    struct obstack *obs);
 
+static void m4_set_module_macro_table   (m4*, lt_dlhandle, const m4_macro*);
+static void m4_set_module_builtin_table (m4*, lt_dlhandle, const m4_builtin*);
+
 static lt_dlcaller_id caller_id = 0;
 
 const char *
@@ -116,30 +119,30 @@ m4_get_module_builtin_table (lt_dlhandle
   return data ? data->builtin_table : 0;
 }
 
-void
-m4_set_module_builtin_table (m4 *context, lt_dlhandle handle,
+static void
+set_module_builtin_table (m4 *context, lt_dlhandle handle,
                             const m4_builtin *table)
 {
   const m4_builtin *bp;
 
+  assert (context);
   assert (handle);
   assert (table);
 
   for (bp = table; bp->name != NULL; bp++)
     {
-      m4_symbol_value *token = XCALLOC (m4_symbol_value, 1);
+      m4_symbol_value *value = m4_symbol_value_create ();
       char *   name;
 
-      VALUE_TYPE (token)       = M4_SYMBOL_FUNC;
-      VALUE_FUNC (token)       = bp->func;
-      VALUE_HANDLE (token)     = handle;
-      VALUE_MIN_ARGS (token)   = bp->min_args;
-      VALUE_MAX_ARGS (token)   = bp->max_args;
+      m4_set_symbol_value_func (value, bp->func);
+      VALUE_HANDLE (value)     = handle;
+      VALUE_MIN_ARGS (value)   = bp->min_args;
+      VALUE_MAX_ARGS (value)   = bp->max_args;
 
       if (bp->groks_macro_args)
-       BIT_SET (VALUE_FLAGS (token), VALUE_MACRO_ARGS_BIT);
+       BIT_SET (VALUE_FLAGS (value), VALUE_MACRO_ARGS_BIT);
       if (bp->blind_if_no_args)
-       BIT_SET (VALUE_FLAGS (token), VALUE_BLIND_ARGS_BIT);
+       BIT_SET (VALUE_FLAGS (value), VALUE_BLIND_ARGS_BIT);
 
       if (prefix_all_builtins)
        {
@@ -153,7 +156,7 @@ m4_set_module_builtin_table (m4 *context
        name = (char *) bp->name;
 
 
-      m4_symbol_pushdef (M4SYMTAB, name, token);
+      m4_symbol_pushdef (M4SYMTAB, name, value);
 
       if (prefix_all_builtins)
        xfree (name);
@@ -172,21 +175,24 @@ m4_get_module_macro_table (lt_dlhandle h
   return data ? data->macro_table : 0;
 }
 
-void
-m4_set_module_macro_table (m4 *context, lt_dlhandle handle,
+static void
+set_module_macro_table (m4 *context, lt_dlhandle handle,
                           const m4_macro *table)
 {
   const m4_macro *mp;
 
+  assert (context);
+  assert (handle);
+  assert (table);
+
   for (mp = table; mp->name != NULL; mp++)
     {
-      m4_symbol_value *token = XCALLOC (m4_symbol_value, 1);
+      m4_symbol_value *value = m4_symbol_value_create ();
 
-      VALUE_TYPE (token)       = M4_SYMBOL_TEXT;
-      VALUE_TEXT (token)       = xstrdup (mp->value);
-      VALUE_HANDLE (token)     = handle;
+      m4_set_symbol_value_text (value, xstrdup (mp->value));
+      VALUE_HANDLE (value) = handle;
 
-      m4_symbol_pushdef (M4SYMTAB, mp->name, token);
+      m4_symbol_pushdef (M4SYMTAB, mp->name, value);
     }
 }
 
@@ -213,13 +219,15 @@ m4_module_load (m4 *context, const char 
        }
       else if (info->ref_count == 1)
        {
-         const m4_builtin *builtin_table       = m4_get_module_builtin_table 
(handle);
-         const m4_macro   *macro_table = m4_get_module_macro_table (handle);
+         const m4_builtin *builtin_table
+           = m4_get_module_builtin_table (handle);
+         const m4_macro   *macro_table
+           = m4_get_module_macro_table (handle);
 
          /* Install the macro functions.  */
          if (builtin_table)
            {
-             m4_set_module_builtin_table (context, handle, builtin_table);
+             set_module_builtin_table (context, handle, builtin_table);
 #ifdef DEBUG_MODULES
              M4_DEBUG_MESSAGE1("module %s: builtins loaded", name);
 #endif /* DEBUG_MODULES */
@@ -228,7 +236,7 @@ m4_module_load (m4 *context, const char 
          /* Install the user macros. */
          if (macro_table)
            {
-             m4_set_module_macro_table (context, handle, macro_table);
+             set_module_macro_table (context, handle, macro_table);
 #ifdef DEBUG_MODULES
              M4_DEBUG_MESSAGE1("module %s: macros loaded", name);
 #endif /* DEBUG_MODULES */
Index: m4/symtab.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/symtab.c,v
retrieving revision 1.38
diff -u -p -u -r1.38 symtab.c
--- m4/symtab.c 18 Jun 2003 16:21:54 -0000 1.38
+++ m4/symtab.c 19 Jun 2003 14:50:44 -0000
@@ -53,6 +53,7 @@ static void *   arg_destroy           (m4_hash *h
 static void *    arg_copy              (m4_hash *src, const void *name,
                                         void *arg, m4_hash *dest);
 
+
 
 /* -- SYMBOL TABLE MANAGEMENT --
 
@@ -110,7 +111,7 @@ m4__symtab_remove_module_references (m4_
   while ((place = m4_get_hash_iterator_next (symtab, place)))
     {
       m4_symbol *symbol = (m4_symbol *) m4_get_hash_iterator_value (place);
-      m4_symbol_value  *data   = SYMBOL_VALUE (symbol);
+      m4_symbol_value *data = m4_get_symbol_value (symbol);
 
       /* For symbols that have token data... */
       if (data)
@@ -124,8 +125,8 @@ m4__symtab_remove_module_references (m4_
                {
                  VALUE_NEXT (data) = VALUE_NEXT (next);
 
-                 if (VALUE_TYPE (next) == M4_SYMBOL_TEXT)
-                   XFREE (VALUE_TEXT (next));
+                 if (next->type == M4_SYMBOL_TEXT)
+                   xfree (m4_get_symbol_value_text (next));
                  XFREE (next);
                }
              else
@@ -149,7 +150,7 @@ symbol_destroy (m4_hash *hash, const voi
 {
   char *key = xstrdup ((char *) name);
 
-  SYMBOL_TRACED ((m4_symbol *) symbol) = FALSE;
+  m4_set_symbol_traced ((m4_symbol *) symbol, FALSE);
 
   while (key && m4_hash_lookup (hash, key))
     m4_symbol_popdef ((m4_symtab *) hash, key);
@@ -175,7 +176,7 @@ m4_symbol_lookup (m4_symtab *symtab, con
 
   /* If just searching, return status of search -- if only an empty
      struct is returned, that is treated as a failed lookup.  */
-  return (psymbol && SYMBOL_VALUE (*psymbol)) ? *psymbol : 0;
+  return (psymbol && m4_get_symbol_value (*psymbol)) ? *psymbol : 0;
 }
 
 
@@ -192,10 +193,10 @@ m4_symbol_pushdef (m4_symtab *symtab, co
   assert (value);
 
   symbol               = symtab_fetch (symtab, name);
-  VALUE_NEXT (value)   = SYMBOL_VALUE (symbol);
-  SYMBOL_VALUE (symbol)        = value;
+  VALUE_NEXT (value)   = m4_get_symbol_value (symbol);
+  symbol->value                = value;
 
-  assert (SYMBOL_VALUE (symbol));
+  assert (m4_get_symbol_value (symbol));
 
   return symbol;
 }
@@ -212,31 +213,17 @@ m4_symbol_define (m4_symtab *symtab, con
   assert (value);
 
   symbol = symtab_fetch (symtab, name);
-  if (SYMBOL_VALUE (symbol))
+  if (m4_get_symbol_value (symbol))
     symbol_popval (symbol);
 
-  VALUE_NEXT (value)   = SYMBOL_VALUE (symbol);
-  SYMBOL_VALUE (symbol)        = value;
+  VALUE_NEXT (value) = m4_get_symbol_value (symbol);
+  symbol->value      = value;
 
-  assert (SYMBOL_VALUE (symbol));
+  assert (m4_get_symbol_value (symbol));
 
   return symbol;
 }
 
-void
-m4_set_symbol_traced (m4_symtab *symtab, const char *name)
-{
-  m4_symbol *symbol;
-
-  assert (symtab);
-  assert (name);
-
-  symbol = symtab_fetch (symtab, name);
-
-  SYMBOL_TRACED (symbol) = TRUE;
-}
-
-
 /* Pop the topmost value stack entry from the symbol associated with
    NAME, deleting it from the table entirely if that was the last
    remaining value in the stack.  */
@@ -252,8 +239,8 @@ m4_symbol_popdef (m4_symtab *symtab, con
 
   /* Only remove the hash table entry if the last value in the
      symbol value stack was successfully removed.  */
-  if (!SYMBOL_VALUE (*psymbol))
-    if (no_gnu_extensions || !SYMBOL_TRACED (*psymbol))
+  if (!m4_get_symbol_value (*psymbol))
+    if (no_gnu_extensions || !m4_get_symbol_traced (*psymbol))
       {
        XFREE (*psymbol);
        xfree (m4_hash_remove ((m4_hash *) symtab, name));
@@ -268,19 +255,19 @@ symbol_popval (m4_symbol *symbol)
 
   assert (symbol);
 
-  stale = SYMBOL_VALUE (symbol);
+  stale = m4_get_symbol_value (symbol);
 
   if (stale)
     {
-      SYMBOL_VALUE (symbol) = VALUE_NEXT (stale);
+      symbol->value = VALUE_NEXT (stale);
 
       if (VALUE_ARG_SIGNATURE (stale))
        {
          m4_hash_apply (VALUE_ARG_SIGNATURE (stale), arg_destroy, NULL);
          m4_hash_delete (VALUE_ARG_SIGNATURE (stale));
        }
-      if (VALUE_TYPE (stale) == M4_SYMBOL_TEXT)
-       XFREE (VALUE_TEXT (stale));
+      if (m4_is_symbol_value_text (stale))
+       xfree (m4_get_symbol_value_text (stale));
       XFREE (stale);
     }
 }
@@ -311,8 +298,8 @@ m4_symbol_value_copy (m4_symbol_value *d
   assert (dest);
   assert (src);
 
-  if (VALUE_TYPE (dest) == M4_SYMBOL_TEXT)
-    xfree (VALUE_TEXT (dest));
+  if (m4_is_symbol_value_text (dest))
+    xfree (m4_get_symbol_value_text (dest));
 
   if (VALUE_ARG_SIGNATURE (dest))
     {
@@ -320,7 +307,7 @@ m4_symbol_value_copy (m4_symbol_value *d
       m4_hash_delete (VALUE_ARG_SIGNATURE (dest));
     }
 
-  /* Copy the token contents over, being careful to preserve
+  /* Copy the valuecontents over, being careful to preserve
      the next pointer.  */
   next = VALUE_NEXT (dest);
   bcopy (src, dest, sizeof (m4_symbol_value));
@@ -328,8 +315,8 @@ m4_symbol_value_copy (m4_symbol_value *d
 
   /* Caller is supposed to free text token strings, so we have to
      copy the string not just its address in that case.  */
-  if (VALUE_TYPE (src) == M4_SYMBOL_TEXT)
-    VALUE_TEXT (dest) = xstrdup (VALUE_TEXT (src));
+  if (m4_is_symbol_value_text (src))
+    m4_set_symbol_value_text (dest, xstrdup (m4_get_symbol_value_text (src)));
 
   if (VALUE_ARG_SIGNATURE (src))
     VALUE_ARG_SIGNATURE (dest) = m4_hash_dup (VALUE_ARG_SIGNATURE (src),
@@ -343,6 +330,124 @@ arg_copy (m4_hash *src, const void *name
   return NULL;
 }
 
+boolean
+m4_set_symbol_name_traced (m4_symtab *symtab, const char *name)
+{
+  m4_symbol *symbol;
+
+  assert (symtab);
+  assert (name);
+
+  symbol = symtab_fetch (symtab, name);
+
+  return m4_set_symbol_traced (symbol, TRUE);
+}
+
+/* Define these functions at the end, so that calls in the file use the
+   faster macro version from m4module.h.  */
+#undef m4_symtab_apply
+void *
+m4_symtab_apply (m4_symtab *symtab, m4_symtab_apply_func *func, void *userdata)
+{
+  return m4_hash_apply ((m4_hash *) symtab, (m4_hash_apply_func *) func,
+                       userdata);
+}
+
+/* Pop all values from the symbol associated with NAME.  */
+#undef m4_symbol_delete
+void
+m4_symbol_delete (m4_symtab *symtab, const char *name)
+{
+  while (m4_symbol_lookup (symtab, name))
+    m4_symbol_popdef (symtab, name);
+}
+
+#undef m4_get_symbol_traced
+boolean
+m4_get_symbol_traced (m4_symbol *symbol)
+{
+  assert (symbol);
+  return symbol->traced;
+}
+
+#undef m4_set_symbol_traced
+boolean
+m4_set_symbol_traced (m4_symbol *symbol, boolean value)
+{
+  assert (symbol);
+  return symbol->traced = value;
+}
+
+#undef m4_symbol_value_create
+m4_symbol_value *
+m4_symbol_value_create (void)
+{
+  return XCALLOC (m4_symbol_value, 1);
+}
+
+#undef m4_get_symbol_value
+m4_symbol_value *
+m4_get_symbol_value (m4_symbol *symbol)
+{
+  assert (symbol);
+  return symbol->value;
+}
+
+#undef m4_is_symbol_value_text
+boolean
+m4_is_symbol_value_text (m4_symbol_value *value)
+{
+  assert (value);
+  return (value->type == M4_SYMBOL_TEXT);
+}
+
+#undef m4_is_symbol_value_func
+boolean
+m4_is_symbol_value_func (m4_symbol_value *value)
+{
+  assert (value);
+  return (value->type == M4_SYMBOL_FUNC);
+}
+
+#undef m4_get_symbol_value_text
+char *
+m4_get_symbol_value_text (m4_symbol_value *value)
+{
+  assert (value);
+  return value->u.text;
+}
+
+#undef m4_get_symbol_value_func
+m4_builtin_func *
+m4_get_symbol_value_func (m4_symbol_value *value)
+{
+  assert (value);
+  return value->u.func;
+}
+
+#undef m4_set_symbol_value_text
+void
+m4_set_symbol_value_text (m4_symbol_value *value, char *text)
+{
+  assert (value);
+  assert (text);
+
+  value->type   = M4_SYMBOL_TEXT;
+  value->u.text = text;
+}
+
+#undef m4_set_symbol_value_func
+void
+m4_set_symbol_value_func (m4_symbol_value *value, m4_builtin_func *func)
+{
+  assert (value);
+  assert (func);
+
+  value->type   = M4_SYMBOL_FUNC;
+  value->u.func = func;
+}
+
+
 
 #ifdef DEBUG_SYM
 
@@ -360,7 +465,7 @@ symtab_dump (m4_symtab *symtab)
     {
       const char   *symbol_name        = (const char *) 
m4_get_hash_iterator_key (place);
       m4_symbol           *symbol      = m4_get_hash_iterator_value (place);
-      m4_symbol_value *token   = SYMBOL_VALUE (symbol);
+      m4_symbol_value *token   = m4_get_symbol_value (symbol);
       int          flags       = token ? SYMBOL_FLAGS (symbol) : 0;
       lt_dlhandle   handle     = token ? SYMBOL_HANDLE (symbol) : 0;
       const char   *module_name        = handle ? m4_get_module_name (handle) 
: "NONE";
@@ -368,20 +473,20 @@ symtab_dump (m4_symtab *symtab)
 
       fprintf (stderr, "%10s: (%d%s) %s=",
               module_name, flags,
-              SYMBOL_TRACED (symbol) ? "!" : "", symbol_name);
+              m4_get_symbol_traced (symbol) ? "!" : "", symbol_name);
 
       if (!token)
        fputs ("<!UNDEFINED!>", stderr);
       else
-       switch (SYMBOL_TYPE (symbol))
+       switch (symbol->value->type)
          {
          case M4_SYMBOL_TEXT:
-           fputs (SYMBOL_TEXT (symbol), stderr);
+           fputs (m4_get_symbol_text (symbol), stderr);
            break;
 
          case M4_SYMBOL_FUNC:
            bp = m4_builtin_find_by_func (m4_get_module_builtin_table (handle),
-                                       SYMBOL_FUNC (symbol));
+                                         m4_get_symbol_func (symbol));
            fprintf (stderr, "<%s>",
                     bp ? bp->name : "!ERROR!");
            break;
@@ -393,22 +498,3 @@ symtab_dump (m4_symtab *symtab)
     }
 }
 #endif /* DEBUG_SYM */
-
-/* Define these functions at the end, so that calls in the file use the
-   faster macro version from m4module.h.  */
-#undef m4_symtab_apply
-void *
-m4_symtab_apply (m4_symtab *symtab, m4_symtab_apply_func *func, void *userdata)
-{
-  return m4_hash_apply ((m4_hash *) symtab, (m4_hash_apply_func *) func,
-                       userdata);
-}
-
-/* Pop all values from the symbol associated with NAME.  */
-#undef m4_symbol_delete
-void
-m4_symbol_delete (m4_symtab *symtab, const char *name)
-{
-  while (m4_symbol_lookup (symtab, name))
-    m4_symbol_popdef (symtab, name);
-}
Index: m4/utility.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/utility.c,v
retrieving revision 1.26
diff -u -p -u -r1.26 utility.c
--- m4/utility.c 18 Jun 2003 16:21:54 -0000 1.26
+++ m4/utility.c 19 Jun 2003 14:50:44 -0000
@@ -71,30 +71,6 @@ m4_string bcomm;
 m4_string ecomm;
 
 
-/* Addressable function versions of the macros defined in m4private.h.
-   Since they are functions the caller does not need access to the
-   internal data structure, so they are safe to export for use in
-   external modules.  */
-m4_symbol_type
-m4_get_symbol_value_type (m4_symbol_value *name)
-{
-  return VALUE_TYPE (name);
-}
-
-char *
-m4_get_symbol_value_text (m4_symbol_value *name)
-{
-  return VALUE_TEXT (name);
-}
-
-m4_builtin_func *
-m4_get_symbol_value_func (m4_symbol_value *name)
-{
-  return VALUE_FUNC (name);
-}
-
-
-
 /* Give friendly warnings if a builtin macro is passed an
    inappropriate number of arguments.  ARGC/ARGV are the arguments,
    MIN is the minimum number of acceptable arguments, negative if not
@@ -224,7 +200,7 @@ dumpdef_cmp (const void *s1, const void 
 int
 m4_dump_symbol (const void *name, void *symbol, void *data)
 {
-  if (SYMBOL_TYPE ((m4_symbol *) symbol) != M4_SYMBOL_VOID)
+  if (((m4_symbol *) symbol)->value->type != M4_SYMBOL_VOID)
     {
       struct m4_dump_symbol_data *symbol_data
        = (struct m4_dump_symbol_data *) data;
@@ -258,7 +234,7 @@ m4_dump_symbols (m4 *context, struct m4_
       for (i = 1; i < argc; i++)
        {
          symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (i));
-         if (symbol != NULL && SYMBOL_TYPE (symbol) != M4_SYMBOL_VOID)
+         if (symbol != NULL && symbol->value->type != M4_SYMBOL_VOID)
            m4_dump_symbol (M4ARG (i), symbol, data);
          else if (complain)
            M4WARN ((warning_status, 0,
Index: modules/gnu.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/gnu.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 gnu.c
--- modules/gnu.c 18 Jun 2003 16:21:55 -0000 1.21
+++ modules/gnu.c 19 Jun 2003 14:50:44 -0000
@@ -27,7 +27,7 @@
 #  include <stdlib.h>
 #endif
 
-#include "m4module.h"
+#include <m4module.h>
 
 #if HAVE_ERRNO_H
 #  include <errno.h>
@@ -36,7 +36,10 @@
 int errno;
 #endif
 
-#include "m4private.h"
+#ifdef NDEBUG
+#  include "m4private.h"
+#endif
+
 #include "regex.h"
 
 #define RE_SYNTAX_BRE RE_SYNTAX_EMACS
@@ -477,17 +480,17 @@ M4BUILTIN_HANDLER (symbols)
  **/
 M4BUILTIN_HANDLER (syncoutput)
 {
-  if (VALUE_TYPE (argv[1]) != M4_SYMBOL_TEXT)
-    return;
-
-  if (   M4ARG (1)[0] == '0'
-      || M4ARG (1)[0] == 'n'
-      || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'f'))
-    sync_output = 0;
-  else if (   M4ARG (1)[0] == '1'
-          || M4ARG (1)[0] == 'y'
-          || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'n'))
-    sync_output = 1;
+  if (m4_is_symbol_value_text (argv[1]))
+    {
+      if (   M4ARG (1)[0] == '0'
+         || M4ARG (1)[0] == 'n'
+         || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'f'))
+       sync_output = 0;
+      else if (   M4ARG (1)[0] == '1'
+              || M4ARG (1)[0] == 'y'
+              || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'n'))
+       sync_output = 1;
+    }
 }
 
 
Index: modules/m4.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/m4.c,v
retrieving revision 1.42
diff -u -p -u -r1.42 m4.c
--- modules/m4.c 18 Jun 2003 16:21:55 -0000 1.42
+++ modules/m4.c 19 Jun 2003 14:50:44 -0000
@@ -32,13 +32,17 @@
 extern int errno;
 #endif
 
+#include <assert.h>
+
 #include <m4module.h>
 
+#ifdef NDEBUG
 /* Include this header for speed, which gives us direct access to
    the fields of internal structures at the expense of maintaining
    interface/implementation separation.   The builtins in this file
    are the core of m4 and must be optimised for speed.  */
-#include "m4private.h"
+#  include "m4private.h"
+#endif
 
 /* Rename exported symbols for dlpreload()ing.  */
 #define m4_builtin_table       m4_LTX_m4_builtin_table
@@ -94,7 +98,7 @@ typedef unsigned long int unumber;
 
 static void    include         (int argc, m4_symbol_value **argv,
                                 boolean silent);
-static int     set_trace       (m4_hash *hash, const void *ignored,
+static void *  set_trace       (m4_hash *hash, const void *ignored,
                                 void *symbol, void *userdata);
 static const char *ntoa                (number value, int radix);
 static void    numb_obstack    (struct obstack *obs, const number value,
@@ -148,22 +152,16 @@ M4INIT_HANDLER (m4)
 
 M4BUILTIN_HANDLER (define)
 {
-  if (VALUE_TYPE (argv[1]) == M4_SYMBOL_TEXT)
+  if (m4_is_symbol_value_text (argv[1]))
     {
-      m4_symbol_value *token = XCALLOC (m4_symbol_value, 1);
+      m4_symbol_value *value = m4_symbol_value_create ();
 
       if (argc == 2)
-       {
-         VALUE_TYPE (token) = M4_SYMBOL_TEXT;
-         VALUE_TEXT (token) = xstrdup ("");
-       }
+       m4_set_symbol_value_text (value, xstrdup (""));
       else
-       {
-         m4_symbol_value_copy (token, argv[2]);
-         VALUE_NEXT (token) = NULL;
-       }
+       m4_symbol_value_copy (value, argv[2]);
 
-      m4_symbol_define (M4SYMTAB, M4ARG (1), token);
+      m4_symbol_define (M4SYMTAB, M4ARG (1), value);
     }
 }
 
@@ -178,22 +176,16 @@ M4BUILTIN_HANDLER (undefine)
 
 M4BUILTIN_HANDLER (pushdef)
 {
-  if (VALUE_TYPE (argv[1]) == M4_SYMBOL_TEXT)
+  if (m4_is_symbol_value_text (argv[1]))
     {
-      m4_symbol_value *token = XCALLOC (m4_symbol_value, 1);
+      m4_symbol_value *value = m4_symbol_value_create ();
 
       if (argc == 2)
-       {
-         VALUE_TYPE (token) = M4_SYMBOL_TEXT;
-         VALUE_TEXT (token) = xstrdup ("");
-       }
+       m4_set_symbol_value_text (value, xstrdup (""));
       else
-       {
-         m4_symbol_value_copy (token, argv[2]);
-         VALUE_NEXT (token) = NULL;
-       }
+       m4_symbol_value_copy (value, argv[2]);
 
-      m4_symbol_pushdef (M4SYMTAB, M4ARG (1), token);
+      m4_symbol_pushdef (M4SYMTAB, M4ARG (1), value);
     }
 }
 
@@ -289,28 +281,26 @@ M4BUILTIN_HANDLER (dumpdef)
       m4_symbol *symbol = m4_symbol_lookup (M4SYMTAB, data.base[0]);
 
       fprintf (stderr, "%s:\t", data.base[0]);
-      assert (SYMBOL_TYPE (symbol) == M4_SYMBOL_TEXT
-             || SYMBOL_TYPE (symbol) == M4_SYMBOL_FUNC
-             || SYMBOL_TYPE (symbol) == M4_SYMBOL_VOID);
-      switch (SYMBOL_TYPE (symbol))
+
+      if (m4_is_symbol_text (symbol))
        {
-       case M4_SYMBOL_TEXT:
          if (debug_level & M4_DEBUG_TRACE_QUOTE)
            fprintf (stderr, "%s%s%s\n",
-                    lquote.string, SYMBOL_TEXT (symbol), rquote.string);
+                    lquote.string, m4_get_symbol_text (symbol),
+                    rquote.string);
          else
-           fprintf (stderr, "%s\n", SYMBOL_TEXT (symbol));
-         break;
-
-       case M4_SYMBOL_FUNC:
-         bp = m4_builtin_find_by_func (NULL, SYMBOL_FUNC (symbol));
+           fprintf (stderr, "%s\n", m4_get_symbol_text (symbol));
+       }
+      else if (m4_is_symbol_func (symbol))
+       {
+         bp = m4_builtin_find_by_func (NULL,
+                                       m4_get_symbol_func (symbol));
          assert (bp);
          fprintf (stderr, "<%s>\n", bp->name);
-         break;
-
-       case M4_SYMBOL_VOID:
-         assert (!"VOID token in m4_dumpdef");
-         break;
+       }
+      else
+       {
+         assert (!"illegal token in m4_dumpdef");
        }
     }
 }
@@ -330,22 +320,12 @@ M4BUILTIN_HANDLER (defn)
       return;
     }
 
-  switch (SYMBOL_TYPE (symbol))
-    {
-    case M4_SYMBOL_TEXT:
-      m4_shipout_string (obs, SYMBOL_TEXT (symbol), 0, TRUE);
-      return;
-
-    case M4_SYMBOL_FUNC:
-      m4_push_builtin (SYMBOL_VALUE (symbol));
-      return;
-
-    case M4_SYMBOL_VOID:
-      assert (!"VOID token in m4_dumpdef");
-      return;
-    }
-
-  assert (!"Bad token data type in m4_defn");
+  if (m4_is_symbol_text (symbol))
+    m4_shipout_string (obs, m4_get_symbol_text (symbol), 0, TRUE);
+  else if (m4_is_symbol_func (symbol))
+    m4_push_builtin (m4_get_symbol_value (symbol));
+  else
+    assert (!"Bad token data type in m4_defn");
 }
 
 
@@ -571,12 +551,12 @@ M4BUILTIN_HANDLER (m4wrap)
 /* Set_trace () is used by "traceon" and "traceoff" to enable and disable
    tracing of a macro.  It disables tracing if DATA is NULL, otherwise it
    enable tracing.  */
-static int
+static void *
 set_trace (m4_hash *hash, const void *ignored, void *symbol,
           void *userdata)
 {
-  SYMBOL_TRACED ((m4_symbol *) symbol) = (boolean) (userdata != NULL);
-  return 0;
+  m4_set_symbol_traced ((m4_symbol *) symbol, (boolean) (userdata != NULL));
+  return NULL;
 }
 
 M4BUILTIN_HANDLER (traceon)
Index: src/freeze.c
===================================================================
RCS file: /cvsroot/m4/m4/src/freeze.c,v
retrieving revision 1.29
diff -u -p -u -r1.29 freeze.c
--- src/freeze.c 18 Jun 2003 16:21:55 -0000 1.29
+++ src/freeze.c 19 Jun 2003 14:50:44 -0000
@@ -134,27 +134,26 @@ produce_symbol_dump (FILE *file, m4_hash
       const char   *module_name        = handle ? m4_get_module_name (handle) 
: NULL;
       const m4_builtin *bp;
 
-      switch (SYMBOL_TYPE (symbol))
+      if (m4_is_symbol_text (symbol))
        {
-       case M4_SYMBOL_TEXT:
          fprintf (file, "T%lu,%lu",
                   (unsigned long) strlen (symbol_name),
-                  (unsigned long) strlen (SYMBOL_TEXT (symbol)));
+                  (unsigned long) strlen (m4_get_symbol_text (symbol)));
          if (handle)
            fprintf (file, ",%lu", (unsigned long) strlen (module_name));
          fputc ('\n', file);
 
          fputs (symbol_name, file);
-         fputs (SYMBOL_TEXT (symbol), file);
+         fputs (m4_get_symbol_text (symbol), file);
          if (handle)
            fputs (module_name, file);
          fputc ('\n', file);
-         break;
-
-       case M4_SYMBOL_FUNC:
+       }
+      else if (m4_is_symbol_func (symbol))
+       {
          bp = m4_builtin_find_by_func
                (m4_get_module_builtin_table (SYMBOL_HANDLE (symbol)),
-                SYMBOL_FUNC (symbol));
+                m4_get_symbol_func (symbol));
 
          if (bp == NULL)
            {
@@ -177,13 +176,12 @@ produce_symbol_dump (FILE *file, m4_hash
          if (handle)
            fputs (module_name, file);
          fputc ('\n', file);
-         break;
-
-       default:
+       }
+      else
+       {
          M4ERROR ((warning_status, 0,
                    "INTERNAL ERROR: Bad token data type in produce_symbol_dump 
()"));
          abort ();
-         break;
        }
     }
 }
@@ -480,8 +478,7 @@ reload_frozen_state (m4 *context, const 
              if (bp->blind_if_no_args)
                BIT_SET (VALUE_FLAGS (token), VALUE_BLIND_ARGS_BIT);
 
-             VALUE_TYPE (token)        = M4_SYMBOL_FUNC;
-             VALUE_FUNC (token)        = bp->func;
+             m4_set_symbol_value_func (token, bp->func);
              VALUE_HANDLE (token)      = handle;
              VALUE_MIN_ARGS (token)    = bp->min_args;
              VALUE_MAX_ARGS (token)    = bp->max_args;
@@ -663,8 +660,7 @@ reload_frozen_state (m4 *context, const 
              if (strcmp (m4_get_module_name (handle), string[2]) == 0)
                break;
 
-         VALUE_TYPE (token)            = M4_SYMBOL_TEXT;
-         VALUE_TEXT (token)            = xstrdup (string[1]);
+         m4_set_symbol_value_text (token, xstrdup (string[1]));
          VALUE_HANDLE (token)          = handle;
          VALUE_MAX_ARGS (token)        = -1;
 
Index: src/main.c
===================================================================
RCS file: /cvsroot/m4/m4/src/main.c,v
retrieving revision 1.40
diff -u -p -u -r1.40 main.c
--- src/main.c 18 Jun 2003 16:21:55 -0000 1.40
+++ src/main.c 19 Jun 2003 14:50:44 -0000
@@ -432,17 +432,16 @@ warranty; not even for MERCHANTABILITY o
          {
          case 'D':
            {
-             m4_symbol_value *token = XCALLOC (m4_symbol_value, 1);
+             m4_symbol_value *value = m4_symbol_value_create ();
 
              macro_value = strchr (defines->macro, '=');
              if (macro_value == NULL)
                macro_value = "";
              else
                *macro_value++ = '\0';
-             VALUE_TEXT (token) = xstrdup (macro_value);
-             VALUE_TYPE (token) = M4_SYMBOL_TEXT;
+             m4_set_symbol_value_text (value, xstrdup (macro_value));
 
-             m4_symbol_pushdef (M4SYMTAB, defines->macro, token);
+             m4_symbol_pushdef (M4SYMTAB, defines->macro, value);
            }
            break;
 
@@ -451,7 +450,7 @@ warranty; not even for MERCHANTABILITY o
            break;
 
          case 't':
-           m4_set_symbol_traced (M4SYMTAB, defines->macro);
+           m4_set_symbol_name_traced (M4SYMTAB, defines->macro);
            break;
 
          case 'm':

reply via email to

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