OSDN Git Service

2000-09-25 Kazu Hirata <kazu@hxi.com>
[pf3gnuchains/gcc-fork.git] / gcc / cpphash.h
index 0fde660..8f569e7 100644 (file)
@@ -25,24 +25,26 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 typedef unsigned char U_CHAR;
 #define U (const U_CHAR *)  /* Intended use: U"string" */
 
-/* Order here matters.  Those beyond SPELL_NONE store their spelling
-   in the token list, and it's length in the token->val.name.len.  */
+/* Tokens with SPELL_STRING store their spelling in the token list,
+   and it's length in the token->val.name.len.  */
 enum spell_type
 {
   SPELL_OPERATOR = 0,
   SPELL_CHAR,
-  SPELL_NONE,
   SPELL_IDENT,
-  SPELL_STRING
+  SPELL_STRING,
+  SPELL_NONE
 };
 
 struct token_spelling
 {
-  ENUM_BITFIELD(spell_type) type : CHAR_BIT;
-  const U_CHAR *spelling;
+  enum spell_type category;
+  const U_CHAR *name;
 };
 
-extern const struct token_spelling token_spellings[];
+extern const struct token_spelling _cpp_token_spellings[];
+#define TOKEN_SPELL(token) (_cpp_token_spellings[(token)->type].category)
+#define TOKEN_NAME(token) (_cpp_token_spellings[(token)->type].name)
 
 /* Chained list of answers to an assertion.  */
 struct answer
@@ -64,14 +66,17 @@ struct answer
    conditional.  EXPAND means that macros are to be expanded on the
    directive line.  INCL means to treat "..." and <...> as
    q-char-sequence and h-char-sequence respectively.  COMMENTS means
-   preserve comments in the directive if -C.  */
+   preserve comments in the directive if -C.  IN_I means this directive
+   should be handled even if -fpreprocessed is in effect (these are the
+   directives with callback hooks).  */
 #define COND           (1 << 0)
 #define EXPAND         (1 << 1)
 #define INCL           (1 << 2)
 #define COMMENTS       (1 << 3)
+#define IN_I           (1 << 4)
 
 /* Defines one #-directive, including how to handle it.  */
-typedef int (*directive_handler) PARAMS ((cpp_reader *));
+typedef void (*directive_handler) PARAMS ((cpp_reader *));
 struct directive
 {
   directive_handler handler;   /* Function to handle directive.  */
@@ -110,10 +115,13 @@ struct include_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 */
+  const unsigned char *buffer; /* pointer to cached file contents */
+  struct stat st;              /* copy of stat(2) data for file */
+  int fd;                      /* fd open on file (short term storage only) */
   unsigned short include_count;        /* number of times file has been read */
-  unsigned short sysp;         /* file is a system header */
-  time_t  date;                 /* modification date of file, if known */
+  unsigned short refcnt;       /* number of stacked buffers using this file */
+  unsigned char sysp;          /* file is a system header */
+  unsigned char mapped;                /* file buffer is mmapped */
 };
 
 /* The cmacro works like this: If it's NULL, the file is to be
@@ -125,14 +133,31 @@ struct include_file
 ((inc)->cmacro && \
  ((inc)->cmacro == NEVER_REREAD || (inc)->cmacro->type != T_VOID))
 
+/* Special nodes - identifiers with predefined significance.
+   Note that the array length of dirs[] must be kept in sync with
+   cpplib.c's dtable[].  */
+struct spec_nodes
+{
+  cpp_hashnode *n_L;                   /* L"str" */
+  cpp_hashnode *n__STRICT_ANSI__;      /* STDC_0_IN_SYSTEM_HEADERS */
+  cpp_hashnode *n__CHAR_UNSIGNED__;    /* plain char is unsigned */
+  cpp_hashnode *n__VA_ARGS__;          /* C99 vararg macros */
+  cpp_hashnode *dirs[19];              /* 19 directives counting #sccs */
+};
+
 /* 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] */
+   definition of a pp-number in the C standard [section 6.4.8 of C99].
+
+   In the unlikely event that characters other than \r and \n enter
+   the set is_vspace, the macro handle_newline() in cpplex.c must be
+   updated.  */
 #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 IShspace       0x08    /* ' ' \t */
+#define ISvspace       0x10    /* \r \n */
+#define ISspace                0x20    /* ' ' \t \r \n \f \v \0 */
 
 #define _dollar_ok(x)  ((x) == '$' && CPP_OPTION (pfile, dollars_in_ident))
 
@@ -141,56 +166,52 @@ struct include_file
 #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_vspace(x)   (_cpp_IStable[x] & ISvspace)
+#define is_nvspace(x)  ((_cpp_IStable[x] & (ISspace | ISvspace)) == ISspace)
 #define is_space(x)    (_cpp_IStable[x] & ISspace)
 
-/* This table is constant if it can be initialized at compile time,
+/* These tables are constant if they 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];
+#if HAVE_DESIGNATED_INITIALIZERS
+extern const unsigned char _cpp_IStable[UCHAR_MAX + 1];
+extern const unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
 #else
-extern unsigned char _cpp_IStable[256];
+extern unsigned char _cpp_IStable[UCHAR_MAX + 1];
+extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1];
 #endif
 
 /* Macros.  */
 
-/* Make sure PFILE->token_buffer has space for at least N more characters. */
-#define CPP_RESERVE(PFILE, N) \
-  (CPP_WRITTEN (PFILE) + (size_t)(N) > (PFILE)->token_buffer_size \
-   && (_cpp_grow_token_buffer (PFILE, N), 0))
-
-/* 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))
-
 #define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev)
 #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps)
-#define CPP_TRADITIONAL(PFILE) CPP_OPTION (PFILE, traditional)
-#define CPP_IN_SYSTEM_HEADER(PFILE) (CPP_BUFFER (PFILE)->inc->sysp)
+#define CPP_IN_SYSTEM_HEADER(PFILE) \
+  (CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->inc \
+   && CPP_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_IN_SYSTEM_HEADER (PF))
 
-/* Flags for _cpp_init_toklist.  */
-#define DUMMY_TOKEN     0
-#define NO_DUMMY_TOKEN 1
+/* Hash step.  The hash calculation is duplicated in cpp_lookup and
+   parse_name.  */
+#define HASHSTEP(r, c) ((r) * 67 + (c - 113));
 
-/* In cpphash.c */
-extern unsigned int _cpp_calc_hash     PARAMS ((const U_CHAR *, size_t));
+/* In cpperror.c  */
+enum error_type { WARNING = 0, PEDWARN, ERROR, FATAL, ICE };
+extern int _cpp_begin_message PARAMS ((cpp_reader *, enum error_type,
+                                      const char *, unsigned int,
+                                      unsigned int));
+
+/* In cppmacro.c */
 extern void _cpp_free_definition       PARAMS ((cpp_hashnode *));
 extern int _cpp_create_definition      PARAMS ((cpp_reader *, cpp_hashnode *));
-extern void _cpp_dump_definition       PARAMS ((cpp_reader *, cpp_hashnode *));
+
+/* In cpphash.c */
 extern void _cpp_init_macros           PARAMS ((cpp_reader *));
 extern void _cpp_cleanup_macros                PARAMS ((cpp_reader *));
-extern void _cpp_dump_macro_hash       PARAMS ((cpp_reader *));
+extern cpp_hashnode *_cpp_lookup_with_hash PARAMS ((cpp_reader*, const U_CHAR *,
+                                                   size_t, unsigned int));
 
 /* In cppfiles.c */
 extern void _cpp_simplify_pathname     PARAMS ((char *));
@@ -204,6 +225,7 @@ extern void _cpp_report_missing_guards      PARAMS ((cpp_reader *));
 extern void _cpp_init_includes         PARAMS ((cpp_reader *));
 extern void _cpp_cleanup_includes      PARAMS ((cpp_reader *));
 extern const char *_cpp_fake_include   PARAMS ((cpp_reader *, const char *));
+extern void _cpp_pop_file_buffer       PARAMS ((cpp_reader *, cpp_buffer *));
 
 /* In cppexp.c */
 extern int _cpp_parse_expr             PARAMS ((cpp_reader *));
@@ -213,8 +235,6 @@ extern void _cpp_skip_rest_of_line  PARAMS ((cpp_reader *));
 extern void _cpp_free_temp_tokens      PARAMS ((cpp_reader *));
 extern void _cpp_init_input_buffer     PARAMS ((cpp_reader *));
 extern void _cpp_grow_token_buffer     PARAMS ((cpp_reader *, long));
-extern enum cpp_ttype _cpp_get_directive_token
-                                       PARAMS ((cpp_reader *));
 extern void _cpp_init_toklist          PARAMS ((cpp_toklist *, int));
 extern void _cpp_clear_toklist         PARAMS ((cpp_toklist *));
 extern void _cpp_free_toklist          PARAMS ((const cpp_toklist *));
@@ -225,35 +245,39 @@ extern int _cpp_equiv_toklists            PARAMS ((const cpp_toklist *,
 extern void _cpp_expand_token_space    PARAMS ((cpp_toklist *, unsigned int));
 extern void _cpp_reserve_name_space    PARAMS ((cpp_toklist *, unsigned int));
 extern void _cpp_expand_name_space     PARAMS ((cpp_toklist *, unsigned int));
-extern void _cpp_dump_list             PARAMS ((cpp_reader *,
-                                                const cpp_toklist *,
-                                                const cpp_token *, int));
 extern int _cpp_equiv_tokens           PARAMS ((const cpp_token *,
                                                 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 *));
 extern const cpp_token *_cpp_get_raw_token PARAMS ((cpp_reader *));
 extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token*));
 extern const cpp_token *_cpp_glue_header_name PARAMS ((cpp_reader *));
 
 /* In cpplib.c */
 extern const struct directive *_cpp_check_directive
-                       PARAMS ((cpp_reader *, const cpp_token *, int));
+                       PARAMS ((cpp_reader *, const cpp_token *));
 extern const struct directive *_cpp_check_linemarker
-                       PARAMS ((cpp_reader *, const cpp_token *, int));
+                       PARAMS ((cpp_reader *, const cpp_token *));
 extern cpp_hashnode *_cpp_parse_assertion 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 *));
 
 /* Utility routines and macros.  */
 #define xnew(T)                (T *) xmalloc (sizeof(T))
+#define xcnew(T)       (T *) xcalloc (1, sizeof(T))
 #define xnewvec(T, N)  (T *) xmalloc (sizeof(T) * (N))
+#define xcnewvec(T, N) (T *) xcalloc (N, sizeof(T))
 #define xobnew(O, T)   (T *) obstack_alloc (O, sizeof(T))
 
 /* These are inline functions instead of macros so we can get type
@@ -265,6 +289,7 @@ static inline int ustrncmp  PARAMS ((const U_CHAR *, const U_CHAR *,
 static inline size_t ustrlen   PARAMS ((const U_CHAR *));
 static inline U_CHAR *uxstrdup PARAMS ((const U_CHAR *));
 static inline U_CHAR *ustrchr  PARAMS ((const U_CHAR *, int));
+static inline int ufputs       PARAMS ((const U_CHAR *, FILE *));
 
 static inline int
 ustrcmp (s1, s2)
@@ -303,4 +328,12 @@ ustrchr (s1, c)
   return (U_CHAR *) strchr ((const char *)s1, c);
 }
 
+static inline int
+ufputs (s, f)
+     const U_CHAR *s;
+     FILE *f;
+{
+  return fputs ((const char *)s, f);
+}
+
 #endif