m4-patches
[Top][All Lists]
Advanced

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

FYI: 17-gary-move-option-globals-to-context.patch


From: Gary V. Vaughan
Subject: FYI: 17-gary-move-option-globals-to-context.patch
Date: Fri, 20 Jun 2003 16:54:35 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030617

Applied to HEAD.
--
  ())_.  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>

        Two related changes, and a huge knockon effect throughout the
        source: Moved the option variables out of global space and into
        `struct m4'; made `m4_symtab' a real datatype, so that it's api
        is not marred passing `struct m4' around just so it can decide
        whether to keep traced symbol names or not.  Added setters and
        getters for the formerly global option variables, and obviously
        changed a vast number of functions to take a `struct m4' and use
        the getter funcs to find option values.

        * m4/utility.c (interactive, sync_output, debug_level)
        (no_gnu_extensions, prefix_all_builtins, suppress_warnings)
        (max_debug_argument_length, warning_status, nesting_limit)
        (discard_comments): Removed.
        * m4/m4module (warning_status, no_gnu_extensions, nesting_limit)
        (debug_level, max_debug_argument_length, prefix_all_builtins)
        (suppress_warnings, discard_comments, interactive, sync_output):
        Removed from here...
        * m4/m4private.h (struct m4): ...and equivalent fields added to
        this structure.
        (m4_get_warning_status_opt, m4_get_no_gnu_extensions_opt)
        (m4_get_nesting_limit_opt, m4_get_debug_level_opt)
        (m4_get_max_debug_arg_length_opt, m4_get_prefix_builtins_opt)
        (m4_get_suppress_warnings_opt, m4_get_discard_comments_opt)
        (m4_get_interactive_opt, m4_get_sync_output_opt): Fast access
        macros for the new fields.
        * m4/m4module.h (m4_context_field_table)
        (m4_context_opt_bit_table): Helper macros used to generate
        prototypes, setters and getters for new option fields
        consistently.
        * m4/m4.c (m4_get_warning_status_opt, m4_get_no_gnu_extensions_opt)
        (m4_get_nesting_limit_opt, m4_get_debug_level_opt)
        (m4_get_max_debug_arg_length_opt, m4_get_prefix_builtins_opt)
        (m4_get_suppress_warnings_opt, m4_get_discard_comments_opt)
        (m4_get_interactive_opt, m4_get_sync_output_opt)
        (m4_set_warning_status_opt, m4_set_no_gnu_extensions_opt)
        (m4_set_nesting_limit_opt, m4_set_debug_level_opt)
        (m4_set_max_debug_arg_length_opt, m4_set_prefix_builtins_opt)
        (m4_set_suppress_warnings_opt, m4_set_discard_comments_opt)
        (m4_set_interactive_opt, m4_set_sync_output_opt): Addressable
        setter and getter functions generated by cpp from
        m4_context_field_table and m4_context_opt_bit_table, exported as
        part of the module api.  Changed all callers.
        * m4/symtab (struct m4_symtab): Used as the concrete type for
        m4_symtab now.
        (m4_symtab_create): Allocate and initialise a new struct.
        (m4_symtab_apply): New function that works like m4_hash_apply, but
        with different callbacks specific to symbol tables.  Changed all
        callers.
        (symbol_destroy, arg_destroy, arg_copy): Renamed
        symbol_destroy_CB, arg_destroy_CB, arg_copy_CB to remind me that
        they have unused parameters for a reason!
        (dump_symbol_CB): New callback to dump the contents of a single
        symbol.
        (symtob_dump): Rewritten in terms of dump_symbol_CB.
        * m4/utility.c (m4_dump_symbol): Renamed to m4_dump_symbol_CB.
        Changed all callers.
        * m4/m4.c (m4_create): By default point the `nuke_trace_bit' field
        of the contained `m4_symtab' at the `no_gnu_extensions' field.
        Although I'm not convinced these semantics are correct, they are
        at least consistent with how things were before this delta.  Also
        set the default nesting limit to M4_DEFAULT_NESTING_LIMIT.

Index: m4/debug.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/debug.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 debug.c
--- m4/debug.c 19 Jun 2003 14:51:03 -0000 1.13
+++ m4/debug.c 20 Jun 2003 15:42:43 -0000
@@ -189,12 +189,12 @@ m4_debug_set_output (const char *name)
 
 /* Print the header of a one-line debug message, starting by "m4 debug".  */
 void
-m4_debug_message_prefix (void)
+m4_debug_message_prefix (m4 *context)
 {
   fprintf (m4_debug, "m4 debug: ");
-  if (debug_level & M4_DEBUG_TRACE_FILE)
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_FILE))
     fprintf (m4_debug, "%s: ", m4_current_file);
-  if (debug_level & M4_DEBUG_TRACE_LINE)
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_LINE))
     fprintf (m4_debug, "%d: ", m4_current_line);
 }
 
@@ -210,10 +210,10 @@ m4_debug_message_prefix (void)
   left quote) and %r (optional right quote).  */
 #if (defined __STDC__ && __STDC__) || defined PROTOTYPES
 static void
-m4_trace_format (const char *fmt, ...)
+m4_trace_format (m4 *context, const char *fmt, ...)
 #else
 static void
-m4_trace_format (va_alist)
+m4_trace_format (m4 *context, va_alist)
      va_dcl
 #endif
 {
@@ -248,7 +248,7 @@ m4_trace_format (va_alist)
       switch (*fmt++)
        {
        case 'S':
-         maxlen = max_debug_argument_length;
+         maxlen = m4_get_max_debug_arg_length_opt (context);
          /* fall through */
 
        case 's':
@@ -256,11 +256,15 @@ m4_trace_format (va_alist)
          break;
 
        case 'l':
-         s = (debug_level & M4_DEBUG_TRACE_QUOTE) ? (char *)lquote.string : "";
+         s = BIT_TEST(m4_get_debug_level_opt(context), M4_DEBUG_TRACE_QUOTE)
+               ? (char *) lquote.string
+               : "";
          break;
 
        case 'r':
-         s = (debug_level & M4_DEBUG_TRACE_QUOTE) ? (char *)rquote.string : "";
+         s = BIT_TEST(m4_get_debug_level_opt(context), M4_DEBUG_TRACE_QUOTE)
+               ? (char *) rquote.string
+               : "";
          break;
 
        case 'd':
@@ -289,16 +293,16 @@ m4_trace_format (va_alist)
 
 /* Format the standard header attached to all tracing output lines.  */
 static void
-m4_trace_header (int id)
+m4_trace_header (m4 *context, int id)
 {
-  m4_trace_format ("m4trace:");
-  if (debug_level & M4_DEBUG_TRACE_FILE)
-    m4_trace_format ("%s:", m4_current_file);
-  if (debug_level & M4_DEBUG_TRACE_LINE)
-    m4_trace_format ("%d:", m4_current_line);
-  m4_trace_format (" -%d- ", m4_expansion_level);
-  if (debug_level & M4_DEBUG_TRACE_CALLID)
-    m4_trace_format ("id %d: ", id);
+  m4_trace_format (context, "m4trace:");
+  if (BIT_TEST(m4_get_debug_level_opt(context), M4_DEBUG_TRACE_FILE))
+    m4_trace_format (context, "%s:", m4_current_file);
+  if (BIT_TEST(m4_get_debug_level_opt(context), M4_DEBUG_TRACE_LINE))
+    m4_trace_format (context, "%d:", m4_current_line);
+  m4_trace_format (context, " -%d- ", m4_expansion_level);
+  if (BIT_TEST(m4_get_debug_level_opt(context), M4_DEBUG_TRACE_CALLID))
+    m4_trace_format (context, "id %d: ", id);
 }
 
 /* Print current tracing line, and clear the obstack.  */
@@ -316,36 +320,38 @@ m4_trace_flush (void)
 /* Do pre-argument-collction tracing for macro NAME.  Used from
    expand_macro ().  */
 void
-m4_trace_prepre (const char *name, int id)
+m4_trace_prepre (m4 *context, const char *name, int id)
 {
-  m4_trace_header (id);
-  m4_trace_format ("%s ...", name);
+  m4_trace_header (context, id);
+  m4_trace_format (context, "%s ...", name);
   m4_trace_flush ();
 }
 
 /* Format the parts of a trace line, that can be made before the macro is
    actually expanded.  Used from expand_macro ().  */
 void
-m4_trace_pre (const char *name, int id, int argc, m4_symbol_value **argv)
+m4_trace_pre (m4 *context, const char *name, int id,
+             int argc, m4_symbol_value **argv)
 {
   int i;
   const m4_builtin *bp;
 
-  m4_trace_header (id);
-  m4_trace_format ("%s", name);
+  m4_trace_header (context, id);
+  m4_trace_format (context, "%s", name);
 
-  if (argc > 1 && (debug_level & M4_DEBUG_TRACE_ARGS))
+  if (argc > 1
+      && BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_ARGS))
     {
-      m4_trace_format ("(");
+      m4_trace_format (context, "(");
 
       for (i = 1; i < argc; i++)
        {
          if (i != 1)
-           m4_trace_format (", ");
+           m4_trace_format (context, ", ");
 
          if (m4_is_symbol_value_text (argv[i]))
            {
-             m4_trace_format ("%l%S%r", M4ARG (i));
+             m4_trace_format (context, "%l%S%r", M4ARG (i));
            }
          else if (m4_is_symbol_value_func (argv[i]))
            {
@@ -353,25 +359,25 @@ m4_trace_pre (const char *name, int id, 
                                            m4_get_symbol_value_func(argv[i]));
              if (bp == NULL)
                {
-                 M4ERROR ((warning_status, 0, "\
+                 M4ERROR ((m4_get_warning_status_opt (context), 0, "\
 INTERNAL ERROR: Builtin not found in builtin table! (m4_trace_pre ())"));
                  abort ();
                }
-             m4_trace_format ("<%s>", bp->name);
+             m4_trace_format (context, "<%s>", bp->name);
            }
          else
            {
-             M4ERROR ((warning_status, 0,
+             M4ERROR ((m4_get_warning_status_opt (context), 0,
                        "INTERNAL ERROR: Bad token data type (m4_trace_pre 
())"));
              abort ();
            }
        }
-      m4_trace_format (")");
+      m4_trace_format (context, ")");
     }
 
-  if (debug_level & M4_DEBUG_TRACE_CALL)
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_CALL))
     {
-      m4_trace_format (" -> ???");
+      m4_trace_format (context, " -> ???");
       m4_trace_flush ();
     }
 }
@@ -379,16 +385,20 @@ 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,
+m4_trace_post (m4 *context, const char *name, int id,
               int argc, m4_symbol_value **argv, const char *expanded)
 {
-  if (debug_level & M4_DEBUG_TRACE_CALL)
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_CALL))
     {
-      m4_trace_header (id);
-      m4_trace_format ("%s%s", name, (argc > 1) ? "(...)" : "");
+      m4_trace_header (context, id);
+      m4_trace_format (context, "%s%s", name, (argc > 1) ? "(...)" : "");
+    }
+
+  if (expanded && (BIT_TEST (m4_get_debug_level_opt (context),
+                            M4_DEBUG_TRACE_EXPANSION)))
+    {
+      m4_trace_format (context, " -> %l%S%r", expanded);
     }
 
-  if (expanded && (debug_level & M4_DEBUG_TRACE_EXPANSION))
-    m4_trace_format (" -> %l%S%r", expanded);
   m4_trace_flush ();
 }
Index: m4/input.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/input.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 input.c
--- m4/input.c 19 Jun 2003 14:51:04 -0000 1.27
+++ m4/input.c 20 Jun 2003 15:42:44 -0000
@@ -69,13 +69,13 @@
 static int   file_peek                 (void);
 static int   file_read                 (void);
 static void  file_unget                (int ch);
-static void  file_clean                (void);
-static void  init_builtin_token        (m4_symbol_value *token);
+static void  file_clean                (m4 *context);
+static void  init_builtin_token        (m4 *context, m4_symbol_value *token);
 static int   builtin_peek              (void);
 static int   builtin_read              (void);
-static int   match_input               (const unsigned char *s);
-static int   next_char                 (void);
-static void  pop_input                 (void);
+static int   match_input               (m4 *context, const unsigned char *s);
+static int   next_char                 (m4 *context);
+static void  pop_input                 (m4 *context);
 static int   single_peek               (void);
 static int   single_read               (void);
 static int   string_peek               (void);
@@ -88,7 +88,7 @@ struct input_funcs
   int (*peek_func) (void);     /* function to peek input */
   int (*read_func) (void);     /* function to read input */
   void (*unget_func) (int);    /* function to unread input */
-  void (*clean_func) (void);   /* function to clean up */
+  void (*clean_func) (m4 *);   /* function to clean up */
 };
 
 struct input_block
@@ -228,11 +228,11 @@ file_unget (ch)
 }
 
 static void
-file_clean (void)
+file_clean (m4 *context)
 {
-  if (debug_level & M4_DEBUG_TRACE_INPUT)
-    M4_DEBUG_MESSAGE2 (_("Input reverted to %s, line %d"),
-                   isp->u.u_f.name, isp->u.u_f.lineno);
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_INPUT))
+    M4_DEBUG_MESSAGE2 (context, _("Input reverted to %s, line %d"),
+                      isp->u.u_f.name, isp->u.u_f.lineno);
 
   fclose (isp->u.u_f.file);
   m4_current_file = isp->u.u_f.name;
@@ -248,7 +248,7 @@ static struct input_funcs file_funcs = {
 };
 
 void
-m4_push_file (FILE *fp, const char *title)
+m4_push_file (m4 *context, FILE *fp, const char *title)
 {
   input_block *i;
 
@@ -258,8 +258,8 @@ m4_push_file (FILE *fp, const char *titl
       next = NULL;
     }
 
-  if (debug_level & M4_DEBUG_TRACE_INPUT)
-    M4_DEBUG_MESSAGE1 (_("Input read from %s"), title);
+  if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_INPUT))
+    M4_DEBUG_MESSAGE1 (context, _("Input read from %s"), title);
 
   i = (input_block *) obstack_alloc (current_input,
                                     sizeof (struct input_block));
@@ -412,11 +412,11 @@ static struct input_funcs string_funcs =
 };
 
 struct obstack *
-m4_push_string_init (void)
+m4_push_string_init (m4 *context)
 {
   if (next != NULL)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                "INTERNAL ERROR: Recursive m4_push_string!"));
       abort ();
     }
@@ -486,12 +486,12 @@ m4_push_wrapup (const char *s)
    reset to the saved values before the memory for the input_block are
    released.  */
 static void
-pop_input (void)
+pop_input (m4 *context)
 {
   input_block *tmp = isp->prev;
 
   if (isp->funcs->clean_func != NULL)
-    (*isp->funcs->clean_func)();
+    (*isp->funcs->clean_func) (context);
 
   obstack_free (current_input, isp);
   next = NULL;                 /* might be set in m4_push_string_init () */
@@ -518,11 +518,11 @@ m4_pop_wrapup (void)
 /* When a BUILTIN token is seen, next_token () uses init_builtin_token
    to retrieve the value of the function pointer.  */
 static void
-init_builtin_token (m4_symbol_value *token)
+init_builtin_token (m4 *context, m4_symbol_value *token)
 {
   if (isp->funcs->read_func != builtin_read)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                "INTERNAL ERROR: Bad call to init_builtin_token ()"));
       abort ();
     }
@@ -540,7 +540,7 @@ init_builtin_token (m4_symbol_value *tok
    next_char () is used to read and advance the input to the next
    character.  */
 static int
-next_char (void)
+next_char (m4 *context)
 {
   int ch;
   int (*f) (void);
@@ -561,13 +561,13 @@ next_char (void)
        }
       else
        {
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Input stack botch in next_char ()"));
          abort ();
        }
 
       /* End of input source --- pop one level.  */
-      pop_input ();
+      pop_input (context);
     }
 }
 
@@ -575,7 +575,7 @@ next_char (void)
    the input stream.  At any given time, it reads from the input_block
    on the top of the current input stack.  */
 int
-m4_peek_input (void)
+m4_peek_input (m4 *context)
 {
   int ch;
   int (*f) (void);
@@ -595,13 +595,13 @@ m4_peek_input (void)
        }
       else
        {
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Input stack botch in m4_peek_input ()"));
          abort ();
        }
 
       /* End of input source --- pop one level.  */
-      pop_input ();
+      pop_input (context);
     }
 }
 
@@ -619,11 +619,11 @@ unget_input (int ch)
 /* skip_line () simply discards all immediately following characters, upto
    the first newline.  It is only used from m4_dnl ().  */
 void
-m4_skip_line (void)
+m4_skip_line (m4 *context)
 {
   int ch;
 
-  while ((ch = next_char ()) != CHAR_EOF && ch != '\n')
+  while ((ch = next_char (context)) != CHAR_EOF && ch != '\n')
     ;
 }
 
@@ -638,30 +638,30 @@ m4_skip_line (void)
    All strings herein should be unsigned.  Otherwise sign-extension
    of individual chars might break quotes with 8-bit chars in it.  */
 static int
-match_input (const unsigned char *s)
+match_input (m4 *context, const unsigned char *s)
 {
   int n;                       /* number of characters matched */
   int ch;                      /* input character */
   const unsigned char *t;
   struct obstack *st;
 
-  ch = m4_peek_input ();
+  ch = m4_peek_input (context);
   if (ch != *s)
     return 0;                  /* fail */
-  (void) next_char ();
+  (void) next_char (context);
 
   if (s[1] == '\0')
     return 1;                  /* short match */
 
-  for (n = 1, t = s++; (ch = m4_peek_input ()) == *s++; n++)
+  for (n = 1, t = s++; (ch = m4_peek_input (context)) == *s++; n++)
     {
-      (void) next_char ();
+      (void) next_char (context);
       if (*s == '\0')          /* long match */
        return 1;
     }
 
   /* Failed, push back input.  */
-  st = m4_push_string_init ();
+  st = m4_push_string_init (context);
   obstack_grow (st, t, n);
   m4_push_string_finish ();
   return 0;
@@ -671,11 +671,11 @@ match_input (const unsigned char *s)
   first character is handled inline, for speed.  Hopefully, this will not
   hurt efficiency too much when single character quotes and comment
   delimiters are used.  */
-#define MATCH(ch, s) \
+#define MATCH(C, ch, s) \
   ((s)[0] == (ch) \
    && (ch) != '\0' \
    && ((s)[1] == '\0' \
-       || (match_input ((s) + 1) ? (ch) = m4_peek_input (), 1 : 0)))
+       || (match_input ((C), (s) + 1) ? (ch) = m4_peek_input (C), 1 : 0)))
 
 
 
@@ -742,7 +742,7 @@ m4_input_exit (void)
    The storage pointed to by the fields in VALUE is therefore subject to
    change the next time next_token () is called.        */
 m4__token_type
-m4__next_token (m4_symbol_value *token)
+m4__next_token (m4 *context, m4_symbol_value *token)
 {
   int ch;
   int quote_level;
@@ -753,7 +753,7 @@ m4__next_token (m4_symbol_value *token)
     obstack_1grow (&token_stack, '\0');
     token_bottom = obstack_finish (&token_stack);
 
-    ch = m4_peek_input ();
+    ch = m4_peek_input (context);
     if (ch == CHAR_EOF)                        /* EOF */
       {
 #ifdef DEBUG_INPUT
@@ -764,43 +764,45 @@ m4__next_token (m4_symbol_value *token)
 
     if (ch == CHAR_BUILTIN)            /* BUILTIN TOKEN */
       {
-       init_builtin_token (token);
-       (void) next_char ();
+       init_builtin_token (context, token);
+       (void) next_char (context);
 #ifdef DEBUG_INPUT
        print_token ("next_token", M4_TOKEN_MACDEF, token);
 #endif
        return M4_TOKEN_MACDEF;
       }
 
-    (void) next_char ();
+    (void) next_char (context);
     if (M4_IS_BCOMM(ch))                       /* COMMENT, SHORT DELIM */
       {
        obstack_1grow (&token_stack, ch);
-       while ((ch = next_char ()) != CHAR_EOF && !M4_IS_ECOMM(ch))
+       while ((ch = next_char (context)) != CHAR_EOF && !M4_IS_ECOMM(ch))
          obstack_1grow (&token_stack, ch);
        if (ch != CHAR_EOF)
          obstack_1grow (&token_stack, ch);
-       type = discard_comments ? M4_TOKEN_NONE : M4_TOKEN_STRING;
+       type = m4_get_discard_comments_opt (context)
+               ? M4_TOKEN_NONE : M4_TOKEN_STRING;
       }
                                        /* COMMENT, LONGER DELIM */
-    else if (!m4__single_comments && MATCH (ch, bcomm.string))
+    else if (!m4__single_comments && MATCH (context, ch, bcomm.string))
       {
        obstack_grow (&token_stack, bcomm.string, bcomm.length);
-       while ((ch = next_char ()) != CHAR_EOF && !MATCH (ch, ecomm.string))
+       while ((ch = next_char (context)) != CHAR_EOF && !MATCH (context, ch, 
ecomm.string))
          obstack_1grow (&token_stack, ch);
        if (ch != CHAR_EOF)
          obstack_grow (&token_stack, ecomm.string, ecomm.length);
-       type = discard_comments ? M4_TOKEN_NONE : M4_TOKEN_STRING;
+       type = m4_get_discard_comments_opt (context)
+               ? M4_TOKEN_NONE : M4_TOKEN_STRING;
       }
     else if (M4_IS_ESCAPE(ch))         /* ESCAPED WORD */
       {
        obstack_1grow (&token_stack, ch);
-       if ((ch = next_char ()) != CHAR_EOF)
+       if ((ch = next_char (context)) != CHAR_EOF)
          {
            if (M4_IS_ALPHA(ch))
              {
                obstack_1grow (&token_stack, ch);
-               while ((ch = next_char ()) != CHAR_EOF && (M4_IS_ALNUM(ch)))
+               while ((ch = next_char (context)) != CHAR_EOF && 
(M4_IS_ALNUM(ch)))
                  {
                    obstack_1grow (&token_stack, ch);
                  }
@@ -823,7 +825,7 @@ m4__next_token (m4_symbol_value *token)
     else if (M4_IS_ALPHA (ch))
       {
        obstack_1grow (&token_stack, ch);
-       while ((ch = next_char ()) != CHAR_EOF && (M4_IS_ALNUM(ch)))
+       while ((ch = next_char (context)) != CHAR_EOF && (M4_IS_ALNUM(ch)))
          {
            obstack_1grow (&token_stack, ch);
          }
@@ -839,7 +841,7 @@ m4__next_token (m4_symbol_value *token)
        quote_level = 1;
        while (1)
          {
-           ch = next_char ();
+           ch = next_char (context);
            if (ch == CHAR_EOF)
              error_at_line (EXIT_FAILURE, 0,
                              current_file, current_line,
@@ -862,25 +864,25 @@ m4__next_token (m4_symbol_value *token)
        type = M4_TOKEN_STRING;
       }
                                        /* QUOTED STRING, LONGER QUOTES */
-    else if (!m4__single_quotes && MATCH (ch, lquote.string))
+    else if (!m4__single_quotes && MATCH (context, ch, lquote.string))
       {
        const char *current_file = m4_current_file;
        int current_line = m4_current_line;
        quote_level = 1;
        while (1)
          {
-           ch = next_char ();
+           ch = next_char (context);
            if (ch == CHAR_EOF)
              error_at_line (EXIT_FAILURE, 0,
                              current_file, current_line,
                              _("EOF in string"));
-           if (MATCH (ch, rquote.string))
+           if (MATCH (context, ch, rquote.string))
              {
                if (--quote_level == 0)
                  break;
                obstack_grow (&token_stack, rquote.string, rquote.length);
              }
-           else if (MATCH (ch, lquote.string))
+           else if (MATCH (context, ch, lquote.string))
              {
                quote_level++;
                obstack_grow (&token_stack, lquote.string, lquote.length);
@@ -896,7 +898,7 @@ m4__next_token (m4_symbol_value *token)
 
        if (M4_IS_OTHER(ch) || M4_IS_NUM(ch))
          {
-           while ((ch = next_char()) != CHAR_EOF
+           while ((ch = next_char(context)) != CHAR_EOF
                   && (M4_IS_OTHER(ch) || M4_IS_NUM(ch)))
              obstack_1grow (&token_stack, ch);
 
@@ -906,9 +908,9 @@ m4__next_token (m4_symbol_value *token)
          }
        else if (M4_IS_SPACE(ch))
          {
-           if (!interactive)
+           if (!m4_get_interactive_opt (context))
              {
-               while ((ch = next_char()) != CHAR_EOF && M4_IS_SPACE(ch))
+               while ((ch = next_char(context)) != CHAR_EOF && M4_IS_SPACE(ch))
                  obstack_1grow (&token_stack, ch);
 
                if (ch != CHAR_EOF)
Index: m4/m4.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 m4.c
--- m4/m4.c 19 Jun 2003 14:51:04 -0000 1.2
+++ m4/m4.c 20 Jun 2003 15:42:44 -0000
@@ -23,9 +23,10 @@
 m4 *
 m4_create (void)
 {
-  m4 *context = XMALLOC (m4, 1);
+  m4 *context = XCALLOC (m4, 1);
 
-  context->symtab = m4_symtab_create (0);
+  context->symtab = m4_symtab_create (0, &context->no_gnu_extensions);
+  context->nesting_limit = M4_DEFAULT_NESTING_LIMIT;
 
   return context;
 }
@@ -48,3 +49,59 @@ m4_get_symtab (m4 *context)
   assert (context);
   return context->symtab;
 }
+
+
+
+/* Use the preprocessor to generate the repetitive bit twiddling functions
+   for us.  */
+#undef m4_get_warning_status_opt
+#undef m4_get_no_gnu_extensions_opt
+#undef m4_get_nesting_limit_opt
+#undef m4_get_debug_level_opt
+#undef m4_get_max_debug_arg_length_opt
+#undef m4_get_prefix_builtins_opt
+#undef m4_get_suppress_warnings_opt
+#undef m4_get_discard_comments_opt
+#undef m4_get_interactive_opt
+#undef m4_get_sync_output_opt
+
+
+#define M4FIELD(type, name)                                            \
+       type CONC(m4_get_, CONC(name, _opt)) (m4 *context)              \
+       {                                                               \
+         assert (context);                                             \
+         return context->name;                                         \
+       }
+m4_context_field_table
+#undef M4FIELD
+
+#define M4FIELD(type, name)                                            \
+       type CONC(m4_set_, CONC(name, _opt)) (m4 *context, type value)  \
+       {                                                               \
+         assert (context);                                             \
+         return context->name = value;                                 \
+       }
+m4_context_field_table
+#undef M4FIELD
+
+#define M4OPT_BIT(bit, base)                                           \
+       boolean CONC(m4_get_, base) (m4 *context)                       \
+       {                                                               \
+         assert (context);                                             \
+         return BIT_TEST (context->opt_flags, (bit));                  \
+       }
+m4_context_opt_bit_table
+#undef M4OPT_BIT
+
+#define M4OPT_BIT(bit, base)                                           \
+       boolean CONC(m4_set_, base) (m4 *context, boolean value)        \
+       {                                                               \
+         assert (context);                                             \
+         if (value)                                                    \
+            BIT_SET   (context->opt_flags, (bit));                     \
+         else                                                          \
+            BIT_RESET (context->opt_flags, (bit));                     \
+         return value;                                                 \
+       }
+m4_context_opt_bit_table
+#undef M4OPT_BIT
Index: m4/m4module.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4module.h,v
retrieving revision 1.50
diff -u -p -u -r1.50 m4module.h
--- m4/m4module.h 19 Jun 2003 14:51:04 -0000 1.50
+++ m4/m4module.h 20 Jun 2003 15:42:44 -0000
@@ -27,16 +27,15 @@
 
 BEGIN_C_DECLS
 
+#define M4_DEFAULT_NESTING_LIMIT       250
+
+
 
 /* Various declarations.  */
 
 typedef struct m4              m4;
-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 {
   const char *name;
@@ -51,13 +50,73 @@ typedef struct {
 } m4_builtin;
 
 
+#define M4BUILTIN(name)                                        \
+  static void CONC(builtin_, name)                             \
+   (m4 *context, struct obstack *obs, int argc, m4_symbol_value **argv);
+
+#define M4BUILTIN_HANDLER(name)                                \
+  static void CONC(builtin_, name)                             \
+   (m4 *context, struct obstack *obs, int argc, m4_symbol_value **argv)
+
+#define M4INIT_HANDLER(name)                                   \
+  void CONC(name, CONC(_LTX_, m4_init_module))                         \
+       (m4 *context, lt_dlhandle handle, struct obstack *obs); \
+  void CONC(name, CONC(_LTX_, m4_init_module))                         \
+       (m4 *context, lt_dlhandle handle, struct obstack *obs)
+
+#define M4FINISH_HANDLER(name)                                 \
+  void CONC(name, CONC(_LTX_, m4_finish_module))               \
+       (m4 *context, lt_dlhandle handle, struct obstack *obs); \
+  void CONC(name, CONC(_LTX_, m4_finish_module))               \
+       (m4 *context, lt_dlhandle handle, struct obstack *obs)
+
+#define M4ARG(i)       (argc > (i) ? m4_get_symbol_value_text (argv[i]) : "")
+
+/* Error handling.  */
+#define M4ERROR(Arglist) (error Arglist)
+#define M4WARN(Arglist)                                M4_STMT_START { \
+       if (!m4_get_suppress_warnings_opt (context)) M4ERROR (Arglist); \
+                                                       } M4_STMT_END
+
+
 
 /* --- CONTEXT MANAGEMENT --- */
 
+typedef struct m4_symtab       m4_symtab;
+typedef struct m4_symbol       m4_symbol;
+
 extern m4 *      m4_create     (void);
 extern void      m4_delete     (m4 *);
 extern m4_symtab *m4_get_symtab        (m4 *);
 
+#define m4_context_field_table                                                 
\
+       M4FIELD(int,            warning_status)                         \
+       M4FIELD(boolean,        no_gnu_extensions)                      \
+       M4FIELD(int,            nesting_limit)                          \
+       M4FIELD(int,            debug_level)                            \
+       M4FIELD(int,            max_debug_arg_length)                   \
+
+
+#define m4_context_opt_bit_table                                       \
+       M4OPT_BIT(M4_OPT_PREFIX_BUILTINS_BIT,   prefix_builtins_opt)    \
+       M4OPT_BIT(M4_OPT_SUPPRESS_WARN_BIT,     suppress_warnings_opt)  \
+       M4OPT_BIT(M4_OPT_DISCARD_COMMENTS_BIT,  discard_comments_opt)   \
+       M4OPT_BIT(M4_OPT_INTERACTIVE_BIT,       interactive_opt)        \
+       M4OPT_BIT(M4_OPT_SYNC_OUTPUT_BIT,       sync_output_opt)        \
+
+
+#define M4FIELD(type, name)                                            \
+       extern type CONC(m4_get_, CONC(name, _opt)) (m4 *context);      \
+       extern type CONC(m4_set_, CONC(name, _opt)) (m4 *context, type value);
+m4_context_field_table
+#undef M4FIELD
+
+#define M4OPT_BIT(bit, base)                                           \
+       extern boolean CONC(m4_get_, base) (m4 *context);               \
+       extern boolean CONC(m4_set_, base) (m4 *context, boolean value);
+m4_context_opt_bit_table
+#undef M4OPT_BIT
+
 #define M4SYMTAB       (m4_get_symtab (context))
 
 
@@ -79,17 +138,13 @@ extern m4_macro       *m4_get_module_macro_
 /* --- SYMBOL TABLE MANAGEMENT --- */
 
 
-typedef int m4_symtab_apply_func (m4_symtab *symtab, const void *key,
-                                 void *value, void *data);
+typedef void *m4_symtab_apply_func (m4_symtab *symtab, const char *key,
+                                   m4_symbol *symbol, void *userdata);
 
-extern m4_symtab *m4_symtab_create  (size_t);
+extern m4_symtab *m4_symtab_create  (size_t, boolean *);
 extern void      m4_symtab_delete  (m4_symtab*);
 extern void *    m4_symtab_apply   (m4_symtab*, m4_symtab_apply_func*, void*);
 
-#define m4_symtab_apply(symtab, func, userdata)                                
\
- (m4_hash_apply ((m4_hash*)(symtab), (m4_hash_apply_func*)(func), (userdata)))
-
-
 extern m4_symbol *m4_symbol_lookup  (m4_symtab*, const char *);
 extern m4_symbol *m4_symbol_pushdef (m4_symtab*, const char *, m4_symbol_value 
*);
 extern m4_symbol *m4_symbol_define  (m4_symtab*, const char *, m4_symbol_value 
*);
@@ -100,7 +155,7 @@ extern void       m4_symbol_delete  (m4_
        while (m4_symbol_lookup ((symtab), (name)))                     \
            m4_symbol_popdef ((symtab), (name));        } M4_STMT_END
 
-extern m4_symbol_value *m4_get_symbol_value      (m4_symbol *symbol);
+extern m4_symbol_value *m4_get_symbol_value      (m4_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 *);
@@ -135,38 +190,6 @@ extern const m4_builtin *m4_builtin_find
 extern const m4_builtin *m4_builtin_find_by_func (
                                const m4_builtin *, m4_builtin_func *);
 
-#define M4ARG(i)       (argc > (i) ? m4_get_symbol_value_text (argv[i]) : "")
-
-#define M4BUILTIN(name)                                        \
-  static void CONC(builtin_, name)                             \
-   (m4 *context, struct obstack *obs, int argc, m4_symbol_value **argv);
-
-#define M4BUILTIN_HANDLER(name)                                \
-  static void CONC(builtin_, name)                             \
-   (m4 *context, struct obstack *obs, int argc, m4_symbol_value **argv)
-
-#define M4INIT_HANDLER(name)                                   \
-  void CONC(name, CONC(_LTX_, m4_init_module))                         \
-       (m4 *context, lt_dlhandle handle, struct obstack *obs); \
-  void CONC(name, CONC(_LTX_, m4_init_module))                         \
-       (m4 *context, lt_dlhandle handle, struct obstack *obs)
-
-#define M4FINISH_HANDLER(name)                                 \
-  void CONC(name, CONC(_LTX_, m4_finish_module))               \
-       (m4 *context, lt_dlhandle handle, struct obstack *obs); \
-  void CONC(name, CONC(_LTX_, m4_finish_module))               \
-       (m4 *context, lt_dlhandle handle, struct obstack *obs)
-
-/* Error handling.  */
-#define M4ERROR(Arglist) (error Arglist)
-#define M4WARN(Arglist) \
-  do                                                           \
-    {                                                          \
-       if (!suppress_warnings)                                  \
-         M4ERROR (Arglist);                                    \
-    }                                                          \
-  while (0)
-
 /* The name this program was run with. */
 #ifdef _LIBC
 /* In the GNU C library, there is a predefined variable for this.  */
@@ -174,19 +197,6 @@ extern const m4_builtin *m4_builtin_find
 #endif
 extern const char *program_name;
 
-/* Option flags  (defined in utility.c; set in m4.c).  */
-extern int interactive;                        /* -e */
-extern int sync_output;                        /* -s */
-extern int debug_level;                        /* -d */
-extern int hash_table_size;            /* -H */
-extern int no_gnu_extensions;          /* -G */
-extern int prefix_all_builtins;                /* -P */
-extern int max_debug_argument_length;  /* -l */
-extern int suppress_warnings;          /* -Q */
-extern int warning_status;             /* -E */
-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 */
@@ -204,9 +214,9 @@ extern m4_string ecomm;
 #define DEF_BCOMM "#"
 #define DEF_ECOMM "\n"
 
-extern boolean m4_bad_argc (int, m4_symbol_value **, int, int);
+extern boolean m4_bad_argc (m4 *, int, m4_symbol_value **, int, int);
 extern const char *m4_skip_space (const char *);
-extern boolean m4_numeric_arg (int, m4_symbol_value **, int, int *);
+extern boolean m4_numeric_arg (m4 *, int, m4_symbol_value **, int, int *);
 extern void m4_shipout_int (struct obstack *, int);
 extern void m4_shipout_string (struct obstack*, const char*, int, boolean);
 extern void m4_dump_args (struct obstack *obs, int argc, m4_symbol_value 
**argv, const char *sep, boolean quoted);
@@ -220,102 +230,80 @@ extern FILE *m4_debug;
 /* The value of debug_level is a bitmask of the following.  */
 
 /* a: show arglist in trace output */
-#define M4_DEBUG_TRACE_ARGS 1
+#define M4_DEBUG_TRACE_ARGS            (1 << 0)
 /* e: show expansion in trace output */
-#define M4_DEBUG_TRACE_EXPANSION 2
+#define M4_DEBUG_TRACE_EXPANSION       (1 << 1)
 /* q: quote args and expansion in trace output */
-#define M4_DEBUG_TRACE_QUOTE 4
+#define M4_DEBUG_TRACE_QUOTE           (1 << 2)
 /* t: trace all macros -- overrides trace{on,off} */
-#define M4_DEBUG_TRACE_ALL 8
+#define M4_DEBUG_TRACE_ALL             (1 << 3)
 /* l: add line numbers to trace output */
-#define M4_DEBUG_TRACE_LINE 16
+#define M4_DEBUG_TRACE_LINE            (1 << 4)
 /* f: add file name to trace output */
-#define M4_DEBUG_TRACE_FILE 32
+#define M4_DEBUG_TRACE_FILE            (1 << 5)
 /* p: trace path search of include files */
-#define M4_DEBUG_TRACE_PATH 64
+#define M4_DEBUG_TRACE_PATH            (1 << 6)
 /* c: show macro call before args collection */
-#define M4_DEBUG_TRACE_CALL 128
+#define M4_DEBUG_TRACE_CALL            (1 << 7)
 /* i: trace changes of input files */
-#define M4_DEBUG_TRACE_INPUT 256
+#define M4_DEBUG_TRACE_INPUT           (1 << 8)
 /* x: add call id to trace output */
-#define M4_DEBUG_TRACE_CALLID 512
+#define M4_DEBUG_TRACE_CALLID          (1 << 9)
 
 /* V: very verbose --  print everything */
-#define M4_DEBUG_TRACE_VERBOSE 1023
+#define M4_DEBUG_TRACE_VERBOSE         1023
 /* default flags -- equiv: aeq */
-#define M4_DEBUG_TRACE_DEFAULT 7
+#define M4_DEBUG_TRACE_DEFAULT         \
+       (M4_DEBUG_TRACE_ARGS|M4_DEBUG_TRACE_EXPANSION|M4_DEBUG_TRACE_QUOTE)
 
-#define M4_DEBUG_PRINT1(Fmt, Arg1) \
-  do                                                           \
-    {                                                          \
-      if (m4_debug != NULL)                                    \
-       fprintf (m4_debug, Fmt, Arg1);                          \
-    }                                                          \
-  while (0)
-
-#define M4_DEBUG_PRINT2(Fmt, Arg1, Arg2) \
-  do                                                           \
-    {                                                          \
-      if (m4_debug != NULL)                                    \
-       fprintf (m4_debug, Fmt, Arg1, Arg2);                    \
-    }                                                          \
-  while (0)
-
-#define M4_DEBUG_PRINT3(Fmt, Arg1, Arg2, Arg3) \
-  do                                                           \
-    {                                                          \
-      if (m4_debug != NULL)                                    \
-       fprintf (m4_debug, Fmt, Arg1, Arg2, Arg3);              \
-    }                                                          \
-  while (0)
-
-#define M4_DEBUG_MESSAGE(Fmt) \
-  do                                                           \
-    {                                                          \
-      if (m4_debug != NULL)                                    \
-       {                                                       \
-         m4_debug_message_prefix ();                           \
-         fprintf (m4_debug, Fmt);                              \
-         putc ('\n', m4_debug);                                \
-       }                                                       \
-    }                                                          \
-  while (0)
-
-#define M4_DEBUG_MESSAGE1(Fmt, Arg1) \
-  do                                                           \
-    {                                                          \
-      if (m4_debug != NULL)                                    \
-       {                                                       \
-         m4_debug_message_prefix ();                           \
-         fprintf (m4_debug, Fmt, Arg1);                        \
-         putc ('\n', m4_debug);                                \
-       }                                                       \
-    }                                                          \
-  while (0)
-
-#define M4_DEBUG_MESSAGE2(Fmt, Arg1, Arg2) \
-  do                                                           \
-    {                                                          \
+#define M4_DEBUG_PRINT1(Fmt, Arg1)                     M4_STMT_START { \
+      if (m4_debug != NULL)                                            \
+       fprintf (m4_debug, Fmt, Arg1);                  } M4_STMT_END
+
+#define M4_DEBUG_PRINT2(Fmt, Arg1, Arg2)               M4_STMT_START { \
       if (m4_debug != NULL)                                    \
-       {                                                       \
-         m4_debug_message_prefix ();                           \
-         fprintf (m4_debug, Fmt, Arg1, Arg2);                  \
-         putc ('\n', m4_debug);                                \
-       }                                                       \
-    }                                                          \
-  while (0)
+       fprintf (m4_debug, Fmt, Arg1, Arg2);            } M4_STMT_END
+
+#define M4_DEBUG_PRINT3(Fmt, Arg1, Arg2, Arg3)         M4_STMT_START { \
+       if (m4_debug != NULL)                                           \
+       fprintf (m4_debug, Fmt, Arg1, Arg2, Arg3);      } M4_STMT_END
+
+#define M4_DEBUG_MESSAGE(C, Fmt)                       M4_STMT_START { \
+      if (m4_debug != NULL)                                            \
+       {                                                               \
+         m4_debug_message_prefix (C);                                  \
+         fprintf (m4_debug, Fmt);                                      \
+         putc ('\n', m4_debug);                                        \
+       }                                               } M4_STMT_END
+
+#define M4_DEBUG_MESSAGE1(C, Fmt, Arg1)                        M4_STMT_START { 
\
+      if (m4_debug != NULL)                                            \
+       {                                                               \
+         m4_debug_message_prefix (C);                                  \
+         fprintf (m4_debug, Fmt, Arg1);                                \
+         putc ('\n', m4_debug);                                        \
+       }                                               } M4_STMT_END
+
+#define M4_DEBUG_MESSAGE2(C, Fmt, Arg1, Arg2)          M4_STMT_START { \
+      if (m4_debug != NULL)                                            \
+       {                                                               \
+         m4_debug_message_prefix (C);                                  \
+         fprintf (m4_debug, Fmt, Arg1, Arg2);                          \
+         putc ('\n', m4_debug);                                        \
+       }                                               } M4_STMT_END
 
 extern void m4_debug_init (void);
 extern void m4_debug_exit (void);
 extern int m4_debug_decode (const char *);
 extern void m4_debug_flush_files (void);
 extern boolean m4_debug_set_output (const char *);
-extern void m4_debug_message_prefix (void);
+extern void m4_debug_message_prefix (m4 *context);
 
-extern void m4_trace_prepre (const char *, int);
-extern void m4_trace_pre (const char *, int, int, m4_symbol_value **);
-extern void m4_trace_post (const char *, int, int, m4_symbol_value **,
-                          const char *);
+extern void m4_trace_prepre (m4 *context, const char *, int);
+extern void m4_trace_pre (m4 *context, const char *, int, int,
+                         m4_symbol_value **);
+extern void m4_trace_post (m4 *context, const char *, int, int,
+                          m4_symbol_value **, const char *);
 
 /* Exit code from last "syscmd" command.  */
 extern int m4_sysval;
@@ -323,10 +311,10 @@ extern int m4_expansion_level;
 
 extern const char *m4_expand_ranges (const char *s, struct obstack *obs);
 extern void       m4_expand_input  (m4 *context);
-extern void       m4_call_macro    (m4_symbol *symbol, m4 *context,
+extern void       m4_call_macro    (m4 *context, m4_symbol *symbol,
                                     struct obstack *obs, int argc,
                                     m4_symbol_value **argv);
-extern void       m4_process_macro (m4_symbol *symbol, m4 *context,
+extern void       m4_process_macro (m4 *context, m4_symbol *symbol,
                                     struct obstack *obs, int argc,
                                     m4_symbol_value **argv);
 
@@ -405,29 +393,29 @@ 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_skip_line    (void);
+extern int     m4_peek_input   (m4 *context);
+extern void    m4_skip_line    (m4 *context);
 
 /* push back input */
 
-extern void    m4_push_file    (FILE *, const char *);
+extern void    m4_push_file    (m4 *context, FILE *, const char *);
 extern void    m4_push_single  (int ch);
 extern void    m4_push_builtin (m4_symbol_value *);
-extern struct obstack *m4_push_string_init (void);
+extern struct obstack *m4_push_string_init (m4 *context);
 extern const char *m4_push_string_finish (void);
 extern void    m4_push_wrapup  (const char *);
 extern boolean m4_pop_wrapup   (void);
 
 extern void    m4_set_quotes   (const char *, const char *);
 extern void    m4_set_comment  (const char *, const char *);
-extern void    m4_set_syntax   (char, const unsigned char *);
+extern void    m4_set_syntax   (m4 *, char, const unsigned char *);
 
 extern int m4_current_diversion;
 extern int m4_output_current_line;
 
 extern void    m4_output_init  (void);
 extern void    m4_output_exit  (void);
-extern void    m4_shipout_text (struct obstack *, const char *, int);
+extern void    m4_shipout_text (m4 *, struct obstack *, const char *, int);
 extern void    m4_make_diversion (int);
 extern void    m4_insert_diversion (int);
 extern void    m4_insert_file  (FILE *);
@@ -435,9 +423,9 @@ extern      void    m4_freeze_diversions (FILE *
 extern void    m4_undivert_all (void);
 
 extern void    m4_include_init (void);
-extern void    m4_include_env_init (void);
-extern void    m4_add_include_directory (const char *);
-extern FILE   *m4_path_search (const char *, char **);
+extern void    m4_include_env_init (m4 *context);
+extern void    m4_add_include_directory (m4 *context, const char *);
+extern FILE   *m4_path_search (m4 *context, const char *, char **);
 
 /* These are for other search paths */
 
@@ -472,7 +460,7 @@ struct m4_dump_symbol_data
   int size;                    /* size of table */
 };
 
-extern int m4_dump_symbol (const void *name, void *symbol, void *data);
+extern void *m4_dump_symbol_CB (m4_symtab*, const char*, m4_symbol *, void *);
 extern void m4_dump_symbols (m4 *context, struct m4_dump_symbol_data *data, 
int argc, m4_symbol_value **argv, boolean complain);
 
 
Index: m4/m4private.h
===================================================================
RCS file: /cvsroot/m4/m4/m4/m4private.h,v
retrieving revision 1.24
diff -u -p -u -r1.24 m4private.h
--- m4/m4private.h 19 Jun 2003 14:51:04 -0000 1.24
+++ m4/m4private.h 20 Jun 2003 15:42:44 -0000
@@ -42,13 +42,44 @@ typedef enum {
 /* --- CONTEXT MANAGEMENT --- */
 
 struct m4 {
-  m4_symtab *symtab;
+  m4_symtab *  symtab;
+
+  /* Option flags  (set in src/main.c).  */
+  int          warning_status;                 /* -E */
+  boolean      no_gnu_extensions;              /* -G */
+  int          nesting_limit;                  /* -L */
+  int          debug_level;                    /* -d */
+  int          max_debug_arg_length;           /* -l */
+  int          opt_flags;
 };
 
+#define M4_OPT_PREFIX_BUILTINS_BIT     (1 << 0) /* -P */
+#define M4_OPT_SUPPRESS_WARN_BIT       (1 << 1) /* -Q */
+#define M4_OPT_DISCARD_COMMENTS_BIT    (1 << 2) /* -c */
+#define M4_OPT_INTERACTIVE_BIT         (1 << 3) /* -e */
+#define M4_OPT_SYNC_OUTPUT_BIT         (1 << 4) /* -s */
+
 #ifdef NDEBUG
-#  define m4_get_symtab(context)       ((context)->symtab)
+#  define m4_get_symtab(C)                     ((C)->symtab)
+#  define m4_get_warning_status_opt(C)         ((C)->warning_status)
+#  define m4_get_no_gnu_extensions_opt(C)      ((C)->no_gnu_extensions)
+#  define m4_get_nesting_limit_opt(C)          ((C)->nesting_limit)
+#  define m4_get_debug_level_opt(C)            ((C)->debug_level)
+#  define m4_get_max_debug_arg_length_opt(C)   ((C)->max_debug_arg_length)
+
+#  define m4_get_prefix_builtins_opt(C)                                        
\
+               (BIT_TEST((C)->opt_flags, M4_OPT_PREFIX_BUILTINS_BIT))
+#  define m4_get_suppress_warnings_opt(C)                              \
+               (BIT_TEST((C)->opt_flags, M4_OPT_SUPPRESS_WARN_BIT))
+#  define m4_get_discard_comments_opt(C)                               \
+               (BIT_TEST((C)->opt_flags, M4_OPT_DISCARD_COMMENTS_BIT))
+#  define m4_get_interactive_opt(C)                                    \
+               (BIT_TEST((C)->opt_flags, M4_OPT_INTERACTIVE_BIT))
+#  define m4_get_sync_output_opt(C)                                    \
+               (BIT_TEST((C)->opt_flags, M4_OPT_SYNC_OUTPUT_BIT))
 #endif
 
+
 
 /* --- MODULE MANAGEMENT --- */
 
@@ -58,7 +89,7 @@ struct m4 {
 #define INIT_SYMBOL            "m4_init_module"
 #define FINISH_SYMBOL          "m4_finish_module"
 
-extern void        m4__module_init (void);
+extern void        m4__module_init (m4 *context);
 extern lt_dlhandle  m4__module_open (m4 *context, const char *name,
                                     struct obstack *obs);
 extern void        m4__module_exit (m4 *context);
@@ -168,7 +199,7 @@ typedef enum {
   M4_TOKEN_MACDEF              /* a macros definition (see "defn") */
 } m4__token_type;
 
-extern m4__token_type m4__next_token (m4_symbol_value *);
+extern m4__token_type m4__next_token (m4 *context, m4_symbol_value *);
 
 
 
Index: m4/macro.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/macro.c,v
retrieving revision 1.28
diff -u -p -u -r1.28 macro.c
--- m4/macro.c 19 Jun 2003 14:51:04 -0000 1.28
+++ m4/macro.c 20 Jun 2003 15:42:44 -0000
@@ -47,7 +47,7 @@ m4_expand_input (m4 *context)
   m4__token_type type;
   m4_symbol_value token;
 
-  while ((type = m4__next_token (&token)) != M4_TOKEN_EOF)
+  while ((type = m4__next_token (context, &token)) != M4_TOKEN_EOF)
     expand_token (context, (struct obstack *) NULL, type, &token);
 }
 
@@ -72,7 +72,7 @@ expand_token (m4 *context, struct obstac
     case M4_TOKEN_SIMPLE:
     case M4_TOKEN_STRING:
     case M4_TOKEN_SPACE:
-      m4_shipout_text (obs, text, strlen (text));
+      m4_shipout_text (context, obs, text, strlen (text));
       break;
 
     case M4_TOKEN_WORD:
@@ -87,9 +87,9 @@ expand_token (m4 *context, struct obstac
            || 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 ())))
+               && !M4_IS_OPEN (m4_peek_input (context))))
          {
-           m4_shipout_text (obs, text, strlen (text));
+           m4_shipout_text (context, obs, text, strlen (text));
          }
        else
          expand_macro (context, textp, symbol);
@@ -97,7 +97,7 @@ expand_token (m4 *context, struct obstac
       break;
 
     default:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                "INTERNAL ERROR: Bad token type in expand_token ()"));
       abort ();
     }
@@ -128,7 +128,7 @@ expand_argument (m4 *context, struct obs
   /* Skip leading white space.  */
   do
     {
-      type = m4__next_token (&token);
+      type = m4__next_token (context, &token);
     }
   while (type == M4_TOKEN_SPACE);
 
@@ -176,12 +176,12 @@ expand_argument (m4 *context, struct obs
          break;
 
        default:
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Bad token type in expand_argument ()"));
          abort ();
        }
 
-      type = m4__next_token (&token);
+      type = m4__next_token (context, &token);
     }
 }
 
@@ -206,22 +206,24 @@ expand_macro (m4 *context, const char *n
   int my_call_id;
 
   m4_expansion_level++;
-  if (m4_expansion_level > nesting_limit)
+  if (m4_expansion_level > m4_get_nesting_limit_opt (context))
     M4ERROR ((EXIT_FAILURE, 0, _("\
 ERROR: Recursion limit of %d exceeded, use -L<N> to change it"),
-             nesting_limit));
+             m4_get_nesting_limit_opt (context)));
 
   macro_call_id++;
   my_call_id = macro_call_id;
 
-  traced = (boolean) ((debug_level & M4_DEBUG_TRACE_ALL)
+  traced = (boolean) ((BIT_TEST (m4_get_debug_level_opt (context),
+                                M4_DEBUG_TRACE_ALL))
                      || m4_get_symbol_traced (symbol));
 
   obstack_init (&argptr);
   obstack_init (&arguments);
 
-  if (traced && (debug_level & M4_DEBUG_TRACE_CALL))
-    m4_trace_prepre (name, my_call_id);
+  if (traced && (BIT_TEST (m4_get_debug_level_opt (context),
+                          M4_DEBUG_TRACE_CALL)))
+    m4_trace_prepre (context, name, my_call_id);
 
   collect_arguments (context, name, symbol, &argptr, &arguments);
 
@@ -229,16 +231,16 @@ ERROR: Recursion limit of %d exceeded, u
   argv = (m4_symbol_value **) obstack_finish (&argptr);
 
   if (traced)
-    m4_trace_pre (name, my_call_id, argc, argv);
+    m4_trace_pre (context, name, my_call_id, argc, argv);
 
-  expansion = m4_push_string_init ();
-  if (!m4_bad_argc (argc, argv,
+  expansion = m4_push_string_init (context);
+  if (!m4_bad_argc (context, argc, argv,
                    SYMBOL_MIN_ARGS (symbol), SYMBOL_MAX_ARGS (symbol)))
-    m4_call_macro (symbol, context, expansion, argc, argv);
+    m4_call_macro (context, symbol, expansion, argc, argv);
   expanded = m4_push_string_finish ();
 
   if (traced)
-    m4_trace_post (name, my_call_id, argc, argv, expanded);
+    m4_trace_post (context, name, my_call_id, argc, argv, expanded);
 
   --m4_expansion_level;
 
@@ -266,10 +268,10 @@ collect_arguments (m4 *context, const ch
                                      sizeof (token));
   obstack_grow (argptr, (void *) &tokenp, sizeof (tokenp));
 
-  ch = m4_peek_input ();
+  ch = m4_peek_input (context);
   if (M4_IS_OPEN(ch))
     {
-      m4__next_token (&token);         /* gobble parenthesis */
+      m4__next_token (context, &token);                /* gobble parenthesis */
       do
        {
          more_args = expand_argument (context, arguments, &token);
@@ -294,12 +296,12 @@ collect_arguments (m4 *context, const ch
    the call, stored in the ARGV table.  The expansion is left on
    the obstack EXPANSION.  Macro tracing is also handled here.  */
 void
-m4_call_macro (m4_symbol *symbol, m4 *context, struct obstack *expansion,
+m4_call_macro (m4 *context, m4_symbol *symbol, struct obstack *expansion,
               int argc, m4_symbol_value **argv)
 {
   if (m4_is_symbol_text (symbol))
     {
-      m4_process_macro (symbol, context, expansion, argc, argv);
+      m4_process_macro (context, symbol, expansion, argc, argv);
     }
   else if (m4_is_symbol_func (symbol))
     {
@@ -307,7 +309,7 @@ m4_call_macro (m4_symbol *symbol, m4 *co
     }
   else
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                "INTERNAL ERROR: Bad symbol type in call_macro ()"));
       abort ();
     }
@@ -319,7 +321,7 @@ m4_call_macro (m4_symbol *symbol, m4 *co
    definition, giving the expansion text.  ARGC and ARGV are the arguments,
    as usual.  */
 void
-m4_process_macro (m4_symbol *symbol, m4 *context, struct obstack *obs,
+m4_process_macro (m4 *context, m4_symbol *symbol, struct obstack *obs,
                  int argc, m4_symbol_value **argv)
 {
   const unsigned char *text;
@@ -338,7 +340,7 @@ m4_process_macro (m4_symbol *symbol, m4 
        {
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':
-         if (no_gnu_extensions || !isdigit(text[1]))
+         if (m4_get_no_gnu_extensions_opt (context) || !isdigit(text[1]))
            {
              i = *text++ - '0';
            }
@@ -364,7 +366,8 @@ m4_process_macro (m4_symbol *symbol, m4 
          break;
 
        default:
-         if (no_gnu_extensions || !SYMBOL_ARG_SIGNATURE (symbol))
+         if (m4_get_no_gnu_extensions_opt (context)
+             || !SYMBOL_ARG_SIGNATURE (symbol))
            {
              obstack_1grow (obs, '$');
            }
@@ -398,7 +401,7 @@ INTERNAL ERROR: %s: out of range referen
                }
              else
                {
-                 M4ERROR ((warning_status, 0,
+                 M4ERROR ((m4_get_warning_status_opt (context), 0,
                          _("Error: %s: unterminated parameter reference: %s"),
                            M4ARG (0), key));
                }
Index: m4/module.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/module.c,v
retrieving revision 1.23
diff -u -p -u -r1.23 module.c
--- m4/module.c 19 Jun 2003 14:51:04 -0000 1.23
+++ m4/module.c 20 Jun 2003 15:42:44 -0000
@@ -121,7 +121,7 @@ m4_get_module_builtin_table (lt_dlhandle
 
 static void
 set_module_builtin_table (m4 *context, lt_dlhandle handle,
-                            const m4_builtin *table)
+                         const m4_builtin *table)
 {
   const m4_builtin *bp;
 
@@ -144,7 +144,7 @@ set_module_builtin_table (m4 *context, l
       if (bp->blind_if_no_args)
        BIT_SET (VALUE_FLAGS (value), VALUE_BLIND_ARGS_BIT);
 
-      if (prefix_all_builtins)
+      if (m4_get_prefix_builtins_opt (context))
        {
          static const char prefix[] = "m4_";
          size_t len = strlen (prefix) + strlen (bp->name);
@@ -158,7 +158,7 @@ set_module_builtin_table (m4 *context, l
 
       m4_symbol_pushdef (M4SYMTAB, name, value);
 
-      if (prefix_all_builtins)
+      if (m4_get_prefix_builtins_opt (context))
        xfree (name);
     }
 }
@@ -213,7 +213,7 @@ m4_module_load (m4 *context, const char 
 
       if (!info)
        {
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    _("Warning: cannot load module `%s': %s"),
                    name, module_dlerror ()));
        }
@@ -286,7 +286,7 @@ m4_module_unload (m4 *context, const cha
    prevent the path search of the dlopen library from finding wrong
    files. */
 void
-m4__module_init (void)
+m4__module_init (m4 *context)
 {
   int errors = 0;
 
@@ -294,7 +294,7 @@ m4__module_init (void)
      module system has already been initialised.  */
   if (caller_id)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: multiple module loader initialisations")));
       return;
     }
@@ -426,7 +426,7 @@ m4__module_open (m4 *context, const char
            {
              xfree (stale);
 
-             M4ERROR ((warning_status, 0,
+             M4ERROR ((m4_get_warning_status_opt (context), 0,
                        _("Warning: overiding stale caller data in module 
`%s'"),
                        name));
            }
Index: m4/output.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/output.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 output.c
--- m4/output.c 19 Oct 2001 15:35:11 -0000 1.10
+++ m4/output.c 20 Jun 2003 15:42:44 -0000
@@ -392,7 +392,8 @@ output_text (const char *text, int lengt
    sync lines are output whenever a single input lines generates several
    output lines, or when several input lines does not generate any output.  */
 void
-m4_shipout_text (struct obstack *obs, const char *text, int length)
+m4_shipout_text (m4 *context, struct obstack *obs,
+                const char *text, int length)
 {
   static boolean start_of_output_line = TRUE;
   char line[20];
@@ -413,7 +414,7 @@ m4_shipout_text (struct obstack *obs, co
 
   /* Output TEXT to a file, or in-memory diversion buffer.  */
 
-  if (!sync_output)
+  if (!m4_get_sync_output_opt (context))
     switch (length)
       {
 
Index: m4/path.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/path.c,v
retrieving revision 1.3
diff -u -p -u -r1.3 path.c
--- m4/path.c 20 Aug 2001 19:42:38 -0000 1.3
+++ m4/path.c 20 Jun 2003 15:42:44 -0000
@@ -117,18 +117,18 @@ m4_include_init (void)
 /* Functions for normal input path search */
 
 void
-m4_include_env_init (void)
+m4_include_env_init (m4 *context)
 {
-  if (no_gnu_extensions)
+  if (m4_get_no_gnu_extensions_opt (context))
     return;
 
   m4_search_path_env_init (&dirpath, getenv ("M4PATH"), FALSE);
 }
 
 void
-m4_add_include_directory (const char *dir)
+m4_add_include_directory (m4 *context, const char *dir)
 {
-  if (no_gnu_extensions)
+  if (m4_get_no_gnu_extensions_opt (context))
     return;
 
   m4_search_path_add (&dirpath, dir);
@@ -139,7 +139,7 @@ m4_add_include_directory (const char *di
 }
 
 FILE *
-m4_path_search (const char *dir, char **expanded_name)
+m4_path_search (m4 *context, const char *dir, char **expanded_name)
 {
   FILE *fp;
   struct m4_search_path *incl;
@@ -155,7 +155,7 @@ m4_path_search (const char *dir, char **
     }
 
   /* If file not found, and filename absolute, fail.  */
-  if (*dir == '/' || no_gnu_extensions)
+  if (*dir == '/' || m4_get_no_gnu_extensions_opt (context))
     return NULL;
 
   name = (char *) xmalloc (dirpath.max_length + 1 + strlen (dir) + 1);
@@ -173,8 +173,9 @@ m4_path_search (const char *dir, char **
       fp = fopen (name, "r");
       if (fp != NULL)
        {
-         if (debug_level & M4_DEBUG_TRACE_PATH)
-           M4_DEBUG_MESSAGE2 (_("Path search for `%s' found `%s'"), dir, name);
+         if (BIT_TEST (m4_get_debug_level_opt (context), M4_DEBUG_TRACE_PATH))
+           M4_DEBUG_MESSAGE2 (context, _("Path search for `%s' found `%s'"),
+                              dir, name);
 
          if (expanded_name != NULL)
            *expanded_name = xstrdup (name);
Index: m4/symtab.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/symtab.c,v
retrieving revision 1.39
diff -u -p -u -r1.39 symtab.c
--- m4/symtab.c 19 Jun 2003 14:51:04 -0000 1.39
+++ m4/symtab.c 20 Jun 2003 15:42:44 -0000
@@ -28,7 +28,7 @@
    symbol is represented by `struct m4_symbol', which is stored in the hash
    table keyed by the symbol name.  As a special case, to facilitate the
    "pushdef" and "popdef" builtins, the value stored against each key is a
-   stack of `struct m4_symbol_value'. All the value entries for a symbol name 
are
+   stack of `m4_symbol_value'. All the value entries for a symbol name are
    simply ordered on the stack by age.  The most recently pushed definition
    will then always be the first found.
 
@@ -44,13 +44,18 @@
 
 #define M4_SYMTAB_DEFAULT_SIZE         2047
 
+struct m4_symtab {
+  m4_hash *table;
+  boolean *nuke_trace_bit;     /* default: &(context->no_gnu_ext_opt) */
+};
+
 static m4_symbol *symtab_fetch         (m4_symtab*, const char *);
 static void      symbol_popval         (m4_symbol *symbol);
-static void *    symbol_destroy        (m4_hash *hash, const void *name,
-                                        void *symbol, void *ignored);
-static void *    arg_destroy           (m4_hash *hash, const void *name,
+static void *    symbol_destroy_CB     (m4_symtab *symtab, const char *name,
+                                        m4_symbol *symbol, void *ignored);
+static void *    arg_destroy_CB        (m4_hash *hash, const void *name,
                                         void *arg, void *ignored);
-static void *    arg_copy              (m4_hash *src, const void *name,
+static void *    arg_copy_CB           (m4_hash *src, const void *name,
                                         void *arg, m4_hash *dest);
 
 
@@ -60,19 +65,49 @@ static void *         arg_copy              (m4_hash *src,
    These functions are used to manage a symbol table as a whole.  */
 
 m4_symtab *
-m4_symtab_create (size_t size)
+m4_symtab_create (size_t size, boolean *nuke_trace_bit)
 {
-  return (m4_symtab *) m4_hash_new (size ? size : M4_SYMTAB_DEFAULT_SIZE,
-                                   m4_hash_string_hash, m4_hash_string_cmp);
+  m4_symtab *symtab = XMALLOC (m4_symtab, 1);
+
+  symtab->table = m4_hash_new (size ? size : M4_SYMTAB_DEFAULT_SIZE,
+                              m4_hash_string_hash, m4_hash_string_cmp);
+  symtab->nuke_trace_bit = nuke_trace_bit;
+  return symtab;
 }
 
 void
 m4_symtab_delete (m4_symtab *symtab)
 {
   assert (symtab);
+  assert (symtab->table);
 
-  m4_hash_apply  ((m4_hash *) symtab, symbol_destroy, NULL);
-  m4_hash_delete ((m4_hash *) symtab);
+  m4_symtab_apply  (symtab, symbol_destroy_CB, NULL);
+  m4_hash_delete (symtab->table);
+  xfree (symtab);
+}
+
+void *
+m4_symtab_apply (m4_symtab *symtab, m4_symtab_apply_func *func, void *userdata)
+{
+  m4_hash_iterator *place  = NULL;
+  void *           result = NULL;
+
+  assert (symtab);
+  assert (symtab->table);
+  assert (func);
+
+  while ((place = m4_get_hash_iterator_next (symtab->table, place)))
+    {
+      result = (*func) (symtab,
+                       (const char *) m4_get_hash_iterator_key   (place),
+                       (m4_symbol *)  m4_get_hash_iterator_value (place),
+                       userdata);
+
+      if (result != NULL)
+       break;
+    }
+
+  return result;
 }
 
 static m4_symbol *
@@ -84,7 +119,7 @@ symtab_fetch (m4_symtab *symtab, const c
   assert (symtab);
   assert (name);
 
-  psymbol = (m4_symbol **) m4_hash_lookup ((m4_hash *) symtab, name);
+  psymbol = (m4_symbol **) m4_hash_lookup (symtab->table, name);
   if (psymbol)
     {
       symbol = *psymbol;
@@ -92,7 +127,7 @@ symtab_fetch (m4_symtab *symtab, const c
   else
     {
       symbol = XCALLOC (m4_symbol, 1);
-      m4_hash_insert ((m4_hash *) symtab, xstrdup (name), symbol);
+      m4_hash_insert (symtab->table, xstrdup (name), symbol);
     }
 
   return symbol;
@@ -108,7 +143,7 @@ m4__symtab_remove_module_references (m4_
   assert (handle);
 
    /* Traverse each symbol name in the hash table.  */
-  while ((place = m4_get_hash_iterator_next (symtab, place)))
+  while ((place = m4_get_hash_iterator_next (symtab->table, place)))
     {
       m4_symbol *symbol = (m4_symbol *) m4_get_hash_iterator_value (place);
       m4_symbol_value *data = m4_get_symbol_value (symbol);
@@ -146,16 +181,17 @@ m4__symtab_remove_module_references (m4_
    on every symbol so that m4_symbol_popdef() doesn't try to preserve
    the table entry.  */
 static void *
-symbol_destroy (m4_hash *hash, const void *name, void *symbol, void *ignored)
+symbol_destroy_CB (m4_symtab *symtab, const char *name, m4_symbol *symbol,
+                  void *ignored)
 {
   char *key = xstrdup ((char *) name);
 
-  m4_set_symbol_traced ((m4_symbol *) symbol, FALSE);
+  m4_set_symbol_traced (symbol, FALSE);
 
-  while (key && m4_hash_lookup (hash, key))
-    m4_symbol_popdef ((m4_symtab *) hash, key);
+  while (key && m4_hash_lookup (symtab->table, key))
+    m4_symbol_popdef (symtab, key);
 
-  XFREE (key);
+  xfree (key);
 
   return NULL;
 }
@@ -171,8 +207,7 @@ symbol_destroy (m4_hash *hash, const voi
 m4_symbol *
 m4_symbol_lookup (m4_symtab *symtab, const char *name)
 {
-  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup ((m4_hash *) symtab,
-                                                      name);
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (symtab->table, name);
 
   /* If just searching, return status of search -- if only an empty
      struct is returned, that is treated as a failed lookup.  */
@@ -230,20 +265,21 @@ m4_symbol_define (m4_symtab *symtab, con
 void
 m4_symbol_popdef (m4_symtab *symtab, const char *name)
 {
-  m4_symbol **psymbol  = (m4_symbol **) m4_hash_lookup ((m4_hash *) symtab,
-                                                        name);
+  m4_symbol **psymbol = (m4_symbol **) m4_hash_lookup (symtab->table, name);
+
   assert (psymbol);
   assert (*psymbol);
+  assert (symtab->nuke_trace_bit);
 
   symbol_popval (*psymbol);
 
   /* Only remove the hash table entry if the last value in the
      symbol value stack was successfully removed.  */
   if (!m4_get_symbol_value (*psymbol))
-    if (no_gnu_extensions || !m4_get_symbol_traced (*psymbol))
+    if (*symtab->nuke_trace_bit || !m4_get_symbol_traced (*psymbol))
       {
        XFREE (*psymbol);
-       xfree (m4_hash_remove ((m4_hash *) symtab, name));
+       xfree (m4_hash_remove (symtab->table, name));
       }
 }
 
@@ -263,7 +299,7 @@ symbol_popval (m4_symbol *symbol)
 
       if (VALUE_ARG_SIGNATURE (stale))
        {
-         m4_hash_apply (VALUE_ARG_SIGNATURE (stale), arg_destroy, NULL);
+         m4_hash_apply (VALUE_ARG_SIGNATURE (stale), arg_destroy_CB, NULL);
          m4_hash_delete (VALUE_ARG_SIGNATURE (stale));
        }
       if (m4_is_symbol_value_text (stale))
@@ -275,7 +311,7 @@ symbol_popval (m4_symbol *symbol)
 /* Callback used by m4_symbol_popdef () to release the memory used
    by values in the arg_signature hash.  */
 static void *
-arg_destroy (m4_hash *hash, const void *name, void *arg, void *ignored)
+arg_destroy_CB (m4_hash *hash, const void *name, void *arg, void *ignored)
 {
   struct m4_symbol_arg *token_arg = (struct m4_symbol_arg *) arg;
 
@@ -303,7 +339,7 @@ m4_symbol_value_copy (m4_symbol_value *d
 
   if (VALUE_ARG_SIGNATURE (dest))
     {
-      m4_hash_apply (VALUE_ARG_SIGNATURE (dest), arg_destroy, NULL);
+      m4_hash_apply (VALUE_ARG_SIGNATURE (dest), arg_destroy_CB, NULL);
       m4_hash_delete (VALUE_ARG_SIGNATURE (dest));
     }
 
@@ -320,11 +356,11 @@ m4_symbol_value_copy (m4_symbol_value *d
 
   if (VALUE_ARG_SIGNATURE (src))
     VALUE_ARG_SIGNATURE (dest) = m4_hash_dup (VALUE_ARG_SIGNATURE (src),
-                                             arg_copy);
+                                             arg_copy_CB);
 }
 
 static void *
-arg_copy (m4_hash *src, const void *name, void *arg, m4_hash *dest)
+arg_copy_CB (m4_hash *src, const void *name, void *arg, m4_hash *dest)
 {
   m4_hash_insert ((m4_hash *) dest, name, arg);
   return NULL;
@@ -343,15 +379,9 @@ m4_set_symbol_name_traced (m4_symtab *sy
   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
@@ -451,50 +481,48 @@ m4_set_symbol_value_func (m4_symbol_valu
 
 #ifdef DEBUG_SYM
 
-static int  symtab_print_list (m4_hash *hash, const void *name, void *symbol,
-                              void *ignored);
-static void symtab_debug      (m4_symtab *symtab);
-static void symtab_dump              (m4_symtab *symtab);
-
-static void
+static void *symtab_dump       (m4_symtab *symtab);
+static void  dump_symbol_CB    (m4_symtab *symtab, const char *name,
+                                m4_symbol *symbol, void *userdata);
+static void *
 symtab_dump (m4_symtab *symtab)
 {
-  m4_hash_iterator *place = 0;
+  return symtab_apply (symtab, dump_symbol_CB, NULL);
+}
 
-  while ((place = m4_get_hash_iterator_next ((m4_hash *) symtab, place)))
-    {
-      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   = 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";
-      const m4_builtin *bp;
-
-      fprintf (stderr, "%10s: (%d%s) %s=",
-              module_name, flags,
-              m4_get_symbol_traced (symbol) ? "!" : "", symbol_name);
-
-      if (!token)
-       fputs ("<!UNDEFINED!>", stderr);
-      else
-       switch (symbol->value->type)
-         {
-         case M4_SYMBOL_TEXT:
-           fputs (m4_get_symbol_text (symbol), stderr);
-           break;
-
-         case M4_SYMBOL_FUNC:
-           bp = m4_builtin_find_by_func (m4_get_module_builtin_table (handle),
-                                         m4_get_symbol_func (symbol));
-           fprintf (stderr, "<%s>",
-                    bp ? bp->name : "!ERROR!");
-           break;
-         case M4_SYMBOL_VOID:
-           fputs ("<!VOID!>", stderr);
-           break;
-       }
-      fputc ('\n', stderr);
-    }
+static void *dump_symbol_CB (m4_symtab *symtab, const char *name,
+                            m4_symbol *symbol, void *ignored)
+{
+  m4_symbol_value *value       = m4_get_symbol_value (symbol);
+  int             flags        = value ? SYMBOL_FLAGS (symbol) : 0;
+  lt_dlhandle      handle      = value ? SYMBOL_HANDLE (symbol) : 0;
+  const char *     module_name = handle ? m4_get_module_name (handle) : "NONE";
+  const m4_builtin *bp;
+
+  fprintf (stderr, "%10s: (%d%s) %s=",
+          handle ? m4_get_module_name (handle) : "NONE",
+          value  ? VALUE_FLAGS (value) : 0,
+          m4_get_symbol_traced (symbol) ? "!" : "", name);
+
+  if (!value)
+    fputs ("<!UNDEFINED!>", stderr);
+  else
+    switch (value->type)
+      {
+      case M4_SYMBOL_TEXT:
+       fputs (m4_get_symbol_text (symbol), stderr);
+       break;
+
+      case M4_SYMBOL_FUNC:
+       bp = m4_builtin_find_by_func (m4_get_module_builtin_table (handle),
+                                     m4_get_symbol_func (symbol));
+       fprintf (stderr, "<%s>",
+                bp ? bp->name : "!ERROR!");
+       break;
+      case M4_SYMBOL_VOID:
+       fputs ("<!VOID!>", stderr);
+       break;
+      }
+  fputc ('\n', stderr);
 }
 #endif /* DEBUG_SYM */
Index: m4/syntax.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/syntax.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 syntax.c
--- m4/syntax.c 6 Jun 2003 16:14:05 -0000 1.2
+++ m4/syntax.c 20 Jun 2003 15:42:44 -0000
@@ -268,7 +268,7 @@ unset_syntax_attribute (int code, int ch
 }
 
 void
-m4_set_syntax (char key, const unsigned char *chars)
+m4_set_syntax (m4 *context, char key, const unsigned char *chars)
 {
   int ch, code;
 
@@ -276,7 +276,7 @@ m4_set_syntax (char key, const unsigned 
 
   if ((code < 0) && (key != '\0'))
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Undefined syntax code %c"), key));
       return;
     }
Index: m4/utility.c
===================================================================
RCS file: /cvsroot/m4/m4/m4/utility.c,v
retrieving revision 1.27
diff -u -p -u -r1.27 utility.c
--- m4/utility.c 19 Jun 2003 14:51:04 -0000 1.27
+++ m4/utility.c 20 Jun 2003 15:42:44 -0000
@@ -29,36 +29,6 @@ static int dumpdef_cmp (const void *s1, 
 /* Exit code from last "syscmd" command.  */
 int m4_sysval = 0;
 
-/* Operate interactively (-e).  */
-int interactive = 0;
-
-/* Enable sync output for /lib/cpp (-s).  */
-int sync_output = 0;
-
-/* Debug (-d[flags]).  */
-int debug_level = 0;
-
-/* Disable GNU extensions (-G).  */
-int no_gnu_extensions = 0;
-
-/* Prefix all builtin functions by `m4_'.  */
-int prefix_all_builtins = 0;
-
-/* Max length of arguments in trace output (-lsize).  */
-int max_debug_argument_length = 0;
-
-/* Suppress warnings about missing arguments.  */
-int suppress_warnings = 0;
-
-/* If not zero, then value of exit status for warning diagnostics.  */
-int warning_status = 0;
-
-/* Artificial limit for expansion_level in macro.c.  */
-int nesting_limit = 250;
-
-/* If nonzero, comments are discarded in the token parser.  */
-int discard_comments = 0;
-
 /* input syntax table. */
 unsigned short m4_syntax_table[256];
 
@@ -77,11 +47,11 @@ m4_string ecomm;
    applicable, MAX is the maximum number, negative if not applicable.
    ARGC, MIN, and MAX count ARGV[0], the name of the macro.  */
 boolean
-m4_bad_argc (int argc, m4_symbol_value **argv, int min, int max)
+m4_bad_argc (m4 *context, int argc, m4_symbol_value **argv, int min, int max)
 {
   if (min > 0 && argc < min)
     {
-      M4WARN ((warning_status, 0,
+      M4WARN ((m4_get_warning_status_opt (context), 0,
               _("Warning: %s: too few arguments: %d < %d"),
               M4ARG (0), argc - 1, min - 1));
       return TRUE;
@@ -89,7 +59,7 @@ m4_bad_argc (int argc, m4_symbol_value *
 
   if (max > 0 && argc > max)
     {
-      M4WARN ((warning_status, 0,
+      M4WARN ((m4_get_warning_status_opt (context), 0,
               _("Warning: %s: too many arguments (ignored): %d > %d"),
               M4ARG (0), argc - 1, max - 1));
       /* Return FALSE, otherwise it is not exactly `ignored'. */
@@ -111,7 +81,8 @@ m4_skip_space (const char *arg)
    VALUEP. If the conversion fails, print error message for macro.
    Return TRUE iff conversion succeeds.  */
 boolean
-m4_numeric_arg (int argc, m4_symbol_value **argv, int arg, int *valuep)
+m4_numeric_arg (m4 *context, int argc, m4_symbol_value **argv,
+               int arg, int *valuep)
 {
   char *endp;
 
@@ -119,7 +90,7 @@ m4_numeric_arg (int argc, m4_symbol_valu
       || (*valuep = strtol (m4_skip_space (M4ARG (arg)), &endp, 10),
          *m4_skip_space (endp) != 0))
     {
-      M4WARN ((warning_status, 0,
+      M4WARN ((m4_get_warning_status_opt (context), 0,
               _("Warning: %s: argument %d non-numeric: %s"),
               M4ARG (0), arg - 1, M4ARG (arg)));
       return FALSE;
@@ -197,20 +168,25 @@ dumpdef_cmp (const void *s1, const void 
 
 /* The function dump_symbol () is for use by "dumpdef".  It builds up a
    table of all defined symbol names.  */
-int
-m4_dump_symbol (const void *name, void *symbol, void *data)
-{
-  if (((m4_symbol *) symbol)->value->type != M4_SYMBOL_VOID)
+void *
+m4_dump_symbol_CB (m4_symtab *ignored, const char *name, m4_symbol *symbol,
+                  void *userdata)
+{
+  assert (name);
+  assert (symbol);
+  assert (symbol->value);
+
+  if (symbol->value->type != M4_SYMBOL_VOID)
     {
       struct m4_dump_symbol_data *symbol_data
-       = (struct m4_dump_symbol_data *) data;
+       = (struct m4_dump_symbol_data *) userdata;
 
       obstack_blank (symbol_data->obs, sizeof (const char *));
       symbol_data->base = (const char **) obstack_base (symbol_data->obs);
       symbol_data->base[symbol_data->size++] = (const char *) name;
     }
 
-  return 0;
+  return NULL;
 }
 
 /* If there are no arguments, build a sorted list of all defined
@@ -224,7 +200,7 @@ m4_dump_symbols (m4 *context, struct m4_
 
   if (argc == 1)
     {
-      m4_symtab_apply (M4SYMTAB, m4_dump_symbol, data);
+      m4_symtab_apply (M4SYMTAB, m4_dump_symbol_CB, data);
     }
   else
     {
@@ -235,9 +211,9 @@ m4_dump_symbols (m4 *context, struct m4_
        {
          symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (i));
          if (symbol != NULL && symbol->value->type != M4_SYMBOL_VOID)
-           m4_dump_symbol (M4ARG (i), symbol, data);
+           m4_dump_symbol_CB (NULL, M4ARG (i), symbol, data);
          else if (complain)
-           M4WARN ((warning_status, 0,
+           M4WARN ((m4_get_warning_status_opt (context), 0,
                     _("Warning: %s: undefined name: %s"),
                     M4ARG (0), M4ARG (i)));
        }
Index: modules/evalparse.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/evalparse.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 evalparse.c
--- modules/evalparse.c 18 Jun 2003 16:21:55 -0000 1.8
+++ modules/evalparse.c 20 Jun 2003 15:42:45 -0000
@@ -66,20 +66,20 @@ typedef enum eval_error
   }
 eval_error;
 
-static eval_error logical_or_term   (eval_token, number *);
-static eval_error logical_and_term  (eval_token, number *);
-static eval_error or_term          (eval_token, number *);
-static eval_error xor_term         (eval_token, number *);
-static eval_error and_term         (eval_token, number *);
-static eval_error not_term         (eval_token, number *);
-static eval_error logical_not_term  (eval_token, number *);
-static eval_error cmp_term         (eval_token, number *);
-static eval_error shift_term       (eval_token, number *);
-static eval_error add_term         (eval_token, number *);
-static eval_error mult_term        (eval_token, number *);
-static eval_error exp_term         (eval_token, number *);
-static eval_error unary_term       (eval_token, number *);
-static eval_error simple_term      (eval_token, number *);
+static eval_error logical_or_term   (m4 *, eval_token, number *);
+static eval_error logical_and_term  (m4 *, eval_token, number *);
+static eval_error or_term          (m4 *, eval_token, number *);
+static eval_error xor_term         (m4 *, eval_token, number *);
+static eval_error and_term         (m4 *, eval_token, number *);
+static eval_error not_term         (m4 *, eval_token, number *);
+static eval_error logical_not_term  (m4 *, eval_token, number *);
+static eval_error cmp_term         (m4 *, eval_token, number *);
+static eval_error shift_term       (m4 *, eval_token, number *);
+static eval_error add_term         (m4 *, eval_token, number *);
+static eval_error mult_term        (m4 *, eval_token, number *);
+static eval_error exp_term         (m4 *, eval_token, number *);
+static eval_error unary_term       (m4 *, eval_token, number *);
+static eval_error simple_term      (m4 *, eval_token, number *);
 static void      numb_pow          (number *x, const number *y);
 
 
@@ -280,12 +280,12 @@ eval_lex (number *val)
 
 /* Recursive descent parser.  */
 static eval_error
-logical_or_term (eval_token et, number *v1)
+logical_or_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
 
-  if ((er = logical_and_term (et, v1)) != NO_ERROR)
+  if ((er = logical_and_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -295,7 +295,7 @@ logical_or_term (eval_token et, number *
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = logical_and_term (et, &v2)) != NO_ERROR)
+      if ((er = logical_and_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       numb_lior(*v1,v2);
@@ -309,12 +309,12 @@ logical_or_term (eval_token et, number *
 }
 
 static eval_error
-logical_and_term (eval_token et, number *v1)
+logical_and_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
 
-  if ((er = or_term (et, v1)) != NO_ERROR)
+  if ((er = or_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -324,7 +324,7 @@ logical_and_term (eval_token et, number 
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = or_term (et, &v2)) != NO_ERROR)
+      if ((er = or_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       numb_land(*v1,v2);
@@ -338,12 +338,12 @@ logical_and_term (eval_token et, number 
 }
 
 static eval_error
-or_term (eval_token et, number *v1)
+or_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
 
-  if ((er = xor_term (et, v1)) != NO_ERROR)
+  if ((er = xor_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -353,10 +353,10 @@ or_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = xor_term (et, &v2)) != NO_ERROR)
+      if ((er = xor_term (context, et, &v2)) != NO_ERROR)
        return er;
 
-      numb_ior(v1, (const number *)&v2);
+      numb_ior(context, v1, (const number *)&v2);
     }
   numb_fini(v2);
   if (et == ERROR)
@@ -367,12 +367,12 @@ or_term (eval_token et, number *v1)
 }
 
 static eval_error
-xor_term (eval_token et, number *v1)
+xor_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
 
-  if ((er = and_term (et, v1)) != NO_ERROR)
+  if ((er = and_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -382,10 +382,10 @@ xor_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = and_term (et, &v2)) != NO_ERROR)
+      if ((er = and_term (context, et, &v2)) != NO_ERROR)
        return er;
 
-      numb_eor(v1, (const number *)&v2);
+      numb_eor(context, v1, (const number *)&v2);
     }
   numb_fini(v2);
   if (et == ERROR)
@@ -396,12 +396,12 @@ xor_term (eval_token et, number *v1)
 }
 
 static eval_error
-and_term (eval_token et, number *v1)
+and_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
 
-  if ((er = not_term (et, v1)) != NO_ERROR)
+  if ((er = not_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -411,10 +411,10 @@ and_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = not_term (et, &v2)) != NO_ERROR)
+      if ((er = not_term (context, et, &v2)) != NO_ERROR)
        return er;
 
-      numb_and(v1, (const number *)&v2);
+      numb_and(context, v1, (const number *)&v2);
     }
   numb_fini(v2);
   if (et == ERROR)
@@ -425,7 +425,7 @@ and_term (eval_token et, number *v1)
 }
 
 static eval_error
-not_term (eval_token et, number *v1)
+not_term (m4 *context, eval_token et, number *v1)
 {
   eval_error er;
 
@@ -435,19 +435,19 @@ not_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = not_term (et, v1)) != NO_ERROR)
+      if ((er = not_term (context, et, v1)) != NO_ERROR)
        return er;
-      numb_not(v1);
+      numb_not(context, v1);
     }
   else
-    if ((er = logical_not_term (et, v1)) != NO_ERROR)
+    if ((er = logical_not_term (context, et, v1)) != NO_ERROR)
       return er;
 
   return NO_ERROR;
 }
 
 static eval_error
-logical_not_term (eval_token et, number *v1)
+logical_not_term (m4 *context, eval_token et, number *v1)
 {
   eval_error er;
 
@@ -457,25 +457,25 @@ logical_not_term (eval_token et, number 
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = logical_not_term (et, v1)) != NO_ERROR)
+      if ((er = logical_not_term (context, et, v1)) != NO_ERROR)
        return er;
       numb_lnot(*v1);
     }
   else
-    if ((er = cmp_term (et, v1)) != NO_ERROR)
+    if ((er = cmp_term (context, et, v1)) != NO_ERROR)
       return er;
 
   return NO_ERROR;
 }
 
 static eval_error
-cmp_term (eval_token et, number *v1)
+cmp_term (m4 *context, eval_token et, number *v1)
 {
   eval_token op;
   number v2;
   eval_error er;
 
-  if ((er = shift_term (et, v1)) != NO_ERROR)
+  if ((er = shift_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -488,7 +488,7 @@ cmp_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = shift_term (et, &v2)) != NO_ERROR)
+      if ((er = shift_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       switch (op)
@@ -518,7 +518,7 @@ cmp_term (eval_token et, number *v1)
          break;
 
        default:
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Bad comparison operator in cmp_term ()"));
          abort ();
        }
@@ -532,13 +532,13 @@ cmp_term (eval_token et, number *v1)
 }
 
 static eval_error
-shift_term (eval_token et, number *v1)
+shift_term (m4 *context, eval_token et, number *v1)
 {
   eval_token op;
   number v2;
   eval_error er;
 
-  if ((er = add_term (et, v1)) != NO_ERROR)
+  if ((er = add_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -549,21 +549,21 @@ shift_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = add_term (et, &v2)) != NO_ERROR)
+      if ((er = add_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       switch (op)
        {
        case LSHIFT:
-         numb_lshift(v1, (const number *)&v2);
+         numb_lshift(context, v1, (const number *)&v2);
          break;
 
        case RSHIFT:
-         numb_rshift(v1, (const number *)&v2);
+         numb_rshift(context, v1, (const number *)&v2);
          break;
 
        default:
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Bad shift operator in shift_term ()"));
          abort ();
        }
@@ -577,13 +577,13 @@ shift_term (eval_token et, number *v1)
 }
 
 static eval_error
-add_term (eval_token et, number *v1)
+add_term (m4 *context, eval_token et, number *v1)
 {
   eval_token op;
   number v2;
   eval_error er;
 
-  if ((er = mult_term (et, v1)) != NO_ERROR)
+  if ((er = mult_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -593,7 +593,7 @@ add_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = mult_term (et, &v2)) != NO_ERROR)
+      if ((er = mult_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       if (op == PLUS) {
@@ -611,13 +611,13 @@ add_term (eval_token et, number *v1)
 }
 
 static eval_error
-mult_term (eval_token et, number *v1)
+mult_term (m4 *context, eval_token et, number *v1)
 {
   eval_token op;
   number v2;
   eval_error er;
 
-  if ((er = exp_term (et, v1)) != NO_ERROR)
+  if ((er = exp_term (context, et, v1)) != NO_ERROR)
     return er;
 
   numb_init(v2);
@@ -631,7 +631,7 @@ mult_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = exp_term (et, &v2)) != NO_ERROR)
+      if ((er = exp_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       switch (op)
@@ -660,12 +660,12 @@ mult_term (eval_token et, number *v1)
          if (numb_zerop(v2))
            return MODULO_ZERO;
          else {
-           numb_modulo(v1, (const number *)&v2);
+           numb_modulo(context, v1, (const number *)&v2);
          }
          break;
 
        default:
-         M4ERROR ((warning_status, 0,
+         M4ERROR ((m4_get_warning_status_opt (context), 0,
                    "INTERNAL ERROR: Bad operator in mult_term ()"));
          abort ();
        }
@@ -679,13 +679,13 @@ mult_term (eval_token et, number *v1)
 }
 
 static eval_error
-exp_term (eval_token et, number *v1)
+exp_term (m4 *context, eval_token et, number *v1)
 {
   number result;
   number v2;
   eval_error er;
 
-  if ((er = unary_term (et, v1)) != NO_ERROR)
+  if ((er = unary_term (context, et, v1)) != NO_ERROR)
     return er;
   memcpy(&result, v1, sizeof(number));
 
@@ -696,7 +696,7 @@ exp_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = exp_term (et, &v2)) != NO_ERROR)
+      if ((er = exp_term (context, et, &v2)) != NO_ERROR)
        return er;
 
       numb_pow(v1, (const number *)&v2);
@@ -710,7 +710,7 @@ exp_term (eval_token et, number *v1)
 }
 
 static eval_error
-unary_term (eval_token et, number *v1)
+unary_term (m4 *context, eval_token et, number *v1)
 {
   eval_token et2 = et;
   eval_error er;
@@ -721,21 +721,21 @@ unary_term (eval_token et, number *v1)
       if (et2 == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = simple_term (et2, v1)) != NO_ERROR)
+      if ((er = simple_term (context, et2, v1)) != NO_ERROR)
        return er;
 
       if (et == MINUS)
        numb_negate(*v1);
     }
   else
-    if ((er = simple_term (et, v1)) != NO_ERROR)
+    if ((er = simple_term (context, et, v1)) != NO_ERROR)
       return er;
 
   return NO_ERROR;
 }
 
 static eval_error
-simple_term (eval_token et, number *v1)
+simple_term (m4 *context, eval_token et, number *v1)
 {
   number v2;
   eval_error er;
@@ -747,7 +747,7 @@ simple_term (eval_token et, number *v1)
       if (et == ERROR)
        return UNKNOWN_INPUT;
 
-      if ((er = logical_or_term (et, v1)) != NO_ERROR)
+      if ((er = logical_or_term (context, et, v1)) != NO_ERROR)
        return er;
 
       et = eval_lex (&v2);
@@ -778,23 +778,23 @@ m4_evaluate (m4 *context, struct obstack
   eval_token   et;
   eval_error   err;
 
-  if (argc >= 3 && !m4_numeric_arg (argc, argv, 2, &radix))
+  if (argc >= 3 && !m4_numeric_arg (context, argc, argv, 2, &radix))
     return;
 
   if (radix <= 1 || radix > 36)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: radix out of range: %d"),
                M4ARG(0), radix));
       return;
     }
 
-  if (argc >= 4 && !m4_numeric_arg (argc, argv, 3, &min))
+  if (argc >= 4 && !m4_numeric_arg (context, argc, argv, 3, &min))
     return;
 
   if (min <= 0)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: negative width: %d"),
                M4ARG(0), min));
       return;
@@ -805,7 +805,7 @@ m4_evaluate (m4 *context, struct obstack
 
   numb_init(val);
   et = eval_lex (&val);
-  err = logical_or_term (et, &val);
+  err = logical_or_term (context, et, &val);
 
   if (err == NO_ERROR && *eval_text != '\0')
     err = EXCESS_INPUT;
@@ -816,43 +816,43 @@ m4_evaluate (m4 *context, struct obstack
       break;
 
     case MISSING_RIGHT:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: missing right parenthesis: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     case SYNTAX_ERROR:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: bad expression: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     case UNKNOWN_INPUT:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: bad input: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     case EXCESS_INPUT:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: excess input: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     case DIVIDE_ZERO:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: divide by zero: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     case MODULO_ZERO:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Warning: %s: modulo by zero: %s"),
                M4ARG (0), M4ARG (1)));
       break;
 
     default:
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                "INTERNAL ERROR: Bad error code in evaluate ()"));
       abort ();
     }
Index: modules/gnu.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/gnu.c,v
retrieving revision 1.22
diff -u -p -u -r1.22 gnu.c
--- modules/gnu.c 19 Jun 2003 14:51:04 -0000 1.22
+++ modules/gnu.c 20 Jun 2003 15:42:45 -0000
@@ -121,10 +121,10 @@ m4_macro m4_macro_table[] =
   { 0, 0 },
 };
 
-static void substitute (struct obstack *obs, const char *victim,
+static void substitute (m4 *context, struct obstack *obs, const char *victim,
                        const char *repl, struct re_registers *regs);
-static void m4_patsubst_do (struct obstack *obs, int argc, m4_symbol_value 
**argv,
-                           int syntax);
+static void m4_patsubst_do (m4 *context, struct obstack *obs, int argc,
+                           m4_symbol_value **argv, int syntax);
 
 
 /* The builtin "builtin" allows calls to builtin macros, even if their
@@ -142,7 +142,7 @@ M4BUILTIN_HANDLER (builtin)
   bp = m4_builtin_find_by_name (NULL, name);
 
   if (bp == NULL)
-    M4ERROR ((warning_status, 0,
+    M4ERROR ((m4_get_warning_status_opt (context), 0,
              _("Undefined name %s"), name));
   else
     (*bp->func) (context, obs, argc - 1, argv + 1);
@@ -164,10 +164,10 @@ M4BUILTIN_HANDLER (indir)
 
   symbol = m4_symbol_lookup (M4SYMTAB, name);
   if (symbol == NULL)
-    M4ERROR ((warning_status, 0,
+    M4ERROR ((m4_get_warning_status_opt (context), 0,
              _("Undefined name `%s'"), name));
   else
-    m4_call_macro (symbol, context, obs, argc - 1, argv + 1);
+    m4_call_macro (context, symbol, obs, argc - 1, argv + 1);
 }
 
 /* Change the current input syntax.  The function set_syntax () lives
@@ -185,7 +185,7 @@ M4BUILTIN_HANDLER (changesyntax)
 
   for (i = 1; i < argc; i++)
     {
-      m4_set_syntax (*M4ARG (i),
+      m4_set_syntax (context, *M4ARG (i),
                     m4_expand_ranges (M4ARG (i)+1, obs));
     }
 }
@@ -199,11 +199,12 @@ M4BUILTIN_HANDLER (changesyntax)
  **/
 M4BUILTIN_HANDLER (debugmode)
 {
+  int debug_level = m4_get_debug_level_opt (context);
   int new_debug_level;
   int change_flag;
 
   if (argc == 1)
-    debug_level = 0;
+    m4_set_debug_level_opt (context, 0);
   else
     {
       if (M4ARG (1)[0] == '+' || M4ARG (1)[0] == '-')
@@ -218,22 +219,22 @@ M4BUILTIN_HANDLER (debugmode)
        }
 
       if (new_debug_level < 0)
-       M4ERROR ((warning_status, 0,
+       M4ERROR ((m4_get_warning_status_opt (context), 0,
                  _("Debugmode: bad debug flags: `%s'"), M4ARG (1)));
       else
        {
          switch (change_flag)
            {
            case 0:
-             debug_level = new_debug_level;
+             m4_set_debug_level_opt (context, new_debug_level);
              break;
 
            case '+':
-             debug_level |= new_debug_level;
+             m4_set_debug_level_opt (context, debug_level | new_debug_level);
              break;
 
            case '-':
-             debug_level &= ~new_debug_level;
+             m4_set_debug_level_opt (context, debug_level & ~new_debug_level);
              break;
            }
        }
@@ -251,7 +252,7 @@ M4BUILTIN_HANDLER (debugfile)
   if (argc == 1)
     m4_debug_set_output (NULL);
   else if (!m4_debug_set_output (M4ARG (1)))
-    M4ERROR ((warning_status, errno,
+    M4ERROR ((m4_get_warning_status_opt (context), errno,
              _("Cannot set error file: %s"), M4ARG (1)));
 }
 
@@ -260,7 +261,7 @@ M4BUILTIN_HANDLER (debugfile)
    Report errors on behalf of CALLER.  */
 
 static struct re_pattern_buffer *
-m4_regexp_compile (const char *caller,
+m4_regexp_compile (m4 *context, const char *caller,
                   const char *regexp, int syntax)
 {
   static struct re_pattern_buffer buf; /* compiled regular expression */
@@ -281,7 +282,7 @@ m4_regexp_compile (const char *caller,
 
   if (msg != NULL)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("%s: bad regular expression `%s': %s"),
                caller, regexp, msg));
       return NULL;
@@ -300,8 +301,8 @@ m4_regexp_compile (const char *caller,
  **/
 
 static void
-m4_regexp_do (struct obstack *obs, int argc, m4_symbol_value **argv,
-             int syntax)
+m4_regexp_do (m4 *context, struct obstack *obs, int argc,
+             m4_symbol_value **argv, int syntax)
 {
   const char *victim;          /* first argument */
   const char *regexp;          /* regular expression */
@@ -314,7 +315,7 @@ m4_regexp_do (struct obstack *obs, int a
   victim = M4ARG (1);
   regexp = M4ARG (2);
 
-  buf = m4_regexp_compile (M4ARG(0), regexp, syntax);
+  buf = m4_regexp_compile (context, M4ARG(0), regexp, syntax);
   if (!buf)
     return;
 
@@ -323,7 +324,7 @@ m4_regexp_do (struct obstack *obs, int a
 
   if (startpos  == -2)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("%s: error matching regular expression `%s'"),
                M4ARG (0), regexp));
       return;
@@ -332,7 +333,7 @@ m4_regexp_do (struct obstack *obs, int a
   if (argc == 3)
     m4_shipout_int (obs, startpos);
   else if (startpos >= 0)
-    substitute (obs, victim, M4ARG (3), &regs);
+    substitute (context, obs, victim, M4ARG (3), &regs);
 
   return;
 }
@@ -343,7 +344,7 @@ m4_regexp_do (struct obstack *obs, int a
  **/
 M4BUILTIN_HANDLER (regexp)
 {
-  m4_regexp_do (obs, argc, argv, RE_SYNTAX_BRE);
+  m4_regexp_do (context, obs, argc, argv, RE_SYNTAX_BRE);
 }
 
 /**
@@ -351,7 +352,7 @@ M4BUILTIN_HANDLER (regexp)
  **/
 M4BUILTIN_HANDLER (eregexp)
 {
-  m4_regexp_do (obs, argc, argv, RE_SYNTAX_ERE);
+  m4_regexp_do (context, obs, argc, argv, RE_SYNTAX_ERE);
 }
 
 
@@ -365,8 +366,8 @@ M4BUILTIN_HANDLER (eregexp)
  * patsubst(STRING, REGEXP, [REPLACEMENT])
  **/
 static void
-m4_patsubst_do (struct obstack *obs, int argc, m4_symbol_value **argv,
-               int syntax)
+m4_patsubst_do (m4 *context, struct obstack *obs, int argc,
+               m4_symbol_value **argv, int syntax)
 {
   const char *victim;          /* first argument */
   const char *regexp;          /* regular expression */
@@ -381,7 +382,7 @@ m4_patsubst_do (struct obstack *obs, int
   victim = M4ARG (1);
   length = strlen (victim);
 
-  buf = m4_regexp_compile (M4ARG(0), regexp, syntax);
+  buf = m4_regexp_compile (context, M4ARG(0), regexp, syntax);
   if (!buf)
     return;
 
@@ -399,7 +400,7 @@ m4_patsubst_do (struct obstack *obs, int
             copied verbatim.  */
 
          if (matchpos == -2)
-           M4ERROR ((warning_status, 0,
+           M4ERROR ((m4_get_warning_status_opt (context), 0,
                      _("%s: error matching regular expression `%s'"),
                      M4ARG (0), regexp));
          else if (offset < length)
@@ -414,7 +415,7 @@ m4_patsubst_do (struct obstack *obs, int
 
       /* Handle the part of the string that was covered by the match.  */
 
-      substitute (obs, victim, M4ARG (3), &regs);
+      substitute (context, obs, victim, M4ARG (3), &regs);
 
       /* Update the offset to the end of the match.  If the regexp
         matched a null string, advance offset one more, to avoid
@@ -434,7 +435,7 @@ m4_patsubst_do (struct obstack *obs, int
  **/
 M4BUILTIN_HANDLER (patsubst)
 {
-  m4_patsubst_do (obs, argc, argv, RE_SYNTAX_BRE);
+  m4_patsubst_do (context, obs, argc, argv, RE_SYNTAX_BRE);
 }
 
 /**
@@ -442,7 +443,7 @@ M4BUILTIN_HANDLER (patsubst)
  **/
 M4BUILTIN_HANDLER (epatsubst)
 {
-  m4_patsubst_do (obs, argc, argv, RE_SYNTAX_ERE);
+  m4_patsubst_do (context, obs, argc, argv, RE_SYNTAX_ERE);
 }
 
 /* Implementation of "symbols" itself.  It builds up a table of pointers to
@@ -485,11 +486,11 @@ M4BUILTIN_HANDLER (syncoutput)
       if (   M4ARG (1)[0] == '0'
          || M4ARG (1)[0] == 'n'
          || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'f'))
-       sync_output = 0;
+       m4_set_sync_output_opt (context, FALSE);
       else if (   M4ARG (1)[0] == '1'
               || M4ARG (1)[0] == 'y'
               || (M4ARG (1)[0] == 'o' && M4ARG (1)[1] == 'n'))
-       sync_output = 1;
+       m4_set_sync_output_opt (context, TRUE);
     }
 }
 
@@ -506,7 +507,7 @@ M4BUILTIN_HANDLER (esyscmd)
   pin = popen (M4ARG (1), "r");
   if (pin == NULL)
     {
-      M4ERROR ((warning_status, errno,
+      M4ERROR ((m4_get_warning_status_opt (context), errno,
                _("Cannot open pipe to command `%s'"), M4ARG (1)));
       m4_sysval = 0xff << 8;
     }
@@ -556,8 +557,8 @@ M4BUILTIN_HANDLER (__line__)
 static int substitute_warned = 0;
 
 static void
-substitute (struct obstack *obs, const char *victim, const char *repl,
-           struct re_registers *regs)
+substitute (m4 *context, struct obstack *obs, const char *victim,
+           const char *repl, struct re_registers *regs)
 {
   register unsigned int ch;
 
@@ -575,7 +576,7 @@ substitute (struct obstack *obs, const c
        case '0':
          if (!substitute_warned)
            {
-             M4ERROR ((warning_status, 0, _("\
+             M4ERROR ((m4_get_warning_status_opt (context), 0, _("\
 WARNING: \\0 will disappear, use \\& instead in replacements")));
              substitute_warned = 1;
            }
Index: modules/load.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/load.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 load.c
--- modules/load.c 16 Jun 2003 16:29:06 -0000 1.10
+++ modules/load.c 20 Jun 2003 15:42:45 -0000
@@ -74,7 +74,7 @@ M4INIT_HANDLER (load)
   if (handle)
     if (lt_dlmakeresident (handle) != 0)
       {
-       M4ERROR ((warning_status, 0,
+       M4ERROR ((m4_get_warning_status_opt (context), 0,
                  _("Warning: cannot make module `%s' resident: %s"),
                  m4_get_module_name (handle), lt_dlerror ()));
       }
Index: modules/m4.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/m4.c,v
retrieving revision 1.43
diff -u -p -u -r1.43 m4.c
--- modules/m4.c 19 Jun 2003 14:51:04 -0000 1.43
+++ modules/m4.c 20 Jun 2003 15:42:46 -0000
@@ -96,10 +96,10 @@ typedef unsigned long int unumber;
 #endif
 
 
-static void    include         (int argc, m4_symbol_value **argv,
+static void    include         (m4 *context, int argc, m4_symbol_value **argv,
                                 boolean silent);
-static void *  set_trace       (m4_hash *hash, const void *ignored,
-                                void *symbol, void *userdata);
+static void *  set_trace_CB    (m4_symtab *symtab, const char *ignored,
+                                m4_symbol *symbol, void *userdata);
 static const char *ntoa                (number value, int radix);
 static void    numb_obstack    (struct obstack *obs, const number value,
                                 const int radix, int min);
@@ -132,7 +132,7 @@ M4INIT_HANDLER (m4)
   if (handle)
     if (lt_dlmakeresident (handle) != 0)
       {
-       M4ERROR ((warning_status, 0,
+       M4ERROR ((m4_get_warning_status_opt (context), 0,
                  _("Warning: cannot make module `%s' resident: %s"),
                  m4_get_module_name (handle), lt_dlerror ()));
       }
@@ -168,7 +168,7 @@ M4BUILTIN_HANDLER (define)
 M4BUILTIN_HANDLER (undefine)
 {
   if (!m4_symbol_lookup (M4SYMTAB, M4ARG (1)))
-    M4WARN ((warning_status, 0,
+    M4WARN ((m4_get_warning_status_opt (context), 0,
             _("Warning: %s: undefined name: %s"), M4ARG (0), M4ARG (1)));
   else
     m4_symbol_delete (M4SYMTAB, M4ARG (1));
@@ -192,7 +192,7 @@ M4BUILTIN_HANDLER (pushdef)
 M4BUILTIN_HANDLER (popdef)
 {
   if (!m4_symbol_lookup (M4SYMTAB, M4ARG (1)))
-    M4WARN ((warning_status, 0,
+    M4WARN ((m4_get_warning_status_opt (context), 0,
             _("Warning: %s: undefined name: %s"), M4ARG (0), M4ARG (1)));
   else
     m4_symbol_popdef (M4SYMTAB, M4ARG (1));
@@ -231,11 +231,11 @@ M4BUILTIN_HANDLER (ifelse)
   if (argc == 2)
     return;
 
-  if (m4_bad_argc (argc, argv, 4, -1))
+  if (m4_bad_argc (context, argc, argv, 4, -1))
     return;
   else
     /* Diagnose excess arguments if 5, 8, 11, etc., actual arguments.  */
-    m4_bad_argc ((argc + 2) % 3, argv, -1, 1);
+    m4_bad_argc (context, (argc + 2) % 3, argv, -1, 1);
 
   argv++;
   argc--;
@@ -284,7 +284,7 @@ M4BUILTIN_HANDLER (dumpdef)
 
       if (m4_is_symbol_text (symbol))
        {
-         if (debug_level & M4_DEBUG_TRACE_QUOTE)
+         if (m4_get_debug_level_opt (context) & M4_DEBUG_TRACE_QUOTE)
            fprintf (stderr, "%s%s%s\n",
                     lquote.string, m4_get_symbol_text (symbol),
                     rquote.string);
@@ -315,7 +315,7 @@ M4BUILTIN_HANDLER (defn)
   symbol = m4_symbol_lookup (M4SYMTAB, M4ARG (1));
   if (symbol == NULL)
     {
-      M4WARN ((warning_status, 0,
+      M4WARN ((m4_get_warning_status_opt (context), 0,
               _("Warning: %s: undefined name: %s"), M4ARG (0), M4ARG (1)));
       return;
     }
@@ -348,7 +348,7 @@ M4BUILTIN_HANDLER (incr)
 {
   int value;
 
-  if (!m4_numeric_arg (argc, argv, 1, &value))
+  if (!m4_numeric_arg (context, argc, argv, 1, &value))
     return;
 
   m4_shipout_int (obs, value + 1);
@@ -358,7 +358,7 @@ M4BUILTIN_HANDLER (decr)
 {
   int value;
 
-  if (!m4_numeric_arg (argc, argv, 1, &value))
+  if (!m4_numeric_arg (context, argc, argv, 1, &value))
     return;
 
   m4_shipout_int (obs, value - 1);
@@ -374,7 +374,7 @@ M4BUILTIN_HANDLER (divert)
 {
   int i = 0;
 
-  if (argc == 2 && !m4_numeric_arg (argc, argv, 1, &i))
+  if (argc == 2 && !m4_numeric_arg (context, argc, argv, 1, &i))
     return;
 
   m4_make_diversion (i);
@@ -401,18 +401,18 @@ M4BUILTIN_HANDLER (undivert)
     {
       if (sscanf (M4ARG (1), "%d", &i) == 1)
        m4_insert_diversion (i);
-      else if (no_gnu_extensions)
-       m4_numeric_arg (argc, argv, 1, &i);
+      else if (m4_get_no_gnu_extensions_opt (context))
+       m4_numeric_arg (context, argc, argv, 1, &i);
       else
        {
-         FILE *fp = m4_path_search (M4ARG (1), (char **) NULL);
+         FILE *fp = m4_path_search (context, M4ARG (1), (char **) NULL);
          if (fp != NULL)
            {
              m4_insert_file (fp);
              fclose (fp);
            }
          else
-           M4ERROR ((warning_status, errno,
+           M4ERROR ((m4_get_warning_status_opt (context), errno,
                      _("Cannot undivert %s"), M4ARG (1)));
        }
     }
@@ -427,7 +427,7 @@ M4BUILTIN_HANDLER (undivert)
    lives in input.c.  */
 M4BUILTIN_HANDLER (dnl)
 {
-  m4_skip_line ();
+  m4_skip_line (context);
 }
 
 /* Shift all argument one to the left, discarding the first argument.  Each
@@ -462,34 +462,34 @@ M4BUILTIN_HANDLER (changecom)
 /* Generic include function.  Include the file given by the first argument,
    if it exists.  Complain about inaccesible files iff SILENT is FALSE.  */
 static void
-include (int argc, m4_symbol_value **argv, boolean silent)
+include (m4 *context, int argc, m4_symbol_value **argv, boolean silent)
 {
   FILE *fp;
   char *name = NULL;
 
-  fp = m4_path_search (M4ARG (1), &name);
+  fp = m4_path_search (context, M4ARG (1), &name);
   if (fp == NULL)
     {
       if (!silent)
-       M4ERROR ((warning_status, errno,
+       M4ERROR ((m4_get_warning_status_opt (context), errno,
                  _("Cannot open %s"), M4ARG (1)));
       return;
     }
 
-  m4_push_file (fp, name);
+  m4_push_file (context, fp, name);
   xfree (name);
 }
 
 /* Include a file, complaining in case of errors.  */
 M4BUILTIN_HANDLER (include)
 {
-  include (argc, argv, FALSE);
+  include (context, argc, argv, FALSE);
 }
 
 /* Include a file, ignoring errors.  */
 M4BUILTIN_HANDLER (sinclude)
 {
-  include (argc, argv, TRUE);
+  include (context, argc, argv, TRUE);
 }
 
 
@@ -522,7 +522,7 @@ M4BUILTIN_HANDLER (m4exit)
 {
   int exit_code = 0;
 
-  if (argc == 2  && !m4_numeric_arg (argc, argv, 1, &exit_code))
+  if (argc == 2  && !m4_numeric_arg (context, argc, argv, 1, &exit_code))
     exit_code = 0;
 
   /* Ensure any module exit callbacks are executed.  */
@@ -536,7 +536,7 @@ M4BUILTIN_HANDLER (m4exit)
    version only the first.  */
 M4BUILTIN_HANDLER (m4wrap)
 {
-  if (no_gnu_extensions)
+  if (m4_get_no_gnu_extensions_opt (context))
     m4_shipout_string (obs, M4ARG (1), 0, FALSE);
   else
     m4_dump_args (obs, argc, argv, " ", FALSE);
@@ -552,10 +552,10 @@ M4BUILTIN_HANDLER (m4wrap)
    tracing of a macro.  It disables tracing if DATA is NULL, otherwise it
    enable tracing.  */
 static void *
-set_trace (m4_hash *hash, const void *ignored, void *symbol,
+set_trace_CB (m4_symtab *hash, const char *ignored, m4_symbol *symbol,
           void *userdata)
 {
-  m4_set_symbol_traced ((m4_symbol *) symbol, (boolean) (userdata != NULL));
+  m4_set_symbol_traced (symbol, (boolean) (userdata != NULL));
   return NULL;
 }
 
@@ -564,16 +564,16 @@ M4BUILTIN_HANDLER (traceon)
   int i;
 
   if (argc == 1)
-    m4_symtab_apply (M4SYMTAB, set_trace, (void *) obs);
+    m4_symtab_apply (M4SYMTAB, set_trace_CB, (void *) obs);
   else
     for (i = 1; i < argc; i++)
       {
        const char *name = M4ARG (i);
        m4_symbol *symbol = m4_symbol_lookup (M4SYMTAB, name);
        if (symbol != NULL)
-         set_trace (NULL, NULL, symbol, (char *) obs);
+         set_trace_CB (NULL, NULL, symbol, (char *) obs);
        else
-         M4WARN ((warning_status, 0,
+         M4WARN ((m4_get_warning_status_opt (context), 0,
                   _("Warning: %s: undefined name: %s"), M4ARG (0), name));
       }
 }
@@ -584,16 +584,16 @@ M4BUILTIN_HANDLER (traceoff)
   int i;
 
   if (argc == 1)
-    m4_symtab_apply (M4SYMTAB, set_trace, NULL);
+    m4_symtab_apply (M4SYMTAB, set_trace_CB, NULL);
   else
     for (i = 1; i < argc; i++)
       {
        const char *name = M4ARG (i);
        m4_symbol *symbol = m4_symbol_lookup (M4SYMTAB, name);
        if (symbol != NULL)
-         set_trace (NULL, NULL, symbol, NULL);
+         set_trace_CB (NULL, NULL, symbol, NULL);
        else
-         M4WARN ((warning_status, 0,
+         M4WARN ((m4_get_warning_status_opt (context), 0,
                   _("Warning: %s: undefined name: %s"), M4ARG (0), name));
       }
 }
@@ -640,10 +640,10 @@ M4BUILTIN_HANDLER (substr)
   int start, length, avail;
 
   length = avail = strlen (M4ARG (1));
-  if (!m4_numeric_arg (argc, argv, 2, &start))
+  if (!m4_numeric_arg (context, argc, argv, 2, &start))
     return;
 
-  if (argc == 4 && !m4_numeric_arg (argc, argv, 3, &length))
+  if (argc == 4 && !m4_numeric_arg (context, argc, argv, 3, &length))
     return;
 
   if (start < 0 || length <= 0 || start >= avail)
@@ -738,10 +738,10 @@ M4BUILTIN_HANDLER (translit)
 #define numb_lior(x,y) ((x) = ((x) || (y)))
 #define numb_land(x,y) ((x) = ((x) && (y)))
 
-#define numb_not(x)   (*(x) = int2numb(~numb2int(*(x))))
-#define numb_eor(x,y) (*(x) = int2numb(numb2int(*(x)) ^ numb2int(*(y))))
-#define numb_ior(x,y) (*(x) = int2numb(numb2int(*(x)) | numb2int(*(y))))
-#define numb_and(x,y) (*(x) = int2numb(numb2int(*(x)) & numb2int(*(y))))
+#define numb_not(c,x)   (*(x) = int2numb(~numb2int(*(x))))
+#define numb_eor(c,x,y) (*(x) = int2numb(numb2int(*(x)) ^ numb2int(*(y))))
+#define numb_ior(c,x,y) (*(x) = int2numb(numb2int(*(x)) | numb2int(*(y))))
+#define numb_and(c,x,y) (*(x) = int2numb(numb2int(*(x)) & numb2int(*(y))))
 
 #define numb_plus(x,y)  ((x) = ((x) + (y)))
 #define numb_minus(x,y) ((x) = ((x) - (y)))
@@ -750,11 +750,11 @@ M4BUILTIN_HANDLER (translit)
 #define numb_times(x,y)  ((x) = ((x) * (y)))
 #define numb_ratio(x,y)  ((x) = ((x) / ((y))))
 #define numb_divide(x,y) (*(x) = (*(x) / (*(y))))
-#define numb_modulo(x,y) (*(x) = (*(x) % *(y)))
+#define numb_modulo(c,x,y) (*(x) = (*(x) % *(y)))
 #define numb_invert(x)   ((x) = 1 / (x))
 
-#define numb_lshift(x,y) (*(x) = (*(x) << *(y)))
-#define numb_rshift(x,y) (*(x) = (*(x) >> *(y)))
+#define numb_lshift(c,x,y) (*(x) = (*(x) << *(y)))
+#define numb_rshift(c,x,y) (*(x) = (*(x) >> *(y)))
 
 
 /* The function ntoa () converts VALUE to a signed ascii representation in
Index: modules/mpeval.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/mpeval.c,v
retrieving revision 1.11
diff -u -p -u -r1.11 mpeval.c
--- modules/mpeval.c 12 Oct 2001 19:57:29 -0000 1.11
+++ modules/mpeval.c 20 Jun 2003 15:42:46 -0000
@@ -111,16 +111,16 @@ typedef mpq_t number;
 static void numb_initialise (void);
 static void numb_obstack (struct obstack *obs, const number value,
                          const int radix, int min);
-static void mpq2mpz (mpz_t z, const number q, const char *noisily);
+static void mpq2mpz (m4 *context, mpz_t z, const number q, const char 
*noisily);
 static void mpz2mpq (number q, const mpz_t z);
 static void numb_divide (number *x, const number *y);
-static void numb_modulo (number *x, const number *y);
-static void numb_and (number *x, const number *y);
-static void numb_ior (number *x, const number *y);
-static void numb_eor (number *x, const number *y);
-static void numb_not (number *x);
-static void numb_lshift (number *x, const number *y);
-static void numb_rshift (number *x, const number *y);
+static void numb_modulo (m4 *context, number *x, const number *y);
+static void numb_and (m4 *context, number *x, const number *y);
+static void numb_ior (m4 *context, number *x, const number *y);
+static void numb_eor (m4 *context, number *x, const number *y);
+static void numb_not (m4 *context, number *x);
+static void numb_lshift (m4 *context, number *x, const number *y);
+static void numb_rshift (m4 *context, number *x, const number *y);
 
 
 static number numb_ZERO;
@@ -181,11 +181,11 @@ numb_obstack (struct obstack *obs, const
 #define QUIET (char *)0
 
 static void
-mpq2mpz (mpz_t z, const number q, const char *noisily)
+mpq2mpz (m4 *context, mpz_t z, const number q, const char *noisily)
 {
   if (noisily && mpz_cmp_si (mpq_denref (q), (long) 1) != 0)
     {
-      M4ERROR ((warning_status, 0,
+      M4ERROR ((m4_get_warning_status_opt (context), 0,
                _("Loss of precision in eval: %s"), noisily));
     }
 
@@ -217,7 +217,7 @@ numb_divide (number * x, const number * 
 }
 
 static void
-numb_modulo (number * x, const number * y)
+numb_modulo (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -225,10 +225,10 @@ numb_modulo (number * x, const number * 
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
   mpz_mod (res, xx, yy);
@@ -241,7 +241,7 @@ numb_modulo (number * x, const number * 
 }
 
 static void
-numb_and (number * x, const number * y)
+numb_and (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -249,10 +249,10 @@ numb_and (number * x, const number * y)
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
   mpz_and (res, xx, yy);
@@ -265,7 +265,7 @@ numb_and (number * x, const number * y)
 }
 
 static void
-numb_ior (number * x, const number * y)
+numb_ior (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -273,10 +273,10 @@ numb_ior (number * x, const number * y)
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
   mpz_ior (res, xx, yy);
@@ -289,7 +289,7 @@ numb_ior (number * x, const number * y)
 }
 
 static void
-numb_eor (number * x, const number * y)
+numb_eor (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -297,10 +297,10 @@ numb_eor (number * x, const number * y)
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
 
@@ -336,14 +336,14 @@ numb_eor (number * x, const number * y)
 }
 
 static void
-numb_not (number * x)
+numb_not (m4 *context, number * x)
 {
   mpz_t xx, res;
 
   /* x should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (res);
   mpz_com (res, xx);
@@ -355,7 +355,7 @@ numb_not (number * x)
 }
 
 static void
-numb_lshift (number * x, const number * y)
+numb_lshift (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -363,10 +363,10 @@ numb_lshift (number * x, const number * 
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
   {
@@ -390,7 +390,7 @@ numb_lshift (number * x, const number * 
 }
 
 static void
-numb_rshift (number * x, const number * y)
+numb_rshift (m4 *context, number * x, const number * y)
 {
   mpz_t xx, yy, res;
 
@@ -398,10 +398,10 @@ numb_rshift (number * x, const number * 
   /* y should be integral */
 
   mpz_init (xx);
-  mpq2mpz (xx, *x, NOISY);
+  mpq2mpz (context, xx, *x, NOISY);
 
   mpz_init (yy);
-  mpq2mpz (yy, *y, NOISY);
+  mpq2mpz (context, yy, *y, NOISY);
 
   mpz_init (res);
   {
Index: modules/stdlib.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/stdlib.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 stdlib.c
--- modules/stdlib.c 13 Oct 2001 08:55:43 -0000 1.8
+++ modules/stdlib.c 20 Jun 2003 15:42:46 -0000
@@ -104,7 +104,7 @@ M4BUILTIN_HANDLER (setenv)
   int overwrite = 1;
 
   if (argc == 4)
-    if (!m4_numeric_arg (argc, argv, 3, &overwrite))
+    if (!m4_numeric_arg (context, argc, argv, 3, &overwrite))
       return;
 
 #if HAVE_SETENV
@@ -202,7 +202,7 @@ M4BUILTIN_HANDLER (getpwuid)
   struct passwd *pw;
   int uid;
 
-  if (!m4_numeric_arg (argc, argv, 1, &uid))
+  if (!m4_numeric_arg (context, argc, argv, 1, &uid))
     return;
 
   pw = getpwuid (uid);
@@ -257,7 +257,7 @@ M4BUILTIN_HANDLER (srand)
     seed = time (0L) * getpid ();
   else
     {
-      if (!m4_numeric_arg (argc, argv, 1, &seed))
+      if (!m4_numeric_arg (context, argc, argv, 1, &seed))
        return;
     }
 
Index: modules/time.c
===================================================================
RCS file: /cvsroot/m4/m4/modules/time.c,v
retrieving revision 1.8
diff -u -p -u -r1.8 time.c
--- modules/time.c 13 Oct 2001 08:55:43 -0000 1.8
+++ modules/time.c 20 Jun 2003 15:42:46 -0000
@@ -97,7 +97,7 @@ M4BUILTIN_HANDLER (ctime)
   time_t t;
 
   if (argc == 2)
-    m4_numeric_arg (argc, argv, 1, (int *) &t);
+    m4_numeric_arg (context, argc, argv, 1, (int *) &t);
   else
     t = time (0L);
 
@@ -141,7 +141,7 @@ M4BUILTIN_HANDLER (gmtime)
 {
   time_t t;
 
-  if (!m4_numeric_arg (argc, argv, 1, (int *) &t))
+  if (!m4_numeric_arg (context, argc, argv, 1, (int *) &t))
     return;
 
   format_tm (obs, gmtime (&t));
@@ -154,7 +154,7 @@ M4BUILTIN_HANDLER (localtime)
 {
   time_t t;
 
-  if (!m4_numeric_arg (argc, argv, 1, (int *) &t))
+  if (!m4_numeric_arg (context, argc, argv, 1, (int *) &t))
     return;
 
   format_tm (obs, localtime (&t));
@@ -169,19 +169,19 @@ M4BUILTIN_HANDLER (mktime)
   struct tm tm;
   time_t t;
 
-  if (!m4_numeric_arg (argc, argv, 1, &tm.tm_sec))
+  if (!m4_numeric_arg (context, argc, argv, 1, &tm.tm_sec))
     return;
-  if (!m4_numeric_arg (argc, argv, 2, &tm.tm_min))
+  if (!m4_numeric_arg (context, argc, argv, 2, &tm.tm_min))
     return;
-  if (!m4_numeric_arg (argc, argv, 3, &tm.tm_hour))
+  if (!m4_numeric_arg (context, argc, argv, 3, &tm.tm_hour))
     return;
-  if (!m4_numeric_arg (argc, argv, 4, &tm.tm_mday))
+  if (!m4_numeric_arg (context, argc, argv, 4, &tm.tm_mday))
     return;
-  if (!m4_numeric_arg (argc, argv, 5, &tm.tm_mon))
+  if (!m4_numeric_arg (context, argc, argv, 5, &tm.tm_mon))
     return;
-  if (!m4_numeric_arg (argc, argv, 6, &tm.tm_year))
+  if (!m4_numeric_arg (context, argc, argv, 6, &tm.tm_year))
     return;
-  if (M4ARG (7) && !m4_numeric_arg (argc, argv, 7, &tm.tm_isdst))
+  if (M4ARG (7) && !m4_numeric_arg (context, argc, argv, 7, &tm.tm_isdst))
     return;
 
   t = mktime (&tm);
@@ -201,7 +201,7 @@ M4BUILTIN_HANDLER (strftime)
   char *buf;
   int l;
 
-  if (!m4_numeric_arg (argc, argv, 2, (int *) &t))
+  if (!m4_numeric_arg (context, argc, argv, 2, (int *) &t))
     return;
 
   tm = localtime (&t);
Index: src/freeze.c
===================================================================
RCS file: /cvsroot/m4/m4/src/freeze.c,v
retrieving revision 1.30
diff -u -p -u -r1.30 freeze.c
--- src/freeze.c 19 Jun 2003 14:51:04 -0000 1.30
+++ src/freeze.c 20 Jun 2003 15:42:46 -0000
@@ -28,7 +28,10 @@ static       void  issue_expect_message (int e
 static int   produce_char_dump    (char *buf, int ch);
 static void  produce_syntax_dump  (FILE *file, char ch, int mask);
 static void  produce_module_dump  (FILE *file, lt_dlhandle handle);
-static void  produce_symbol_dump  (FILE *file, m4_hash *hash);
+static void  produce_symbol_dump  (m4 *context, FILE *file,
+                                   m4_symtab *symtab);
+static void *dump_symbol_CB       (m4_symtab *symtab, const char *symbol_name,
+                                   m4_symbol *symbol, void *userdata);
 
 
 /* Produce a frozen state to the given file NAME. */
@@ -122,68 +125,68 @@ produce_module_dump (FILE *file, lt_dlha
    This order ensures that, at reload time, pushdef's will be
    executed with the oldest definitions first.  */
 void
-produce_symbol_dump (FILE *file, m4_hash *hash)
+produce_symbol_dump (m4 *context, FILE *file, m4_symtab *symtab)
 {
-  m4_hash_iterator *place      = 0;
+  const char *errormsg = m4_symtab_apply (symtab, dump_symbol_CB, file);
 
-  while ((place = m4_get_hash_iterator_next (hash, place)))
+  if (errormsg)
     {
-      const char   *symbol_name        = (const char *) 
m4_get_hash_iterator_key (place);
-      m4_symbol           *symbol      = m4_get_hash_iterator_value (place);
-      lt_dlhandle   handle     = SYMBOL_HANDLE (symbol);
-      const char   *module_name        = handle ? m4_get_module_name (handle) 
: NULL;
-      const m4_builtin *bp;
+      M4ERROR ((m4_get_warning_status_opt (context), 0, errormsg));
+      abort ();
+    }
+}
 
-      if (m4_is_symbol_text (symbol))
-       {
-         fprintf (file, "T%lu,%lu",
-                  (unsigned long) strlen (symbol_name),
-                  (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 (m4_get_symbol_text (symbol), file);
-         if (handle)
-           fputs (module_name, file);
-         fputc ('\n', file);
-       }
-      else if (m4_is_symbol_func (symbol))
-       {
-         bp = m4_builtin_find_by_func
-               (m4_get_module_builtin_table (SYMBOL_HANDLE (symbol)),
+static void *
+dump_symbol_CB (m4_symtab *symtab, const char *symbol_name, m4_symbol *symbol,
+               void *userdata)
+{
+  lt_dlhandle   handle         = SYMBOL_HANDLE (symbol);
+  const char   *module_name    = handle ? m4_get_module_name (handle) : NULL;
+  FILE *       file            = (FILE *) userdata;
+
+  if (m4_is_symbol_text (symbol))
+    {
+      fprintf (file, "T%lu,%lu",
+              (unsigned long) strlen (symbol_name),
+              (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 (m4_get_symbol_text (symbol), file);
+      if (handle)
+       fputs (module_name, file);
+      fputc ('\n', file);
+    }
+  else if (m4_is_symbol_func (symbol))
+    {
+      const m4_builtin *bp = m4_builtin_find_by_func
+               (m4_get_module_builtin_table (SYMBOL_HANDLE (symbol)),
                 m4_get_symbol_func (symbol));
 
-         if (bp == NULL)
-           {
-             M4ERROR ((warning_status, 0,
-                       "INTERNAL ERROR: Builtin not found in builtin table!"));
-             abort ();
-           }
+      if (bp == NULL)
+       return "INTERNAL ERROR: Builtin not found in builtin table!";
 
-         fprintf (file, "F%lu,%lu",
-                  (unsigned long) strlen (symbol_name),
-                  (unsigned long) strlen (bp->name));
-
-         if (handle)
-           fprintf (file, ",%lu",
-                    (unsigned long) strlen (module_name));
-         fputc ('\n', file);
-
-         fputs (symbol_name, file);
-         fputs (bp->name, file);
-         if (handle)
-           fputs (module_name, file);
-         fputc ('\n', file);
-       }
-      else
-       {
-         M4ERROR ((warning_status, 0,
-                   "INTERNAL ERROR: Bad token data type in produce_symbol_dump 
()"));
-         abort ();
-       }
+      fprintf (file, "F%lu,%lu",
+              (unsigned long) strlen (symbol_name),
+              (unsigned long) strlen (bp->name));
+
+      if (handle)
+       fprintf (file, ",%lu",
+                (unsigned long) strlen (module_name));
+      fputc ('\n', file);
+
+      fputs (symbol_name, file);
+      fputs (bp->name, file);
+      if (handle)
+       fputs (module_name, file);
+      fputc ('\n', file);
     }
+  else
+    return "INTERNAL ERROR: Bad token data type in produce_symbol_dump ()";
+
+  return NULL;
 }
 
 void
@@ -193,7 +196,7 @@ produce_frozen_state (m4 *context, const
 
   if (file = fopen (name, "w"), !file)
     {
-      M4ERROR ((warning_status, errno, name));
+      M4ERROR ((m4_get_warning_status_opt (context), errno, name));
       return;
     }
 
@@ -252,7 +255,7 @@ produce_frozen_state (m4 *context, const
   produce_module_dump (file, lt_dlhandle_next (0));
 
   /* Dump all symbols.  */
-  produce_symbol_dump (file, M4SYMTAB);
+  produce_symbol_dump (context, file, M4SYMTAB);
 
   /* Let diversions be issued from output.c module, its cleaner to have this
      piece of code there.  */
@@ -378,7 +381,7 @@ reload_frozen_state (m4 *context, const 
     }                                                          \
   while (0)
 
-  file = m4_path_search (name, (char **)NULL);
+  file = m4_path_search (context, name, (char **)NULL);
   if (file == NULL)
     M4ERROR ((EXIT_FAILURE, errno, _("Cannot open %s"), name));
 
@@ -486,7 +489,7 @@ reload_frozen_state (m4 *context, const 
              m4_symbol_pushdef (M4SYMTAB, string[0], token);
            }
          else
-           M4ERROR ((warning_status, 0,
+           M4ERROR ((m4_get_warning_status_opt (context), 0,
                      _("`%s' from frozen file not found in builtin table!"),
                      string[0]));
        }
@@ -547,7 +550,7 @@ reload_frozen_state (m4 *context, const 
          }
        string[0][number[0]] = '\0';
 
-       m4_set_syntax (syntax, string[0]);
+       m4_set_syntax (context, syntax, string[0]);
        break;
 
       case 'C':
@@ -596,7 +599,7 @@ reload_frozen_state (m4 *context, const 
 
            m4_make_diversion (number[0]);
            if (number[1] > 0)
-             m4_shipout_text (NULL, string[1], number[1]);
+             m4_shipout_text (context, NULL, string[1], number[1]);
            break;
 
          case 'Q':
Index: src/main.c
===================================================================
RCS file: /cvsroot/m4/m4/src/main.c,v
retrieving revision 1.41
diff -u -p -u -r1.41 main.c
--- src/main.c 19 Jun 2003 14:51:04 -0000 1.41
+++ src/main.c 20 Jun 2003 15:42:46 -0000
@@ -227,18 +227,18 @@ main (int argc, char *const *argv, char 
 
   LTDL_SET_PRELOADED_SYMBOLS();
 
-  m4__module_init ();
+  context = m4_create ();
+
+  m4__module_init (context);
   m4_debug_init ();
   m4_include_init ();
 
-  context = m4_create ();
-
 #ifdef USE_STACKOVF
   setup_stackovf_trap (argv, envp, stackovf_handler);
 #endif
 
   if (isatty (STDIN_FILENO))
-    interactive = TRUE;
+    m4_set_interactive_opt (context, TRUE);
 
   /* First, we decode the arguments, to size up tables and stuff.  */
 
@@ -281,7 +281,7 @@ main (int argc, char *const *argv, char 
        break;
 
       case 'E':
-       warning_status = EXIT_FAILURE;
+       m4_set_warning_status_opt (context, EXIT_FAILURE);
        break;
 
       case 'F':
@@ -289,15 +289,15 @@ main (int argc, char *const *argv, char 
        break;
 
       case 'G':
-       no_gnu_extensions = 1;
+       m4_set_no_gnu_extensions_opt (context, TRUE);
        break;
 
       case 'I':
-       m4_add_include_directory (optarg);
+       m4_add_include_directory (context, optarg);
        break;
 
       case 'L':
-       nesting_limit = atoi (optarg);
+       m4_set_nesting_limit_opt (context, atoi (optarg));
        break;
       case 'M':
        if (lt_dlinsertsearchdir (lt_dlgetsearchpath(), optarg) != 0)
@@ -315,11 +315,11 @@ main (int argc, char *const *argv, char 
        break;
 
       case 'P':
-       prefix_all_builtins = 1;
+       m4_set_prefix_builtins_opt (context, TRUE);
        break;
 
       case 'Q':
-       suppress_warnings = 1;
+       m4_set_suppress_warnings_opt (context, TRUE);
        break;
 
       case 'R':
@@ -327,30 +327,30 @@ main (int argc, char *const *argv, char 
        break;
 
       case 'b':
-       interactive = FALSE;
+       m4_set_interactive_opt (context, FALSE);
        break;
 
       case 'c':
-       discard_comments = TRUE;
+       m4_set_discard_comments_opt (context, TRUE);
        break;
 
       case 'd':
-       debug_level = m4_debug_decode (optarg);
-       if (debug_level < 0)
+       m4_set_debug_level_opt (context, m4_debug_decode (optarg));
+       if (m4_get_debug_level_opt (context) < 0)
          {
            error (0, 0, _("Bad debug flags: `%s'"), optarg);
-           debug_level = 0;
+           m4_set_debug_level_opt (context, 0);
          }
        break;
 
       case 'e':
-       interactive = TRUE;
+       m4_set_interactive_opt (context, TRUE);
        break;
 
       case 'l':
-       max_debug_argument_length = atoi (optarg);
-       if (max_debug_argument_length <= 0)
-         max_debug_argument_length = 0;
+       m4_set_max_debug_arg_length_opt (context, atoi (optarg));
+       if (m4_get_max_debug_arg_length_opt (context) <= 0)
+         m4_set_max_debug_arg_length_opt (context, 0);
        break;
 
       case 'o':
@@ -359,7 +359,7 @@ main (int argc, char *const *argv, char 
        break;
 
       case 's':
-       sync_output = 1;
+       m4_set_sync_output_opt (context, TRUE);
        break;
       }
 
@@ -386,7 +386,7 @@ warranty; not even for MERCHANTABILITY o
 
   m4_input_init ();
   m4_output_init ();
-  m4_include_env_init ();
+  m4_include_env_init (context);
 
   if (frozen_file_to_read)
     {
@@ -396,7 +396,10 @@ warranty; not even for MERCHANTABILITY o
     {
       m4_syntax_init ();
       m4_module_load (context, "m4", 0);
-      m4_module_load (context, no_gnu_extensions ? "traditional" : "gnu", 0);
+      if (m4_get_no_gnu_extensions_opt (context))
+       m4_module_load (context, "traditional", 0);
+      else
+       m4_module_load (context, "gnu", 0);
     }
 
   /* Import environment variables as macros.  The definition are
@@ -458,7 +461,7 @@ warranty; not even for MERCHANTABILITY o
            break;
 
          default:
-           M4ERROR ((warning_status, 0,
+           M4ERROR ((m4_get_warning_status_opt (context), 0,
                      "INTERNAL ERROR: Bad code in deferred arguments"));
            abort ();
          }
@@ -471,7 +474,7 @@ warranty; not even for MERCHANTABILITY o
 
   /* Interactive mode means unbuffered output, and interrupts ignored.  */
 
-  if (interactive)
+  if (m4_get_interactive_opt (context))
     {
       signal (SIGINT, SIG_IGN);
       setbuf (stdout, (char *) NULL);
@@ -483,17 +486,17 @@ warranty; not even for MERCHANTABILITY o
   exit_status = EXIT_SUCCESS;
   if (optind == argc)
     {
-      m4_push_file (stdin, "stdin");
+      m4_push_file (context, stdin, "stdin");
       m4_expand_input (context);
     }
   else
     for (; optind < argc; optind++)
       {
        if (strcmp (argv[optind], "-") == 0)
-         m4_push_file (stdin, "stdin");
+         m4_push_file (context, stdin, "stdin");
        else
          {
-           fp = m4_path_search (argv[optind], &filename);
+           fp = m4_path_search (context, argv[optind], &filename);
            if (fp == NULL)
              {
                error (0, errno, "%s", argv[optind]);
@@ -502,7 +505,7 @@ warranty; not even for MERCHANTABILITY o
              }
            else
              {
-               m4_push_file (fp, filename);
+               m4_push_file (context, fp, filename);
                xfree (filename);
              }
          }

reply via email to

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