aboutsummaryrefslogtreecommitdiff
path: root/gcc/cpphash.h
diff options
context:
space:
mode:
authorZack Weinberg <zack@wolery.cumb.org>2000-06-21 18:33:51 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-06-21 18:33:51 +0000
commitc31a6508eedf17dc50388f1694bc131bd965004f (patch)
treeeb5aadb8fbe401846a1ceb69f99c1b4e7af8d929 /gcc/cpphash.h
parente3cd9945cbe33d50af459b6b4951d3dcb12a33f7 (diff)
downloadgcc-c31a6508eedf17dc50388f1694bc131bd965004f.zip
gcc-c31a6508eedf17dc50388f1694bc131bd965004f.tar.gz
gcc-c31a6508eedf17dc50388f1694bc131bd965004f.tar.bz2
cppfiles.c: Include splay-tree.h, not hashtab.h.
* cppfiles.c: Include splay-tree.h, not hashtab.h. (redundant_include_p, make_IHASH, hash_IHASH, eq_IHASH): Delete. (destroy_include_file_node): New. (_cpp_init_include_hash): Rename _cpp_init_include_table. Create a splay tree, not a hash table. (open_include_file): Look up the path in the include table, do the multiple include optimization here, etc. (cpp_included): Walk the path. (find_include_file): Just walk the path calling open_include_file, or call it directly for an absolute path. (_cpp_fake_ihash): Rename _cpp_fake_include and update for new scheme. (read_include_file): Update for new scheme. Don't close the file unless reading fails. (_cpp_execute_include, cpp_read_file): Tweak for new scheme. * cpphash.h (struct ihash, NEVER_REINCLUDE): Delete. (struct include_file): New. (NEVER_REREAD, DO_NOT_REREAD, CPP_IN_SYSTEM_HEADER): New macros. (CPP_PEDANTIC, CPP_WTRADITIONAL): Update. Update prototypes. * cppinit.c: Include splay-tree.h. (cpp_reader_init, cpp_cleanup): Update. * cpplib.h (struct cpp_buffer): Change ihash field to 'struct include_file *inc'. Remove system_header_p. (struct cpp_reader): Change all_include_files to a struct splay_tree_s *. * cpplex.c: Update all references to cpp_buffer->ihash and/or cpp_buffer->system_header_p. (cpp_pop_buffer): Close file here, only if DO_NOT_REREAD. From-SVN: r34636
Diffstat (limited to 'gcc/cpphash.h')
-rw-r--r--gcc/cpphash.h51
1 files changed, 28 insertions, 23 deletions
diff --git a/gcc/cpphash.h b/gcc/cpphash.h
index 28761c7..967dcef 100644
--- a/gcc/cpphash.h
+++ b/gcc/cpphash.h
@@ -53,27 +53,27 @@ struct file_name_list
};
#define ABSOLUTE_PATH ((struct file_name_list *)-1)
-/* This structure is used for the table of all includes. It is
- indexed by the `short name' (the name as it appeared in the
- #include statement) which is stored in *nshort. */
-struct ihash
+/* This structure is used for the table of all includes. */
+struct include_file
{
- /* Next file with the same short name but a
- different (partial) pathname). */
- struct ihash *next_this_file;
-
- /* Location of the file in the include search path.
- Used for include_next and to detect redundant includes. */
- struct file_name_list *foundhere;
-
- unsigned int hash; /* save hash value for future reference */
- const char *nshort; /* name of file as referenced in #include;
- points into name[] */
+ const char *name; /* actual path name of file */
const cpp_hashnode *cmacro; /* macro, if any, preventing reinclusion. */
- const char name[1]; /* (partial) pathname of file */
+ const struct file_name_list *foundhere;
+ /* location in search path where file was
+ found, for #include_next */
+ int fd; /* file descriptor possibly open on file */
+ unsigned char before; /* file has been included before */
+ unsigned char sysp; /* file is a system header */
};
-typedef struct ihash IHASH;
-#define NEVER_REINCLUDE ((const cpp_hashnode *)-1)
+
+/* The cmacro works like this: If it's NULL, the file is to be
+ included again. If it's NEVER_REREAD, the file is never to be
+ included again. Otherwise it is a macro hashnode, and the file is
+ to be included again if the macro is not defined. */
+#define NEVER_REREAD ((const cpp_hashnode *)-1)
+#define DO_NOT_REREAD(inc) \
+((inc)->cmacro && \
+ ((inc)->cmacro == NEVER_REREAD || (inc)->cmacro->type != T_VOID))
/* Character classes.
If the definition of `numchar' looks odd to you, please look up the
@@ -143,10 +143,11 @@ extern unsigned char _cpp_IStable[256];
#define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps)
#define CPP_TRADITIONAL(PFILE) CPP_OPTION (PFILE, traditional)
-#define CPP_PEDANTIC(PFILE) \
- (CPP_OPTION (PFILE, pedantic) && !CPP_BUFFER (PFILE)->system_header_p)
+#define CPP_IN_SYSTEM_HEADER(PFILE) (cpp_file_buffer (PFILE)->inc->sysp)
+#define CPP_PEDANTIC(PF) \
+ (CPP_OPTION (PF, pedantic) && !CPP_IN_SYSTEM_HEADER (PF))
#define CPP_WTRADITIONAL(PF) \
- (CPP_OPTION (PF, warn_traditional) && !CPP_BUFFER (PF)->system_header_p)
+ (CPP_OPTION (PF, warn_traditional) && !CPP_IN_SYSTEM_HEADER (PF))
/* CPP_IS_MACRO_BUFFER is true if the buffer contains macro expansion.
(Note that it is false while we're expanding macro *arguments*.) */
@@ -192,8 +193,8 @@ extern void _cpp_simplify_pathname PARAMS ((char *));
extern void _cpp_execute_include PARAMS ((cpp_reader *, U_CHAR *,
unsigned int, int,
struct file_name_list *));
-extern void _cpp_init_include_hash PARAMS ((cpp_reader *));
-extern const char *_cpp_fake_ihash PARAMS ((cpp_reader *, const char *));
+extern void _cpp_init_include_table PARAMS ((cpp_reader *));
+extern const char *_cpp_fake_include PARAMS ((cpp_reader *, const char *));
/* In cppexp.c */
extern int _cpp_parse_expr PARAMS ((cpp_reader *));
@@ -234,6 +235,10 @@ extern int _cpp_handle_directive PARAMS ((cpp_reader *));
extern void _cpp_unwind_if_stack PARAMS ((cpp_reader *, cpp_buffer *));
extern void _cpp_check_directive PARAMS ((cpp_toklist *, cpp_token *));
+/* Utility routines and macros. */
+#define xnew(T) (T *) xmalloc (sizeof(T))
+#define xnewvec(T, N) (T *) xmalloc (sizeof(T) * (N))
+
/* These are inline functions instead of macros so we can get type
checking. */