+2000-08-29 Zack Weinberg <zack@wolery.cumb.org>
+
+ * cpperror.c (print_file_and_line): If line is (unsigned int)-1,
+ print just the filename.
+ * cpplex.c (_cpp_run_directive): Add additional argument, the
+ name to give the synthetic buffer. This defaults to
+ translated "<command line>".
+ * cpplib.c (cpp_define, cpp_undef, cpp_assert, cpp_unassert):
+ Adjust to match.
+ (_cpp_define_builtin): New function.
+ * cppinit.c (initialize_builtins): Use _cpp_define_builtin.
+ * cpphash.h: Update prototypes.
+
+ * tradcpp.c (main): Process -D and -U simultaneously, in the
+ order they appeared on the command line.
+
2000-08-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* c-decl.c (define_label): Call warning_with_file_and_line and
const char *filename;
unsigned int line, column;
{
- if (line == 0)
- fputs (_("<command line>: "), stderr);
+ if (filename == 0 || *filename == '\0')
+ filename = "<stdin>";
+
+ if (line == (unsigned int)-1)
+ fprintf (stderr, "%s: ", filename);
+ else if (column > 0)
+ fprintf (stderr, "%s:%u:%u: ", filename, line, column);
else
- {
- if (filename == 0 || *filename == '\0')
- filename = "<stdin>";
- if (column > 0)
- fprintf (stderr, "%s:%u:%u: ", filename, line, column);
- else
- fprintf (stderr, "%s:%u: ", filename, line);
- }
+ fprintf (stderr, "%s:%u: ", filename, line);
}
/* Set up for an error message: print the file and line, bump the error
const cpp_token *));
extern void _cpp_run_directive PARAMS ((cpp_reader *,
const struct directive *,
- const char *, size_t));
+ const char *, size_t,
+ const char *));
extern unsigned int _cpp_get_line PARAMS ((cpp_reader *,
unsigned int *));
extern const cpp_token *_cpp_get_token PARAMS ((cpp_reader *));
struct answer **));
extern struct answer **_cpp_find_answer PARAMS ((cpp_hashnode *,
const cpp_toklist *));
+extern void _cpp_define_builtin PARAMS ((cpp_reader *, const char *));
+
extern void _cpp_init_stacks PARAMS ((cpp_reader *));
extern void _cpp_cleanup_stacks PARAMS ((cpp_reader *));
extern void _cpp_init_internal_pragmas PARAMS ((cpp_reader *));
if (b->flags & VERS)
{
- /* Allocate enough space for 'name="value"\0'. */
- str = xmalloc (b->len + strlen (version_string) + 4);
- sprintf (str, "%s=\"%s\"", b->name, version_string);
+ /* Allocate enough space for 'name "value"\n\0'. */
+ str = alloca (b->len + strlen (version_string) + 5);
+ sprintf (str, "%s \"%s\"\n", b->name, version_string);
}
else
{
else
val = b->value;
- /* Allocate enough space for "name=value\0". */
- str = xmalloc (b->len + strlen (val) + 2);
- sprintf(str, "%s=%s", b->name, val);
+ /* Allocate enough space for "name value\n\0". */
+ str = alloca (b->len + strlen (val) + 3);
+ sprintf(str, "%s %s\n", b->name, val);
}
- cpp_define (pfile, str);
- free (str);
+ _cpp_define_builtin (pfile, str);
}
else
{
/* Directive handler wrapper used by the command line option
processor. */
void
-_cpp_run_directive (pfile, dir, buf, count)
+_cpp_run_directive (pfile, dir, buf, count, name)
cpp_reader *pfile;
const struct directive *dir;
const char *buf;
size_t count;
+ const char *name;
{
if (cpp_push_buffer (pfile, (const U_CHAR *)buf, count) != NULL)
{
unsigned int prev_lvl = 0;
+ if (name)
+ CPP_BUFFER (pfile)->nominal_fname = name;
+ else
+ CPP_BUFFER (pfile)->nominal_fname = _("<command line>");
+ CPP_BUFFER (pfile)->lineno = (unsigned int)-1;
+
/* Scan the line now, else prevent_macro_expansion won't work. */
lex_next (pfile, 1);
if (! (dir->flags & EXPAND))
strcpy (&buf[count-4], " 1\n");
}
- _cpp_run_directive (pfile, &dtable[T_DEFINE], buf, count - 1);
+ _cpp_run_directive (pfile, &dtable[T_DEFINE], buf, count - 1, 0);
+}
+
+/* Slight variant of the above for use by initialize_builtins, which (a)
+ knows how to set up the buffer itself, (b) needs a different "filename"
+ tag. */
+void
+_cpp_define_builtin (pfile, str)
+ cpp_reader *pfile;
+ const char *str;
+{
+ _cpp_run_directive (pfile, &dtable[T_DEFINE],
+ str, strlen (str),
+ _("<builtin>"));
}
/* Process MACRO as if it appeared as the body of an #undef. */
cpp_reader *pfile;
const char *macro;
{
- _cpp_run_directive (pfile, &dtable[T_UNDEF], macro, strlen (macro));
+ _cpp_run_directive (pfile, &dtable[T_UNDEF], macro, strlen (macro), 0);
}
/* Process the string STR as if it appeared as the body of a #assert. */
cpp_reader *pfile;
const char *str;
{
- _cpp_run_directive (pfile, &dtable[T_ASSERT], str, strlen (str));
+ _cpp_run_directive (pfile, &dtable[T_ASSERT], str, strlen (str), 0);
}
/* Process STR as if it appeared as the body of an #unassert. */
cpp_reader *pfile;
const char *str;
{
- _cpp_run_directive (pfile, &dtable[T_UNASSERT], str, strlen (str));
+ _cpp_run_directive (pfile, &dtable[T_UNASSERT], str, strlen (str), 0);
}
/* Determine whether the identifier ID, of length LEN, is a defined macro. */
and option processing. */
initialize_builtins ();
- /* Do defines specified with -D. */
+ /* Do defines specified with -D and undefines specified with -U. */
for (i = 1; i < argc; i++)
if (pend_defs[i])
make_definition ((U_CHAR *)pend_defs[i]);
-
- /* Do undefines specified with -U. */
- for (i = 1; i < argc; i++)
- if (pend_undefs[i])
+ else if (pend_undefs[i])
make_undef ((U_CHAR *)pend_undefs[i]);
/* Unless -fnostdinc,