14fee23f9Smrg /* Definitions for CPP library.
2e9e6e0f6Smrg Copyright (C) 1995-2022 Free Software Foundation, Inc.
34fee23f9Smrg Written by Per Bothner, 1994-95.
44fee23f9Smrg
54fee23f9Smrg This program is free software; you can redistribute it and/or modify it
64fee23f9Smrg under the terms of the GNU General Public License as published by the
74fee23f9Smrg Free Software Foundation; either version 3, or (at your option) any
84fee23f9Smrg later version.
94fee23f9Smrg
104fee23f9Smrg This program is distributed in the hope that it will be useful,
114fee23f9Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
124fee23f9Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
134fee23f9Smrg GNU General Public License for more details.
144fee23f9Smrg
154fee23f9Smrg You should have received a copy of the GNU General Public License
164fee23f9Smrg along with this program; see the file COPYING3. If not see
174fee23f9Smrg <http://www.gnu.org/licenses/>.
184fee23f9Smrg
194fee23f9Smrg In other words, you are welcome to use, share and improve this program.
204fee23f9Smrg You are forbidden to forbid anyone else to use, share and improve
214fee23f9Smrg what you give them. Help stamp out software-hoarding! */
224fee23f9Smrg #ifndef LIBCPP_CPPLIB_H
234fee23f9Smrg #define LIBCPP_CPPLIB_H
244fee23f9Smrg
254fee23f9Smrg #include <sys/types.h>
264fee23f9Smrg #include "symtab.h"
274fee23f9Smrg #include "line-map.h"
284fee23f9Smrg
294fee23f9Smrg typedef struct cpp_reader cpp_reader;
304fee23f9Smrg typedef struct cpp_buffer cpp_buffer;
314fee23f9Smrg typedef struct cpp_options cpp_options;
324fee23f9Smrg typedef struct cpp_token cpp_token;
334fee23f9Smrg typedef struct cpp_string cpp_string;
344fee23f9Smrg typedef struct cpp_hashnode cpp_hashnode;
354fee23f9Smrg typedef struct cpp_macro cpp_macro;
364fee23f9Smrg typedef struct cpp_callbacks cpp_callbacks;
374fee23f9Smrg typedef struct cpp_dir cpp_dir;
384fee23f9Smrg
394fee23f9Smrg struct _cpp_file;
404fee23f9Smrg
414fee23f9Smrg /* The first three groups, apart from '=', can appear in preprocessor
424fee23f9Smrg expressions (+= and -= are used to indicate unary + and - resp.).
434fee23f9Smrg This allows a lookup table to be implemented in _cpp_parse_expr.
444fee23f9Smrg
454fee23f9Smrg The first group, to CPP_LAST_EQ, can be immediately followed by an
464fee23f9Smrg '='. The lexer needs operators ending in '=', like ">>=", to be in
474fee23f9Smrg the same order as their counterparts without the '=', like ">>".
484fee23f9Smrg
49e9e6e0f6Smrg See the cpp_operator table optab in expr.cc if you change the order or
504fee23f9Smrg add or remove anything in the first group. */
514fee23f9Smrg
524fee23f9Smrg #define TTYPE_TABLE \
534fee23f9Smrg OP(EQ, "=") \
544fee23f9Smrg OP(NOT, "!") \
554fee23f9Smrg OP(GREATER, ">") /* compare */ \
564fee23f9Smrg OP(LESS, "<") \
574fee23f9Smrg OP(PLUS, "+") /* math */ \
584fee23f9Smrg OP(MINUS, "-") \
594fee23f9Smrg OP(MULT, "*") \
604fee23f9Smrg OP(DIV, "/") \
614fee23f9Smrg OP(MOD, "%") \
624fee23f9Smrg OP(AND, "&") /* bit ops */ \
634fee23f9Smrg OP(OR, "|") \
644fee23f9Smrg OP(XOR, "^") \
654fee23f9Smrg OP(RSHIFT, ">>") \
664fee23f9Smrg OP(LSHIFT, "<<") \
674fee23f9Smrg \
684fee23f9Smrg OP(COMPL, "~") \
694fee23f9Smrg OP(AND_AND, "&&") /* logical */ \
704fee23f9Smrg OP(OR_OR, "||") \
714fee23f9Smrg OP(QUERY, "?") \
724fee23f9Smrg OP(COLON, ":") \
734fee23f9Smrg OP(COMMA, ",") /* grouping */ \
744fee23f9Smrg OP(OPEN_PAREN, "(") \
754fee23f9Smrg OP(CLOSE_PAREN, ")") \
764fee23f9Smrg TK(EOF, NONE) \
774fee23f9Smrg OP(EQ_EQ, "==") /* compare */ \
784fee23f9Smrg OP(NOT_EQ, "!=") \
794fee23f9Smrg OP(GREATER_EQ, ">=") \
804fee23f9Smrg OP(LESS_EQ, "<=") \
8143265c03Smrg OP(SPACESHIP, "<=>") \
824fee23f9Smrg \
834fee23f9Smrg /* These two are unary + / - in preprocessor expressions. */ \
844fee23f9Smrg OP(PLUS_EQ, "+=") /* math */ \
854fee23f9Smrg OP(MINUS_EQ, "-=") \
864fee23f9Smrg \
874fee23f9Smrg OP(MULT_EQ, "*=") \
884fee23f9Smrg OP(DIV_EQ, "/=") \
894fee23f9Smrg OP(MOD_EQ, "%=") \
904fee23f9Smrg OP(AND_EQ, "&=") /* bit ops */ \
914fee23f9Smrg OP(OR_EQ, "|=") \
924fee23f9Smrg OP(XOR_EQ, "^=") \
934fee23f9Smrg OP(RSHIFT_EQ, ">>=") \
944fee23f9Smrg OP(LSHIFT_EQ, "<<=") \
954fee23f9Smrg /* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \
964fee23f9Smrg OP(HASH, "#") /* digraphs */ \
974fee23f9Smrg OP(PASTE, "##") \
984fee23f9Smrg OP(OPEN_SQUARE, "[") \
994fee23f9Smrg OP(CLOSE_SQUARE, "]") \
1004fee23f9Smrg OP(OPEN_BRACE, "{") \
1014fee23f9Smrg OP(CLOSE_BRACE, "}") \
1024fee23f9Smrg /* The remainder of the punctuation. Order is not significant. */ \
1034fee23f9Smrg OP(SEMICOLON, ";") /* structure */ \
1044fee23f9Smrg OP(ELLIPSIS, "...") \
1054fee23f9Smrg OP(PLUS_PLUS, "++") /* increment */ \
1064fee23f9Smrg OP(MINUS_MINUS, "--") \
1074fee23f9Smrg OP(DEREF, "->") /* accessors */ \
1084fee23f9Smrg OP(DOT, ".") \
1094fee23f9Smrg OP(SCOPE, "::") \
1104fee23f9Smrg OP(DEREF_STAR, "->*") \
1114fee23f9Smrg OP(DOT_STAR, ".*") \
1124fee23f9Smrg OP(ATSIGN, "@") /* used in Objective-C */ \
1134fee23f9Smrg \
1144fee23f9Smrg TK(NAME, IDENT) /* word */ \
1154fee23f9Smrg TK(AT_NAME, IDENT) /* @word - Objective-C */ \
1164fee23f9Smrg TK(NUMBER, LITERAL) /* 34_be+ta */ \
1174fee23f9Smrg \
1184fee23f9Smrg TK(CHAR, LITERAL) /* 'char' */ \
1194fee23f9Smrg TK(WCHAR, LITERAL) /* L'char' */ \
1204fee23f9Smrg TK(CHAR16, LITERAL) /* u'char' */ \
1214fee23f9Smrg TK(CHAR32, LITERAL) /* U'char' */ \
122cdbfa754Smrg TK(UTF8CHAR, LITERAL) /* u8'char' */ \
1234fee23f9Smrg TK(OTHER, LITERAL) /* stray punctuation */ \
1244fee23f9Smrg \
1254fee23f9Smrg TK(STRING, LITERAL) /* "string" */ \
1264fee23f9Smrg TK(WSTRING, LITERAL) /* L"string" */ \
1274fee23f9Smrg TK(STRING16, LITERAL) /* u"string" */ \
1284fee23f9Smrg TK(STRING32, LITERAL) /* U"string" */ \
1294fee23f9Smrg TK(UTF8STRING, LITERAL) /* u8"string" */ \
1304fee23f9Smrg TK(OBJC_STRING, LITERAL) /* @"string" - Objective-C */ \
1314fee23f9Smrg TK(HEADER_NAME, LITERAL) /* <stdio.h> in #include */ \
1324fee23f9Smrg \
13323da6d05Smrg TK(CHAR_USERDEF, LITERAL) /* 'char'_suffix - C++-0x */ \
13423da6d05Smrg TK(WCHAR_USERDEF, LITERAL) /* L'char'_suffix - C++-0x */ \
13523da6d05Smrg TK(CHAR16_USERDEF, LITERAL) /* u'char'_suffix - C++-0x */ \
13623da6d05Smrg TK(CHAR32_USERDEF, LITERAL) /* U'char'_suffix - C++-0x */ \
137cdbfa754Smrg TK(UTF8CHAR_USERDEF, LITERAL) /* u8'char'_suffix - C++-0x */ \
13823da6d05Smrg TK(STRING_USERDEF, LITERAL) /* "string"_suffix - C++-0x */ \
13923da6d05Smrg TK(WSTRING_USERDEF, LITERAL) /* L"string"_suffix - C++-0x */ \
14023da6d05Smrg TK(STRING16_USERDEF, LITERAL) /* u"string"_suffix - C++-0x */ \
14123da6d05Smrg TK(STRING32_USERDEF, LITERAL) /* U"string"_suffix - C++-0x */ \
14223da6d05Smrg TK(UTF8STRING_USERDEF,LITERAL) /* u8"string"_suffix - C++-0x */ \
14323da6d05Smrg \
1444fee23f9Smrg TK(COMMENT, LITERAL) /* Only if output comments. */ \
1454fee23f9Smrg /* SPELL_LITERAL happens to DTRT. */ \
1464fee23f9Smrg TK(MACRO_ARG, NONE) /* Macro argument. */ \
1474fee23f9Smrg TK(PRAGMA, NONE) /* Only for deferred pragmas. */ \
1484fee23f9Smrg TK(PRAGMA_EOL, NONE) /* End-of-line for deferred pragmas. */ \
1494fee23f9Smrg TK(PADDING, NONE) /* Whitespace for -E. */
1504fee23f9Smrg
1514fee23f9Smrg #define OP(e, s) CPP_ ## e,
1524fee23f9Smrg #define TK(e, s) CPP_ ## e,
1534fee23f9Smrg enum cpp_ttype
1544fee23f9Smrg {
1554fee23f9Smrg TTYPE_TABLE
1564fee23f9Smrg N_TTYPES,
1574fee23f9Smrg
158d35849d0Smrg /* A token type for keywords, as opposed to ordinary identifiers. */
159d35849d0Smrg CPP_KEYWORD,
160d35849d0Smrg
1614fee23f9Smrg /* Positions in the table. */
1624fee23f9Smrg CPP_LAST_EQ = CPP_LSHIFT,
1634fee23f9Smrg CPP_FIRST_DIGRAPH = CPP_HASH,
1644fee23f9Smrg CPP_LAST_PUNCTUATOR= CPP_ATSIGN,
1654fee23f9Smrg CPP_LAST_CPP_OP = CPP_LESS_EQ
1664fee23f9Smrg };
1674fee23f9Smrg #undef OP
1684fee23f9Smrg #undef TK
1694fee23f9Smrg
1704fee23f9Smrg /* C language kind, used when calling cpp_create_reader. */
171654d12c0Smrg enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC11, CLK_GNUC17, CLK_GNUC2X,
1723f8cba22Smrg CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC11, CLK_STDC17,
173654d12c0Smrg CLK_STDC2X,
174d35849d0Smrg CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX11, CLK_CXX11,
1753f8cba22Smrg CLK_GNUCXX14, CLK_CXX14, CLK_GNUCXX17, CLK_CXX17,
176e9e6e0f6Smrg CLK_GNUCXX20, CLK_CXX20, CLK_GNUCXX23, CLK_CXX23,
177e9e6e0f6Smrg CLK_ASM};
1784fee23f9Smrg
1794fee23f9Smrg /* Payload of a NUMBER, STRING, CHAR or COMMENT token. */
1804fee23f9Smrg struct GTY(()) cpp_string {
1814fee23f9Smrg unsigned int len;
1824fee23f9Smrg const unsigned char *text;
1834fee23f9Smrg };
1844fee23f9Smrg
1854fee23f9Smrg /* Flags for the cpp_token structure. */
1864fee23f9Smrg #define PREV_WHITE (1 << 0) /* If whitespace before this token. */
1874fee23f9Smrg #define DIGRAPH (1 << 1) /* If it was a digraph. */
1884fee23f9Smrg #define STRINGIFY_ARG (1 << 2) /* If macro argument to be stringified. */
1894fee23f9Smrg #define PASTE_LEFT (1 << 3) /* If on LHS of a ## operator. */
1904fee23f9Smrg #define NAMED_OP (1 << 4) /* C++ named operators. */
191a41324a9Smrg #define PREV_FALLTHROUGH (1 << 5) /* On a token preceeded by FALLTHROUGH
192a41324a9Smrg comment. */
1934fee23f9Smrg #define BOL (1 << 6) /* Token at beginning of line. */
1944fee23f9Smrg #define PURE_ZERO (1 << 7) /* Single 0 digit, used by the C++ frontend,
195e9e6e0f6Smrg set in c-lex.cc. */
196*4fe0f936Smrg #define COLON_SCOPE PURE_ZERO /* Adjacent colons in C < 23. */
1974fee23f9Smrg #define SP_DIGRAPH (1 << 8) /* # or ## token was a digraph. */
1984fee23f9Smrg #define SP_PREV_WHITE (1 << 9) /* If whitespace before a ##
1994fee23f9Smrg operator, or before this token
2004fee23f9Smrg after a # operator. */
201a41324a9Smrg #define NO_EXPAND (1 << 10) /* Do not macro-expand this token. */
202e9e6e0f6Smrg #define PRAGMA_OP (1 << 11) /* _Pragma token. */
2034fee23f9Smrg
2044fee23f9Smrg /* Specify which field, if any, of the cpp_token union is used. */
2054fee23f9Smrg
2064fee23f9Smrg enum cpp_token_fld_kind {
2074fee23f9Smrg CPP_TOKEN_FLD_NODE,
2084fee23f9Smrg CPP_TOKEN_FLD_SOURCE,
2094fee23f9Smrg CPP_TOKEN_FLD_STR,
2104fee23f9Smrg CPP_TOKEN_FLD_ARG_NO,
2114fee23f9Smrg CPP_TOKEN_FLD_TOKEN_NO,
2124fee23f9Smrg CPP_TOKEN_FLD_PRAGMA,
2134fee23f9Smrg CPP_TOKEN_FLD_NONE
2144fee23f9Smrg };
2154fee23f9Smrg
2164fee23f9Smrg /* A macro argument in the cpp_token union. */
2174fee23f9Smrg struct GTY(()) cpp_macro_arg {
2184fee23f9Smrg /* Argument number. */
2194fee23f9Smrg unsigned int arg_no;
220d35849d0Smrg /* The original spelling of the macro argument token. */
221d35849d0Smrg cpp_hashnode *
222d35849d0Smrg GTY ((nested_ptr (union tree_node,
223d35849d0Smrg "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
224d35849d0Smrg "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
225d35849d0Smrg spelling;
2264fee23f9Smrg };
2274fee23f9Smrg
2284fee23f9Smrg /* An identifier in the cpp_token union. */
2294fee23f9Smrg struct GTY(()) cpp_identifier {
2304fee23f9Smrg /* The canonical (UTF-8) spelling of the identifier. */
2314fee23f9Smrg cpp_hashnode *
2324fee23f9Smrg GTY ((nested_ptr (union tree_node,
2334fee23f9Smrg "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
2344fee23f9Smrg "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
2354fee23f9Smrg node;
236d35849d0Smrg /* The original spelling of the identifier. */
237d35849d0Smrg cpp_hashnode *
238d35849d0Smrg GTY ((nested_ptr (union tree_node,
239d35849d0Smrg "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
240d35849d0Smrg "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
241d35849d0Smrg spelling;
2424fee23f9Smrg };
2434fee23f9Smrg
2444fee23f9Smrg /* A preprocessing token. This has been carefully packed and should
2454fee23f9Smrg occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts. */
2464fee23f9Smrg struct GTY(()) cpp_token {
247654d12c0Smrg
248654d12c0Smrg /* Location of first char of token, together with range of full token. */
249654d12c0Smrg location_t src_loc;
250654d12c0Smrg
2514fee23f9Smrg ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT; /* token type */
2524fee23f9Smrg unsigned short flags; /* flags - see above */
2534fee23f9Smrg
2544fee23f9Smrg union cpp_token_u
2554fee23f9Smrg {
2564fee23f9Smrg /* An identifier. */
2574fee23f9Smrg struct cpp_identifier GTY ((tag ("CPP_TOKEN_FLD_NODE"))) node;
2584fee23f9Smrg
2594fee23f9Smrg /* Inherit padding from this token. */
2604fee23f9Smrg cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source;
2614fee23f9Smrg
2624fee23f9Smrg /* A string, or number. */
2634fee23f9Smrg struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str;
2644fee23f9Smrg
265d35849d0Smrg /* Argument no. (and original spelling) for a CPP_MACRO_ARG. */
2664fee23f9Smrg struct cpp_macro_arg GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) macro_arg;
2674fee23f9Smrg
2684fee23f9Smrg /* Original token no. for a CPP_PASTE (from a sequence of
2694fee23f9Smrg consecutive paste tokens in a macro expansion). */
2704fee23f9Smrg unsigned int GTY ((tag ("CPP_TOKEN_FLD_TOKEN_NO"))) token_no;
2714fee23f9Smrg
2724fee23f9Smrg /* Caller-supplied identifier for a CPP_PRAGMA. */
2734fee23f9Smrg unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma;
2744fee23f9Smrg } GTY ((desc ("cpp_token_val_index (&%1)"))) val;
2754fee23f9Smrg };
2764fee23f9Smrg
2774fee23f9Smrg /* Say which field is in use. */
278d35849d0Smrg extern enum cpp_token_fld_kind cpp_token_val_index (const cpp_token *tok);
2794fee23f9Smrg
2804fee23f9Smrg /* A type wide enough to hold any multibyte source character.
2814fee23f9Smrg cpplib's character constant interpreter requires an unsigned type.
2824fee23f9Smrg Also, a typedef for the signed equivalent.
2834fee23f9Smrg The width of this type is capped at 32 bits; there do exist targets
2844fee23f9Smrg where wchar_t is 64 bits, but only in a non-default mode, and there
2854fee23f9Smrg would be no meaningful interpretation for a wchar_t value greater
2864fee23f9Smrg than 2^32 anyway -- the widest wide-character encoding around is
2874fee23f9Smrg ISO 10646, which stops at 2^31. */
2884fee23f9Smrg #if CHAR_BIT * SIZEOF_INT >= 32
2894fee23f9Smrg # define CPPCHAR_SIGNED_T int
2904fee23f9Smrg #elif CHAR_BIT * SIZEOF_LONG >= 32
2914fee23f9Smrg # define CPPCHAR_SIGNED_T long
2924fee23f9Smrg #else
2934fee23f9Smrg # error "Cannot find a least-32-bit signed integer type"
2944fee23f9Smrg #endif
2954fee23f9Smrg typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
2964fee23f9Smrg typedef CPPCHAR_SIGNED_T cppchar_signed_t;
2974fee23f9Smrg
2984fee23f9Smrg /* Style of header dependencies to generate. */
2994fee23f9Smrg enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
3004fee23f9Smrg
3014fee23f9Smrg /* The possible normalization levels, from most restrictive to least. */
3024fee23f9Smrg enum cpp_normalize_level {
3034fee23f9Smrg /* In NFKC. */
3044fee23f9Smrg normalized_KC = 0,
3054fee23f9Smrg /* In NFC. */
3064fee23f9Smrg normalized_C,
3074fee23f9Smrg /* In NFC, except for subsequences where being in NFC would make
3084fee23f9Smrg the identifier invalid. */
3094fee23f9Smrg normalized_identifier_C,
3104fee23f9Smrg /* Not normalized at all. */
3114fee23f9Smrg normalized_none
3124fee23f9Smrg };
3134fee23f9Smrg
314e9e6e0f6Smrg enum cpp_main_search
315e9e6e0f6Smrg {
316e9e6e0f6Smrg CMS_none, /* A regular source file. */
317e9e6e0f6Smrg CMS_header, /* Is a directly-specified header file (eg PCH or
318e9e6e0f6Smrg header-unit). */
319e9e6e0f6Smrg CMS_user, /* Search the user INCLUDE path. */
320e9e6e0f6Smrg CMS_system, /* Search the system INCLUDE path. */
321e9e6e0f6Smrg };
322e9e6e0f6Smrg
323e9e6e0f6Smrg /* The possible bidirectional control characters checking levels. */
324e9e6e0f6Smrg enum cpp_bidirectional_level {
325e9e6e0f6Smrg /* No checking. */
326e9e6e0f6Smrg bidirectional_none = 0,
327e9e6e0f6Smrg /* Only detect unpaired uses of bidirectional control characters. */
328e9e6e0f6Smrg bidirectional_unpaired = 1,
329e9e6e0f6Smrg /* Detect any use of bidirectional control characters. */
330e9e6e0f6Smrg bidirectional_any = 2,
331e9e6e0f6Smrg /* Also warn about UCNs. */
332e9e6e0f6Smrg bidirectional_ucn = 4
333e9e6e0f6Smrg };
334e9e6e0f6Smrg
3354fee23f9Smrg /* This structure is nested inside struct cpp_reader, and
3364fee23f9Smrg carries all the options visible to the command line. */
3374fee23f9Smrg struct cpp_options
3384fee23f9Smrg {
3394fee23f9Smrg /* The language we're preprocessing. */
3404fee23f9Smrg enum c_lang lang;
3414fee23f9Smrg
3424fee23f9Smrg /* Nonzero means use extra default include directories for C++. */
3434fee23f9Smrg unsigned char cplusplus;
3444fee23f9Smrg
3454fee23f9Smrg /* Nonzero means handle cplusplus style comments. */
3464fee23f9Smrg unsigned char cplusplus_comments;
3474fee23f9Smrg
3484fee23f9Smrg /* Nonzero means define __OBJC__, treat @ as a special token, use
3494fee23f9Smrg the OBJC[PLUS]_INCLUDE_PATH environment variable, and allow
3504fee23f9Smrg "#import". */
3514fee23f9Smrg unsigned char objc;
3524fee23f9Smrg
3534fee23f9Smrg /* Nonzero means don't copy comments into the output file. */
3544fee23f9Smrg unsigned char discard_comments;
3554fee23f9Smrg
3564fee23f9Smrg /* Nonzero means don't copy comments into the output file during
3574fee23f9Smrg macro expansion. */
3584fee23f9Smrg unsigned char discard_comments_in_macro_exp;
3594fee23f9Smrg
3604fee23f9Smrg /* Nonzero means process the ISO trigraph sequences. */
3614fee23f9Smrg unsigned char trigraphs;
3624fee23f9Smrg
3634fee23f9Smrg /* Nonzero means process the ISO digraph sequences. */
3644fee23f9Smrg unsigned char digraphs;
3654fee23f9Smrg
3664fee23f9Smrg /* Nonzero means to allow hexadecimal floats and LL suffixes. */
3674fee23f9Smrg unsigned char extended_numbers;
3684fee23f9Smrg
3694fee23f9Smrg /* Nonzero means process u/U prefix literals (UTF-16/32). */
3704fee23f9Smrg unsigned char uliterals;
3714fee23f9Smrg
372cdbfa754Smrg /* Nonzero means process u8 prefixed character literals (UTF-8). */
373cdbfa754Smrg unsigned char utf8_char_literals;
374cdbfa754Smrg
37523da6d05Smrg /* Nonzero means process r/R raw strings. If this is set, uliterals
37623da6d05Smrg must be set as well. */
37723da6d05Smrg unsigned char rliterals;
37823da6d05Smrg
3794fee23f9Smrg /* Nonzero means print names of header files (-H). */
3804fee23f9Smrg unsigned char print_include_names;
3814fee23f9Smrg
3824fee23f9Smrg /* Nonzero means complain about deprecated features. */
38323da6d05Smrg unsigned char cpp_warn_deprecated;
3844fee23f9Smrg
3854fee23f9Smrg /* Nonzero means warn if slash-star appears in a comment. */
3864fee23f9Smrg unsigned char warn_comments;
3874fee23f9Smrg
388d35849d0Smrg /* Nonzero means to warn about __DATA__, __TIME__ and __TIMESTAMP__ usage. */
389d35849d0Smrg unsigned char warn_date_time;
390d35849d0Smrg
3914fee23f9Smrg /* Nonzero means warn if a user-supplied include directory does not
3924fee23f9Smrg exist. */
3934fee23f9Smrg unsigned char warn_missing_include_dirs;
3944fee23f9Smrg
3954fee23f9Smrg /* Nonzero means warn if there are any trigraphs. */
3964fee23f9Smrg unsigned char warn_trigraphs;
3974fee23f9Smrg
3984fee23f9Smrg /* Nonzero means warn about multicharacter charconsts. */
3994fee23f9Smrg unsigned char warn_multichar;
4004fee23f9Smrg
4014fee23f9Smrg /* Nonzero means warn about various incompatibilities with
4024fee23f9Smrg traditional C. */
40323da6d05Smrg unsigned char cpp_warn_traditional;
4044fee23f9Smrg
4054fee23f9Smrg /* Nonzero means warn about long long numeric constants. */
40623da6d05Smrg unsigned char cpp_warn_long_long;
4074fee23f9Smrg
4084fee23f9Smrg /* Nonzero means warn about text after an #endif (or #else). */
4094fee23f9Smrg unsigned char warn_endif_labels;
4104fee23f9Smrg
4114fee23f9Smrg /* Nonzero means warn about implicit sign changes owing to integer
4124fee23f9Smrg promotions. */
4134fee23f9Smrg unsigned char warn_num_sign_change;
4144fee23f9Smrg
4154fee23f9Smrg /* Zero means don't warn about __VA_ARGS__ usage in c89 pedantic mode.
4164fee23f9Smrg Presumably the usage is protected by the appropriate #ifdef. */
4174fee23f9Smrg unsigned char warn_variadic_macros;
4184fee23f9Smrg
4194fee23f9Smrg /* Nonzero means warn about builtin macros that are redefined or
4204fee23f9Smrg explicitly undefined. */
4214fee23f9Smrg unsigned char warn_builtin_macro_redefined;
4224fee23f9Smrg
423a41324a9Smrg /* Different -Wimplicit-fallthrough= levels. */
424a41324a9Smrg unsigned char cpp_warn_implicit_fallthrough;
425a41324a9Smrg
4264fee23f9Smrg /* Nonzero means we should look for header.gcc files that remap file
4274fee23f9Smrg names. */
4284fee23f9Smrg unsigned char remap;
4294fee23f9Smrg
4304fee23f9Smrg /* Zero means dollar signs are punctuation. */
4314fee23f9Smrg unsigned char dollars_in_ident;
4324fee23f9Smrg
4334fee23f9Smrg /* Nonzero means UCNs are accepted in identifiers. */
4344fee23f9Smrg unsigned char extended_identifiers;
4354fee23f9Smrg
4364fee23f9Smrg /* True if we should warn about dollars in identifiers or numbers
4374fee23f9Smrg for this translation unit. */
4384fee23f9Smrg unsigned char warn_dollars;
4394fee23f9Smrg
4404fee23f9Smrg /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
4414fee23f9Smrg unsigned char warn_undef;
4424fee23f9Smrg
443a41324a9Smrg /* Nonzero means warn if "defined" is encountered in a place other than
444a41324a9Smrg an #if. */
445a41324a9Smrg unsigned char warn_expansion_to_defined;
446a41324a9Smrg
4474fee23f9Smrg /* Nonzero means warn of unused macros from the main file. */
4484fee23f9Smrg unsigned char warn_unused_macros;
4494fee23f9Smrg
4504fee23f9Smrg /* Nonzero for the 1999 C Standard, including corrigenda and amendments. */
4514fee23f9Smrg unsigned char c99;
4524fee23f9Smrg
4534fee23f9Smrg /* Nonzero if we are conforming to a specific C or C++ standard. */
4544fee23f9Smrg unsigned char std;
4554fee23f9Smrg
4564fee23f9Smrg /* Nonzero means give all the error messages the ANSI standard requires. */
45723da6d05Smrg unsigned char cpp_pedantic;
4584fee23f9Smrg
4594fee23f9Smrg /* Nonzero means we're looking at already preprocessed code, so don't
4604fee23f9Smrg bother trying to do macro expansion and whatnot. */
4614fee23f9Smrg unsigned char preprocessed;
4624fee23f9Smrg
46323da6d05Smrg /* Nonzero means we are going to emit debugging logs during
46423da6d05Smrg preprocessing. */
46523da6d05Smrg unsigned char debug;
46623da6d05Smrg
46723da6d05Smrg /* Nonzero means we are tracking locations of tokens involved in
46823da6d05Smrg macro expansion. 1 Means we track the location in degraded mode
46923da6d05Smrg where we do not track locations of tokens resulting from the
47023da6d05Smrg expansion of arguments of function-like macro. 2 Means we do
47123da6d05Smrg track all macro expansions. This last option is the one that
47223da6d05Smrg consumes the highest amount of memory. */
47323da6d05Smrg unsigned char track_macro_expansion;
4744fee23f9Smrg
4754fee23f9Smrg /* Nonzero means handle C++ alternate operator names. */
4764fee23f9Smrg unsigned char operator_names;
4774fee23f9Smrg
4784fee23f9Smrg /* Nonzero means warn about use of C++ alternate operator names. */
4794fee23f9Smrg unsigned char warn_cxx_operator_names;
4804fee23f9Smrg
4814fee23f9Smrg /* True for traditional preprocessing. */
4824fee23f9Smrg unsigned char traditional;
4834fee23f9Smrg
484d35849d0Smrg /* Nonzero for C++ 2011 Standard user-defined literals. */
48523da6d05Smrg unsigned char user_literals;
48623da6d05Smrg
48723da6d05Smrg /* Nonzero means warn when a string or character literal is followed by a
48823da6d05Smrg ud-suffix which does not beging with an underscore. */
48923da6d05Smrg unsigned char warn_literal_suffix;
49023da6d05Smrg
49123da6d05Smrg /* Nonzero means interpret imaginary, fixed-point, or other gnu extension
49223da6d05Smrg literal number suffixes as user-defined literal number suffixes. */
49323da6d05Smrg unsigned char ext_numeric_literals;
49423da6d05Smrg
495d35849d0Smrg /* Nonzero means extended identifiers allow the characters specified
496e9e6e0f6Smrg in C11. */
497d35849d0Smrg unsigned char c11_identifiers;
498d35849d0Smrg
499d35849d0Smrg /* Nonzero for C++ 2014 Standard binary constants. */
500d35849d0Smrg unsigned char binary_constants;
501d35849d0Smrg
502d35849d0Smrg /* Nonzero for C++ 2014 Standard digit separators. */
503d35849d0Smrg unsigned char digit_separators;
504d35849d0Smrg
50543265c03Smrg /* Nonzero for C2X decimal floating-point constants. */
50643265c03Smrg unsigned char dfp_constants;
50743265c03Smrg
508e9e6e0f6Smrg /* Nonzero for C++20 __VA_OPT__ feature. */
5093f8cba22Smrg unsigned char va_opt;
5103f8cba22Smrg
51143265c03Smrg /* Nonzero for the '::' token. */
51243265c03Smrg unsigned char scope;
51343265c03Smrg
514e9e6e0f6Smrg /* Nonzero for the '#elifdef' and '#elifndef' directives. */
515e9e6e0f6Smrg unsigned char elifdef;
516e9e6e0f6Smrg
517e9e6e0f6Smrg /* Nonzero means tokenize C++20 module directives. */
518e9e6e0f6Smrg unsigned char module_directives;
519e9e6e0f6Smrg
520e9e6e0f6Smrg /* Nonzero for C++23 size_t literals. */
521e9e6e0f6Smrg unsigned char size_t_literals;
522e9e6e0f6Smrg
5234fee23f9Smrg /* Holds the name of the target (execution) character set. */
5244fee23f9Smrg const char *narrow_charset;
5254fee23f9Smrg
5264fee23f9Smrg /* Holds the name of the target wide character set. */
5274fee23f9Smrg const char *wide_charset;
5284fee23f9Smrg
5294fee23f9Smrg /* Holds the name of the input character set. */
5304fee23f9Smrg const char *input_charset;
5314fee23f9Smrg
5324fee23f9Smrg /* The minimum permitted level of normalization before a warning
533d35849d0Smrg is generated. See enum cpp_normalize_level. */
534d35849d0Smrg int warn_normalize;
5354fee23f9Smrg
5364fee23f9Smrg /* True to warn about precompiled header files we couldn't use. */
5374fee23f9Smrg bool warn_invalid_pch;
5384fee23f9Smrg
5394fee23f9Smrg /* True if dependencies should be restored from a precompiled header. */
5404fee23f9Smrg bool restore_pch_deps;
5414fee23f9Smrg
542d35849d0Smrg /* True if warn about differences between C90 and C99. */
543d35849d0Smrg signed char cpp_warn_c90_c99_compat;
544d35849d0Smrg
54543265c03Smrg /* True if warn about differences between C11 and C2X. */
54643265c03Smrg signed char cpp_warn_c11_c2x_compat;
54743265c03Smrg
548cdbfa754Smrg /* True if warn about differences between C++98 and C++11. */
549cdbfa754Smrg bool cpp_warn_cxx11_compat;
550cdbfa754Smrg
551e9e6e0f6Smrg /* Nonzero if bidirectional control characters checking is on. See enum
552e9e6e0f6Smrg cpp_bidirectional_level. */
553e9e6e0f6Smrg unsigned char cpp_warn_bidirectional;
554e9e6e0f6Smrg
5554fee23f9Smrg /* Dependency generation. */
5564fee23f9Smrg struct
5574fee23f9Smrg {
5584fee23f9Smrg /* Style of header dependencies to generate. */
5594fee23f9Smrg enum cpp_deps_style style;
5604fee23f9Smrg
5614fee23f9Smrg /* Assume missing files are generated files. */
5624fee23f9Smrg bool missing_files;
5634fee23f9Smrg
5644fee23f9Smrg /* Generate phony targets for each dependency apart from the first
5654fee23f9Smrg one. */
5664fee23f9Smrg bool phony_targets;
5674fee23f9Smrg
568e9e6e0f6Smrg /* Generate dependency info for modules. */
569e9e6e0f6Smrg bool modules;
570e9e6e0f6Smrg
5714fee23f9Smrg /* If true, no dependency is generated on the main file. */
5724fee23f9Smrg bool ignore_main_file;
5734fee23f9Smrg
5744fee23f9Smrg /* If true, intend to use the preprocessor output (e.g., for compilation)
5754fee23f9Smrg in addition to the dependency info. */
5764fee23f9Smrg bool need_preprocessor_output;
5774fee23f9Smrg } deps;
5784fee23f9Smrg
5794fee23f9Smrg /* Target-specific features set by the front end or client. */
5804fee23f9Smrg
5814fee23f9Smrg /* Precision for target CPP arithmetic, target characters, target
5824fee23f9Smrg ints and target wide characters, respectively. */
5834fee23f9Smrg size_t precision, char_precision, int_precision, wchar_precision;
5844fee23f9Smrg
5854fee23f9Smrg /* True means chars (wide chars) are unsigned. */
5864fee23f9Smrg bool unsigned_char, unsigned_wchar;
5874fee23f9Smrg
5884fee23f9Smrg /* True if the most significant byte in a word has the lowest
5894fee23f9Smrg address in memory. */
5904fee23f9Smrg bool bytes_big_endian;
5914fee23f9Smrg
5924fee23f9Smrg /* Nonzero means __STDC__ should have the value 0 in system headers. */
5934fee23f9Smrg unsigned char stdc_0_in_system_headers;
5944fee23f9Smrg
5954fee23f9Smrg /* True disables tokenization outside of preprocessing directives. */
5964fee23f9Smrg bool directives_only;
59723da6d05Smrg
59823da6d05Smrg /* True enables canonicalization of system header file paths. */
59923da6d05Smrg bool canonical_system_headers;
60043265c03Smrg
60143265c03Smrg /* The maximum depth of the nested #include. */
60243265c03Smrg unsigned int max_include_depth;
603e9e6e0f6Smrg
604e9e6e0f6Smrg cpp_main_search main_search : 8;
6054fee23f9Smrg };
6064fee23f9Smrg
607654d12c0Smrg /* Diagnostic levels. To get a diagnostic without associating a
608654d12c0Smrg position in the translation unit with it, use cpp_error_with_line
609654d12c0Smrg with a line number of zero. */
610654d12c0Smrg
611654d12c0Smrg enum cpp_diagnostic_level {
612654d12c0Smrg /* Warning, an error with -Werror. */
613654d12c0Smrg CPP_DL_WARNING = 0,
614654d12c0Smrg /* Same as CPP_DL_WARNING, except it is not suppressed in system headers. */
615654d12c0Smrg CPP_DL_WARNING_SYSHDR,
616654d12c0Smrg /* Warning, an error with -pedantic-errors or -Werror. */
617654d12c0Smrg CPP_DL_PEDWARN,
618654d12c0Smrg /* An error. */
619654d12c0Smrg CPP_DL_ERROR,
620654d12c0Smrg /* An internal consistency check failed. Prints "internal error: ",
621654d12c0Smrg otherwise the same as CPP_DL_ERROR. */
622654d12c0Smrg CPP_DL_ICE,
623654d12c0Smrg /* An informative note following a warning. */
624654d12c0Smrg CPP_DL_NOTE,
625654d12c0Smrg /* A fatal error. */
626654d12c0Smrg CPP_DL_FATAL
627654d12c0Smrg };
628654d12c0Smrg
629654d12c0Smrg /* Warning reason codes. Use a reason code of CPP_W_NONE for unclassified
630654d12c0Smrg warnings and diagnostics that are not warnings. */
631654d12c0Smrg
632654d12c0Smrg enum cpp_warning_reason {
633654d12c0Smrg CPP_W_NONE = 0,
634654d12c0Smrg CPP_W_DEPRECATED,
635654d12c0Smrg CPP_W_COMMENTS,
636654d12c0Smrg CPP_W_MISSING_INCLUDE_DIRS,
637654d12c0Smrg CPP_W_TRIGRAPHS,
638654d12c0Smrg CPP_W_MULTICHAR,
639654d12c0Smrg CPP_W_TRADITIONAL,
640654d12c0Smrg CPP_W_LONG_LONG,
641654d12c0Smrg CPP_W_ENDIF_LABELS,
642654d12c0Smrg CPP_W_NUM_SIGN_CHANGE,
643654d12c0Smrg CPP_W_VARIADIC_MACROS,
644654d12c0Smrg CPP_W_BUILTIN_MACRO_REDEFINED,
645654d12c0Smrg CPP_W_DOLLARS,
646654d12c0Smrg CPP_W_UNDEF,
647654d12c0Smrg CPP_W_UNUSED_MACROS,
648654d12c0Smrg CPP_W_CXX_OPERATOR_NAMES,
649654d12c0Smrg CPP_W_NORMALIZE,
650654d12c0Smrg CPP_W_INVALID_PCH,
651654d12c0Smrg CPP_W_WARNING_DIRECTIVE,
652654d12c0Smrg CPP_W_LITERAL_SUFFIX,
653e9e6e0f6Smrg CPP_W_SIZE_T_LITERALS,
654654d12c0Smrg CPP_W_DATE_TIME,
655654d12c0Smrg CPP_W_PEDANTIC,
656654d12c0Smrg CPP_W_C90_C99_COMPAT,
65743265c03Smrg CPP_W_C11_C2X_COMPAT,
658654d12c0Smrg CPP_W_CXX11_COMPAT,
659e9e6e0f6Smrg CPP_W_EXPANSION_TO_DEFINED,
660e9e6e0f6Smrg CPP_W_BIDIRECTIONAL
661654d12c0Smrg };
662654d12c0Smrg
6634fee23f9Smrg /* Callback for header lookup for HEADER, which is the name of a
6644fee23f9Smrg source file. It is used as a method of last resort to find headers
6654fee23f9Smrg that are not otherwise found during the normal include processing.
6664fee23f9Smrg The return value is the malloced name of a header to try and open,
6674fee23f9Smrg if any, or NULL otherwise. This callback is called only if the
6684fee23f9Smrg header is otherwise unfound. */
6694fee23f9Smrg typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **);
6704fee23f9Smrg
6714fee23f9Smrg /* Call backs to cpplib client. */
6724fee23f9Smrg struct cpp_callbacks
6734fee23f9Smrg {
6744fee23f9Smrg /* Called when a new line of preprocessed output is started. */
6754fee23f9Smrg void (*line_change) (cpp_reader *, const cpp_token *, int);
6764fee23f9Smrg
6774fee23f9Smrg /* Called when switching to/from a new file.
6784fee23f9Smrg The line_map is for the new file. It is NULL if there is no new file.
6794fee23f9Smrg (In C this happens when done with <built-in>+<command line> and also
6804fee23f9Smrg when done with a main file.) This can be used for resource cleanup. */
681cdbfa754Smrg void (*file_change) (cpp_reader *, const line_map_ordinary *);
6824fee23f9Smrg
6834fee23f9Smrg void (*dir_change) (cpp_reader *, const char *);
684654d12c0Smrg void (*include) (cpp_reader *, location_t, const unsigned char *,
6854fee23f9Smrg const char *, int, const cpp_token **);
686654d12c0Smrg void (*define) (cpp_reader *, location_t, cpp_hashnode *);
687654d12c0Smrg void (*undef) (cpp_reader *, location_t, cpp_hashnode *);
688654d12c0Smrg void (*ident) (cpp_reader *, location_t, const cpp_string *);
689654d12c0Smrg void (*def_pragma) (cpp_reader *, location_t);
6904fee23f9Smrg int (*valid_pch) (cpp_reader *, const char *, int);
6914fee23f9Smrg void (*read_pch) (cpp_reader *, const char *, int, const char *);
6924fee23f9Smrg missing_header_cb missing_header;
6934fee23f9Smrg
6944fee23f9Smrg /* Context-sensitive macro support. Returns macro (if any) that should
6954fee23f9Smrg be expanded. */
6964fee23f9Smrg cpp_hashnode * (*macro_to_expand) (cpp_reader *, const cpp_token *);
6974fee23f9Smrg
6984fee23f9Smrg /* Called to emit a diagnostic. This callback receives the
6994fee23f9Smrg translated message. */
700654d12c0Smrg bool (*diagnostic) (cpp_reader *,
701654d12c0Smrg enum cpp_diagnostic_level,
702654d12c0Smrg enum cpp_warning_reason,
703654d12c0Smrg rich_location *,
7044fee23f9Smrg const char *, va_list *)
705cdbfa754Smrg ATTRIBUTE_FPTR_PRINTF(5,0);
7064fee23f9Smrg
7074fee23f9Smrg /* Callbacks for when a macro is expanded, or tested (whether
7084fee23f9Smrg defined or not at the time) in #ifdef, #ifndef or "defined". */
709654d12c0Smrg void (*used_define) (cpp_reader *, location_t, cpp_hashnode *);
710654d12c0Smrg void (*used_undef) (cpp_reader *, location_t, cpp_hashnode *);
7114fee23f9Smrg /* Called before #define and #undef or other macro definition
7124fee23f9Smrg changes are processed. */
7134fee23f9Smrg void (*before_define) (cpp_reader *);
7144fee23f9Smrg /* Called whenever a macro is expanded or tested.
7154fee23f9Smrg Second argument is the location of the start of the current expansion. */
716654d12c0Smrg void (*used) (cpp_reader *, location_t, cpp_hashnode *);
71723da6d05Smrg
718d35849d0Smrg /* Callback to identify whether an attribute exists. */
719e9e6e0f6Smrg int (*has_attribute) (cpp_reader *, bool);
720d35849d0Smrg
72143265c03Smrg /* Callback to determine whether a built-in function is recognized. */
72243265c03Smrg int (*has_builtin) (cpp_reader *);
72343265c03Smrg
724654d12c0Smrg /* Callback that can change a user lazy into normal macro. */
725654d12c0Smrg void (*user_lazy_macro) (cpp_reader *, cpp_macro *, unsigned);
726a41324a9Smrg
727e9e6e0f6Smrg /* Callback to handle deferred cpp_macros. */
728e9e6e0f6Smrg cpp_macro *(*user_deferred_macro) (cpp_reader *, location_t, cpp_hashnode *);
729e9e6e0f6Smrg
730a41324a9Smrg /* Callback to parse SOURCE_DATE_EPOCH from environment. */
731a41324a9Smrg time_t (*get_source_date_epoch) (cpp_reader *);
732a41324a9Smrg
733a41324a9Smrg /* Callback for providing suggestions for misspelled directives. */
734a41324a9Smrg const char *(*get_suggestion) (cpp_reader *, const char *, const char *const *);
7353f8cba22Smrg
7363f8cba22Smrg /* Callback for when a comment is encountered, giving the location
7373f8cba22Smrg of the opening slash, a pointer to the content (which is not
7383f8cba22Smrg necessarily 0-terminated), and the length of the content.
7393f8cba22Smrg The content contains the opening slash-star (or slash-slash),
7403f8cba22Smrg and for C-style comments contains the closing star-slash. For
7413f8cba22Smrg C++-style comments it does not include the terminating newline. */
742654d12c0Smrg void (*comment) (cpp_reader *, location_t, const unsigned char *,
7433f8cba22Smrg size_t);
7443f8cba22Smrg
7453f8cba22Smrg /* Callback for filename remapping in __FILE__ and __BASE_FILE__ macro
7463f8cba22Smrg expansions. */
7473f8cba22Smrg const char *(*remap_filename) (const char*);
748e9e6e0f6Smrg
749e9e6e0f6Smrg /* Maybe translate a #include into something else. Return a
750e9e6e0f6Smrg cpp_buffer containing the translation if translating. */
751e9e6e0f6Smrg char *(*translate_include) (cpp_reader *, line_maps *, location_t,
752e9e6e0f6Smrg const char *path);
7534fee23f9Smrg };
7544fee23f9Smrg
7554fee23f9Smrg #ifdef VMS
7564fee23f9Smrg #define INO_T_CPP ino_t ino[3]
757e9e6e0f6Smrg #elif defined (_AIX) && SIZEOF_INO_T == 4
758e9e6e0f6Smrg #define INO_T_CPP ino64_t ino
7594fee23f9Smrg #else
7604fee23f9Smrg #define INO_T_CPP ino_t ino
7614fee23f9Smrg #endif
7624fee23f9Smrg
763e9e6e0f6Smrg #if defined (_AIX) && SIZEOF_DEV_T == 4
764e9e6e0f6Smrg #define DEV_T_CPP dev64_t dev
765e9e6e0f6Smrg #else
766e9e6e0f6Smrg #define DEV_T_CPP dev_t dev
767e9e6e0f6Smrg #endif
768e9e6e0f6Smrg
7694fee23f9Smrg /* Chain of directories to look for include files in. */
7704fee23f9Smrg struct cpp_dir
7714fee23f9Smrg {
7724fee23f9Smrg /* NULL-terminated singly-linked list. */
7734fee23f9Smrg struct cpp_dir *next;
7744fee23f9Smrg
7754fee23f9Smrg /* NAME of the directory, NUL-terminated. */
7764fee23f9Smrg char *name;
7774fee23f9Smrg unsigned int len;
7784fee23f9Smrg
7794fee23f9Smrg /* One if a system header, two if a system header that has extern
7804fee23f9Smrg "C" guards for C++. */
7814fee23f9Smrg unsigned char sysp;
7824fee23f9Smrg
7834fee23f9Smrg /* Is this a user-supplied directory? */
7844fee23f9Smrg bool user_supplied_p;
7854fee23f9Smrg
7864fee23f9Smrg /* The canonicalized NAME as determined by lrealpath. This field
7874fee23f9Smrg is only used by hosts that lack reliable inode numbers. */
7884fee23f9Smrg char *canonical_name;
7894fee23f9Smrg
7904fee23f9Smrg /* Mapping of file names for this directory for MS-DOS and related
7914fee23f9Smrg platforms. A NULL-terminated array of (from, to) pairs. */
7924fee23f9Smrg const char **name_map;
7934fee23f9Smrg
7944fee23f9Smrg /* Routine to construct pathname, given the search path name and the
7954fee23f9Smrg HEADER we are trying to find, return a constructed pathname to
7964fee23f9Smrg try and open. If this is NULL, the constructed pathname is as
7974fee23f9Smrg constructed by append_file_to_dir. */
7984fee23f9Smrg char *(*construct) (const char *header, cpp_dir *dir);
7994fee23f9Smrg
8004fee23f9Smrg /* The C front end uses these to recognize duplicated
8014fee23f9Smrg directories in the search path. */
8024fee23f9Smrg INO_T_CPP;
803e9e6e0f6Smrg DEV_T_CPP;
8044fee23f9Smrg };
8054fee23f9Smrg
806654d12c0Smrg /* The kind of the cpp_macro. */
807654d12c0Smrg enum cpp_macro_kind {
808654d12c0Smrg cmk_macro, /* An ISO macro (token expansion). */
809654d12c0Smrg cmk_assert, /* An assertion. */
810654d12c0Smrg cmk_traditional /* A traditional macro (text expansion). */
811654d12c0Smrg };
812654d12c0Smrg
813654d12c0Smrg /* Each macro definition is recorded in a cpp_macro structure.
814654d12c0Smrg Variadic macros cannot occur with traditional cpp. */
815654d12c0Smrg struct GTY(()) cpp_macro {
816654d12c0Smrg union cpp_parm_u
817654d12c0Smrg {
818654d12c0Smrg /* Parameters, if any. If parameter names use extended identifiers,
819654d12c0Smrg the original spelling of those identifiers, not the canonical
820654d12c0Smrg UTF-8 spelling, goes here. */
821654d12c0Smrg cpp_hashnode ** GTY ((tag ("false"),
822654d12c0Smrg nested_ptr (union tree_node,
823654d12c0Smrg "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
824654d12c0Smrg "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL"),
825654d12c0Smrg length ("%1.paramc"))) params;
826654d12c0Smrg
827654d12c0Smrg /* If this is an assertion, the next one in the chain. */
828654d12c0Smrg cpp_macro *GTY ((tag ("true"))) next;
829654d12c0Smrg } GTY ((desc ("%1.kind == cmk_assert"))) parm;
830654d12c0Smrg
831654d12c0Smrg /* Definition line number. */
832654d12c0Smrg location_t line;
833654d12c0Smrg
834654d12c0Smrg /* Number of tokens in body, or bytes for traditional macros. */
835654d12c0Smrg /* Do we really need 2^32-1 range here? */
836654d12c0Smrg unsigned int count;
837654d12c0Smrg
838654d12c0Smrg /* Number of parameters. */
839654d12c0Smrg unsigned short paramc;
840654d12c0Smrg
841654d12c0Smrg /* Non-zero if this is a user-lazy macro, value provided by user. */
842654d12c0Smrg unsigned char lazy;
843654d12c0Smrg
844654d12c0Smrg /* The kind of this macro (ISO, trad or assert) */
845654d12c0Smrg unsigned kind : 2;
846654d12c0Smrg
847654d12c0Smrg /* If a function-like macro. */
848654d12c0Smrg unsigned int fun_like : 1;
849654d12c0Smrg
850654d12c0Smrg /* If a variadic macro. */
851654d12c0Smrg unsigned int variadic : 1;
852654d12c0Smrg
853654d12c0Smrg /* If macro defined in system header. */
854654d12c0Smrg unsigned int syshdr : 1;
855654d12c0Smrg
856654d12c0Smrg /* Nonzero if it has been expanded or had its existence tested. */
857654d12c0Smrg unsigned int used : 1;
858654d12c0Smrg
859654d12c0Smrg /* Indicate whether the tokens include extra CPP_PASTE tokens at the
860654d12c0Smrg end to track invalid redefinitions with consecutive CPP_PASTE
861654d12c0Smrg tokens. */
862654d12c0Smrg unsigned int extra_tokens : 1;
863654d12c0Smrg
864e9e6e0f6Smrg /* Imported C++20 macro (from a header unit). */
865e9e6e0f6Smrg unsigned int imported_p : 1;
866e9e6e0f6Smrg
867e9e6e0f6Smrg /* 0 bits spare (32-bit). 32 on 64-bit target. */
868654d12c0Smrg
869654d12c0Smrg union cpp_exp_u
870654d12c0Smrg {
871654d12c0Smrg /* Trailing array of replacement tokens (ISO), or assertion body value. */
872654d12c0Smrg cpp_token GTY ((tag ("false"), length ("%1.count"))) tokens[1];
873654d12c0Smrg
874654d12c0Smrg /* Pointer to replacement text (traditional). See comment at top
875654d12c0Smrg of cpptrad.c for how traditional function-like macros are
876654d12c0Smrg encoded. */
877654d12c0Smrg const unsigned char *GTY ((tag ("true"))) text;
878654d12c0Smrg } GTY ((desc ("%1.kind == cmk_traditional"))) exp;
879654d12c0Smrg };
880654d12c0Smrg
881654d12c0Smrg /* Poisoned identifiers are flagged NODE_POISONED. NODE_OPERATOR (C++
882654d12c0Smrg only) indicates an identifier that behaves like an operator such as
883654d12c0Smrg "xor". NODE_DIAGNOSTIC is for speed in lex_token: it indicates a
8844fee23f9Smrg diagnostic may be required for this node. Currently this only
8854fee23f9Smrg applies to __VA_ARGS__, poisoned identifiers, and -Wc++-compat
8864fee23f9Smrg warnings about NODE_OPERATOR. */
8874fee23f9Smrg
8884fee23f9Smrg /* Hash node flags. */
8894fee23f9Smrg #define NODE_OPERATOR (1 << 0) /* C++ named operator. */
8904fee23f9Smrg #define NODE_POISONED (1 << 1) /* Poisoned identifier. */
891654d12c0Smrg #define NODE_DIAGNOSTIC (1 << 2) /* Possible diagnostic when lexed. */
892654d12c0Smrg #define NODE_WARN (1 << 3) /* Warn if redefined or undefined. */
893654d12c0Smrg #define NODE_DISABLED (1 << 4) /* A disabled macro. */
894654d12c0Smrg #define NODE_USED (1 << 5) /* Dumped with -dU. */
895654d12c0Smrg #define NODE_CONDITIONAL (1 << 6) /* Conditional macro */
896654d12c0Smrg #define NODE_WARN_OPERATOR (1 << 7) /* Warn about C++ named operator. */
897e9e6e0f6Smrg #define NODE_MODULE (1 << 8) /* C++-20 module-related name. */
8984fee23f9Smrg
8994fee23f9Smrg /* Different flavors of hash node. */
9004fee23f9Smrg enum node_type
9014fee23f9Smrg {
902654d12c0Smrg NT_VOID = 0, /* Maybe an assert? */
903654d12c0Smrg NT_MACRO_ARG, /* A macro arg. */
904654d12c0Smrg NT_USER_MACRO, /* A user macro. */
905654d12c0Smrg NT_BUILTIN_MACRO, /* A builtin macro. */
906654d12c0Smrg NT_MACRO_MASK = NT_USER_MACRO /* Mask for either macro kind. */
9074fee23f9Smrg };
9084fee23f9Smrg
9094fee23f9Smrg /* Different flavors of builtin macro. _Pragma is an operator, but we
9104fee23f9Smrg handle it with the builtin code for efficiency reasons. */
9114fee23f9Smrg enum cpp_builtin_type
9124fee23f9Smrg {
9134fee23f9Smrg BT_SPECLINE = 0, /* `__LINE__' */
9144fee23f9Smrg BT_DATE, /* `__DATE__' */
9154fee23f9Smrg BT_FILE, /* `__FILE__' */
916e9e6e0f6Smrg BT_FILE_NAME, /* `__FILE_NAME__' */
9174fee23f9Smrg BT_BASE_FILE, /* `__BASE_FILE__' */
9184fee23f9Smrg BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
9194fee23f9Smrg BT_TIME, /* `__TIME__' */
9204fee23f9Smrg BT_STDC, /* `__STDC__' */
9214fee23f9Smrg BT_PRAGMA, /* `_Pragma' operator */
9224fee23f9Smrg BT_TIMESTAMP, /* `__TIMESTAMP__' */
92323da6d05Smrg BT_COUNTER, /* `__COUNTER__' */
92443265c03Smrg BT_HAS_ATTRIBUTE, /* `__has_attribute(x)' */
925e9e6e0f6Smrg BT_HAS_STD_ATTRIBUTE, /* `__has_c_attribute(x)' */
92643265c03Smrg BT_HAS_BUILTIN, /* `__has_builtin(x)' */
92743265c03Smrg BT_HAS_INCLUDE, /* `__has_include(x)' */
92843265c03Smrg BT_HAS_INCLUDE_NEXT /* `__has_include_next(x)' */
9294fee23f9Smrg };
9304fee23f9Smrg
9314fee23f9Smrg #define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))
932654d12c0Smrg #define HT_NODE(NODE) (&(NODE)->ident)
933654d12c0Smrg #define NODE_LEN(NODE) HT_LEN (HT_NODE (NODE))
934654d12c0Smrg #define NODE_NAME(NODE) HT_STR (HT_NODE (NODE))
9354fee23f9Smrg
9364fee23f9Smrg /* The common part of an identifier node shared amongst all 3 C front
9374fee23f9Smrg ends. Also used to store CPP identifiers, which are a superset of
9384fee23f9Smrg identifiers in the grammatical sense. */
9394fee23f9Smrg
9404fee23f9Smrg union GTY(()) _cpp_hashnode_value {
941654d12c0Smrg /* Assert (maybe NULL) */
942654d12c0Smrg cpp_macro * GTY((tag ("NT_VOID"))) answers;
943e9e6e0f6Smrg /* Macro (maybe NULL) */
944654d12c0Smrg cpp_macro * GTY((tag ("NT_USER_MACRO"))) macro;
9454fee23f9Smrg /* Code for a builtin macro. */
946654d12c0Smrg enum cpp_builtin_type GTY ((tag ("NT_BUILTIN_MACRO"))) builtin;
9474fee23f9Smrg /* Macro argument index. */
948654d12c0Smrg unsigned short GTY ((tag ("NT_MACRO_ARG"))) arg_index;
9494fee23f9Smrg };
9504fee23f9Smrg
9514fee23f9Smrg struct GTY(()) cpp_hashnode {
9524fee23f9Smrg struct ht_identifier ident;
9534fee23f9Smrg unsigned int is_directive : 1;
9544fee23f9Smrg unsigned int directive_index : 7; /* If is_directive,
9554fee23f9Smrg then index into directive table.
9564fee23f9Smrg Otherwise, a NODE_OPERATOR. */
957e9e6e0f6Smrg unsigned int rid_code : 8; /* Rid code - for front ends. */
958e9e6e0f6Smrg unsigned int flags : 9; /* CPP flags. */
959654d12c0Smrg ENUM_BITFIELD(node_type) type : 2; /* CPP node type. */
9604fee23f9Smrg
961e9e6e0f6Smrg /* 5 bits spare. */
962e9e6e0f6Smrg
963e9e6e0f6Smrg /* The deferred cookie is applicable to NT_USER_MACRO or NT_VOID.
964e9e6e0f6Smrg The latter for when a macro had a prevailing undef.
965e9e6e0f6Smrg On a 64-bit system there would be 32-bits of padding to the value
966e9e6e0f6Smrg field. So placing the deferred index here is not costly. */
967e9e6e0f6Smrg unsigned deferred; /* Deferred cookie */
968654d12c0Smrg
969654d12c0Smrg union _cpp_hashnode_value GTY ((desc ("%1.type"))) value;
9704fee23f9Smrg };
9714fee23f9Smrg
972a41324a9Smrg /* A class for iterating through the source locations within a
973a41324a9Smrg string token (before escapes are interpreted, and before
974a41324a9Smrg concatenation). */
975a41324a9Smrg
976a41324a9Smrg class cpp_string_location_reader {
977a41324a9Smrg public:
978654d12c0Smrg cpp_string_location_reader (location_t src_loc,
979a41324a9Smrg line_maps *line_table);
980a41324a9Smrg
981a41324a9Smrg source_range get_next ();
982a41324a9Smrg
983a41324a9Smrg private:
984654d12c0Smrg location_t m_loc;
985a41324a9Smrg int m_offset_per_column;
986a41324a9Smrg };
987a41324a9Smrg
988a41324a9Smrg /* A class for storing the source ranges of all of the characters within
989a41324a9Smrg a string literal, after escapes are interpreted, and after
990a41324a9Smrg concatenation.
991a41324a9Smrg
992a41324a9Smrg This is not GTY-marked, as instances are intended to be temporary. */
993a41324a9Smrg
994a41324a9Smrg class cpp_substring_ranges
995a41324a9Smrg {
996a41324a9Smrg public:
997a41324a9Smrg cpp_substring_ranges ();
998a41324a9Smrg ~cpp_substring_ranges ();
999a41324a9Smrg
get_num_ranges()1000a41324a9Smrg int get_num_ranges () const { return m_num_ranges; }
get_range(int idx)1001a41324a9Smrg source_range get_range (int idx) const
1002a41324a9Smrg {
1003a41324a9Smrg linemap_assert (idx < m_num_ranges);
1004a41324a9Smrg return m_ranges[idx];
1005a41324a9Smrg }
1006a41324a9Smrg
1007a41324a9Smrg void add_range (source_range range);
1008a41324a9Smrg void add_n_ranges (int num, cpp_string_location_reader &loc_reader);
1009a41324a9Smrg
1010a41324a9Smrg private:
1011a41324a9Smrg source_range *m_ranges;
1012a41324a9Smrg int m_num_ranges;
1013a41324a9Smrg int m_alloc_ranges;
1014a41324a9Smrg };
1015a41324a9Smrg
10164fee23f9Smrg /* Call this first to get a handle to pass to other functions.
10174fee23f9Smrg
10184fee23f9Smrg If you want cpplib to manage its own hashtable, pass in a NULL
10194fee23f9Smrg pointer. Otherwise you should pass in an initialized hash table
10204fee23f9Smrg that cpplib will share; this technique is used by the C front
10214fee23f9Smrg ends. */
10224fee23f9Smrg extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *,
102343265c03Smrg class line_maps *);
10244fee23f9Smrg
10254fee23f9Smrg /* Reset the cpp_reader's line_map. This is only used after reading a
10264fee23f9Smrg PCH file. */
102743265c03Smrg extern void cpp_set_line_map (cpp_reader *, class line_maps *);
10284fee23f9Smrg
10294fee23f9Smrg /* Call this to change the selected language standard (e.g. because of
10304fee23f9Smrg command line options). */
10314fee23f9Smrg extern void cpp_set_lang (cpp_reader *, enum c_lang);
10324fee23f9Smrg
10334fee23f9Smrg /* Set the include paths. */
10344fee23f9Smrg extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
10354fee23f9Smrg
10362f4e9d03Smrg /* Provide src:dst pair for __FILE__ remapping. */
10372f4e9d03Smrg extern void add_cpp_remap_path (const char *);
10382f4e9d03Smrg
10394fee23f9Smrg /* Call these to get pointers to the options, callback, and deps
10404fee23f9Smrg structures for a given reader. These pointers are good until you
10414fee23f9Smrg call cpp_finish on that reader. You can either edit the callbacks
10424fee23f9Smrg through the pointer returned from cpp_get_callbacks, or set them
10434fee23f9Smrg with cpp_set_callbacks. */
1044e9e6e0f6Smrg extern cpp_options *cpp_get_options (cpp_reader *) ATTRIBUTE_PURE;
1045e9e6e0f6Smrg extern cpp_callbacks *cpp_get_callbacks (cpp_reader *) ATTRIBUTE_PURE;
10464fee23f9Smrg extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *);
1047e9e6e0f6Smrg extern class mkdeps *cpp_get_deps (cpp_reader *) ATTRIBUTE_PURE;
1048e9e6e0f6Smrg
1049e9e6e0f6Smrg extern const char *cpp_probe_header_unit (cpp_reader *, const char *file,
1050e9e6e0f6Smrg bool angle_p, location_t);
1051e9e6e0f6Smrg
1052e9e6e0f6Smrg /* Call these to get name data about the various compile-time
1053e9e6e0f6Smrg charsets. */
1054e9e6e0f6Smrg extern const char *cpp_get_narrow_charset_name (cpp_reader *) ATTRIBUTE_PURE;
1055e9e6e0f6Smrg extern const char *cpp_get_wide_charset_name (cpp_reader *) ATTRIBUTE_PURE;
10564fee23f9Smrg
10574fee23f9Smrg /* This function reads the file, but does not start preprocessing. It
10584fee23f9Smrg returns the name of the original file; this is the same as the
10594fee23f9Smrg input file, except for preprocessed input. This will generate at
10604fee23f9Smrg least one file change callback, and possibly a line change callback
10614fee23f9Smrg too. If there was an error opening the file, it returns NULL. */
1062e9e6e0f6Smrg extern const char *cpp_read_main_file (cpp_reader *, const char *,
1063e9e6e0f6Smrg bool injecting = false);
1064e9e6e0f6Smrg extern location_t cpp_main_loc (const cpp_reader *);
1065e9e6e0f6Smrg
1066e9e6e0f6Smrg /* Adjust for the main file to be an include. */
1067e9e6e0f6Smrg extern void cpp_retrofit_as_include (cpp_reader *);
10684fee23f9Smrg
10694fee23f9Smrg /* Set up built-ins with special behavior. Use cpp_init_builtins()
10704fee23f9Smrg instead unless your know what you are doing. */
10714fee23f9Smrg extern void cpp_init_special_builtins (cpp_reader *);
10724fee23f9Smrg
10734fee23f9Smrg /* Set up built-ins like __FILE__. */
10744fee23f9Smrg extern void cpp_init_builtins (cpp_reader *, int);
10754fee23f9Smrg
10764fee23f9Smrg /* This is called after options have been parsed, and partially
10774fee23f9Smrg processed. */
10784fee23f9Smrg extern void cpp_post_options (cpp_reader *);
10794fee23f9Smrg
10804fee23f9Smrg /* Set up translation to the target character set. */
10814fee23f9Smrg extern void cpp_init_iconv (cpp_reader *);
10824fee23f9Smrg
10834fee23f9Smrg /* Call this to finish preprocessing. If you requested dependency
10844fee23f9Smrg generation, pass an open stream to write the information to,
10854fee23f9Smrg otherwise NULL. It is your responsibility to close the stream. */
10864fee23f9Smrg extern void cpp_finish (cpp_reader *, FILE *deps_stream);
10874fee23f9Smrg
10884fee23f9Smrg /* Call this to release the handle at the end of preprocessing. Any
10894fee23f9Smrg use of the handle after this function returns is invalid. */
10904fee23f9Smrg extern void cpp_destroy (cpp_reader *);
10914fee23f9Smrg
10924fee23f9Smrg extern unsigned int cpp_token_len (const cpp_token *);
10934fee23f9Smrg extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
10944fee23f9Smrg extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
10954fee23f9Smrg unsigned char *, bool);
10964fee23f9Smrg extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
10974fee23f9Smrg void (*) (cpp_reader *), bool);
10984fee23f9Smrg extern void cpp_register_deferred_pragma (cpp_reader *, const char *,
10994fee23f9Smrg const char *, unsigned, bool, bool);
11004fee23f9Smrg extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
11014fee23f9Smrg const cpp_token *);
11024fee23f9Smrg extern const cpp_token *cpp_get_token (cpp_reader *);
11034fee23f9Smrg extern const cpp_token *cpp_get_token_with_location (cpp_reader *,
1104654d12c0Smrg location_t *);
cpp_user_macro_p(const cpp_hashnode * node)1105654d12c0Smrg inline bool cpp_user_macro_p (const cpp_hashnode *node)
1106654d12c0Smrg {
1107654d12c0Smrg return node->type == NT_USER_MACRO;
1108654d12c0Smrg }
cpp_builtin_macro_p(const cpp_hashnode * node)1109654d12c0Smrg inline bool cpp_builtin_macro_p (const cpp_hashnode *node)
1110654d12c0Smrg {
1111654d12c0Smrg return node->type == NT_BUILTIN_MACRO;
1112654d12c0Smrg }
cpp_macro_p(const cpp_hashnode * node)1113654d12c0Smrg inline bool cpp_macro_p (const cpp_hashnode *node)
1114654d12c0Smrg {
1115654d12c0Smrg return node->type & NT_MACRO_MASK;
1116654d12c0Smrg }
1117e9e6e0f6Smrg inline cpp_macro *cpp_set_deferred_macro (cpp_hashnode *node,
1118e9e6e0f6Smrg cpp_macro *forced = NULL)
1119e9e6e0f6Smrg {
1120e9e6e0f6Smrg cpp_macro *old = node->value.macro;
1121e9e6e0f6Smrg
1122e9e6e0f6Smrg node->value.macro = forced;
1123e9e6e0f6Smrg node->type = NT_USER_MACRO;
1124e9e6e0f6Smrg node->flags &= ~NODE_USED;
1125e9e6e0f6Smrg
1126e9e6e0f6Smrg return old;
1127e9e6e0f6Smrg }
1128e9e6e0f6Smrg cpp_macro *cpp_get_deferred_macro (cpp_reader *, cpp_hashnode *, location_t);
1129654d12c0Smrg
1130654d12c0Smrg /* Returns true if NODE is a function-like user macro. */
cpp_fun_like_macro_p(cpp_hashnode * node)1131654d12c0Smrg inline bool cpp_fun_like_macro_p (cpp_hashnode *node)
1132654d12c0Smrg {
1133654d12c0Smrg return cpp_user_macro_p (node) && node->value.macro->fun_like;
1134654d12c0Smrg }
1135654d12c0Smrg
1136e9e6e0f6Smrg extern const unsigned char *cpp_macro_definition (cpp_reader *, cpp_hashnode *);
1137e9e6e0f6Smrg extern const unsigned char *cpp_macro_definition (cpp_reader *, cpp_hashnode *,
1138e9e6e0f6Smrg const cpp_macro *);
cpp_macro_definition_location(cpp_hashnode * node)1139654d12c0Smrg inline location_t cpp_macro_definition_location (cpp_hashnode *node)
1140654d12c0Smrg {
1141e9e6e0f6Smrg const cpp_macro *macro = node->value.macro;
1142e9e6e0f6Smrg return macro ? macro->line : 0;
1143654d12c0Smrg }
1144e9e6e0f6Smrg /* Return an idempotent time stamp (possibly from SOURCE_DATE_EPOCH). */
1145e9e6e0f6Smrg enum class CPP_time_kind
1146e9e6e0f6Smrg {
1147e9e6e0f6Smrg FIXED = -1, /* Fixed time via source epoch. */
1148e9e6e0f6Smrg DYNAMIC = -2, /* Dynamic via time(2). */
1149e9e6e0f6Smrg UNKNOWN = -3 /* Wibbly wobbly, timey wimey. */
1150e9e6e0f6Smrg };
1151e9e6e0f6Smrg extern CPP_time_kind cpp_get_date (cpp_reader *, time_t *);
1152e9e6e0f6Smrg
11534fee23f9Smrg extern void _cpp_backup_tokens (cpp_reader *, unsigned int);
11544fee23f9Smrg extern const cpp_token *cpp_peek_token (cpp_reader *, int);
11554fee23f9Smrg
11564fee23f9Smrg /* Evaluate a CPP_*CHAR* token. */
11574fee23f9Smrg extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *,
11584fee23f9Smrg unsigned int *, int *);
11594fee23f9Smrg /* Evaluate a vector of CPP_*STRING* tokens. */
11604fee23f9Smrg extern bool cpp_interpret_string (cpp_reader *,
11614fee23f9Smrg const cpp_string *, size_t,
11624fee23f9Smrg cpp_string *, enum cpp_ttype);
1163a41324a9Smrg extern const char *cpp_interpret_string_ranges (cpp_reader *pfile,
1164a41324a9Smrg const cpp_string *from,
1165a41324a9Smrg cpp_string_location_reader *,
1166a41324a9Smrg size_t count,
1167a41324a9Smrg cpp_substring_ranges *out,
1168a41324a9Smrg enum cpp_ttype type);
11694fee23f9Smrg extern bool cpp_interpret_string_notranslate (cpp_reader *,
11704fee23f9Smrg const cpp_string *, size_t,
11714fee23f9Smrg cpp_string *, enum cpp_ttype);
11724fee23f9Smrg
11734fee23f9Smrg /* Convert a host character constant to the execution character set. */
11744fee23f9Smrg extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
11754fee23f9Smrg
11764fee23f9Smrg /* Used to register macros and assertions, perhaps from the command line.
11774fee23f9Smrg The text is the same as the command line argument. */
11784fee23f9Smrg extern void cpp_define (cpp_reader *, const char *);
1179e9e6e0f6Smrg extern void cpp_define_unused (cpp_reader *, const char *);
11804fee23f9Smrg extern void cpp_define_formatted (cpp_reader *pfile,
11814fee23f9Smrg const char *fmt, ...) ATTRIBUTE_PRINTF_2;
1182e9e6e0f6Smrg extern void cpp_define_formatted_unused (cpp_reader *pfile,
1183e9e6e0f6Smrg const char *fmt,
1184e9e6e0f6Smrg ...) ATTRIBUTE_PRINTF_2;
11854fee23f9Smrg extern void cpp_assert (cpp_reader *, const char *);
11864fee23f9Smrg extern void cpp_undef (cpp_reader *, const char *);
11874fee23f9Smrg extern void cpp_unassert (cpp_reader *, const char *);
11884fee23f9Smrg
1189654d12c0Smrg /* Mark a node as a lazily defined macro. */
1190654d12c0Smrg extern void cpp_define_lazily (cpp_reader *, cpp_hashnode *node, unsigned N);
1191654d12c0Smrg
11924fee23f9Smrg /* Undefine all macros and assertions. */
11934fee23f9Smrg extern void cpp_undef_all (cpp_reader *);
11944fee23f9Smrg
11954fee23f9Smrg extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *,
11964fee23f9Smrg size_t, int);
11974fee23f9Smrg extern int cpp_defined (cpp_reader *, const unsigned char *, int);
11984fee23f9Smrg
11994fee23f9Smrg /* A preprocessing number. Code assumes that any unused high bits of
12004fee23f9Smrg the double integer are set to zero. */
1201d35849d0Smrg
1202d35849d0Smrg /* This type has to be equal to unsigned HOST_WIDE_INT, see
1203e9e6e0f6Smrg gcc/c-family/c-lex.cc. */
1204d35849d0Smrg typedef uint64_t cpp_num_part;
12054fee23f9Smrg typedef struct cpp_num cpp_num;
12064fee23f9Smrg struct cpp_num
12074fee23f9Smrg {
12084fee23f9Smrg cpp_num_part high;
12094fee23f9Smrg cpp_num_part low;
12104fee23f9Smrg bool unsignedp; /* True if value should be treated as unsigned. */
12114fee23f9Smrg bool overflow; /* True if the most recent calculation overflowed. */
12124fee23f9Smrg };
12134fee23f9Smrg
12144fee23f9Smrg /* cpplib provides two interfaces for interpretation of preprocessing
12154fee23f9Smrg numbers.
12164fee23f9Smrg
12174fee23f9Smrg cpp_classify_number categorizes numeric constants according to
12184fee23f9Smrg their field (integer, floating point, or invalid), radix (decimal,
12194fee23f9Smrg octal, hexadecimal), and type suffixes. */
12204fee23f9Smrg
12214fee23f9Smrg #define CPP_N_CATEGORY 0x000F
12224fee23f9Smrg #define CPP_N_INVALID 0x0000
12234fee23f9Smrg #define CPP_N_INTEGER 0x0001
12244fee23f9Smrg #define CPP_N_FLOATING 0x0002
12254fee23f9Smrg
12264fee23f9Smrg #define CPP_N_WIDTH 0x00F0
1227a41324a9Smrg #define CPP_N_SMALL 0x0010 /* int, float, short _Fract/Accum */
12284fee23f9Smrg #define CPP_N_MEDIUM 0x0020 /* long, double, long _Fract/_Accum. */
12294fee23f9Smrg #define CPP_N_LARGE 0x0040 /* long long, long double,
12304fee23f9Smrg long long _Fract/Accum. */
12314fee23f9Smrg
12324fee23f9Smrg #define CPP_N_WIDTH_MD 0xF0000 /* machine defined. */
12334fee23f9Smrg #define CPP_N_MD_W 0x10000
12344fee23f9Smrg #define CPP_N_MD_Q 0x20000
12354fee23f9Smrg
12364fee23f9Smrg #define CPP_N_RADIX 0x0F00
12374fee23f9Smrg #define CPP_N_DECIMAL 0x0100
12384fee23f9Smrg #define CPP_N_HEX 0x0200
12394fee23f9Smrg #define CPP_N_OCTAL 0x0400
12404fee23f9Smrg #define CPP_N_BINARY 0x0800
12414fee23f9Smrg
12424fee23f9Smrg #define CPP_N_UNSIGNED 0x1000 /* Properties. */
12434fee23f9Smrg #define CPP_N_IMAGINARY 0x2000
12444fee23f9Smrg #define CPP_N_DFLOAT 0x4000
12454fee23f9Smrg #define CPP_N_DEFAULT 0x8000
12464fee23f9Smrg
12474fee23f9Smrg #define CPP_N_FRACT 0x100000 /* Fract types. */
12484fee23f9Smrg #define CPP_N_ACCUM 0x200000 /* Accum types. */
1249a41324a9Smrg #define CPP_N_FLOATN 0x400000 /* _FloatN types. */
1250a41324a9Smrg #define CPP_N_FLOATNX 0x800000 /* _FloatNx types. */
12514fee23f9Smrg
1252e9e6e0f6Smrg #define CPP_N_USERDEF 0x1000000 /* C++11 user-defined literal. */
1253e9e6e0f6Smrg
1254e9e6e0f6Smrg #define CPP_N_SIZE_T 0x2000000 /* C++23 size_t literal. */
125523da6d05Smrg
1256a41324a9Smrg #define CPP_N_WIDTH_FLOATN_NX 0xF0000000 /* _FloatN / _FloatNx value
1257a41324a9Smrg of N, divided by 16. */
1258a41324a9Smrg #define CPP_FLOATN_SHIFT 24
1259a41324a9Smrg #define CPP_FLOATN_MAX 0xF0
1260a41324a9Smrg
12614fee23f9Smrg /* Classify a CPP_NUMBER token. The return value is a combination of
12624fee23f9Smrg the flags from the above sets. */
126323da6d05Smrg extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *,
1264654d12c0Smrg const char **, location_t);
126523da6d05Smrg
126623da6d05Smrg /* Return the classification flags for a float suffix. */
126723da6d05Smrg extern unsigned int cpp_interpret_float_suffix (cpp_reader *, const char *,
126823da6d05Smrg size_t);
126923da6d05Smrg
127023da6d05Smrg /* Return the classification flags for an int suffix. */
127123da6d05Smrg extern unsigned int cpp_interpret_int_suffix (cpp_reader *, const char *,
127223da6d05Smrg size_t);
12734fee23f9Smrg
12744fee23f9Smrg /* Evaluate a token classified as category CPP_N_INTEGER. */
12754fee23f9Smrg extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
127623da6d05Smrg unsigned int);
12774fee23f9Smrg
12784fee23f9Smrg /* Sign extend a number, with PRECISION significant bits and all
12794fee23f9Smrg others assumed clear, to fill out a cpp_num structure. */
12804fee23f9Smrg cpp_num cpp_num_sign_extend (cpp_num, size_t);
12814fee23f9Smrg
12824fee23f9Smrg /* Output a diagnostic of some kind. */
1283654d12c0Smrg extern bool cpp_error (cpp_reader *, enum cpp_diagnostic_level,
1284654d12c0Smrg const char *msgid, ...)
12854fee23f9Smrg ATTRIBUTE_PRINTF_3;
1286654d12c0Smrg extern bool cpp_warning (cpp_reader *, enum cpp_warning_reason,
1287654d12c0Smrg const char *msgid, ...)
128823da6d05Smrg ATTRIBUTE_PRINTF_3;
1289654d12c0Smrg extern bool cpp_pedwarning (cpp_reader *, enum cpp_warning_reason,
1290654d12c0Smrg const char *msgid, ...)
129123da6d05Smrg ATTRIBUTE_PRINTF_3;
1292654d12c0Smrg extern bool cpp_warning_syshdr (cpp_reader *, enum cpp_warning_reason reason,
1293654d12c0Smrg const char *msgid, ...)
129423da6d05Smrg ATTRIBUTE_PRINTF_3;
12954fee23f9Smrg
1296e9e6e0f6Smrg /* As their counterparts above, but use RICHLOC. */
1297e9e6e0f6Smrg extern bool cpp_warning_at (cpp_reader *, enum cpp_warning_reason,
1298e9e6e0f6Smrg rich_location *richloc, const char *msgid, ...)
1299e9e6e0f6Smrg ATTRIBUTE_PRINTF_4;
1300e9e6e0f6Smrg extern bool cpp_pedwarning_at (cpp_reader *, enum cpp_warning_reason,
1301e9e6e0f6Smrg rich_location *richloc, const char *msgid, ...)
1302e9e6e0f6Smrg ATTRIBUTE_PRINTF_4;
1303e9e6e0f6Smrg
13044fee23f9Smrg /* Output a diagnostic with "MSGID: " preceding the
13054fee23f9Smrg error string of errno. No location is printed. */
1306654d12c0Smrg extern bool cpp_errno (cpp_reader *, enum cpp_diagnostic_level,
1307654d12c0Smrg const char *msgid);
1308d35849d0Smrg /* Similarly, but with "FILENAME: " instead of "MSGID: ", where
1309d35849d0Smrg the filename is not localized. */
1310654d12c0Smrg extern bool cpp_errno_filename (cpp_reader *, enum cpp_diagnostic_level,
1311654d12c0Smrg const char *filename, location_t loc);
13124fee23f9Smrg
13134fee23f9Smrg /* Same as cpp_error, except additionally specifies a position as a
13144fee23f9Smrg (translation unit) physical line and physical column. If the line is
13154fee23f9Smrg zero, then no location is printed. */
1316654d12c0Smrg extern bool cpp_error_with_line (cpp_reader *, enum cpp_diagnostic_level,
1317654d12c0Smrg location_t, unsigned,
1318654d12c0Smrg const char *msgid, ...)
131923da6d05Smrg ATTRIBUTE_PRINTF_5;
1320654d12c0Smrg extern bool cpp_warning_with_line (cpp_reader *, enum cpp_warning_reason,
1321654d12c0Smrg location_t, unsigned,
1322654d12c0Smrg const char *msgid, ...)
132323da6d05Smrg ATTRIBUTE_PRINTF_5;
1324654d12c0Smrg extern bool cpp_pedwarning_with_line (cpp_reader *, enum cpp_warning_reason,
1325654d12c0Smrg location_t, unsigned,
1326654d12c0Smrg const char *msgid, ...)
132723da6d05Smrg ATTRIBUTE_PRINTF_5;
1328654d12c0Smrg extern bool cpp_warning_with_line_syshdr (cpp_reader *, enum cpp_warning_reason,
1329654d12c0Smrg location_t, unsigned,
1330654d12c0Smrg const char *msgid, ...)
133123da6d05Smrg ATTRIBUTE_PRINTF_5;
13324fee23f9Smrg
1333654d12c0Smrg extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level,
1334654d12c0Smrg location_t src_loc, const char *msgid, ...)
1335a41324a9Smrg ATTRIBUTE_PRINTF_4;
1336a41324a9Smrg
1337654d12c0Smrg extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level,
1338654d12c0Smrg rich_location *richloc, const char *msgid, ...)
1339a41324a9Smrg ATTRIBUTE_PRINTF_4;
1340a41324a9Smrg
1341e9e6e0f6Smrg /* In lex.cc */
13424fee23f9Smrg extern int cpp_ideq (const cpp_token *, const char *);
13434fee23f9Smrg extern void cpp_output_line (cpp_reader *, FILE *);
13444fee23f9Smrg extern unsigned char *cpp_output_line_to_string (cpp_reader *,
13454fee23f9Smrg const unsigned char *);
1346e9e6e0f6Smrg extern const unsigned char *cpp_alloc_token_string
1347e9e6e0f6Smrg (cpp_reader *, const unsigned char *, unsigned);
13484fee23f9Smrg extern void cpp_output_token (const cpp_token *, FILE *);
13494fee23f9Smrg extern const char *cpp_type2name (enum cpp_ttype, unsigned char flags);
13504fee23f9Smrg /* Returns the value of an escape sequence, truncated to the correct
13514fee23f9Smrg target precision. PSTR points to the input pointer, which is just
13524fee23f9Smrg after the backslash. LIMIT is how much text we have. WIDE is true
13534fee23f9Smrg if the escape sequence is part of a wide character constant or
13544fee23f9Smrg string literal. Handles all relevant diagnostics. */
13554fee23f9Smrg extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr,
13564fee23f9Smrg const unsigned char *limit, int wide);
13574fee23f9Smrg
13584fee23f9Smrg /* Structure used to hold a comment block at a given location in the
13594fee23f9Smrg source code. */
13604fee23f9Smrg
13614fee23f9Smrg typedef struct
13624fee23f9Smrg {
13634fee23f9Smrg /* Text of the comment including the terminators. */
13644fee23f9Smrg char *comment;
13654fee23f9Smrg
13664fee23f9Smrg /* source location for the given comment. */
1367654d12c0Smrg location_t sloc;
13684fee23f9Smrg } cpp_comment;
13694fee23f9Smrg
13704fee23f9Smrg /* Structure holding all comments for a given cpp_reader. */
13714fee23f9Smrg
13724fee23f9Smrg typedef struct
13734fee23f9Smrg {
13744fee23f9Smrg /* table of comment entries. */
13754fee23f9Smrg cpp_comment *entries;
13764fee23f9Smrg
13774fee23f9Smrg /* number of actual entries entered in the table. */
13784fee23f9Smrg int count;
13794fee23f9Smrg
13804fee23f9Smrg /* number of entries allocated currently. */
13814fee23f9Smrg int allocated;
13824fee23f9Smrg } cpp_comment_table;
13834fee23f9Smrg
13844fee23f9Smrg /* Returns the table of comments encountered by the preprocessor. This
13854fee23f9Smrg table is only populated when pfile->state.save_comments is true. */
13864fee23f9Smrg extern cpp_comment_table *cpp_get_comments (cpp_reader *);
13874fee23f9Smrg
13884fee23f9Smrg /* In hash.c */
13894fee23f9Smrg
13904fee23f9Smrg /* Lookup an identifier in the hashtable. Puts the identifier in the
13914fee23f9Smrg table if it is not already there. */
13924fee23f9Smrg extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
13934fee23f9Smrg unsigned int);
13944fee23f9Smrg
13954fee23f9Smrg typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *);
13964fee23f9Smrg extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *);
13974fee23f9Smrg
1398e9e6e0f6Smrg /* In macro.cc */
13994fee23f9Smrg extern void cpp_scan_nooutput (cpp_reader *);
14004fee23f9Smrg extern int cpp_sys_macro_p (cpp_reader *);
14014fee23f9Smrg extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
14024fee23f9Smrg unsigned int);
1403e9e6e0f6Smrg extern bool cpp_compare_macros (const cpp_macro *macro1,
1404e9e6e0f6Smrg const cpp_macro *macro2);
14054fee23f9Smrg
1406e9e6e0f6Smrg /* In files.cc */
14074fee23f9Smrg extern bool cpp_included (cpp_reader *, const char *);
1408654d12c0Smrg extern bool cpp_included_before (cpp_reader *, const char *, location_t);
14094fee23f9Smrg extern void cpp_make_system_header (cpp_reader *, int, int);
14104fee23f9Smrg extern bool cpp_push_include (cpp_reader *, const char *);
141123da6d05Smrg extern bool cpp_push_default_include (cpp_reader *, const char *);
14124fee23f9Smrg extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
14134fee23f9Smrg extern const char *cpp_get_path (struct _cpp_file *);
14144fee23f9Smrg extern cpp_dir *cpp_get_dir (struct _cpp_file *);
14154fee23f9Smrg extern cpp_buffer *cpp_get_buffer (cpp_reader *);
14164fee23f9Smrg extern struct _cpp_file *cpp_get_file (cpp_buffer *);
14174fee23f9Smrg extern cpp_buffer *cpp_get_prev (cpp_buffer *);
14184fee23f9Smrg extern void cpp_clear_file_cache (cpp_reader *);
14194fee23f9Smrg
1420e9e6e0f6Smrg /* cpp_get_converted_source returns the contents of the given file, as it exists
1421e9e6e0f6Smrg after cpplib has read it and converted it from the input charset to the
1422e9e6e0f6Smrg source charset. Return struct will be zero-filled if the data could not be
1423e9e6e0f6Smrg read for any reason. The data starts at the DATA pointer, but the TO_FREE
1424e9e6e0f6Smrg pointer is what should be passed to free(), as there may be an offset. */
1425e9e6e0f6Smrg struct cpp_converted_source
1426e9e6e0f6Smrg {
1427e9e6e0f6Smrg char *to_free;
1428e9e6e0f6Smrg char *data;
1429e9e6e0f6Smrg size_t len;
1430e9e6e0f6Smrg };
1431e9e6e0f6Smrg cpp_converted_source cpp_get_converted_source (const char *fname,
1432e9e6e0f6Smrg const char *input_charset);
1433e9e6e0f6Smrg
1434e9e6e0f6Smrg /* In pch.cc */
14354fee23f9Smrg struct save_macro_data;
14364fee23f9Smrg extern int cpp_save_state (cpp_reader *, FILE *);
14374fee23f9Smrg extern int cpp_write_pch_deps (cpp_reader *, FILE *);
14384fee23f9Smrg extern int cpp_write_pch_state (cpp_reader *, FILE *);
14394fee23f9Smrg extern int cpp_valid_state (cpp_reader *, const char *, int);
14404fee23f9Smrg extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
14414fee23f9Smrg extern int cpp_read_state (cpp_reader *, const char *, FILE *,
14424fee23f9Smrg struct save_macro_data *);
14434fee23f9Smrg
1444e9e6e0f6Smrg /* In lex.cc */
1445654d12c0Smrg extern void cpp_force_token_locations (cpp_reader *, location_t);
144623da6d05Smrg extern void cpp_stop_forcing_token_locations (cpp_reader *);
1447e9e6e0f6Smrg enum CPP_DO_task
1448e9e6e0f6Smrg {
1449e9e6e0f6Smrg CPP_DO_print,
1450e9e6e0f6Smrg CPP_DO_location,
1451e9e6e0f6Smrg CPP_DO_token
1452e9e6e0f6Smrg };
145323da6d05Smrg
1454e9e6e0f6Smrg extern void cpp_directive_only_process (cpp_reader *pfile,
1455e9e6e0f6Smrg void *data,
1456e9e6e0f6Smrg void (*cb) (cpp_reader *,
1457e9e6e0f6Smrg CPP_DO_task,
1458e9e6e0f6Smrg void *data, ...));
1459e9e6e0f6Smrg
1460e9e6e0f6Smrg /* In expr.cc */
146123da6d05Smrg extern enum cpp_ttype cpp_userdef_string_remove_type
146223da6d05Smrg (enum cpp_ttype type);
146323da6d05Smrg extern enum cpp_ttype cpp_userdef_string_add_type
146423da6d05Smrg (enum cpp_ttype type);
146523da6d05Smrg extern enum cpp_ttype cpp_userdef_char_remove_type
146623da6d05Smrg (enum cpp_ttype type);
146723da6d05Smrg extern enum cpp_ttype cpp_userdef_char_add_type
146823da6d05Smrg (enum cpp_ttype type);
146923da6d05Smrg extern bool cpp_userdef_string_p
147023da6d05Smrg (enum cpp_ttype type);
147123da6d05Smrg extern bool cpp_userdef_char_p
147223da6d05Smrg (enum cpp_ttype type);
147323da6d05Smrg extern const char * cpp_get_userdef_suffix
147423da6d05Smrg (const cpp_token *);
147523da6d05Smrg
1476e9e6e0f6Smrg /* In charset.cc */
1477e9e6e0f6Smrg
1478e9e6e0f6Smrg /* The result of attempting to decode a run of UTF-8 bytes. */
1479e9e6e0f6Smrg
1480e9e6e0f6Smrg struct cpp_decoded_char
148143265c03Smrg {
1482e9e6e0f6Smrg const char *m_start_byte;
1483e9e6e0f6Smrg const char *m_next_byte;
1484e9e6e0f6Smrg
1485e9e6e0f6Smrg bool m_valid_ch;
1486e9e6e0f6Smrg cppchar_t m_ch;
1487e9e6e0f6Smrg };
1488e9e6e0f6Smrg
1489e9e6e0f6Smrg /* Information for mapping between code points and display columns.
1490e9e6e0f6Smrg
1491e9e6e0f6Smrg This is a tabstop value, along with a callback for getting the
1492e9e6e0f6Smrg widths of characters. Normally this callback is cpp_wcwidth, but we
1493e9e6e0f6Smrg support other schemes for escaping non-ASCII unicode as a series of
1494e9e6e0f6Smrg ASCII chars when printing the user's source code in diagnostic-show-locus.cc
1495e9e6e0f6Smrg
1496e9e6e0f6Smrg For example, consider:
1497e9e6e0f6Smrg - the Unicode character U+03C0 "GREEK SMALL LETTER PI" (UTF-8: 0xCF 0x80)
1498e9e6e0f6Smrg - the Unicode character U+1F642 "SLIGHTLY SMILING FACE"
1499e9e6e0f6Smrg (UTF-8: 0xF0 0x9F 0x99 0x82)
1500e9e6e0f6Smrg - the byte 0xBF (a stray trailing byte of a UTF-8 character)
1501e9e6e0f6Smrg Normally U+03C0 would occupy one display column, U+1F642
1502e9e6e0f6Smrg would occupy two display columns, and the stray byte would be
1503e9e6e0f6Smrg printed verbatim as one display column.
1504e9e6e0f6Smrg
1505e9e6e0f6Smrg However when escaping them as unicode code points as "<U+03C0>"
1506e9e6e0f6Smrg and "<U+1F642>" they occupy 8 and 9 display columns respectively,
1507e9e6e0f6Smrg and when escaping them as bytes as "<CF><80>" and "<F0><9F><99><82>"
1508e9e6e0f6Smrg they occupy 8 and 16 display columns respectively. In both cases
1509e9e6e0f6Smrg the stray byte is escaped to <BF> as 4 display columns. */
1510e9e6e0f6Smrg
1511e9e6e0f6Smrg struct cpp_char_column_policy
1512e9e6e0f6Smrg {
cpp_char_column_policycpp_char_column_policy1513e9e6e0f6Smrg cpp_char_column_policy (int tabstop,
1514e9e6e0f6Smrg int (*width_cb) (cppchar_t c))
1515e9e6e0f6Smrg : m_tabstop (tabstop),
1516e9e6e0f6Smrg m_undecoded_byte_width (1),
1517e9e6e0f6Smrg m_width_cb (width_cb)
1518e9e6e0f6Smrg {}
1519e9e6e0f6Smrg
1520e9e6e0f6Smrg int m_tabstop;
1521e9e6e0f6Smrg /* Width in display columns of a stray byte that isn't decodable
1522e9e6e0f6Smrg as UTF-8. */
1523e9e6e0f6Smrg int m_undecoded_byte_width;
1524e9e6e0f6Smrg int (*m_width_cb) (cppchar_t c);
1525e9e6e0f6Smrg };
1526e9e6e0f6Smrg
1527e9e6e0f6Smrg /* A class to manage the state while converting a UTF-8 sequence to cppchar_t
1528e9e6e0f6Smrg and computing the display width one character at a time. */
1529e9e6e0f6Smrg class cpp_display_width_computation {
1530e9e6e0f6Smrg public:
1531e9e6e0f6Smrg cpp_display_width_computation (const char *data, int data_length,
1532e9e6e0f6Smrg const cpp_char_column_policy &policy);
next_byte()1533e9e6e0f6Smrg const char *next_byte () const { return m_next; }
bytes_processed()1534e9e6e0f6Smrg int bytes_processed () const { return m_next - m_begin; }
bytes_left()1535e9e6e0f6Smrg int bytes_left () const { return m_bytes_left; }
done()1536e9e6e0f6Smrg bool done () const { return !bytes_left (); }
display_cols_processed()1537e9e6e0f6Smrg int display_cols_processed () const { return m_display_cols; }
1538e9e6e0f6Smrg
1539e9e6e0f6Smrg int process_next_codepoint (cpp_decoded_char *out);
1540e9e6e0f6Smrg int advance_display_cols (int n);
1541e9e6e0f6Smrg
1542e9e6e0f6Smrg private:
1543e9e6e0f6Smrg const char *const m_begin;
1544e9e6e0f6Smrg const char *m_next;
1545e9e6e0f6Smrg size_t m_bytes_left;
1546e9e6e0f6Smrg const cpp_char_column_policy &m_policy;
1547e9e6e0f6Smrg int m_display_cols;
1548e9e6e0f6Smrg };
1549e9e6e0f6Smrg
1550e9e6e0f6Smrg /* Convenience functions that are simple use cases for class
1551e9e6e0f6Smrg cpp_display_width_computation. Tab characters will be expanded to spaces
1552e9e6e0f6Smrg as determined by POLICY.m_tabstop, and non-printable-ASCII characters
1553e9e6e0f6Smrg will be escaped as per POLICY. */
1554e9e6e0f6Smrg
1555e9e6e0f6Smrg int cpp_byte_column_to_display_column (const char *data, int data_length,
1556e9e6e0f6Smrg int column,
1557e9e6e0f6Smrg const cpp_char_column_policy &policy);
cpp_display_width(const char * data,int data_length,const cpp_char_column_policy & policy)1558e9e6e0f6Smrg inline int cpp_display_width (const char *data, int data_length,
1559e9e6e0f6Smrg const cpp_char_column_policy &policy)
1560e9e6e0f6Smrg {
1561e9e6e0f6Smrg return cpp_byte_column_to_display_column (data, data_length, data_length,
1562e9e6e0f6Smrg policy);
156343265c03Smrg }
156443265c03Smrg int cpp_display_column_to_byte_column (const char *data, int data_length,
1565e9e6e0f6Smrg int display_col,
1566e9e6e0f6Smrg const cpp_char_column_policy &policy);
156743265c03Smrg int cpp_wcwidth (cppchar_t c);
156843265c03Smrg
1569e9e6e0f6Smrg bool cpp_input_conversion_is_trivial (const char *input_charset);
1570e9e6e0f6Smrg int cpp_check_utf8_bom (const char *data, size_t data_length);
1571e9e6e0f6Smrg
15724fee23f9Smrg #endif /* ! LIBCPP_CPPLIB_H */
1573