[Top][All Lists]
[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), ®s);
+ substitute (context, obs, victim, M4ARG (3), ®s);
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), ®s);
+ substitute (context, obs, victim, M4ARG (3), ®s);
/* 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);
}
}
- FYI: 17-gary-move-option-globals-to-context.patch,
Gary V. Vaughan <=