This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Pragma handling: non-C front ends should not require c_lex()
Richard Henderson wrote:-
> On Tue, Oct 16, 2001 at 10:06:24PM +0100, Neil Booth wrote:
> > That leaves c4x and i370. Would you accept a patch to have those
> > targets use c{,xx}_target_objs with their pragma routines bropken out
> > into a separate file?
>
> Certainly.
How about this then? I've successfully created a stage1 cross C
compiler to i370-ibm-mvs and i370-ibm-linux (couldn't do a fortran one
because of some #error about needing exact target floating point
representation). Also a stage1 C and F77 compiler to c4x-foo-rtems.
Neil.
* config.gcc: Update c4x and i370 for C front end-specific
dependencies.
* config/c4x/c4x-c.c: New.
* config/c4x/c4x-protos.h (c4x_handle_pragma): Remove.
(code_tree, data_tree, pure_tree, noreturn_tree, interrupt_tree):
New declarations.
* config/c4x/c4x.c: Don't include c-lex.h or c-pragma.h.
(code_tree, data_tree, pure_tree, noreturn_tree, interrupt_tree):
Make extern.
(c4x_init_pragma): Remove.
(c4x_parse_pragma, c4x_pr_CODE_SECTION, c4x_pr_DATA_SECTION,
c4x_pr_FUNC_IS_PURE, c4x_pr_FUNC_NEVER_RETURNS, c4x_pr_INTERRUPT,
c4x_pr_ignored): Move to c4x-c.c.
* config/c4x/c4x.h (REGISTER_TARGET_PRAGMAS): Update.
* config/c4x/t-c4x: Update.
* config/i370/i370-c.c: New.
* config/i370/i370.c: Don't include c-lex.h or c-pragma.h.
(i370_pr_map): Move to i370-c.c.
* config/i370/t-i370: New.
* doc/tm.texi: Update.
Index: config.gcc
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config.gcc,v
retrieving revision 1.96
diff -u -p -r1.96 config.gcc
--- config.gcc 2001/10/11 17:02:34 1.96
+++ config.gcc 2001/10/17 19:01:45
@@ -644,11 +644,15 @@ c4x-*-rtems*)
if test x$enable_threads = xyes; then
thread_file='rtems'
fi
+ c_target_objs="c4x-c.o"
+ cxx_target_objs="c4x-c.o"
;;
c4x-*)
cpu_type=c4x
float_format=c4x
tmake_file=c4x/t-c4x
+ c_target_objs="c4x-c.o"
+ cxx_target_objs="c4x-c.o"
;;
clipper-intergraph-clix*)
tm_file="${tm_file} svr3.h clipper/clix.h"
@@ -941,11 +945,17 @@ hppa*-*-mpeix*)
i370-*-opened*) # IBM 360/370/390 Architecture
xm_defines='POSIX FATAL_EXIT_CODE=12'
tm_file=i370/oe.h
+ tmake_file="i370/t-i370"
xmake_file=i370/x-oe
+ c_target_objs="i370-c.o"
+ cxx_target_objs="i370-c.o"
;;
i370-*-mvs*)
xm_defines='POSIX FATAL_EXIT_CODE=12'
tm_file=i370/mvs.h
+ tmake_file="i370/t-i370"
+ c_target_objs="i370-c.o"
+ cxx_target_objs="i370-c.o"
;;
i370-*-linux*)
xmake_file=x-linux
Index: config/c4x/c4x-c.c
===================================================================
RCS file: c4x-c.c
diff -N c4x-c.c
--- /dev/null Tue May 5 13:32:27 1998
+++ c4x-c.c Wed Oct 17 12:01:55 2001
@@ -0,0 +1,159 @@
+/* Subroutines for the C front end on the TMS320C[34]x
+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ Free Software Foundation, Inc.
+
+ Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz)
+ and Herman Ten Brugge (Haj.Ten.Brugge@net.HCC.nl).
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include "system.h"
+#include "tree.h"
+#include "toplev.h"
+#include "cpplib.h"
+#include "c-pragma.h"
+#include "c-lex.h"
+#include "c4x-protos.h"
+
+static int c4x_parse_pragma PARAMS ((const char *, tree *, tree *));
+
+/* Handle machine specific pragmas for compatibility with existing
+ compilers for the C3x/C4x.
+
+ pragma attribute
+ ----------------------------------------------------------
+ CODE_SECTION(symbol,"section") section("section")
+ DATA_SECTION(symbol,"section") section("section")
+ FUNC_CANNOT_INLINE(function)
+ FUNC_EXT_CALLED(function)
+ FUNC_IS_PURE(function) const
+ FUNC_IS_SYSTEM(function)
+ FUNC_NEVER_RETURNS(function) noreturn
+ FUNC_NO_GLOBAL_ASG(function)
+ FUNC_NO_IND_ASG(function)
+ INTERRUPT(function) interrupt
+
+ */
+
+/* Parse a C4x pragma, of the form ( function [, "section"] ) \n.
+ FUNC is loaded with the IDENTIFIER_NODE of the function, SECT with
+ the STRING_CST node of the string. If SECT is null, then this
+ pragma doesn't take a section string. Returns 0 for a good pragma,
+ -1 for a malformed pragma. */
+#define BAD(msgid, arg) do { warning (msgid, arg); return -1; } while (0)
+
+static int
+c4x_parse_pragma (name, func, sect)
+ const char *name;
+ tree *func;
+ tree *sect;
+{
+ tree f, s, x;
+
+ if (c_lex (&x) != CPP_OPEN_PAREN)
+ BAD ("missing '(' after '#pragma %s' - ignored", name);
+
+ if (c_lex (&f) != CPP_NAME)
+ BAD ("missing function name in '#pragma %s' - ignored", name);
+
+ if (sect)
+ {
+ if (c_lex (&x) != CPP_COMMA)
+ BAD ("malformed '#pragma %s' - ignored", name);
+ if (c_lex (&s) != CPP_STRING)
+ BAD ("missing section name in '#pragma %s' - ignored", name);
+ *sect = s;
+ }
+
+ if (c_lex (&x) != CPP_CLOSE_PAREN)
+ BAD ("missing ')' for '#pragma %s' - ignored", name);
+
+ if (c_lex (&x) != CPP_EOF)
+ warning ("junk at end of '#pragma %s'", name);
+
+ *func = f;
+ return 0;
+}
+
+void
+c4x_pr_CODE_SECTION (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree func, sect;
+
+ if (c4x_parse_pragma ("CODE_SECTION", &func, §))
+ return;
+ code_tree = chainon (code_tree,
+ build_tree_list (func,
+ build_tree_list (NULL_TREE, sect)));
+}
+
+void
+c4x_pr_DATA_SECTION (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree func, sect;
+
+ if (c4x_parse_pragma ("DATA_SECTION", &func, §))
+ return;
+ data_tree = chainon (data_tree,
+ build_tree_list (func,
+ build_tree_list (NULL_TREE, sect)));
+}
+
+void
+c4x_pr_FUNC_IS_PURE (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree func;
+
+ if (c4x_parse_pragma ("FUNC_IS_PURE", &func, 0))
+ return;
+ pure_tree = chainon (pure_tree, build_tree_list (func, NULL_TREE));
+}
+
+void
+c4x_pr_FUNC_NEVER_RETURNS (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree func;
+
+ if (c4x_parse_pragma ("FUNC_NEVER_RETURNS", &func, 0))
+ return;
+ noreturn_tree = chainon (noreturn_tree, build_tree_list (func, NULL_TREE));
+}
+
+void
+c4x_pr_INTERRUPT (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree func;
+
+ if (c4x_parse_pragma ("INTERRUPT", &func, 0))
+ return;
+ interrupt_tree = chainon (interrupt_tree, build_tree_list (func, NULL_TREE));
+}
+
+/* Used for FUNC_CANNOT_INLINE, FUNC_EXT_CALLED, FUNC_IS_SYSTEM,
+ FUNC_NO_GLOBAL_ASG, and FUNC_NO_IND_ASG. */
+void
+c4x_pr_ignored (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+}
Index: config/c4x/c4x-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/c4x/c4x-protos.h,v
retrieving revision 1.21
diff -u -p -r1.21 c4x-protos.h
--- c4x-protos.h 2001/08/18 20:25:51 1.21
+++ c4x-protos.h 2001/10/17 19:01:57
@@ -39,10 +39,6 @@ extern void c4x_expand_epilogue PARAMS (
extern int c4x_null_epilogue_p PARAMS ((void));
-extern int c4x_handle_pragma PARAMS ((int (* p_getc) (void),
- void (* p_ungetc) (int),
- char *));
-
extern void c4x_global_label (const char *);
extern void c4x_external_ref (const char *);
@@ -305,6 +301,7 @@ extern void c4x_pr_FUNC_NEVER_RETURNS PA
extern void c4x_pr_INTERRUPT PARAMS ((cpp_reader *));
extern void c4x_pr_ignored PARAMS ((cpp_reader *));
extern void c4x_init_pragma PARAMS ((int (*) (tree *)));
+extern tree code_tree, data_tree, pure_tree, noreturn_tree, interrupt_tree;
#endif
#endif /* ! GCC_C4X_PROTOS_H */
Index: config/c4x/c4x.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/c4x/c4x.c,v
retrieving revision 1.95
diff -u -p -r1.95 c4x.c
--- c4x.c 2001/10/07 16:51:09 1.95
+++ c4x.c 2001/10/17 19:02:04
@@ -45,8 +45,6 @@ Boston, MA 02111-1307, USA. */
#include "c-tree.h"
#include "ggc.h"
#include "cpplib.h"
-#include "c-lex.h"
-#include "c-pragma.h"
#include "toplev.h"
#include "c4x-protos.h"
#include "target.h"
@@ -160,11 +158,11 @@ int c4x_cpu_version = 40; /* CPU version
/* Pragma definitions. */
-static tree code_tree = NULL_TREE;
-static tree data_tree = NULL_TREE;
-static tree pure_tree = NULL_TREE;
-static tree noreturn_tree = NULL_TREE;
-static tree interrupt_tree = NULL_TREE;
+tree code_tree = NULL_TREE;
+tree data_tree = NULL_TREE;
+tree pure_tree = NULL_TREE;
+tree noreturn_tree = NULL_TREE;
+tree interrupt_tree = NULL_TREE;
/* Forward declarations */
static void c4x_add_gc_roots PARAMS ((void));
@@ -187,7 +185,6 @@ static int c4x_valid_operands PARAMS ((e
static int c4x_arn_reg_operand PARAMS ((rtx, enum machine_mode, unsigned int));
static int c4x_arn_mem_operand PARAMS ((rtx, enum machine_mode, unsigned int));
static void c4x_check_attribute PARAMS ((const char *, tree, tree, tree *));
-static int c4x_parse_pragma PARAMS ((const char *, tree *, tree *));
static int c4x_r11_set_p PARAMS ((rtx));
static int c4x_rptb_valid_p PARAMS ((rtx, rtx));
static int c4x_label_ref_used_p PARAMS ((rtx, rtx));
@@ -4485,141 +4482,6 @@ c4x_operand_subword (op, i, validate_add
}
return operand_subword (op, i, validate_address, mode);
-}
-
-/* Handle machine specific pragmas for compatibility with existing
- compilers for the C3x/C4x.
-
- pragma attribute
- ----------------------------------------------------------
- CODE_SECTION(symbol,"section") section("section")
- DATA_SECTION(symbol,"section") section("section")
- FUNC_CANNOT_INLINE(function)
- FUNC_EXT_CALLED(function)
- FUNC_IS_PURE(function) const
- FUNC_IS_SYSTEM(function)
- FUNC_NEVER_RETURNS(function) noreturn
- FUNC_NO_GLOBAL_ASG(function)
- FUNC_NO_IND_ASG(function)
- INTERRUPT(function) interrupt
-
- */
-
-/* Parse a C4x pragma, of the form ( function [, "section"] ) \n.
- FUNC is loaded with the IDENTIFIER_NODE of the function, SECT with
- the STRING_CST node of the string. If SECT is null, then this
- pragma doesn't take a section string. Returns 0 for a good pragma,
- -1 for a malformed pragma. */
-#define BAD(msgid, arg) do { warning (msgid, arg); return -1; } while (0)
-
-static int (*c_lex_func) (tree *);
-
-void
-c4x_init_pragma (get_token)
- int (*get_token) PARAMS ((tree *));
-{
- c_lex_func = get_token;
-}
-
-
-static int
-c4x_parse_pragma (name, func, sect)
- const char *name;
- tree *func;
- tree *sect;
-{
- tree f, s, x;
-
- if (c_lex_func (&x) != CPP_OPEN_PAREN)
- BAD ("missing '(' after '#pragma %s' - ignored", name);
-
- if (c_lex_func (&f) != CPP_NAME)
- BAD ("missing function name in '#pragma %s' - ignored", name);
-
- if (sect)
- {
- if (c_lex_func (&x) != CPP_COMMA)
- BAD ("malformed '#pragma %s' - ignored", name);
- if (c_lex_func (&s) != CPP_STRING)
- BAD ("missing section name in '#pragma %s' - ignored", name);
- *sect = s;
- }
-
- if (c_lex_func (&x) != CPP_CLOSE_PAREN)
- BAD ("missing ')' for '#pragma %s' - ignored", name);
-
- if (c_lex_func (&x) != CPP_EOF)
- warning ("junk at end of '#pragma %s'", name);
-
- *func = f;
- return 0;
-}
-
-void
-c4x_pr_CODE_SECTION (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree func, sect;
-
- if (c4x_parse_pragma ("CODE_SECTION", &func, §))
- return;
- code_tree = chainon (code_tree,
- build_tree_list (func,
- build_tree_list (NULL_TREE, sect)));
-}
-
-void
-c4x_pr_DATA_SECTION (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree func, sect;
-
- if (c4x_parse_pragma ("DATA_SECTION", &func, §))
- return;
- data_tree = chainon (data_tree,
- build_tree_list (func,
- build_tree_list (NULL_TREE, sect)));
-}
-
-void
-c4x_pr_FUNC_IS_PURE (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree func;
-
- if (c4x_parse_pragma ("FUNC_IS_PURE", &func, 0))
- return;
- pure_tree = chainon (pure_tree, build_tree_list (func, NULL_TREE));
-}
-
-void
-c4x_pr_FUNC_NEVER_RETURNS (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree func;
-
- if (c4x_parse_pragma ("FUNC_NEVER_RETURNS", &func, 0))
- return;
- noreturn_tree = chainon (noreturn_tree, build_tree_list (func, NULL_TREE));
-}
-
-void
-c4x_pr_INTERRUPT (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree func;
-
- if (c4x_parse_pragma ("INTERRUPT", &func, 0))
- return;
- interrupt_tree = chainon (interrupt_tree, build_tree_list (func, NULL_TREE));
-}
-
-/* Used for FUNC_CANNOT_INLINE, FUNC_EXT_CALLED, FUNC_IS_SYSTEM,
- FUNC_NO_GLOBAL_ASG, and FUNC_NO_IND_ASG. */
-void
-c4x_pr_ignored (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
}
struct name_list
Index: config/c4x/c4x.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/c4x/c4x.h,v
retrieving revision 1.85
diff -u -p -r1.85 c4x.h
--- c4x.h 2001/09/11 16:49:57 1.85
+++ c4x.h 2001/10/17 19:02:13
@@ -2348,7 +2348,6 @@ do { \
cpp_register_pragma (PFILE, 0, "FUNC_NO_GLOBAL_ASG", c4x_pr_ignored); \
cpp_register_pragma (PFILE, 0, "FUNC_NO_IND_ASG", c4x_pr_ignored); \
cpp_register_pragma (PFILE, 0, "INTERRUPT", c4x_pr_INTERRUPT); \
- c4x_init_pragma (&c_lex); \
} while (0)
/* Assembler Commands for Alignment. */
Index: config/c4x/t-c4x
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/c4x/t-c4x,v
retrieving revision 1.8
diff -u -p -r1.8 t-c4x
--- t-c4x 2001/05/17 03:15:51 1.8
+++ t-c4x 2001/10/17 19:02:13
@@ -7,6 +7,10 @@ LIB1ASMFUNCS = _divsf3 _divsi3 _udivsi3
TARGET_LIBGCC2_CFLAGS = -Dexit=unused_exit
+c4x-c.o: $(srcdir)/config/c4x/c4x-c.c $(srcdir)/config/c4x/c4x-protos.h \
+ $(CONFIG_H) $(SYSTEM_H) cpplib.h $(TREE_H) c-pragma.h c-lex.h toplev.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
+
MULTILIB_OPTIONS = m30 msmall mmemparm
MULTILIB_DIRNAMES = c3x small mem
MULTILIB_MATCHES = m30=mcpu?30 m30=mcpu?31 m30=mcpu?32 m30=m31 m30=m32
Index: config/i370/i370-c.c
===================================================================
RCS file: i370-c.c
diff -N i370-c.c
--- /dev/null Tue May 5 13:32:27 1998
+++ i370-c.c Wed Oct 17 12:02:13 2001
@@ -0,0 +1,63 @@
+/* Subroutines for the C front end for System/370.
+ Copyright (C) 1989, 1993, 1995, 1997, 1998, 1999, 2000
+ Free Software Foundation, Inc.
+ Contributed by Jan Stein (jan@cd.chalmers.se).
+ Modified for OS/390 LanguageEnvironment C by Dave Pitts (dpitts@cozx.com)
+ Hacked for Linux-ELF/390 by Linas Vepstas (linas@linas.org)
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include "system.h"
+#include "tree.h"
+#include "toplev.h"
+#include "cpplib.h"
+#include "c-pragma.h"
+#include "c-lex.h"
+#include "i370-protos.h"
+
+#ifdef TARGET_HLASM
+
+/* #pragma map (name, alias) -
+ In this implementation both name and alias are required to be
+ identifiers. The older code seemed to be more permissive. Can
+ anyone clarify? */
+
+void
+i370_pr_map (pfile)
+ cpp_reader *pfile ATTRIBUTE_UNUSED;
+{
+ tree name, alias, x;
+
+ if (c_lex (&x) == CPP_OPEN_PAREN
+ && c_lex (&name) == CPP_NAME
+ && c_lex (&x) == CPP_COMMA
+ && c_lex (&alias) == CPP_NAME
+ && c_lex (&x) == CPP_CLOSE_PAREN)
+ {
+ if (c_lex (&x) != CPP_EOF)
+ warning ("junk at end of #pragma map");
+
+ mvs_add_alias (IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (alias), 1);
+ return;
+ }
+
+ warning ("malformed #pragma map, ignored");
+}
+
+#endif
Index: config/i370/i370.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i370/i370.c,v
retrieving revision 1.20
diff -u -p -r1.20 i370.c
--- i370.c 2001/08/10 16:19:18 1.20
+++ i370.c 2001/10/17 19:02:17
@@ -39,8 +39,6 @@ Boston, MA 02111-1307, USA. */
#include "recog.h"
#include "toplev.h"
#include "cpplib.h"
-#include "c-pragma.h"
-#include "c-lex.h"
#include "tm_p.h"
#include "target.h"
#include "target-def.h"
@@ -1029,33 +1027,6 @@ mvs_check_alias (realname, aliasname)
}
#endif
return 0;
-}
-
-/* #pragma map (name, alias) -
- In this implementation both name and alias are required to be
- identifiers. The older code seemed to be more permissive. Can
- anyone clarify? */
-
-void
-i370_pr_map (pfile)
- cpp_reader *pfile ATTRIBUTE_UNUSED;
-{
- tree name, alias, x;
-
- if (c_lex (&x) == CPP_OPEN_PAREN
- && c_lex (&name) == CPP_NAME
- && c_lex (&x) == CPP_COMMA
- && c_lex (&alias) == CPP_NAME
- && c_lex (&x) == CPP_CLOSE_PAREN)
- {
- if (c_lex (&x) != CPP_EOF)
- warning ("junk at end of #pragma map");
-
- mvs_add_alias (IDENTIFIER_POINTER (name), IDENTIFIER_POINTER (alias), 1);
- return;
- }
-
- warning ("malformed #pragma map, ignored");
}
/* defines and functions specific to the HLASM assembler */
Index: config/i370/t-i370
===================================================================
RCS file: t-i370
diff -N t-i370
--- /dev/null Tue May 5 13:32:27 1998
+++ t-i370 Wed Oct 17 12:02:17 2001
@@ -0,0 +1,3 @@
+i370-c.o: $(srcdir)/config/i370/i370-c.c $(srcdir)/config/i370/i370-protos.h \
+ $(CONFIG_H) $(SYSTEM_H) cpplib.h $(TREE_H) c-pragma.h c-lex.h toplev.h
+ $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
Index: doc/tm.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
retrieving revision 1.64
diff -u -p -r1.64 tm.texi
--- tm.texi 2001/10/17 08:44:09 1.64
+++ tm.texi 2001/10/17 19:02:51
@@ -8514,12 +8514,13 @@ pragma of the form
@var{space} is the case-sensitive namespace of the pragma, or
@code{NULL} to put the pragma in the global namespace. The callback
routine receives @var{pfile} as its first argument, which can be passed
-on to cpplib's functions if necessary. It may read any text after the
-@var{name} by making calls to @code{c_lex}. Text which is not read by
-the callback will be silently ignored.
+on to cpplib's functions if necessary. You can lex tokens after the
+@var{name} by calling @code{c_lex}. Tokens that are not read by the
+callback will be silently ignored. The end of the line is indicated by
+a token of type @code{CPP_EOF}.
For an example use of this routine, see @file{c4x.h} and the callback
-routines defined in @file{c4x.c}.
+routines defined in @file{c4x-c.c}.
Note that the use of @code{c_lex} is specific to the C and C++
compilers. It will not work in the Java or Fortran compilers, or any