OSDN Git Service

gcc/cp:
[pf3gnuchains/gcc-fork.git] / libcpp / include / cpplib.h
index dab3157..adae96b 100644 (file)
@@ -1,5 +1,6 @@
 /* Definitions for CPP library.
-   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004, 2005
    Free Software Foundation, Inc.
    Written by Per Bothner, 1994-95.
 
@@ -15,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
  In other words, you are welcome to use, share and improve this program.
  You are forbidden to forbid anyone else to use, share and improve
@@ -52,106 +53,107 @@ struct _cpp_file;
    '='.  The lexer needs operators ending in '=', like ">>=", to be in
    the same order as their counterparts without the '=', like ">>".  */
 
-/* Positions in the table.  */
-#define CPP_LAST_EQ CPP_MAX
-#define CPP_FIRST_DIGRAPH CPP_HASH
-#define CPP_LAST_PUNCTUATOR CPP_DOT_STAR
-#define CPP_LAST_CPP_OP CPP_LESS_EQ
-
-#define TTYPE_TABLE                            \
-  OP(CPP_EQ = 0,       "=")                    \
-  OP(CPP_NOT,          "!")                    \
-  OP(CPP_GREATER,      ">")    /* compare */   \
-  OP(CPP_LESS,         "<")                    \
-  OP(CPP_PLUS,         "+")    /* math */      \
-  OP(CPP_MINUS,                "-")                    \
-  OP(CPP_MULT,         "*")                    \
-  OP(CPP_DIV,          "/")                    \
-  OP(CPP_MOD,          "%")                    \
-  OP(CPP_AND,          "&")    /* bit ops */   \
-  OP(CPP_OR,           "|")                    \
-  OP(CPP_XOR,          "^")                    \
-  OP(CPP_RSHIFT,       ">>")                   \
-  OP(CPP_LSHIFT,       "<<")                   \
-  OP(CPP_MIN,          "<?")   /* extension */ \
-  OP(CPP_MAX,          ">?")                   \
-\
-  OP(CPP_COMPL,                "~")                    \
-  OP(CPP_AND_AND,      "&&")   /* logical */   \
-  OP(CPP_OR_OR,                "||")                   \
-  OP(CPP_QUERY,                "?")                    \
-  OP(CPP_COLON,                ":")                    \
-  OP(CPP_COMMA,                ",")    /* grouping */  \
-  OP(CPP_OPEN_PAREN,   "(")                    \
-  OP(CPP_CLOSE_PAREN,  ")")                    \
-  TK(CPP_EOF,          SPELL_NONE)             \
-  OP(CPP_EQ_EQ,                "==")   /* compare */   \
-  OP(CPP_NOT_EQ,       "!=")                   \
-  OP(CPP_GREATER_EQ,   ">=")                   \
-  OP(CPP_LESS_EQ,      "<=")                   \
-\
-  /* These two are unary + / - in preprocessor expressions.  */ \
-  OP(CPP_PLUS_EQ,      "+=")   /* math */      \
-  OP(CPP_MINUS_EQ,     "-=")                   \
-\
-  OP(CPP_MULT_EQ,      "*=")                   \
-  OP(CPP_DIV_EQ,       "/=")                   \
-  OP(CPP_MOD_EQ,       "%=")                   \
-  OP(CPP_AND_EQ,       "&=")   /* bit ops */   \
-  OP(CPP_OR_EQ,                "|=")                   \
-  OP(CPP_XOR_EQ,       "^=")                   \
-  OP(CPP_RSHIFT_EQ,    ">>=")                  \
-  OP(CPP_LSHIFT_EQ,    "<<=")                  \
-  OP(CPP_MIN_EQ,       "<?=")  /* extension */ \
-  OP(CPP_MAX_EQ,       ">?=")                  \
-  /* Digraphs together, beginning with CPP_FIRST_DIGRAPH.  */  \
-  OP(CPP_HASH,         "#")    /* digraphs */  \
-  OP(CPP_PASTE,                "##")                   \
-  OP(CPP_OPEN_SQUARE,  "[")                    \
-  OP(CPP_CLOSE_SQUARE, "]")                    \
-  OP(CPP_OPEN_BRACE,   "{")                    \
-  OP(CPP_CLOSE_BRACE,  "}")                    \
-  /* The remainder of the punctuation.  Order is not significant.  */  \
-  OP(CPP_SEMICOLON,    ";")    /* structure */ \
-  OP(CPP_ELLIPSIS,     "...")                  \
-  OP(CPP_PLUS_PLUS,    "++")   /* increment */ \
-  OP(CPP_MINUS_MINUS,  "--")                   \
-  OP(CPP_DEREF,                "->")   /* accessors */ \
-  OP(CPP_DOT,          ".")                    \
-  OP(CPP_SCOPE,                "::")                   \
-  OP(CPP_DEREF_STAR,   "->*")                  \
-  OP(CPP_DOT_STAR,     ".*")                   \
-  OP(CPP_ATSIGN,       "@")  /* used in Objective-C */ \
-\
-  TK(CPP_NAME,         SPELL_IDENT)    /* word */                      \
-  TK(CPP_AT_NAME,       SPELL_IDENT)    /* @word - Objective-C */       \
-  TK(CPP_NUMBER,       SPELL_LITERAL)  /* 34_be+ta  */                 \
-\
-  TK(CPP_CHAR,         SPELL_LITERAL)  /* 'char' */                    \
-  TK(CPP_WCHAR,                SPELL_LITERAL)  /* L'char' */                   \
-  TK(CPP_OTHER,                SPELL_LITERAL)  /* stray punctuation */         \
-\
-  TK(CPP_STRING,       SPELL_LITERAL)  /* "string" */                  \
-  TK(CPP_WSTRING,      SPELL_LITERAL)  /* L"string" */                 \
-  TK(CPP_OBJC_STRING,   SPELL_LITERAL)  /* @"string" - Objective-C */  \
-  TK(CPP_HEADER_NAME,  SPELL_LITERAL)  /* <stdio.h> in #include */     \
-\
-  TK(CPP_COMMENT,      SPELL_LITERAL)  /* Only if output comments.  */ \
-                                        /* SPELL_LITERAL happens to DTRT.  */ \
-  TK(CPP_MACRO_ARG,    SPELL_NONE)     /* Macro argument.  */          \
-  TK(CPP_PADDING,      SPELL_NONE)     /* Whitespace for cpp0.  */
-
-#define OP(e, s) e,
-#define TK(e, s) e,
+#define TTYPE_TABLE                                                    \
+  OP(EQ,               "=")                                            \
+  OP(NOT,              "!")                                            \
+  OP(GREATER,          ">")    /* compare */                           \
+  OP(LESS,             "<")                                            \
+  OP(PLUS,             "+")    /* math */                              \
+  OP(MINUS,            "-")                                            \
+  OP(MULT,             "*")                                            \
+  OP(DIV,              "/")                                            \
+  OP(MOD,              "%")                                            \
+  OP(AND,              "&")    /* bit ops */                           \
+  OP(OR,               "|")                                            \
+  OP(XOR,              "^")                                            \
+  OP(RSHIFT,           ">>")                                           \
+  OP(LSHIFT,           "<<")                                           \
+  OP(MIN,              "<?")   /* extension */                         \
+  OP(MAX,              ">?")                                           \
+                                                                       \
+  OP(COMPL,            "~")                                            \
+  OP(AND_AND,          "&&")   /* logical */                           \
+  OP(OR_OR,            "||")                                           \
+  OP(QUERY,            "?")                                            \
+  OP(COLON,            ":")                                            \
+  OP(COMMA,            ",")    /* grouping */                          \
+  OP(OPEN_PAREN,       "(")                                            \
+  OP(CLOSE_PAREN,      ")")                                            \
+  TK(EOF,              NONE)                                           \
+  OP(EQ_EQ,            "==")   /* compare */                           \
+  OP(NOT_EQ,           "!=")                                           \
+  OP(GREATER_EQ,       ">=")                                           \
+  OP(LESS_EQ,          "<=")                                           \
+                                                                       \
+  /* These two are unary + / - in preprocessor expressions.  */                \
+  OP(PLUS_EQ,          "+=")   /* math */                              \
+  OP(MINUS_EQ,         "-=")                                           \
+                                                                       \
+  OP(MULT_EQ,          "*=")                                           \
+  OP(DIV_EQ,           "/=")                                           \
+  OP(MOD_EQ,           "%=")                                           \
+  OP(AND_EQ,           "&=")   /* bit ops */                           \
+  OP(OR_EQ,            "|=")                                           \
+  OP(XOR_EQ,           "^=")                                           \
+  OP(RSHIFT_EQ,                ">>=")                                          \
+  OP(LSHIFT_EQ,                "<<=")                                          \
+  OP(MIN_EQ,           "<?=")  /* extension */                         \
+  OP(MAX_EQ,           ">?=")                                          \
+  /* Digraphs together, beginning with CPP_FIRST_DIGRAPH.  */          \
+  OP(HASH,             "#")    /* digraphs */                          \
+  OP(PASTE,            "##")                                           \
+  OP(OPEN_SQUARE,      "[")                                            \
+  OP(CLOSE_SQUARE,     "]")                                            \
+  OP(OPEN_BRACE,       "{")                                            \
+  OP(CLOSE_BRACE,      "}")                                            \
+  /* The remainder of the punctuation. Order is not significant.  */   \
+  OP(SEMICOLON,                ";")    /* structure */                         \
+  OP(ELLIPSIS,         "...")                                          \
+  OP(PLUS_PLUS,                "++")   /* increment */                         \
+  OP(MINUS_MINUS,      "--")                                           \
+  OP(DEREF,            "->")   /* accessors */                         \
+  OP(DOT,              ".")                                            \
+  OP(SCOPE,            "::")                                           \
+  OP(DEREF_STAR,       "->*")                                          \
+  OP(DOT_STAR,         ".*")                                           \
+  OP(ATSIGN,           "@")  /* used in Objective-C */                 \
+                                                                       \
+  TK(NAME,             IDENT)   /* word */                             \
+  TK(AT_NAME,          IDENT)   /* @word - Objective-C */              \
+  TK(NUMBER,           LITERAL) /* 34_be+ta  */                        \
+                                                                       \
+  TK(CHAR,             LITERAL) /* 'char' */                           \
+  TK(WCHAR,            LITERAL) /* L'char' */                          \
+  TK(OTHER,            LITERAL) /* stray punctuation */                \
+                                                                       \
+  TK(STRING,           LITERAL) /* "string" */                         \
+  TK(WSTRING,          LITERAL) /* L"string" */                        \
+  TK(OBJC_STRING,      LITERAL) /* @"string" - Objective-C */          \
+  TK(HEADER_NAME,      LITERAL) /* <stdio.h> in #include */            \
+                                                                       \
+  TK(COMMENT,          LITERAL) /* Only if output comments.  */        \
+                                /* SPELL_LITERAL happens to DTRT.  */  \
+  TK(MACRO_ARG,                NONE)    /* Macro argument.  */                 \
+  TK(PRAGMA,           NONE)    /* Only if deferring pragmas */        \
+  TK(PADDING,          NONE)    /* Whitespace for -E.  */
+
+#define OP(e, s) CPP_ ## e,
+#define TK(e, s) CPP_ ## e,
 enum cpp_ttype
 {
   TTYPE_TABLE
-  N_TTYPES
+  N_TTYPES,
+
+  /* Positions in the table.  */
+  CPP_LAST_EQ        = CPP_MAX,
+  CPP_FIRST_DIGRAPH  = CPP_HASH,
+  CPP_LAST_PUNCTUATOR= CPP_DOT_STAR,
+  CPP_LAST_CPP_OP    = CPP_LESS_EQ
 };
 #undef OP
 #undef TK
 
-/* C language kind, used when calling cpp_reader_init.  */
+/* C language kind, used when calling cpp_create_reader.  */
 enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_STDC89, CLK_STDC94, CLK_STDC99,
             CLK_GNUCXX, CLK_CXX98, CLK_ASM};
 
@@ -231,6 +233,22 @@ extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok);
 typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
 typedef CPPCHAR_SIGNED_T cppchar_signed_t;
 
+/* Style of header dependencies to generate.  */
+enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
+
+/* The possible normalization levels, from most restrictive to least.  */
+enum cpp_normalize_level {
+  /* In NFKC.  */
+  normalized_KC = 0,
+  /* In NFC.  */
+  normalized_C,
+  /* In NFC, except for subsequences where being in NFC would make
+     the identifier invalid.  */
+  normalized_identifier_C,
+  /* Not normalized at all.  */
+  normalized_none
+};
+
 /* This structure is nested inside struct cpp_reader, and
    carries all the options visible to the command line.  */
 struct cpp_options
@@ -327,6 +345,9 @@ struct cpp_options
   /* Zero means dollar signs are punctuation.  */
   unsigned char dollars_in_ident;
 
+  /* Nonzero means UCNs are accepted in identifiers.  */
+  unsigned char extended_identifiers;
+
   /* True if we should warn about dollars in identifiers or numbers
      for this translation unit.  */
   unsigned char warn_dollars;
@@ -368,6 +389,10 @@ struct cpp_options
   /* Holds the name of the input character set.  */
   const char *input_charset;
 
+  /* The minimum permitted level of normalization before a warning
+     is generated.  */
+  enum cpp_normalize_level warn_normalize;
+
   /* True to warn about precompiled header files we couldn't use.  */
   bool warn_invalid_pch;
 
@@ -378,7 +403,7 @@ struct cpp_options
   struct
   {
     /* Style of header dependencies to generate.  */
-    enum {DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM } style;
+    enum cpp_deps_style style;
 
     /* Assume missing files are generated files.  */
     bool missing_files;
@@ -406,6 +431,13 @@ struct cpp_options
 
   /* Nonzero means __STDC__ should have the value 0 in system headers.  */
   unsigned char stdc_0_in_system_headers;
+
+  /* True means return pragmas as tokens rather than processing
+     them directly. */
+  bool defer_pragmas;
+
+  /* True means error callback should be used for diagnostics.  */
+  bool client_diagnostic;
 };
 
 /* Callback for header lookup for HEADER, which is the name of a
@@ -430,7 +462,7 @@ struct cpp_callbacks
 
   void (*dir_change) (cpp_reader *, const char *);
   void (*include) (cpp_reader *, unsigned int, const unsigned char *,
-                  const char *, int);
+                  const char *, int, const cpp_token **);
   void (*define) (cpp_reader *, unsigned int, cpp_hashnode *);
   void (*undef) (cpp_reader *, unsigned int, cpp_hashnode *);
   void (*ident) (cpp_reader *, unsigned int, const cpp_string *);
@@ -438,6 +470,11 @@ struct cpp_callbacks
   int (*valid_pch) (cpp_reader *, const char *, int);
   void (*read_pch) (cpp_reader *, const char *, int, const char *);
   missing_header_cb missing_header;
+
+  /* Called to emit a diagnostic if client_diagnostic option is true.
+     This callback receives the translated message.  */
+  void (*error) (cpp_reader *, int, const char *, va_list *)
+       ATTRIBUTE_PRINTF(3,0);
 };
 
 /* Chain of directories to look for include files in.  */
@@ -543,6 +580,19 @@ enum {
 /* The common part of an identifier node shared amongst all 3 C front
    ends.  Also used to store CPP identifiers, which are a superset of
    identifiers in the grammatical sense.  */
+
+union _cpp_hashnode_value GTY(())
+{
+  /* If a macro.  */
+  cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
+  /* Answers to an assertion.  */
+  struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
+  /* Code for a builtin macro.  */
+  enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
+  /* Macro argument index.  */
+  unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
+};
+
 struct cpp_hashnode GTY(())
 {
   struct ht_identifier ident;
@@ -554,17 +604,7 @@ struct cpp_hashnode GTY(())
   ENUM_BITFIELD(node_type) type : 8;   /* CPP node type.  */
   unsigned char flags;                 /* CPP flags.  */
 
-  union _cpp_hashnode_value
-  {
-    /* If a macro.  */
-    cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
-    /* Answers to an assertion.  */
-    struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
-    /* Code for a builtin macro.  */
-    enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
-    /* Macro argument index.  */
-    unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
-  } GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
+  union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
 };
 
 /* Call this first to get a handle to pass to other functions.
@@ -628,9 +668,10 @@ extern unsigned int cpp_errors (cpp_reader *);
 extern unsigned int cpp_token_len (const cpp_token *);
 extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
 extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
-                                      unsigned char *);
+                                      unsigned char *, bool);
 extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
-                                void (*) (cpp_reader *));
+                                void (*) (cpp_reader *), bool);
+extern void cpp_handle_deferred_pragma (cpp_reader *, const cpp_string *);
 extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
                            const cpp_token *);
 extern const cpp_token *cpp_get_token (cpp_reader *);
@@ -649,6 +690,9 @@ extern bool cpp_interpret_string_notranslate (cpp_reader *,
                                              const cpp_string *, size_t,
                                              cpp_string *, bool);
 
+/* Convert a host character constant to the execution character set.  */
+extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
+
 /* Used to register macros and assertions, perhaps from the command line.
    The text is the same as the command line argument.  */
 extern void cpp_define (cpp_reader *, const char *);
@@ -733,12 +777,6 @@ cpp_num cpp_num_sign_extend (cpp_num, size_t);
 #define CPP_DL_WARNING_P(l)    (CPP_DL_EXTRACT (l) >= CPP_DL_WARNING \
                                 && CPP_DL_EXTRACT (l) <= CPP_DL_PEDWARN)
 
-/* N.B. The error-message-printer prototypes have not been nicely
-   formatted because exgettext needs to see 'msgid' on the same line
-   as the name of the function in order to work properly.  Only the
-   string argument gets a name in an effort to keep the lines from
-   getting ridiculously oversized.  */
-
 /* Output a diagnostic of some kind.  */
 extern void cpp_error (cpp_reader *, int, const char *msgid, ...)
   ATTRIBUTE_PRINTF_3;