+/* List of directories to look for include files in. */
+struct file_name_list
+{
+ struct file_name_list *next;
+ struct file_name_list *alloc; /* for the cache of
+ current directory entries */
+ char *name;
+ unsigned int nlen;
+ /* We use these to tell if the directory mentioned here is a duplicate
+ of an earlier directory on the search path. */
+ ino_t ino;
+ dev_t dev;
+ /* If the following is nonzero, it is a C-language system include
+ directory. */
+ int sysp;
+ /* Mapping of file names for this directory.
+ Only used on MS-DOS and related platforms. */
+ struct file_name_map *name_map;
+};
+#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
+{
+ struct ihash *next;
+ /* 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 */
+ struct file_name_list *foundhere;
+ const char *name; /* (partial) pathname of file */
+ const char *nshort; /* name of file as referenced in #include */
+ const U_CHAR *control_macro; /* macro, if any, preventing reinclusion -
+ see redundant_include_p */
+ char *buf, *limit; /* for file content cache,
+ not yet implemented */
+};
+typedef struct ihash IHASH;
+
+/* Character classes.
+ If the definition of `numchar' looks odd to you, please look up the
+ definition of a pp-number in the C standard [section 6.4.8 of C99] */
+#define ISidnum 0x01 /* a-zA-Z0-9_ */
+#define ISidstart 0x02 /* _a-zA-Z */
+#define ISnumstart 0x04 /* 0-9 */
+#define IShspace 0x08 /* ' ' \t \f \v */
+#define ISspace 0x10 /* ' ' \t \f \v \n */
+
+#define _dollar_ok(x) ((x) == '$' && CPP_OPTIONS (pfile)->dollars_in_ident)
+
+#define is_idchar(x) ((_cpp_IStable[x] & ISidnum) || _dollar_ok(x))
+#define is_idstart(x) ((_cpp_IStable[x] & ISidstart) || _dollar_ok(x))
+#define is_numchar(x) (_cpp_IStable[x] & ISidnum)
+#define is_numstart(x) (_cpp_IStable[x] & ISnumstart)
+#define is_hspace(x) (_cpp_IStable[x] & IShspace)
+#define is_space(x) (_cpp_IStable[x] & ISspace)
+
+/* This table is constant if it can be initialized at compile time,
+ which is the case if cpp was compiled with GCC >=2.7, or another
+ compiler that supports C99. */
+#if (GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)
+extern const unsigned char _cpp_IStable[256];
+#else
+extern unsigned char _cpp_IStable[256];
+#endif
+
+/* Macros. */
+
+#define CPP_BUF_PEEK(BUFFER) \
+ ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF)
+#define CPP_BUF_GET(BUFFER) \
+ ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF)
+#define CPP_FORWARD(BUFFER, N) ((BUFFER)->cur += (N))
+
+/* Append string STR (of length N) to PFILE's output buffer.
+ Assume there is enough space. */
+#define CPP_PUTS_Q(PFILE, STR, N) \
+ (memcpy ((PFILE)->limit, STR, (N)), (PFILE)->limit += (N))
+/* Append string STR (of length N) to PFILE's output buffer. Make space. */
+#define CPP_PUTS(PFILE, STR, N) CPP_RESERVE(PFILE, N), CPP_PUTS_Q(PFILE, STR,N)
+/* Append character CH to PFILE's output buffer. Assume sufficient space. */
+#define CPP_PUTC_Q(PFILE, CH) (*(PFILE)->limit++ = (CH))
+/* Append character CH to PFILE's output buffer. Make space if need be. */
+#define CPP_PUTC(PFILE, CH) (CPP_RESERVE (PFILE, 1), CPP_PUTC_Q (PFILE, CH))
+/* Make sure PFILE->limit is followed by '\0'. */
+#define CPP_NUL_TERMINATE_Q(PFILE) (*(PFILE)->limit = 0)
+#define CPP_NUL_TERMINATE(PFILE) (CPP_RESERVE(PFILE, 1), *(PFILE)->limit = 0)
+
+/* Advance the current line by one. */
+#define CPP_BUMP_BUFFER_LINE(PBUF) ((PBUF)->lineno++,\
+ (PBUF)->line_base = (PBUF)->cur)
+#define CPP_BUMP_LINE(PFILE) CPP_BUMP_BUFFER_LINE(CPP_BUFFER(PFILE))
+#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev)
+
+#define CPP_PRINT_DEPS(PFILE) (CPP_OPTIONS (PFILE)->print_deps)
+#define CPP_TRADITIONAL(PFILE) (CPP_OPTIONS(PFILE)->traditional)
+#define CPP_PEDANTIC(PFILE) \
+ (CPP_OPTIONS (PFILE)->pedantic && !CPP_BUFFER (pfile)->system_header_p)
+
+/* In cpphash.c */