cppinit.c (struct pending option): Replace undef with a pointer to a directive handling routine.

2000-03-11  Neil Booth  <NeilB@earthling.net>

	* cppinit.c (struct pending option): Replace undef with a
	pointer to a directive handling routine.
	(struct cpp_pending): Replace separate assert_ and define_
	lists with one directive_ list.
	(new_pending_define): Rename new_pending_directive. Extra
	argument is the directive's handling routine.
	(handle_option): Update to use new_pending_directive.

From-SVN: r32481
This commit is contained in:
Neil Booth 2000-03-11 09:13:00 +00:00 committed by Neil Booth
parent 1ef9f74981
commit 40eac643be
2 changed files with 35 additions and 64 deletions

View File

@ -1,3 +1,13 @@
2000-03-11 Neil Booth <NeilB@earthling.net>
* cppinit.c (struct pending option): Replace undef with a
pointer to a directive handling routine.
(struct cpp_pending): Replace separate assert_ and define_
lists with one directive_ list.
(new_pending_define): Rename new_pending_directive. Extra
argument is the directive's handling routine.
(handle_option): Update to use new_pending_directive.
2000-03-11 Neil Booth <NeilB@earthling.net>
* cppfiles.c (file_cleanup, _cpp_find_include_file,

View File

@ -164,11 +164,13 @@ static const struct default_include include_defaults_array[]
for -include, one for -imacros. `undef' is set for -U, clear for
-D, ignored for the others.
(Future: add an equivalent of -U for -A) */
typedef void (* cl_directive_handler) (cpp_reader *, const char *);
struct pending_option
{
struct pending_option *next;
const char *arg;
int undef;
cl_directive_handler handler;
};
/* The `pending' structure accumulates all the options that are not
@ -177,8 +179,7 @@ struct pending_option
tail pointers for quick insertion. */
struct cpp_pending
{
struct pending_option *define_head, *define_tail;
struct pending_option *assert_head, *assert_tail;
struct pending_option *directive_head, *directive_tail;
struct file_name_list *quote_head, *quote_tail;
struct file_name_list *brack_head, *brack_tail;
@ -216,8 +217,9 @@ static void merge_include_chains PARAMS ((struct cpp_options *));
static void dump_special_to_buffer PARAMS ((cpp_reader *, const char *));
static void initialize_dependency_output PARAMS ((cpp_reader *));
static void initialize_standard_includes PARAMS ((cpp_reader *));
static void new_pending_define PARAMS ((struct cpp_options *,
const char *));
static void new_pending_directive PARAMS ((struct cpp_options *,
const char *,
cl_directive_handler));
#ifdef HOST_EBCDIC
static int opt_comp PARAMS ((const void *, const void *));
#endif
@ -919,32 +921,15 @@ cpp_start_read (pfile, fname)
initialize_builtins (pfile);
/* Do -U's, -D's and -A's in the order they were seen. */
p = opts->pending->define_head;
p = opts->pending->directive_head;
while (p)
{
if (p->undef)
cpp_undef (pfile, p->arg);
else
cpp_define (pfile, p->arg);
p->handler (pfile, p->arg);
q = p->next;
free (p);
p = q;
}
p = opts->pending->assert_head;
while (p)
{
if (p->undef)
cpp_unassert (pfile, p->arg);
else
cpp_assert (pfile, p->arg);
q = p->next;
free (p);
p = q;
}
opts->done_initializing = 1;
CPP_BUFFER (pfile)->lineno = 1;
@ -1047,17 +1032,18 @@ cpp_finish (pfile)
}
static void
new_pending_define (opts, text)
new_pending_directive (opts, text, handler)
struct cpp_options *opts;
const char *text;
cl_directive_handler handler;
{
struct pending_option *o = (struct pending_option *)
xmalloc (sizeof (struct pending_option));
o->arg = text;
o->next = NULL;
o->undef = 0;
APPEND (opts->pending, define, o);
o->handler = handler;
APPEND (opts->pending, directive, o);
}
enum opt_code
@ -1339,7 +1325,7 @@ handle_option (pfile, argc, argv)
opts->print_include_names = 1;
break;
case OPT_D:
new_pending_define (opts, arg);
new_pending_directive (opts, arg, cpp_define);
break;
case OPT_pedantic_errors:
opts->pedantic_errors = 1;
@ -1375,7 +1361,7 @@ handle_option (pfile, argc, argv)
opts->cplusplus = 0, opts->cplusplus_comments = 0;
opts->c89 = 1, opts->c99 = 0, opts->objc = 0;
opts->trigraphs = 1;
new_pending_define (opts, "__STRICT_ANSI__");
new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
break;
case OPT_lang_cplusplus:
opts->cplusplus = 1, opts->cplusplus_comments = 1;
@ -1414,17 +1400,17 @@ handle_option (pfile, argc, argv)
case OPT_std_gnu99:
opts->cplusplus = 0, opts->cplusplus_comments = 1;
opts->c89 = 0, opts->c99 = 1, opts->objc = 0;
new_pending_define (opts, "__STDC_VERSION__=199901L");
new_pending_directive (opts, "__STDC_VERSION__=199901L", cpp_define);
break;
case OPT_std_iso9899_199409:
new_pending_define (opts, "__STDC_VERSION__=199409L");
new_pending_directive (opts, "__STDC_VERSION__=199409L", cpp_define);
/* Fall through */
case OPT_std_iso9899_1990:
case OPT_std_c89:
opts->cplusplus = 0, opts->cplusplus_comments = 0;
opts->c89 = 1, opts->c99 = 0, opts->objc = 0;
opts->trigraphs = 1;
new_pending_define (opts, "__STRICT_ANSI__");
new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
break;
case OPT_std_iso9899_199x:
case OPT_std_iso9899_1999:
@ -1433,8 +1419,8 @@ handle_option (pfile, argc, argv)
opts->cplusplus = 0, opts->cplusplus_comments = 1;
opts->c89 = 0, opts->c99 = 1, opts->objc = 0;
opts->trigraphs = 1;
new_pending_define (opts, "__STRICT_ANSI__");
new_pending_define (opts, "__STDC_VERSION__=199901L");
new_pending_directive (opts, "__STRICT_ANSI__", cpp_define);
new_pending_directive (opts, "__STDC_VERSION__=199901L", cpp_define);
break;
case OPT_o:
if (opts->out_fname != NULL)
@ -1521,15 +1507,7 @@ handle_option (pfile, argc, argv)
break;
case OPT_A:
if (strcmp (arg, "-"))
{
struct pending_option *o = (struct pending_option *)
xmalloc (sizeof (struct pending_option));
o->arg = arg;
o->next = NULL;
o->undef = 0;
APPEND (opts->pending, assert, o);
}
new_pending_directive (opts, arg, cpp_assert);
else
{
/* -A- eliminates all predefined macros and assertions.
@ -1538,36 +1516,19 @@ handle_option (pfile, argc, argv)
that were passed automatically in from GCC. */
struct pending_option *o1, *o2;
o1 = opts->pending->define_head;
o1 = opts->pending->directive_head;
while (o1)
{
o2 = o1->next;
free (o1);
o1 = o2;
}
o1 = opts->pending->assert_head;
while (o1)
{
o2 = o1->next;
free (o1);
o1 = o2;
}
opts->pending->assert_head = NULL;
opts->pending->assert_tail = NULL;
opts->pending->define_head = NULL;
opts->pending->define_tail = NULL;
opts->pending->directive_head = NULL;
opts->pending->directive_tail = NULL;
}
break;
case OPT_U:
{
struct pending_option *o = (struct pending_option *)
xmalloc (sizeof (struct pending_option));
o->arg = arg;
o->next = NULL;
o->undef = 1;
APPEND (opts->pending, define, o);
}
new_pending_directive (opts, arg, cpp_undef);
break;
case OPT_I: /* Add directory to path for includes. */
if (!strcmp (arg, "-"))