/* Copyright (c) 2017-2026 Griefer@Work                                       *
 *                                                                            *
 * This software is provided 'as-is', without any express or implied          *
 * warranty. In no event will the authors be held liable for any damages      *
 * arising from the use of this software.                                     *
 *                                                                            *
 * Permission is granted to anyone to use this software for any purpose,      *
 * including commercial applications, and to alter it and redistribute it     *
 * freely, subject to the following restrictions:                             *
 *                                                                            *
 * 1. The origin of this software must not be misrepresented; you must not    *
 *    claim that you wrote the original software. If you use this software    *
 *    in a product, an acknowledgement (see the following) in the product     *
 *    documentation is required:                                              *
 *    Portions Copyright (c) 2017-2026 Griefer@Work                           *
 * 2. Altered source versions must be plainly marked as such, and must not be *
 *    misrepresented as being the original software.                          *
 * 3. This notice may not be removed or altered from any source distribution. *
 */
/* clang-format off */
#ifndef GUARD_TPP_AMALGAMATION_H
#ifdef TPP_DEFS
/************************************************************************/
/* File: parts/defs.h                                                   */
/************************************************************************/
/********************************************************************************
 * Supplying your own keywords/warnings/extensions/etc. to TPP3:
 * >> #define TPP_CONFIG_USERDEFS_FILENAME "../../relative/path/to/your/defs.h"
 *
 * If defined, this is the (relative to "tpp-amalgamation.h") name of a file that
 * should be included in various places to define additional keywords/warnings/
 * extensions/etc. for integration into TPP3.
 ********************************************************************************
 *
 * While inside of this file, the following macros are pre-defined:
 *
 *
 * >> #define TPP_DEFS
 *    Defined, but no explicit meaning (for use in "#ifdef TPP_DEFS" to detect context)
 *    If you #include other files for "your/defs.h", you can use this macro prevent
 *    unexpected tokens from appearing within the definitions file.
 *
 *
 * >> #define TPP_KWD(id, string)  <magic>
 *    Define an additional keyword within "tpp_token_id" by the name "id".
 *    This keyword token is returned when an identifier equal to "string" was parsed.
 *    Example:
 *       >> TPP_KWD(KWD_function, "function")
 *    Your compiler can then check for the "function" keyword token like:
 *       >> if (tpp_lexer_gettok(LEXER) == KWD_function) {
 *       >>     ...
 *       >> }
 *
 *
 * >> #define TPP_KWD_FLAGS(id, flags_expr)  <magic>
 *    For use with "TPP_KWD": defines flags that should be associated with the keyword
 *    token "id". The given "flags_expr" parameter is allowed to be a runtime expression,
 *    and should evaluate to a set of `TPP_KEYWORD_FLAG_*', and can thus be used to encode
 *    the intended expansion values of builtins like `__has_extension()'.
 *    The specified "flags_expr" has access to the following pre-defined function:
 *       >> tpp_lexer *tpp_current_lexer(void);            // The current lexer
 *       >> tpp_keyword const *tpp_current_keyword(void);  // The current keyword
 *       >> tpp_token_id tpp_current_keyword_id(void);     // The current keyword ID
 *       WARNING: The state of the current lexer is undefined inside of "if_expr"!
 *                Do not appear to yield tokens, or modify "tpp_current_lexer()"
 *                in any way.
 *    Example:
 *       >> // Allow user-code to query support for "#pragma once" using "__has_extension(pragma_once)"
 *       >> TPP_KWD(pragma_once, "pragma_once")
 *       >> TPP_KWD_FLAGS(pragma_once, tpp_lexer_has(tpp_current_lexer(), PRAGMA_ONCE)
 *       >>                            ? TPP_KEYWORD_FLAG_HAS_EXTENSION
 *       >>                            ? 0)
 *    User-code can how evaluate the specified "flags_expr" like so:
 *       >> #if __has_extension(pragma_once)
 *       >> #pragma once
 *       >> #endif
 *
 *
 * >> #define TPP_EXTENSION(id, name, default)  <magic>
 *    Define an extension that can be tested-for using `tpp_lexer_getextension(LEXER, id)',
 *    and can be configured by user-code as `#pragma extension("-f<name>")'. The "default"
 *    argument is a compile-time constant expression specifying if the extension should be
 *    enabled (!= 0) or disabled (== 0) by default.
 *    Example:
 *       >> // "-fmy-cool-expresion" is enabled by default
 *       >> TPP_EXTENSION(EXT_MY_COOL_EXTENSION, "my-cool-expresion", 1)
 *    User-code can now control this extension like so:
 *       >> #pragma extension("-fmy-cool-expresion")    // Enable
 *       >> #pragma extension("-fno-my-cool-expresion") // Disable
 *    During compilation, you can check if the extension is currently enabled:
 *       >> if (tpp_lexer_getextension(LEXER, EXT_MY_COOL_EXTENSION)) {
 *       >>     ...
 *       >> }
 *    When "TPP_HAVE_EXTENSIONS" is disabled, uses of this macro are ignored
 *
 *
 * >> #define TPP_WGROUP(wgroup_id, names, default)  <magic>
 *    Define a warning group identified by "wgroup_id" and addressable by the
 *    specified "names" (which must be a "preprocessor tuple"). The "default"
 *    argument is a compile-time constant expression specifying the warning
 *    group's default "tpp_warning_state" and must evaluate to one of:
 *       - TPP_WSTATE_DISABLED
 *       - TPP_WSTATE_WARN
 *       - TPP_WSTATE_ERROR     (only #if TPP_HAVE_WARNING_ERROR)
 *       - TPP_WSTATE_FATAL
 *       Other values (particularly 'TPP_WSTATE_SUPPRESS') are NOT allowed
 *    Example:
 *       >> // "-fmy-cool-expresion" is enabled by default
 *       >> TPP_WGROUP(WG_BAD_THING_HAPPEND, 2("bad-thing-happened", "same-bad-thing-happened"), TPP_WSTATE_ERROR)
 *    Usercode can then control this warning like:
 *       >> #pragma warning("-Wno-bad-thing-happened")
 *       >> #pragma warning("-Wno-same-bad-thing-happened") // Same as previous line
 *    When "TPP_HAVE_WARNINGS" is disabled, uses of this macro are ignored
 *
 *
 * >> TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, format)
 * >> TPP_WARNING_EX(warning_id, wgroup_ids, numbers, numbers_default, expr)
 *    Defines a warning that can be emitted as "tpp_lexer_warnf(LEXER, warning_id, ...)",
 *    and belongs to the specified "wgroup_ids" (which must be a "preprocessor tuple").
 *    - When "TPP_HAVE_WARNING_NUMBERS" is enabled, "numbers" is another preprocessor
 *      tuple, expanding to the set of "numbers" that can be used to identify this warning
 *      specifically, in which case "numbers_default" is the default state of that warning
 *      specifically.
 *    - When "TPP_HAVE_WARNING_NUMBERS" is disabled, or "numbers" is "0()" (an empty tuple),
 *      the the "numbers_default" parameter is ignored and never used.
 *    - When "TPP_WARNING" is used, "format" is the format string that is returned by
 *      the TPP API function `tpp_warning_getformat()', and is also the string passed to
 *      `tpp_lexer_printf_warning()' when the warning is emitted by `tpp_lexer_warnf()'.
 *      Operands like '%s' that may appear in this format-string are taken from varargs
 *      passed to `tpp_lexer_warnf()' at the time the warning is emitted.
 *    The alternate macro "TPP_WARNING_EX()" behaves the same as "TPP_WARNING()", except
 *    that instead of directly specifying a "format" string literal, an "expr" is supplied,
 *    that is executed (as a block-statement) when the warning is emitted. When this happens,
 *    "expr" has access to the following functions:
 *       >> tpp_lexer *tpp_current_lexer(void);            // The current lext
 *       >> tpp_lexer_printf_info *tpp_current_info(void); // Warning emission info
 *       >> tpp_warning_id tpp_current_warning_id(void);   // The warning that is being invoked
 *       >> tpp_formatprinter tpp_current_printer(void);   // Warning output printer
 *       >> void *tpp_current_printer_arg(void);           // Cookie for tpp_current_printer()
 *       >> va_list tpp_current_va_args(void);             // Variable arguments supplied to warning
 *       >> T tpp_current_va_arg(T);                       // Convenience wrapper for "va_arg(tpp_current_va_arg(), T)"
 *       >> void tpp_do(tpp_ssize expr_returning_error);   // Handle the return value of an invocation of "*tpp_current_printer()"
 *    The following convenience functions are provided (100% implementable using API exposed above):
 *       >> void tpp_warn_print_file_and_line(tpp_lexer_printf_info *info);
 *       >> void tpp_warn_print_file_and_line_at(tpp_file *file, tpp_char const *pos);
 *       >> void tpp_warn_print_file_and_line_lc(char const *filename, tpp_lcinfo lc);
 *       >> void tpp_warn_print(tpp_char const *text, tpp_size num_bytes);
 *       >> void tpp_warn_print_cstr(char const *text, tpp_size num_bytes);
 *       >> void tpp_warn_print_conststr(char STR[]);
 *       >> void tpp_warn_printf0(tpp_lexer_printf_info *info, char const *format);
 *       >> void tpp_warn_printf1(tpp_lexer_printf_info *info, char const *format, A a);
 *       >> void tpp_warn_printf2(tpp_lexer_printf_info *info, char const *format, A a, B b);
 *       >> void tpp_warn_printf3(tpp_lexer_printf_info *info, char const *format, A a, B b, C c);
 *       >> void tpp_warn_printf4(tpp_lexer_printf_info *info, char const *format, A a, B b, C c, D d);
 *       - Any "return" statement executed must specify some "tpp_errno", and causes
 *         the associated `tpp_lexer_warnf()' to eventually return with that value.
 *         In case "TPP_EOK" is returned, trailing notes are still printed.
 *    Example:
 *       >> TPP_WARNING(W_BAD_THING_HAPPEND, 1(WG_BAD_THING_HAPPEND), 2(100, 101), "bad thing happened: %s")
 *       >> TPP_WARNING_EX(W_BAD_THING_HAPPEND, 1(WG_BAD_THING_HAPPEND), 2(100, 101), {
 *       >>     char const *message = tpp_current_va_arg(char const *);
 *       >>     tpp_warn_printf1("same bad thing happened: %s", message);
 *       >> });
 *    During compilation, you can emit this warning like:
 *       >> tpp_errno error = tpp_lexer_warnf(LEXER, W_BAD_THING_HAPPEND, "uh'oh");
 *       >> if (TPP_ISERR(error))
 *       >>     ...;
 *
 *
 * >> #define TPP_MACRO(keyword_id, if_expr)
 *    For use with "TPP_KWD": specifies if the associated keyword should be considered to
 *    be "#if defined(<keyword_id>)" for the purposes of #ifdef-checks, as well as builtin
 *    macro expansions. For this purpose, "if_expr" should be a "bool"-expression.
 *    The specified "if_expr" has access to the following pre-defined function:
 *       >> tpp_lexer *tpp_current_lexer(void);            // The current lexer
 *       >> tpp_keyword const *tpp_current_keyword(void);  // The current keyword
 *       >> tpp_token_id tpp_current_keyword_id(void);     // The current keyword ID
 *       WARNING: The state of the current lexer is undefined inside of "if_expr"!
 *                Do not appear to yield tokens, or modify "tpp_current_lexer()"
 *                in any way.
 *    Example:
 *       >> // Allow user-code to query support for "#pragma once" using "__has_extension(pragma_once)"
 *       >> TPP_KWD(KWD___MY_COOL_EXTENSION_ENABLED__, "__MY_COOL_EXTENSION_ENABLED__")
 *       >> TPP_MACRO(KWD___MY_COOL_EXTENSION_ENABLED__, tpp_lexer_getextension(tpp_current_lexer(), EXT_MY_COOL_EXTENSION))
 *    User-code can now test the state of "EXT_MY_COOL_EXTENSION" like:
 *       >> #ifdef __MY_COOL_EXTENSION_ENABLED__
 *    Hint:
 *       - You can use "container_of" to access structure surrounding TPP's lexer,
 *         allowing you to (safely) access other components of your compiler, thus
 *         enabling user-code to test feature flags you implemented without the use
 *         of TPP's extension system
 *
 ********************************************************************************/



/* Definitions for builtin keywords */
#ifndef TPP_KWD
#define TPP_KWD(id, string)
#endif /* !TPP_KWD */
#ifndef TPP_KWD_FLAGS
#define TPP_KWD_FLAGS(id, flags_expr)
#endif /* !TPP_KWD_FLAGS */

/* Definitions for compiler extensions */
#ifndef TPP_EXTENSION
#define TPP_EXTENSION(id, name, default)
#endif /* !TPP_EXTENSION */

/* Definitions for compiler warnings */
#ifndef TPP_WGROUP
#define TPP_WGROUP(wgroup_id, names, default)
#endif /* !TPP_WGROUP */
#ifndef TPP_WARNING
#define TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, format)
#endif /* !TPP_WARNING */
#ifndef TPP_WARNING_EX
#define TPP_WARNING_EX(warning_id, wgroup_ids, numbers, numbers_default, expr) \
	TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, ~)
#endif /* !TPP_WARNING_EX */

/* Definitions for builtin macros*/
#ifndef TPP_MACRO
/* Reference a keyword that would behave as a predefined
 * macro only defined when `if' evaluates to true at runtime.
 * NOTE: Such a macro can still be re-defined by the user, but may
 *       later be #undef'd again to restore its original meaning. */
#define TPP_MACRO(keyword_id, if_expr)
#endif /* !TPP_MACRO */
#ifndef TPP_BUILTIN_MACRO
/* Defines the value that a builtin macro without custom behavior
 * should expand to. Without this, the expansion is either controlled
 * via custom behavior (in the case of macros like __FILE__, __LINE__),
 * or as a fallback: the macro will simply expand to itself. */
#define TPP_BUILTIN_MACRO(keyword_id, value)
#endif /* !TPP_BUILTIN_MACRO */


#if TPP_HAVE_CPP_LINE
#define TPP_KWD_line TPP_KWD_line
TPP_KWD(TPP_KWD_line, "line")
#endif /* TPP_HAVE_CPP_LINE */
#if TPP_HAVE_CPP_INCLUDE
#define TPP_KWD_include TPP_KWD_include
TPP_KWD(TPP_KWD_include, "include")
#endif /* TPP_HAVE_CPP_INCLUDE */
#if TPP_HAVE_CPP_INCLUDE_NEXT
#define TPP_KWD_include_next TPP_KWD_include_next
TPP_KWD(TPP_KWD_include_next, "include_next")
#endif /* TPP_HAVE_CPP_INCLUDE_NEXT */
#if TPP_HAVE_CPP_IMPORT
#define TPP_KWD_import TPP_KWD_import
TPP_KWD(TPP_KWD_import, "import")
#endif /* TPP_HAVE_CPP_IMPORT */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
#define TPP_KWD_if TPP_KWD_if
TPP_KWD(TPP_KWD_if, "if")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_KWD_ifdef TPP_KWD_ifdef
TPP_KWD(TPP_KWD_ifdef, "ifdef")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_KWD_ifndef TPP_KWD_ifndef
TPP_KWD(TPP_KWD_ifndef, "ifndef")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
#define TPP_KWD_elif TPP_KWD_elif
TPP_KWD(TPP_KWD_elif, "elif")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_KWD_elifdef TPP_KWD_elifdef
TPP_KWD(TPP_KWD_elifdef, "elifdef")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_KWD_elifndef TPP_KWD_elifndef
TPP_KWD(TPP_KWD_elifndef, "elifndef")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
#define TPP_KWD_else TPP_KWD_else
TPP_KWD(TPP_KWD_else, "else")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS */
#if TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_KWD_endif TPP_KWD_endif
TPP_KWD(TPP_KWD_endif, "endif")
#endif /* TPP_HAVE_CPP_IF_ELSE_ENDIF */
#if TPP_HAVE_CPP_DEFINE
#define TPP_KWD_define TPP_KWD_define
TPP_KWD(TPP_KWD_define, "define")
#endif /* TPP_HAVE_CPP_DEFINE */
#if TPP_HAVE_CPP_DEFINE || TPP_HAVE_PRAGMA_PUSH_MACRO
#define TPP_KWD_undef TPP_KWD_undef
TPP_KWD(TPP_KWD_undef, "undef")
#endif /* TPP_HAVE_CPP_DEFINE || TPP_HAVE_PRAGMA_PUSH_MACRO */
#if TPP_HAVE_CPP_EMBED
#define TPP_KWD_embed TPP_KWD_embed
TPP_KWD(TPP_KWD_embed, "embed")
#endif /* TPP_HAVE_CPP_EMBED */
#if TPP_HAVE_CPP_ASSERT
#define TPP_KWD_assert TPP_KWD_assert
TPP_KWD(TPP_KWD_assert, "assert")
#endif /* TPP_HAVE_CPP_ASSERT */
#if TPP_HAVE_CPP_ASSERT
#define TPP_KWD_unassert TPP_KWD_unassert
TPP_KWD(TPP_KWD_unassert, "unassert")
#endif /* TPP_HAVE_CPP_ASSERT */
#if TPP_HAVE_CPP_ERROR || TPP_HAVE_PRAGMA_ERROR || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_GCC_ERROR || TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_KWD_error TPP_KWD_error
TPP_KWD(TPP_KWD_error, "error")
#endif /* TPP_HAVE_CPP_ERROR || TPP_HAVE_PRAGMA_ERROR || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_GCC_ERROR || TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING */
#if TPP_HAVE_CPP_WARNING || TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_GCC_WARNING
#define TPP_KWD_warning TPP_KWD_warning
TPP_KWD(TPP_KWD_warning, "warning")
#endif /* TPP_HAVE_CPP_WARNING || TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_GCC_WARNING */
#if TPP_HAVE_CPP_IDENT_SCCS
#define TPP_KWD_ident TPP_KWD_ident
TPP_KWD(TPP_KWD_ident, "ident")
#endif /* TPP_HAVE_CPP_IDENT_SCCS */
#if TPP_HAVE_CPP_IDENT_SCCS
#define TPP_KWD_sccs TPP_KWD_sccs
TPP_KWD(TPP_KWD_sccs, "sccs")
#endif /* TPP_HAVE_CPP_IDENT_SCCS */
#if TPP_HAVE_CPP_PRAGMA
#define TPP_KWD_pragma TPP_KWD_pragma
TPP_KWD(TPP_KWD_pragma, "pragma")
#endif /* TPP_HAVE_CPP_PRAGMA */
#if TPP_HAVE_MACRO__Pragma
#define TPP_KWD__Pragma TPP_KWD__Pragma
TPP_KWD(TPP_KWD__Pragma, "_Pragma")
#endif /* TPP_HAVE_MACRO__Pragma */
#if TPP_HAVE_MACRO___pragma
#define TPP_KWD___pragma TPP_KWD___pragma
TPP_KWD(TPP_KWD___pragma, "__pragma")
#endif /* TPP_HAVE_MACRO___pragma */
#if TPP_HAVE_CLANG_MACRO___has_attribute
#define TPP_KWD___has_attribute TPP_KWD___has_attribute
TPP_KWD(TPP_KWD___has_attribute, "__has_attribute")
#endif /* TPP_HAVE_CLANG_MACRO___has_attribute */
#if TPP_HAVE_CLANG_MACRO___has_builtin
#define TPP_KWD___has_builtin TPP_KWD___has_builtin
TPP_KWD(TPP_KWD___has_builtin, "__has_builtin")
#endif /* TPP_HAVE_CLANG_MACRO___has_builtin */
#if TPP_HAVE_CLANG_MACRO___has_cpp_attribute
#define TPP_KWD___has_cpp_attribute TPP_KWD___has_cpp_attribute
TPP_KWD(TPP_KWD___has_cpp_attribute, "__has_cpp_attribute")
#endif /* TPP_HAVE_CLANG_MACRO___has_cpp_attribute */
#if TPP_HAVE_CLANG_MACRO___has_declspec_attribute
#define TPP_KWD___has_declspec_attribute TPP_KWD___has_declspec_attribute
TPP_KWD(TPP_KWD___has_declspec_attribute, "__has_declspec_attribute")
#endif /* TPP_HAVE_CLANG_MACRO___has_declspec_attribute */
#if TPP_HAVE_CLANG_MACRO___has_extension || TPP_HAVE_MACRO___has_extension
#define TPP_KWD___has_extension TPP_KWD___has_extension
TPP_KWD(TPP_KWD___has_extension, "__has_extension")
#endif /* TPP_HAVE_CLANG_MACRO___has_extension || TPP_HAVE_MACRO___has_extension */
#if TPP_HAVE_CLANG_MACRO___has_feature
#define TPP_KWD___has_feature TPP_KWD___has_feature
TPP_KWD(TPP_KWD___has_feature, "__has_feature")
#endif /* TPP_HAVE_CLANG_MACRO___has_feature */
#if TPP_HAVE_CLANG_MACRO___has_c_attribute
#define TPP_KWD___has_c_attribute TPP_KWD___has_c_attribute
TPP_KWD(TPP_KWD___has_c_attribute, "__has_c_attribute")
#endif /* TPP_HAVE_CLANG_MACRO___has_c_attribute */
#if TPP_HAVE_MACRO___is_identifier
#define TPP_KWD___is_identifier TPP_KWD___is_identifier
TPP_KWD(TPP_KWD___is_identifier, "__is_identifier")
#endif /* TPP_HAVE_MACRO___is_identifier */
#if TPP_HAVE_MACRO___is_deprecated
#define TPP_KWD___is_deprecated TPP_KWD___is_deprecated
TPP_KWD(TPP_KWD___is_deprecated, "__is_deprecated")
#endif /* TPP_HAVE_MACRO___is_deprecated */
#if TPP_HAVE_MACRO___is_poisoned
#define TPP_KWD___is_poisoned TPP_KWD___is_poisoned
TPP_KWD(TPP_KWD___is_poisoned, "__is_poisoned")
#endif /* TPP_HAVE_MACRO___is_poisoned */
#if TPP_HAVE_MACRO___has_known_extension
#define TPP_KWD___has_known_extension TPP_KWD___has_known_extension
TPP_KWD(TPP_KWD___has_known_extension, "__has_known_extension")
#endif /* TPP_HAVE_MACRO___has_known_extension */
#if TPP_HAVE_MACRO___has_warning
#define TPP_KWD___has_warning TPP_KWD___has_warning
TPP_KWD(TPP_KWD___has_warning, "__has_warning")
#endif /* TPP_HAVE_MACRO___has_warning */
#if TPP_HAVE_MACRO___has_known_warning
#define TPP_KWD___has_known_warning TPP_KWD___has_known_warning
TPP_KWD(TPP_KWD___has_known_warning, "__has_known_warning")
#endif /* TPP_HAVE_MACRO___has_known_warning */
#if TPP_HAVE_CPP_MACROS
#define TPP_KWD___TPP_VERSION__ TPP_KWD___TPP_VERSION__
TPP_KWD(TPP_KWD___TPP_VERSION__, "__TPP_VERSION__")
#endif /* TPP_HAVE_CPP_MACROS */
#if TPP_HAVE_MACRO___has_include
#define TPP_KWD___has_include TPP_KWD___has_include
TPP_KWD(TPP_KWD___has_include, "__has_include")
#endif /* TPP_HAVE_MACRO___has_include */
#if TPP_HAVE_MACRO___has_include_next
#define TPP_KWD___has_include_next TPP_KWD___has_include_next
TPP_KWD(TPP_KWD___has_include_next, "__has_include_next")
#endif /* TPP_HAVE_MACRO___has_include_next */
#if TPP_HAVE_MACRO___has_embed
#define TPP_KWD___has_embed TPP_KWD___has_embed
TPP_KWD(TPP_KWD___has_embed, "__has_embed")
#endif /* TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_MACRO___FILE__
#define TPP_KWD___FILE__ TPP_KWD___FILE__
TPP_KWD(TPP_KWD___FILE__, "__FILE__")
#endif /* TPP_HAVE_MACRO___FILE__ */
#if TPP_HAVE_MACRO___LINE__
#define TPP_KWD___LINE__ TPP_KWD___LINE__
TPP_KWD(TPP_KWD___LINE__, "__LINE__")
#endif /* TPP_HAVE_MACRO___LINE__ */
#if TPP_HAVE_MACRO___TIME__
#define TPP_KWD___TIME__ TPP_KWD___TIME__
TPP_KWD(TPP_KWD___TIME__, "__TIME__")
#endif /* TPP_HAVE_MACRO___TIME__ */
#if TPP_HAVE_MACRO___DATE__
#define TPP_KWD___DATE__ TPP_KWD___DATE__
TPP_KWD(TPP_KWD___DATE__, "__DATE__")
#endif /* TPP_HAVE_MACRO___DATE__ */
#if TPP_HAVE_MACRO___COLUMN__
#define TPP_KWD___COLUMN__ TPP_KWD___COLUMN__
TPP_KWD(TPP_KWD___COLUMN__, "__COLUMN__")
#endif /* TPP_HAVE_MACRO___COLUMN__ */
#if TPP_HAVE_MACRO___BASE_FILE__
#define TPP_KWD___BASE_FILE__ TPP_KWD___BASE_FILE__
TPP_KWD(TPP_KWD___BASE_FILE__, "__BASE_FILE__")
#endif /* TPP_HAVE_MACRO___BASE_FILE__ */
#if TPP_HAVE_MACRO___FILE_NAME__
#define TPP_KWD___FILE_NAME__ TPP_KWD___FILE_NAME__
TPP_KWD(TPP_KWD___FILE_NAME__, "__FILE_NAME__")
#endif /* TPP_HAVE_MACRO___FILE_NAME__ */
#if TPP_HAVE_MACRO___INCLUDE_LEVEL__
#define TPP_KWD___INCLUDE_LEVEL__ TPP_KWD___INCLUDE_LEVEL__
TPP_KWD(TPP_KWD___INCLUDE_LEVEL__, "__INCLUDE_LEVEL__")
#endif /* TPP_HAVE_MACRO___INCLUDE_LEVEL__ */
#if TPP_HAVE_MACRO___INCLUDE_DEPTH__
#define TPP_KWD___INCLUDE_DEPTH__ TPP_KWD___INCLUDE_DEPTH__
TPP_KWD(TPP_KWD___INCLUDE_DEPTH__, "__INCLUDE_DEPTH__")
#endif /* TPP_HAVE_MACRO___INCLUDE_DEPTH__ */
#if TPP_HAVE_MACRO___COUNTER__
#define TPP_KWD___COUNTER__ TPP_KWD___COUNTER__
TPP_KWD(TPP_KWD___COUNTER__, "__COUNTER__")
#endif /* TPP_HAVE_MACRO___COUNTER__ */
#if TPP_HAVE_MACRO___TIMESTAMP__
#define TPP_KWD___TIMESTAMP__ TPP_KWD___TIMESTAMP__
TPP_KWD(TPP_KWD___TIMESTAMP__, "__TIMESTAMP__")
#endif /* TPP_HAVE_MACRO___TIMESTAMP__ */
#if TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_KWD___DATE_DAY__ TPP_KWD___DATE_DAY__
TPP_KWD(TPP_KWD___DATE_DAY__, "__DATE_DAY__")
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_KWD___DATE_WDAY__ TPP_KWD___DATE_WDAY__
TPP_KWD(TPP_KWD___DATE_WDAY__, "__DATE_WDAY__")
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_KWD___DATE_YDAY__ TPP_KWD___DATE_YDAY__
TPP_KWD(TPP_KWD___DATE_YDAY__, "__DATE_YDAY__")
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_KWD___DATE_MONTH__ TPP_KWD___DATE_MONTH__
TPP_KWD(TPP_KWD___DATE_MONTH__, "__DATE_MONTH__")
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_KWD___DATE_YEAR__ TPP_KWD___DATE_YEAR__
TPP_KWD(TPP_KWD___DATE_YEAR__, "__DATE_YEAR__")
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_TIME_MACROS
#define TPP_KWD___TIME_SEC__ TPP_KWD___TIME_SEC__
TPP_KWD(TPP_KWD___TIME_SEC__, "__TIME_SEC__")
#endif /* TPP_HAVE_NUMERIC_TIME_MACROS */
#if TPP_HAVE_NUMERIC_TIME_MACROS
#define TPP_KWD___TIME_MIN__ TPP_KWD___TIME_MIN__
TPP_KWD(TPP_KWD___TIME_MIN__, "__TIME_MIN__")
#endif /* TPP_HAVE_NUMERIC_TIME_MACROS */
#if TPP_HAVE_NUMERIC_TIME_MACROS
#define TPP_KWD___TIME_HOUR__ TPP_KWD___TIME_HOUR__
TPP_KWD(TPP_KWD___TIME_HOUR__, "__TIME_HOUR__")
#endif /* TPP_HAVE_NUMERIC_TIME_MACROS */
#if TPP_HAVE_MACRO___TPP_EVAL
#define TPP_KWD___TPP_EVAL TPP_KWD___TPP_EVAL
TPP_KWD(TPP_KWD___TPP_EVAL, "__TPP_EVAL")
#endif /* TPP_HAVE_MACRO___TPP_EVAL */
#if TPP_HAVE_MACRO___TPP_EXEC
#define TPP_KWD___TPP_EXEC TPP_KWD___TPP_EXEC
TPP_KWD(TPP_KWD___TPP_EXEC, "__TPP_EXEC")
#endif /* TPP_HAVE_MACRO___TPP_EXEC */
#if TPP_HAVE_MACRO___TPP_UNIQUE
#define TPP_KWD___TPP_UNIQUE TPP_KWD___TPP_UNIQUE
TPP_KWD(TPP_KWD___TPP_UNIQUE, "__TPP_UNIQUE")
#endif /* TPP_HAVE_MACRO___TPP_UNIQUE */
#if TPP_HAVE_MACRO___TPP_LOAD_FILE
#define TPP_KWD___TPP_LOAD_FILE TPP_KWD___TPP_LOAD_FILE
TPP_KWD(TPP_KWD___TPP_LOAD_FILE, "__TPP_LOAD_FILE")
#endif /* TPP_HAVE_MACRO___TPP_LOAD_FILE */
#if TPP_HAVE_MACRO___TPP_COUNTER
#define TPP_KWD___TPP_COUNTER TPP_KWD___TPP_COUNTER
TPP_KWD(TPP_KWD___TPP_COUNTER, "__TPP_COUNTER")
#endif /* TPP_HAVE_MACRO___TPP_COUNTER */
#if TPP_HAVE_MACRO___TPP_RANDOM
#define TPP_KWD___TPP_RANDOM TPP_KWD___TPP_RANDOM
TPP_KWD(TPP_KWD___TPP_RANDOM, "__TPP_RANDOM")
#endif /* TPP_HAVE_MACRO___TPP_RANDOM */
#if TPP_HAVE_MACRO___TPP_STR_DECOMPILE
#define TPP_KWD___TPP_STR_DECOMPILE TPP_KWD___TPP_STR_DECOMPILE
TPP_KWD(TPP_KWD___TPP_STR_DECOMPILE, "__TPP_STR_DECOMPILE")
#endif /* TPP_HAVE_MACRO___TPP_STR_DECOMPILE */
#if TPP_HAVE_MACRO___TPP_STR_SUBSTR
#define TPP_KWD___TPP_STR_SUBSTR TPP_KWD___TPP_STR_SUBSTR
TPP_KWD(TPP_KWD___TPP_STR_SUBSTR, "__TPP_STR_SUBSTR")
#endif /* TPP_HAVE_MACRO___TPP_STR_SUBSTR */
#if TPP_HAVE_MACRO___TPP_STR_SUBSTR
#define TPP_KWD___TPP_STR_AT TPP_KWD___TPP_STR_AT
TPP_KWD(TPP_KWD___TPP_STR_AT, "__TPP_STR_AT")
#endif /* TPP_HAVE_MACRO___TPP_STR_SUBSTR */
#if TPP_HAVE_MACRO___TPP_STR_PACK
#define TPP_KWD___TPP_STR_PACK TPP_KWD___TPP_STR_PACK
TPP_KWD(TPP_KWD___TPP_STR_PACK, "__TPP_STR_PACK")
#endif /* TPP_HAVE_MACRO___TPP_STR_PACK */
#if TPP_HAVE_MACRO___TPP_STR_SIZE
#define TPP_KWD___TPP_STR_SIZE TPP_KWD___TPP_STR_SIZE
TPP_KWD(TPP_KWD___TPP_STR_SIZE, "__TPP_STR_SIZE")
#endif /* TPP_HAVE_MACRO___TPP_STR_SIZE */
#if TPP_HAVE_MACRO___TPP_COUNT_TOKENS
#define TPP_KWD___TPP_COUNT_TOKENS TPP_KWD___TPP_COUNT_TOKENS
TPP_KWD(TPP_KWD___TPP_COUNT_TOKENS, "__TPP_COUNT_TOKENS")
#endif /* TPP_HAVE_MACRO___TPP_COUNT_TOKENS */
#if TPP_HAVE_MACRO___TPP_IDENTIFIER
#define TPP_KWD___TPP_IDENTIFIER TPP_KWD___TPP_IDENTIFIER
TPP_KWD(TPP_KWD___TPP_IDENTIFIER, "__TPP_IDENTIFIER")
#endif /* TPP_HAVE_MACRO___TPP_IDENTIFIER */
#if TPP_HAVE_VA_ARGS_IN_MACROS
#define TPP_KWD___VA_ARGS__ TPP_KWD___VA_ARGS__
TPP_KWD(TPP_KWD___VA_ARGS__, "__VA_ARGS__")
#endif /* TPP_HAVE_VA_ARGS_IN_MACROS */
#if TPP_HAVE_VA_COMMA_IN_MACROS
#define TPP_KWD___VA_COMMA__ TPP_KWD___VA_COMMA__
TPP_KWD(TPP_KWD___VA_COMMA__, "__VA_COMMA__")
#endif /* TPP_HAVE_VA_COMMA_IN_MACROS */
#if TPP_HAVE_VA_NARGS_IN_MACROS
#define TPP_KWD___VA_NARGS__ TPP_KWD___VA_NARGS__
TPP_KWD(TPP_KWD___VA_NARGS__, "__VA_NARGS__")
#endif /* TPP_HAVE_VA_NARGS_IN_MACROS */
#if TPP_HAVE_VA_OPT_IN_MACROS
#define TPP_KWD___VA_OPT__ TPP_KWD___VA_OPT__
TPP_KWD(TPP_KWD___VA_OPT__, "__VA_OPT__")
#endif /* TPP_HAVE_VA_OPT_IN_MACROS */
#if TPP_HAVE_BUILTIN_EXPR_DEFINED
#define TPP_KWD_defined TPP_KWD_defined
TPP_KWD(TPP_KWD_defined, "defined")
#endif /* TPP_HAVE_BUILTIN_EXPR_DEFINED */
#if TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed
#define TPP_KWD_limit TPP_KWD_limit
TPP_KWD(TPP_KWD_limit, "limit")
#endif /* TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed
#define TPP_KWD_prefix TPP_KWD_prefix
TPP_KWD(TPP_KWD_prefix, "prefix")
#endif /* TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed
#define TPP_KWD_suffix TPP_KWD_suffix
TPP_KWD(TPP_KWD_suffix, "suffix")
#endif /* TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed
#define TPP_KWD_if_empty TPP_KWD_if_empty
TPP_KWD(TPP_KWD_if_empty, "if_empty")
#endif /* TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_MACRO___has_embed
#define TPP_KWD___STDC_EMBED_NOT_FOUND__ TPP_KWD___STDC_EMBED_NOT_FOUND__
TPP_KWD(TPP_KWD___STDC_EMBED_NOT_FOUND__, "__STDC_EMBED_NOT_FOUND__")
#endif /* TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_MACRO___has_embed
#define TPP_KWD___STDC_EMBED_FOUND__ TPP_KWD___STDC_EMBED_FOUND__
TPP_KWD(TPP_KWD___STDC_EMBED_FOUND__, "__STDC_EMBED_FOUND__")
#endif /* TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_MACRO___has_embed
#define TPP_KWD___STDC_EMBED_EMPTY__ TPP_KWD___STDC_EMBED_EMPTY__
TPP_KWD(TPP_KWD___STDC_EMBED_EMPTY__, "__STDC_EMBED_EMPTY__")
#endif /* TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_PRAGMA_PUSH_MACRO
#define TPP_KWD_push_macro TPP_KWD_push_macro
TPP_KWD(TPP_KWD_push_macro, "push_macro")
#endif /* TPP_HAVE_PRAGMA_PUSH_MACRO */
#if TPP_HAVE_PRAGMA_PUSH_MACRO
#define TPP_KWD_pop_macro TPP_KWD_pop_macro
TPP_KWD(TPP_KWD_pop_macro, "pop_macro")
#endif /* TPP_HAVE_PRAGMA_PUSH_MACRO */
#if TPP_HAVE_PRAGMA_ONCE
#define TPP_KWD_once TPP_KWD_once
TPP_KWD(TPP_KWD_once, "once")
#endif /* TPP_HAVE_PRAGMA_ONCE */
#if TPP_HAVE_PRAGMA_TPP
#define TPP_KWD_TPP TPP_KWD_TPP
TPP_KWD(TPP_KWD_TPP, "TPP")
#endif /* TPP_HAVE_PRAGMA_TPP */
#if TPP_HAVE_PRAGMA_REGION
#define TPP_KWD_region TPP_KWD_region
TPP_KWD(TPP_KWD_region, "region")
#endif /* TPP_HAVE_PRAGMA_REGION */
#if TPP_HAVE_PRAGMA_REGION
#define TPP_KWD_endregion TPP_KWD_endregion
TPP_KWD(TPP_KWD_endregion, "endregion")
#endif /* TPP_HAVE_PRAGMA_REGION */
#if TPP_HAVE_PRAGMA_DEPRECATED
#define TPP_KWD_deprecated TPP_KWD_deprecated
TPP_KWD(TPP_KWD_deprecated, "deprecated")
#endif /* TPP_HAVE_PRAGMA_DEPRECATED */
#if TPP_HAVE_PRAGMA_TPP_EXEC || TPP_HAVE_PRAGMA_TPP_TPP_EXEC
#define TPP_KWD_tpp_exec TPP_KWD_tpp_exec
TPP_KWD(TPP_KWD_tpp_exec, "tpp_exec")
#endif /* TPP_HAVE_PRAGMA_TPP_EXEC || TPP_HAVE_PRAGMA_TPP_TPP_EXEC */
#if TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS || TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS
#define TPP_KWD_tpp_set_keyword_flags TPP_KWD_tpp_set_keyword_flags
TPP_KWD(TPP_KWD_tpp_set_keyword_flags, "tpp_set_keyword_flags")
#endif /* TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS || TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS */
#if TPP_HAVE_PRAGMA_EXTENSION
#define TPP_KWD_extension TPP_KWD_extension
TPP_KWD(TPP_KWD_extension, "extension")
#endif /* TPP_HAVE_PRAGMA_EXTENSION */
#if ((TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION) && TPP_HAVE_EXTENSIONS_PUSH_POP) || ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNINGS_PUSH_POP) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_WARNINGS_PUSH_POP)
#define TPP_KWD_push TPP_KWD_push
TPP_KWD(TPP_KWD_push, "push")
#endif /* ((TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION) && TPP_HAVE_EXTENSIONS_PUSH_POP) || ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNINGS_PUSH_POP) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_WARNINGS_PUSH_POP) */
#if ((TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION) && TPP_HAVE_EXTENSIONS_PUSH_POP) || ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNINGS_PUSH_POP) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_WARNINGS_PUSH_POP)
#define TPP_KWD_pop TPP_KWD_pop
TPP_KWD(TPP_KWD_pop, "pop")
#endif /* ((TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION) && TPP_HAVE_EXTENSIONS_PUSH_POP) || ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNINGS_PUSH_POP) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_WARNINGS_PUSH_POP) */
#if TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_KWD_disable TPP_KWD_disable
TPP_KWD(TPP_KWD_disable, "disable")
#endif /* TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING */
#if TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_KWD_enable TPP_KWD_enable
TPP_KWD(TPP_KWD_enable, "enable")
#endif /* TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING */
#if (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNING_SUPPRESS
#define TPP_KWD_suppress TPP_KWD_suppress
TPP_KWD(TPP_KWD_suppress, "suppress")
#endif /* (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNING_SUPPRESS */
#if ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNING_DEFAULT) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER)
#define TPP_KWD_default TPP_KWD_default
TPP_KWD(TPP_KWD_default, "default")
#endif /* ((TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNING_DEFAULT) || (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER) */
#if TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_KWD_fatal TPP_KWD_fatal
TPP_KWD(TPP_KWD_fatal, "fatal")
#endif /* TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING */
#if TPP_HAVE_PRAGMA_MESSAGE
#define TPP_KWD_message TPP_KWD_message
TPP_KWD(TPP_KWD_message, "message")
#endif /* TPP_HAVE_PRAGMA_MESSAGE */
#if TPP_HAVE_PRAGMA_GCC
#define TPP_KWD_GCC TPP_KWD_GCC
TPP_KWD(TPP_KWD_GCC, "GCC")
#endif /* TPP_HAVE_PRAGMA_GCC */
#if TPP_HAVE_PRAGMA_GCC_POISON
#define TPP_KWD_poison TPP_KWD_poison
TPP_KWD(TPP_KWD_poison, "poison")
#endif /* TPP_HAVE_PRAGMA_GCC_POISON */
#if TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER
#define TPP_KWD_system_header TPP_KWD_system_header
TPP_KWD(TPP_KWD_system_header, "system_header")
#endif /* TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER */
#if TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC
#define TPP_KWD_diagnostic TPP_KWD_diagnostic
TPP_KWD(TPP_KWD_diagnostic, "diagnostic")
#endif /* TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC */
#if TPP_HAVE_PRAGMA_GCC_DEPENDENCY
#define TPP_KWD_dependency TPP_KWD_dependency
TPP_KWD(TPP_KWD_dependency, "dependency")
#endif /* TPP_HAVE_PRAGMA_GCC_DEPENDENCY */
#if TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC
#define TPP_KWD_ignored TPP_KWD_ignored
TPP_KWD(TPP_KWD_ignored, "ignored")
#endif /* TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH
#define TPP_KWD_include_path TPP_KWD_include_path
TPP_KWD(TPP_KWD_include_path, "include_path")
#endif /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH
#define TPP_KWD_clear TPP_KWD_clear
TPP_KWD(TPP_KWD_clear, "clear")
#endif /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_QUOTE
#define TPP_KWD_quote TPP_KWD_quote
TPP_KWD(TPP_KWD_quote, "quote")
#endif /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_SYSHDR
#define TPP_KWD_system TPP_KWD_system
TPP_KWD(TPP_KWD_system, "system")
#endif /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER
#define TPP_KWD_dirafter TPP_KWD_dirafter
TPP_KWD(TPP_KWD_dirafter, "dirafter")
#endif /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER */


/* Pre-defined macros... */
#if TPP_HAVE_CPP_MACROS
TPP_MACRO(TPP_KWD___TPP_VERSION__, true)
TPP_BUILTIN_MACRO(TPP_KWD___TPP_VERSION__, TPP_PREPROCESSOR_VERSION_STR)
#if TPP_HAVE_MACRO__Pragma /* GCC defines _Pragma as a macro... So I'll just do that as well! */
TPP_MACRO(TPP_KWD__Pragma, tpp_lexer_has(tpp_current_lexer(), MACRO__Pragma))
#endif /* TPP_HAVE_MACRO__Pragma */
#if TPP_HAVE_MACRO___pragma /* I promised this would be defined as a macro... */
TPP_MACRO(TPP_KWD___pragma, tpp_lexer_has(tpp_current_lexer(), MACRO___pragma))
#endif /* TPP_HAVE_MACRO___pragma */

/* Declare magic, built-in macros */
#if TPP_HAVE_CLANG_MACRO___has_attribute
TPP_MACRO(TPP_KWD___has_attribute, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_attribute))
#endif /* TPP_HAVE_CLANG_MACRO___has_attribute */
#if TPP_HAVE_CLANG_MACRO___has_builtin
TPP_MACRO(TPP_KWD___has_builtin, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_builtin))
#endif /* TPP_HAVE_CLANG_MACRO___has_builtin */
#if TPP_HAVE_CLANG_MACRO___has_cpp_attribute
TPP_MACRO(TPP_KWD___has_cpp_attribute, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_cpp_attribute))
#endif /* TPP_HAVE_CLANG_MACRO___has_cpp_attribute */
#if TPP_HAVE_CLANG_MACRO___has_declspec_attribute
TPP_MACRO(TPP_KWD___has_declspec_attribute, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_declspec_attribute))
#endif /* TPP_HAVE_CLANG_MACRO___has_declspec_attribute */
#if TPP_HAVE_CLANG_MACRO___has_extension || TPP_HAVE_MACRO___has_extension
TPP_MACRO(TPP_KWD___has_extension, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_extension) ||
                                   tpp_lexer_has(tpp_current_lexer(), MACRO___has_extension))
#endif /* TPP_HAVE_CLANG_MACRO___has_extension || TPP_HAVE_MACRO___has_extension */
#if TPP_HAVE_CLANG_MACRO___has_feature
TPP_MACRO(TPP_KWD___has_feature, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_feature))
#endif /* TPP_HAVE_CLANG_MACRO___has_feature */
#if TPP_HAVE_CLANG_MACRO___has_c_attribute
TPP_MACRO(TPP_KWD___has_c_attribute, tpp_lexer_has(tpp_current_lexer(), CLANG_MACRO___has_c_attribute))
#endif /* TPP_HAVE_CLANG_MACRO___has_c_attribute */
#if TPP_HAVE_MACRO___is_identifier
TPP_MACRO(TPP_KWD___is_identifier, tpp_lexer_has(tpp_current_lexer(), MACRO___is_identifier))
#endif /* TPP_HAVE_MACRO___is_identifier */
#if TPP_HAVE_MACRO___is_deprecated
TPP_MACRO(TPP_KWD___is_deprecated, tpp_lexer_has(tpp_current_lexer(), MACRO___is_deprecated))
#endif /* TPP_HAVE_MACRO___is_deprecated */
#if TPP_HAVE_MACRO___is_poisoned
TPP_MACRO(TPP_KWD___is_poisoned, tpp_lexer_has(tpp_current_lexer(), MACRO___is_poisoned))
#endif /* TPP_HAVE_MACRO___is_poisoned */
#if TPP_HAVE_MACRO___has_known_extension
TPP_MACRO(TPP_KWD___has_known_extension, tpp_lexer_has(tpp_current_lexer(), MACRO___has_known_extension))
#endif /* TPP_HAVE_MACRO___has_known_extension */
#if TPP_HAVE_MACRO___has_warning
TPP_MACRO(TPP_KWD___has_warning, tpp_lexer_has(tpp_current_lexer(), MACRO___has_warning))
#endif /* TPP_HAVE_MACRO___has_warning */
#if TPP_HAVE_MACRO___has_known_warning
TPP_MACRO(TPP_KWD___has_known_warning, tpp_lexer_has(tpp_current_lexer(), MACRO___has_known_warning))
#endif /* TPP_HAVE_MACRO___has_known_warning */
#if TPP_HAVE_MACRO___has_include
TPP_MACRO(TPP_KWD___has_include, tpp_lexer_has(tpp_current_lexer(), MACRO___has_include))
#endif /* TPP_HAVE_MACRO___has_include */
#if TPP_HAVE_MACRO___has_include_next
TPP_MACRO(TPP_KWD___has_include_next, tpp_lexer_has(tpp_current_lexer(), MACRO___has_include_next))
#endif /* TPP_HAVE_MACRO___has_include_next */
#if TPP_HAVE_MACRO___has_embed
TPP_MACRO(TPP_KWD___has_embed, tpp_lexer_has(tpp_current_lexer(), MACRO___has_embed))
TPP_MACRO(TPP_KWD___STDC_EMBED_NOT_FOUND__, tpp_lexer_has(tpp_current_lexer(), MACRO___has_embed))
TPP_MACRO(TPP_KWD___STDC_EMBED_FOUND__, tpp_lexer_has(tpp_current_lexer(), MACRO___has_embed))
TPP_MACRO(TPP_KWD___STDC_EMBED_EMPTY__, tpp_lexer_has(tpp_current_lexer(), MACRO___has_embed))
TPP_BUILTIN_MACRO(TPP_KWD___STDC_EMBED_NOT_FOUND__, TPP_CONFIG_VALUEOF_STDC_EMBED_NOT_FOUND)
TPP_BUILTIN_MACRO(TPP_KWD___STDC_EMBED_FOUND__, TPP_CONFIG_VALUEOF_STDC_EMBED_FOUND)
TPP_BUILTIN_MACRO(TPP_KWD___STDC_EMBED_EMPTY__, TPP_CONFIG_VALUEOF_STDC_EMBED_EMPTY)
#endif /* TPP_HAVE_MACRO___has_embed */
#if TPP_HAVE_MACRO___FILE__
TPP_MACRO(TPP_KWD___FILE__, tpp_lexer_has(tpp_current_lexer(), MACRO___FILE__))
#endif /* TPP_HAVE_MACRO___FILE__ */
#if TPP_HAVE_MACRO___LINE__
TPP_MACRO(TPP_KWD___LINE__, tpp_lexer_has(tpp_current_lexer(), MACRO___LINE__))
#endif /* TPP_HAVE_MACRO___LINE__ */
#if TPP_HAVE_MACRO___TIME__
TPP_MACRO(TPP_KWD___TIME__, tpp_lexer_has(tpp_current_lexer(), MACRO___TIME__))
#endif /* TPP_HAVE_MACRO___TIME__ */
#if TPP_HAVE_MACRO___DATE__
TPP_MACRO(TPP_KWD___DATE__, tpp_lexer_has(tpp_current_lexer(), MACRO___DATE__))
#endif /* TPP_HAVE_MACRO___DATE__ */
#if TPP_HAVE_MACRO___COLUMN__
TPP_MACRO(TPP_KWD___COLUMN__, tpp_lexer_has(tpp_current_lexer(), MACRO___COLUMN__))
#endif /* TPP_HAVE_MACRO___COLUMN__ */
#if TPP_HAVE_MACRO___BASE_FILE__
TPP_MACRO(TPP_KWD___BASE_FILE__, tpp_lexer_has(tpp_current_lexer(), MACRO___BASE_FILE__))
#endif /* TPP_HAVE_MACRO___BASE_FILE__ */
#if TPP_HAVE_MACRO___FILE_NAME__
TPP_MACRO(TPP_KWD___FILE_NAME__, tpp_lexer_has(tpp_current_lexer(), MACRO___FILE_NAME__))
#endif /* TPP_HAVE_MACRO___FILE_NAME__ */
#if TPP_HAVE_MACRO___INCLUDE_LEVEL__
TPP_MACRO(TPP_KWD___INCLUDE_LEVEL__, tpp_lexer_has(tpp_current_lexer(), MACRO___INCLUDE_LEVEL__))
#endif /* TPP_HAVE_MACRO___INCLUDE_LEVEL__ */
#if TPP_HAVE_MACRO___INCLUDE_DEPTH__
TPP_MACRO(TPP_KWD___INCLUDE_DEPTH__, tpp_lexer_has(tpp_current_lexer(), MACRO___INCLUDE_DEPTH__))
#endif /* TPP_HAVE_MACRO___INCLUDE_DEPTH__ */
#if TPP_HAVE_MACRO___COUNTER__
TPP_MACRO(TPP_KWD___COUNTER__, tpp_lexer_has(tpp_current_lexer(), MACRO___COUNTER__))
#endif /* TPP_HAVE_MACRO___COUNTER__ */
#if TPP_HAVE_MACRO___TIMESTAMP__
TPP_MACRO(TPP_KWD___TIMESTAMP__, tpp_lexer_has(tpp_current_lexer(), MACRO___TIMESTAMP__))
#endif /* TPP_HAVE_MACRO___TIMESTAMP__ */
#if TPP_HAVE_NUMERIC_DATE_MACROS
TPP_MACRO(TPP_KWD___DATE_DAY__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_DATE_MACROS))
TPP_MACRO(TPP_KWD___DATE_WDAY__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_DATE_MACROS))
TPP_MACRO(TPP_KWD___DATE_YDAY__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_DATE_MACROS))
TPP_MACRO(TPP_KWD___DATE_MONTH__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_DATE_MACROS))
TPP_MACRO(TPP_KWD___DATE_YEAR__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_DATE_MACROS))
#endif /* TPP_HAVE_NUMERIC_DATE_MACROS */
#if TPP_HAVE_NUMERIC_TIME_MACROS
TPP_MACRO(TPP_KWD___TIME_SEC__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_TIME_MACROS))
TPP_MACRO(TPP_KWD___TIME_MIN__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_TIME_MACROS))
TPP_MACRO(TPP_KWD___TIME_HOUR__, tpp_lexer_has(tpp_current_lexer(), NUMERIC_TIME_MACROS))
#endif /* TPP_HAVE_NUMERIC_TIME_MACROS */
#if TPP_HAVE_MACRO___TPP_EVAL
TPP_MACRO(TPP_KWD___TPP_EVAL, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_EVAL))
#endif /* TPP_HAVE_MACRO___TPP_EVAL */
#if TPP_HAVE_MACRO___TPP_EXEC
TPP_MACRO(TPP_KWD___TPP_EXEC, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_EXEC))
#endif /* TPP_HAVE_MACRO___TPP_EXEC */
#if TPP_HAVE_MACRO___TPP_UNIQUE
TPP_MACRO(TPP_KWD___TPP_UNIQUE, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_UNIQUE))
#endif /* TPP_HAVE_MACRO___TPP_UNIQUE */
#if TPP_HAVE_MACRO___TPP_LOAD_FILE
TPP_MACRO(TPP_KWD___TPP_LOAD_FILE, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_LOAD_FILE))
#endif /* TPP_HAVE_MACRO___TPP_LOAD_FILE */
#if TPP_HAVE_MACRO___TPP_COUNTER
TPP_MACRO(TPP_KWD___TPP_COUNTER, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_COUNTER))
#endif /* TPP_HAVE_MACRO___TPP_COUNTER */
#if TPP_HAVE_MACRO___TPP_RANDOM
TPP_MACRO(TPP_KWD___TPP_RANDOM, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_RANDOM))
#endif /* TPP_HAVE_MACRO___TPP_RANDOM */
#if TPP_HAVE_MACRO___TPP_STR_DECOMPILE
TPP_MACRO(TPP_KWD___TPP_STR_DECOMPILE, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_STR_DECOMPILE))
#endif /* TPP_HAVE_MACRO___TPP_STR_DECOMPILE */
#if TPP_HAVE_MACRO___TPP_STR_SUBSTR
TPP_MACRO(TPP_KWD___TPP_STR_SUBSTR, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_STR_SUBSTR))
TPP_MACRO(TPP_KWD___TPP_STR_AT, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_STR_SUBSTR))
#endif /* TPP_HAVE_MACRO___TPP_STR_SUBSTR */
#if TPP_HAVE_MACRO___TPP_STR_PACK
TPP_MACRO(TPP_KWD___TPP_STR_PACK, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_STR_PACK))
#endif /* TPP_HAVE_MACRO___TPP_STR_PACK */
#if TPP_HAVE_MACRO___TPP_STR_SIZE
TPP_MACRO(TPP_KWD___TPP_STR_SIZE, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_STR_SIZE))
#endif /* TPP_HAVE_MACRO___TPP_STR_SIZE */
#if TPP_HAVE_MACRO___TPP_COUNT_TOKENS
TPP_MACRO(TPP_KWD___TPP_COUNT_TOKENS, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_COUNT_TOKENS))
#endif /* TPP_HAVE_MACRO___TPP_COUNT_TOKENS */
#if TPP_HAVE_MACRO___TPP_IDENTIFIER
TPP_MACRO(TPP_KWD___TPP_IDENTIFIER, tpp_lexer_has(tpp_current_lexer(), MACRO___TPP_IDENTIFIER))
#endif /* TPP_HAVE_MACRO___TPP_IDENTIFIER */
#endif /* TPP_HAVE_CPP_MACROS */




#if TPP_CONF_IS_EXT(TPP_HAVE_BSE)
#ifndef TPP_EXTNAME_BSE
#define TPP_EXTNAME_BSE "bse"
#endif /* !TPP_EXTNAME_BSE */
#define TPP_EXT_BSE TPP_EXT_BSE
TPP_EXTENSION(TPP_EXT_BSE, TPP_EXTNAME_BSE, TPP_CONF_DEFAULT(TPP_HAVE_BSE))
#define _tpp_lexer_has_BSE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BSE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BSE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BSE_WHITESPACE)
#ifndef TPP_EXTNAME_BSE_WHITESPACE
#define TPP_EXTNAME_BSE_WHITESPACE "bse-whitespace"
#endif /* !TPP_EXTNAME_BSE_WHITESPACE */
#define TPP_EXT_BSE_WHITESPACE TPP_EXT_BSE_WHITESPACE
TPP_EXTENSION(TPP_EXT_BSE_WHITESPACE, TPP_EXTNAME_BSE_WHITESPACE, TPP_CONF_DEFAULT(TPP_HAVE_BSE_WHITESPACE))
#define _tpp_lexer_has_BSE_WHITESPACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BSE_WHITESPACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BSE_WHITESPACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI)
#ifndef TPP_EXTNAME_IDENTIFIER_ESCAPE_UNI
#define TPP_EXTNAME_IDENTIFIER_ESCAPE_UNI "extended-identifiers"
#endif /* !TPP_EXTNAME_IDENTIFIER_ESCAPE_UNI */
#define TPP_EXT_IDENTIFIER_ESCAPE_UNI TPP_EXT_IDENTIFIER_ESCAPE_UNI
TPP_EXTENSION(TPP_EXT_IDENTIFIER_ESCAPE_UNI, TPP_EXTNAME_IDENTIFIER_ESCAPE_UNI, TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI))
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_UNI(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_IDENTIFIER_ESCAPE_UNI)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI) */
#if TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
#ifndef TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED
#define TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED "named-extended-identifiers"
#endif /* !TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED */
#define TPP_EXT_IDENTIFIER_ESCAPE_NAMED TPP_EXT_IDENTIFIER_ESCAPE_NAMED
TPP_EXTENSION(TPP_EXT_IDENTIFIER_ESCAPE_NAMED, TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED, TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED))
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_IDENTIFIER_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED) */
#if TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY)
#ifndef TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED_MANY
#define TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED_MANY "named-extended-identifiers-many"
#endif /* !TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED_MANY */
#define TPP_EXT_IDENTIFIER_ESCAPE_NAMED_MANY TPP_EXT_IDENTIFIER_ESCAPE_NAMED_MANY
TPP_EXTENSION(TPP_EXT_IDENTIFIER_ESCAPE_NAMED_MANY, TPP_EXTNAME_IDENTIFIER_ESCAPE_NAMED_MANY, TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY))
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED_MANY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_IDENTIFIER_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_DIRECTIVES)
#ifndef TPP_EXTNAME_CPP_DIRECTIVES
#define TPP_EXTNAME_CPP_DIRECTIVES "cpp-directives"
#endif /* !TPP_EXTNAME_CPP_DIRECTIVES */
#define TPP_EXT_CPP_DIRECTIVES TPP_EXT_CPP_DIRECTIVES
TPP_EXTENSION(TPP_EXT_CPP_DIRECTIVES, TPP_EXTNAME_CPP_DIRECTIVES, TPP_CONF_DEFAULT(TPP_HAVE_CPP_DIRECTIVES))
#define _tpp_lexer_has_CPP_DIRECTIVES(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_DIRECTIVES)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_DIRECTIVES) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_MACROS)
#ifndef TPP_EXTNAME_CPP_MACROS
#define TPP_EXTNAME_CPP_MACROS "cpp-macros"
#endif /* !TPP_EXTNAME_CPP_MACROS */
#define TPP_EXT_CPP_MACROS TPP_EXT_CPP_MACROS
TPP_EXTENSION(TPP_EXT_CPP_MACROS, TPP_EXTNAME_CPP_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_CPP_MACROS))
#define _tpp_lexer_has_CPP_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MAGIC_WHITESPACE)
#ifndef TPP_EXTNAME_MAGIC_WHITESPACE
#define TPP_EXTNAME_MAGIC_WHITESPACE "magic-whitespace"
#endif /* !TPP_EXTNAME_MAGIC_WHITESPACE */
#define TPP_EXT_MAGIC_WHITESPACE TPP_EXT_MAGIC_WHITESPACE
TPP_EXTENSION(TPP_EXT_MAGIC_WHITESPACE, TPP_EXTNAME_MAGIC_WHITESPACE, TPP_CONF_DEFAULT(TPP_HAVE_MAGIC_WHITESPACE))
#define _tpp_lexer_has_MAGIC_WHITESPACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MAGIC_WHITESPACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MAGIC_WHITESPACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_BUILTIN_MACROS)
#ifndef TPP_EXTNAME_CPP_BUILTIN_MACROS
#define TPP_EXTNAME_CPP_BUILTIN_MACROS "cpp-builtin-macros"
#endif /* !TPP_EXTNAME_CPP_BUILTIN_MACROS */
#define TPP_EXT_CPP_BUILTIN_MACROS TPP_EXT_CPP_BUILTIN_MACROS
TPP_EXTENSION(TPP_EXT_CPP_BUILTIN_MACROS, TPP_EXTNAME_CPP_BUILTIN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_CPP_BUILTIN_MACROS))
#define _tpp_lexer_has_CPP_BUILTIN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_BUILTIN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_BUILTIN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_EXCLAIM)
#ifndef TPP_EXTNAME_CPP_EXCLAIM
#define TPP_EXTNAME_CPP_EXCLAIM "shebang-directives"
#endif /* !TPP_EXTNAME_CPP_EXCLAIM */
#define TPP_EXT_CPP_EXCLAIM TPP_EXT_CPP_EXCLAIM
TPP_EXTENSION(TPP_EXT_CPP_EXCLAIM, TPP_EXTNAME_CPP_EXCLAIM, TPP_CONF_DEFAULT(TPP_HAVE_CPP_EXCLAIM))
#define _tpp_lexer_has_CPP_EXCLAIM(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_EXCLAIM)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_EXCLAIM) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_BLANK)
#ifndef TPP_EXTNAME_CPP_BLANK
#define TPP_EXTNAME_CPP_BLANK "blank-directives"
#endif /* !TPP_EXTNAME_CPP_BLANK */
#define TPP_EXT_CPP_BLANK TPP_EXT_CPP_BLANK
TPP_EXTENSION(TPP_EXT_CPP_BLANK, TPP_EXTNAME_CPP_BLANK, TPP_CONF_DEFAULT(TPP_HAVE_CPP_BLANK))
#define _tpp_lexer_has_CPP_BLANK(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_BLANK)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_BLANK) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_DIGIT_LINE)
#ifndef TPP_EXTNAME_CPP_DIGIT_LINE
#define TPP_EXTNAME_CPP_DIGIT_LINE "digit-directives"
#endif /* !TPP_EXTNAME_CPP_DIGIT_LINE */
#define TPP_EXT_CPP_DIGIT_LINE TPP_EXT_CPP_DIGIT_LINE
TPP_EXTENSION(TPP_EXT_CPP_DIGIT_LINE, TPP_EXTNAME_CPP_DIGIT_LINE, TPP_CONF_DEFAULT(TPP_HAVE_CPP_DIGIT_LINE))
#define _tpp_lexer_has_CPP_DIGIT_LINE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_DIGIT_LINE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_DIGIT_LINE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_LINE)
#ifndef TPP_EXTNAME_CPP_LINE
#define TPP_EXTNAME_CPP_LINE "line-directives"
#endif /* !TPP_EXTNAME_CPP_LINE */
#define TPP_EXT_CPP_LINE TPP_EXT_CPP_LINE
TPP_EXTENSION(TPP_EXT_CPP_LINE, TPP_EXTNAME_CPP_LINE, TPP_CONF_DEFAULT(TPP_HAVE_CPP_LINE))
#define _tpp_lexer_has_CPP_LINE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_LINE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_LINE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_INCLUDE)
#ifndef TPP_EXTNAME_CPP_INCLUDE
#define TPP_EXTNAME_CPP_INCLUDE "include-directives"
#endif /* !TPP_EXTNAME_CPP_INCLUDE */
#define TPP_EXT_CPP_INCLUDE TPP_EXT_CPP_INCLUDE
TPP_EXTENSION(TPP_EXT_CPP_INCLUDE, TPP_EXTNAME_CPP_INCLUDE, TPP_CONF_DEFAULT(TPP_HAVE_CPP_INCLUDE))
#define _tpp_lexer_has_CPP_INCLUDE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_INCLUDE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_INCLUDE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_INCLUDE_NEXT)
#ifndef TPP_EXTNAME_CPP_INCLUDE_NEXT
#define TPP_EXTNAME_CPP_INCLUDE_NEXT "include-next-directives"
#endif /* !TPP_EXTNAME_CPP_INCLUDE_NEXT */
#define TPP_EXT_CPP_INCLUDE_NEXT TPP_EXT_CPP_INCLUDE_NEXT
TPP_EXTENSION(TPP_EXT_CPP_INCLUDE_NEXT, TPP_EXTNAME_CPP_INCLUDE_NEXT, TPP_CONF_DEFAULT(TPP_HAVE_CPP_INCLUDE_NEXT))
#define _tpp_lexer_has_CPP_INCLUDE_NEXT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_INCLUDE_NEXT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_INCLUDE_NEXT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_IMPORT)
#ifndef TPP_EXTNAME_CPP_IMPORT
#define TPP_EXTNAME_CPP_IMPORT "import-directives"
#endif /* !TPP_EXTNAME_CPP_IMPORT */
#define TPP_EXT_CPP_IMPORT TPP_EXT_CPP_IMPORT
TPP_EXTENSION(TPP_EXT_CPP_IMPORT, TPP_EXTNAME_CPP_IMPORT, TPP_CONF_DEFAULT(TPP_HAVE_CPP_IMPORT))
#define _tpp_lexer_has_CPP_IMPORT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_IMPORT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_IMPORT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_IF_ELSE_ENDIF)
#ifndef TPP_EXTNAME_CPP_IF_ELSE_ENDIF
#define TPP_EXTNAME_CPP_IF_ELSE_ENDIF "if-directives"
#endif /* !TPP_EXTNAME_CPP_IF_ELSE_ENDIF */
#define TPP_EXT_CPP_IF_ELSE_ENDIF TPP_EXT_CPP_IF_ELSE_ENDIF
TPP_EXTENSION(TPP_EXT_CPP_IF_ELSE_ENDIF, TPP_EXTNAME_CPP_IF_ELSE_ENDIF, TPP_CONF_DEFAULT(TPP_HAVE_CPP_IF_ELSE_ENDIF))
#define _tpp_lexer_has_CPP_IF_ELSE_ENDIF(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_IF_ELSE_ENDIF)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_IF_ELSE_ENDIF) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_DEFINE)
#ifndef TPP_EXTNAME_CPP_DEFINE
#define TPP_EXTNAME_CPP_DEFINE "define-directives"
#endif /* !TPP_EXTNAME_CPP_DEFINE */
#define TPP_EXT_CPP_DEFINE TPP_EXT_CPP_DEFINE
TPP_EXTENSION(TPP_EXT_CPP_DEFINE, TPP_EXTNAME_CPP_DEFINE, TPP_CONF_DEFAULT(TPP_HAVE_CPP_DEFINE))
#define _tpp_lexer_has_CPP_DEFINE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_DEFINE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_DEFINE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_ASSERT)
#ifndef TPP_EXTNAME_CPP_ASSERT
#define TPP_EXTNAME_CPP_ASSERT "assertions"
#endif /* !TPP_EXTNAME_CPP_ASSERT */
#define TPP_EXT_CPP_ASSERT TPP_EXT_CPP_ASSERT
TPP_EXTENSION(TPP_EXT_CPP_ASSERT, TPP_EXTNAME_CPP_ASSERT, TPP_CONF_DEFAULT(TPP_HAVE_CPP_ASSERT))
#define _tpp_lexer_has_CPP_ASSERT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_ASSERT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_ASSERT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_ERROR)
#ifndef TPP_EXTNAME_CPP_ERROR
#define TPP_EXTNAME_CPP_ERROR "error-directives"
#endif /* !TPP_EXTNAME_CPP_ERROR */
#define TPP_EXT_CPP_ERROR TPP_EXT_CPP_ERROR
TPP_EXTENSION(TPP_EXT_CPP_ERROR, TPP_EXTNAME_CPP_ERROR, TPP_CONF_DEFAULT(TPP_HAVE_CPP_ERROR))
#define _tpp_lexer_has_CPP_ERROR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_ERROR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_ERROR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_WARNING)
#ifndef TPP_EXTNAME_CPP_WARNING
#define TPP_EXTNAME_CPP_WARNING "warning-directives"
#endif /* !TPP_EXTNAME_CPP_WARNING */
#define TPP_EXT_CPP_WARNING TPP_EXT_CPP_WARNING
TPP_EXTENSION(TPP_EXT_CPP_WARNING, TPP_EXTNAME_CPP_WARNING, TPP_CONF_DEFAULT(TPP_HAVE_CPP_WARNING))
#define _tpp_lexer_has_CPP_WARNING(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_WARNING)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_WARNING) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_IDENT_SCCS)
#ifndef TPP_EXTNAME_CPP_IDENT_SCCS
#define TPP_EXTNAME_CPP_IDENT_SCCS "ident-directives"
#endif /* !TPP_EXTNAME_CPP_IDENT_SCCS */
#define TPP_EXT_CPP_IDENT_SCCS TPP_EXT_CPP_IDENT_SCCS
TPP_EXTENSION(TPP_EXT_CPP_IDENT_SCCS, TPP_EXTNAME_CPP_IDENT_SCCS, TPP_CONF_DEFAULT(TPP_HAVE_CPP_IDENT_SCCS))
#define _tpp_lexer_has_CPP_IDENT_SCCS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_IDENT_SCCS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_IDENT_SCCS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_PRAGMA)
#ifndef TPP_EXTNAME_CPP_PRAGMA
#define TPP_EXTNAME_CPP_PRAGMA "pragma-directives"
#endif /* !TPP_EXTNAME_CPP_PRAGMA */
#define TPP_EXT_CPP_PRAGMA TPP_EXT_CPP_PRAGMA
TPP_EXTENSION(TPP_EXT_CPP_PRAGMA, TPP_EXTNAME_CPP_PRAGMA, TPP_CONF_DEFAULT(TPP_HAVE_CPP_PRAGMA))
#define _tpp_lexer_has_CPP_PRAGMA(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_PRAGMA)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_PRAGMA) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CPP_EMBED)
#ifndef TPP_EXTNAME_CPP_EMBED
#define TPP_EXTNAME_CPP_EMBED "embed-directives"
#endif /* !TPP_EXTNAME_CPP_EMBED */
#define TPP_EXT_CPP_EMBED TPP_EXT_CPP_EMBED
TPP_EXTENSION(TPP_EXT_CPP_EMBED, TPP_EXTNAME_CPP_EMBED, TPP_CONF_DEFAULT(TPP_HAVE_CPP_EMBED))
#define _tpp_lexer_has_CPP_EMBED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CPP_EMBED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CPP_EMBED) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO__Pragma)
#ifndef TPP_EXTNAME_MACRO__Pragma
#define TPP_EXTNAME_MACRO__Pragma "_Pragma"
#endif /* !TPP_EXTNAME_MACRO__Pragma */
#define TPP_EXT_MACRO__Pragma TPP_EXT_MACRO__Pragma
TPP_EXTENSION(TPP_EXT_MACRO__Pragma, TPP_EXTNAME_MACRO__Pragma, TPP_CONF_DEFAULT(TPP_HAVE_MACRO__Pragma))
#define _tpp_lexer_has_MACRO__Pragma(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO__Pragma)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO__Pragma) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___pragma)
#ifndef TPP_EXTNAME_MACRO___pragma
#define TPP_EXTNAME_MACRO___pragma "__pragma"
#endif /* !TPP_EXTNAME_MACRO___pragma */
#define TPP_EXT_MACRO___pragma TPP_EXT_MACRO___pragma
TPP_EXTENSION(TPP_EXT_MACRO___pragma, TPP_EXTNAME_MACRO___pragma, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___pragma))
#define _tpp_lexer_has_MACRO___pragma(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___pragma)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___pragma) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_attribute)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_attribute
#define TPP_EXTNAME_CLANG_MACRO___has_attribute "clang-__has_attribute"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_attribute */
#define TPP_EXT_CLANG_MACRO___has_attribute TPP_EXT_CLANG_MACRO___has_attribute
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_attribute, TPP_EXTNAME_CLANG_MACRO___has_attribute, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_attribute))
#define _tpp_lexer_has_CLANG_MACRO___has_attribute(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_attribute)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_attribute) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_builtin)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_builtin
#define TPP_EXTNAME_CLANG_MACRO___has_builtin "clang-__has_builtin"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_builtin */
#define TPP_EXT_CLANG_MACRO___has_builtin TPP_EXT_CLANG_MACRO___has_builtin
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_builtin, TPP_EXTNAME_CLANG_MACRO___has_builtin, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_builtin))
#define _tpp_lexer_has_CLANG_MACRO___has_builtin(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_builtin)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_builtin) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_cpp_attribute
#define TPP_EXTNAME_CLANG_MACRO___has_cpp_attribute "clang-__has_cpp_attribute"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_cpp_attribute */
#define TPP_EXT_CLANG_MACRO___has_cpp_attribute TPP_EXT_CLANG_MACRO___has_cpp_attribute
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_cpp_attribute, TPP_EXTNAME_CLANG_MACRO___has_cpp_attribute, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute))
#define _tpp_lexer_has_CLANG_MACRO___has_cpp_attribute(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_cpp_attribute)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_declspec_attribute
#define TPP_EXTNAME_CLANG_MACRO___has_declspec_attribute "clang-__has_declspec_attribute"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_declspec_attribute */
#define TPP_EXT_CLANG_MACRO___has_declspec_attribute TPP_EXT_CLANG_MACRO___has_declspec_attribute
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_declspec_attribute, TPP_EXTNAME_CLANG_MACRO___has_declspec_attribute, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute))
#define _tpp_lexer_has_CLANG_MACRO___has_declspec_attribute(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_declspec_attribute)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_extension)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_extension
#define TPP_EXTNAME_CLANG_MACRO___has_extension "clang-__has_extension"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_extension */
#define TPP_EXT_CLANG_MACRO___has_extension TPP_EXT_CLANG_MACRO___has_extension
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_extension, TPP_EXTNAME_CLANG_MACRO___has_extension, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_extension))
#define _tpp_lexer_has_CLANG_MACRO___has_extension(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_extension)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_extension) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_feature)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_feature
#define TPP_EXTNAME_CLANG_MACRO___has_feature "clang-__has_feature"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_feature */
#define TPP_EXT_CLANG_MACRO___has_feature TPP_EXT_CLANG_MACRO___has_feature
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_feature, TPP_EXTNAME_CLANG_MACRO___has_feature, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_feature))
#define _tpp_lexer_has_CLANG_MACRO___has_feature(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_feature)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_feature) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_c_attribute)
#ifndef TPP_EXTNAME_CLANG_MACRO___has_c_attribute
#define TPP_EXTNAME_CLANG_MACRO___has_c_attribute "clang-__has_c_attribute"
#endif /* !TPP_EXTNAME_CLANG_MACRO___has_c_attribute */
#define TPP_EXT_CLANG_MACRO___has_c_attribute TPP_EXT_CLANG_MACRO___has_c_attribute
TPP_EXTENSION(TPP_EXT_CLANG_MACRO___has_c_attribute, TPP_EXTNAME_CLANG_MACRO___has_c_attribute, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_c_attribute))
#define _tpp_lexer_has_CLANG_MACRO___has_c_attribute(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_MACRO___has_c_attribute)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_MACRO___has_c_attribute) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES)
#ifndef TPP_EXTNAME_CLANG_EXTENSIONS_ARE_FEATURES
#define TPP_EXTNAME_CLANG_EXTENSIONS_ARE_FEATURES "clang-extensions-are-features"
#endif /* !TPP_EXTNAME_CLANG_EXTENSIONS_ARE_FEATURES */
#define TPP_EXT_CLANG_EXTENSIONS_ARE_FEATURES TPP_EXT_CLANG_EXTENSIONS_ARE_FEATURES
TPP_EXTENSION(TPP_EXT_CLANG_EXTENSIONS_ARE_FEATURES, TPP_EXTNAME_CLANG_EXTENSIONS_ARE_FEATURES, TPP_CONF_DEFAULT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES))
#define _tpp_lexer_has_CLANG_EXTENSIONS_ARE_FEATURES(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CLANG_EXTENSIONS_ARE_FEATURES)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_identifier)
#ifndef TPP_EXTNAME_MACRO___is_identifier
#define TPP_EXTNAME_MACRO___is_identifier "__is_identifier"
#endif /* !TPP_EXTNAME_MACRO___is_identifier */
#define TPP_EXT_MACRO___is_identifier TPP_EXT_MACRO___is_identifier
TPP_EXTENSION(TPP_EXT_MACRO___is_identifier, TPP_EXTNAME_MACRO___is_identifier, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_identifier))
#define _tpp_lexer_has_MACRO___is_identifier(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___is_identifier)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_identifier) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_deprecated)
#ifndef TPP_EXTNAME_MACRO___is_deprecated
#define TPP_EXTNAME_MACRO___is_deprecated "__is_deprecated"
#endif /* !TPP_EXTNAME_MACRO___is_deprecated */
#define TPP_EXT_MACRO___is_deprecated TPP_EXT_MACRO___is_deprecated
TPP_EXTENSION(TPP_EXT_MACRO___is_deprecated, TPP_EXTNAME_MACRO___is_deprecated, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_deprecated))
#define _tpp_lexer_has_MACRO___is_deprecated(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___is_deprecated)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_deprecated) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_poisoned)
#ifndef TPP_EXTNAME_MACRO___is_poisoned
#define TPP_EXTNAME_MACRO___is_poisoned "__is_poisoned"
#endif /* !TPP_EXTNAME_MACRO___is_poisoned */
#define TPP_EXT_MACRO___is_poisoned TPP_EXT_MACRO___is_poisoned
TPP_EXTENSION(TPP_EXT_MACRO___is_poisoned, TPP_EXTNAME_MACRO___is_poisoned, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_poisoned))
#define _tpp_lexer_has_MACRO___is_poisoned(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___is_poisoned)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___is_poisoned) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_extension)
#ifndef TPP_EXTNAME_MACRO___has_extension
#define TPP_EXTNAME_MACRO___has_extension "__has_extension"
#endif /* !TPP_EXTNAME_MACRO___has_extension */
#define TPP_EXT_MACRO___has_extension TPP_EXT_MACRO___has_extension
TPP_EXTENSION(TPP_EXT_MACRO___has_extension, TPP_EXTNAME_MACRO___has_extension, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_extension))
#define _tpp_lexer_has_MACRO___has_extension(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_extension)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_extension) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_known_extension)
#ifndef TPP_EXTNAME_MACRO___has_known_extension
#define TPP_EXTNAME_MACRO___has_known_extension "__has_known_extension"
#endif /* !TPP_EXTNAME_MACRO___has_known_extension */
#define TPP_EXT_MACRO___has_known_extension TPP_EXT_MACRO___has_known_extension
TPP_EXTENSION(TPP_EXT_MACRO___has_known_extension, TPP_EXTNAME_MACRO___has_known_extension, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_known_extension))
#define _tpp_lexer_has_MACRO___has_known_extension(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_known_extension)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_known_extension) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_warning)
#ifndef TPP_EXTNAME_MACRO___has_warning
#define TPP_EXTNAME_MACRO___has_warning "__has_warning"
#endif /* !TPP_EXTNAME_MACRO___has_warning */
#define TPP_EXT_MACRO___has_warning TPP_EXT_MACRO___has_warning
TPP_EXTENSION(TPP_EXT_MACRO___has_warning, TPP_EXTNAME_MACRO___has_warning, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_warning))
#define _tpp_lexer_has_MACRO___has_warning(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_warning)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_warning) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_known_warning)
#ifndef TPP_EXTNAME_MACRO___has_known_warning
#define TPP_EXTNAME_MACRO___has_known_warning "__has_known_warning"
#endif /* !TPP_EXTNAME_MACRO___has_known_warning */
#define TPP_EXT_MACRO___has_known_warning TPP_EXT_MACRO___has_known_warning
TPP_EXTENSION(TPP_EXT_MACRO___has_known_warning, TPP_EXTNAME_MACRO___has_known_warning, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_known_warning))
#define _tpp_lexer_has_MACRO___has_known_warning(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_known_warning)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_known_warning) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_include)
#ifndef TPP_EXTNAME_MACRO___has_include
#define TPP_EXTNAME_MACRO___has_include "__has_include"
#endif /* !TPP_EXTNAME_MACRO___has_include */
#define TPP_EXT_MACRO___has_include TPP_EXT_MACRO___has_include
TPP_EXTENSION(TPP_EXT_MACRO___has_include, TPP_EXTNAME_MACRO___has_include, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_include))
#define _tpp_lexer_has_MACRO___has_include(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_include)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_include) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_include_next)
#ifndef TPP_EXTNAME_MACRO___has_include_next
#define TPP_EXTNAME_MACRO___has_include_next "__has_include_next"
#endif /* !TPP_EXTNAME_MACRO___has_include_next */
#define TPP_EXT_MACRO___has_include_next TPP_EXT_MACRO___has_include_next
TPP_EXTENSION(TPP_EXT_MACRO___has_include_next, TPP_EXTNAME_MACRO___has_include_next, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_include_next))
#define _tpp_lexer_has_MACRO___has_include_next(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_include_next)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_include_next) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_embed)
#ifndef TPP_EXTNAME_MACRO___has_embed
#define TPP_EXTNAME_MACRO___has_embed "__has_embed"
#endif /* !TPP_EXTNAME_MACRO___has_embed */
#define TPP_EXT_MACRO___has_embed TPP_EXT_MACRO___has_embed
TPP_EXTENSION(TPP_EXT_MACRO___has_embed, TPP_EXTNAME_MACRO___has_embed, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_embed))
#define _tpp_lexer_has_MACRO___has_embed(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___has_embed)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___has_embed) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___FILE__)
#ifndef TPP_EXTNAME_MACRO___FILE__
#define TPP_EXTNAME_MACRO___FILE__ "__FILE__"
#endif /* !TPP_EXTNAME_MACRO___FILE__ */
#define TPP_EXT_MACRO___FILE__ TPP_EXT_MACRO___FILE__
TPP_EXTENSION(TPP_EXT_MACRO___FILE__, TPP_EXTNAME_MACRO___FILE__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___FILE__))
#define _tpp_lexer_has_MACRO___FILE__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___FILE__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___FILE__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___LINE__)
#ifndef TPP_EXTNAME_MACRO___LINE__
#define TPP_EXTNAME_MACRO___LINE__ "__LINE__"
#endif /* !TPP_EXTNAME_MACRO___LINE__ */
#define TPP_EXT_MACRO___LINE__ TPP_EXT_MACRO___LINE__
TPP_EXTENSION(TPP_EXT_MACRO___LINE__, TPP_EXTNAME_MACRO___LINE__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___LINE__))
#define _tpp_lexer_has_MACRO___LINE__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___LINE__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___LINE__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TIME__)
#ifndef TPP_EXTNAME_MACRO___TIME__
#define TPP_EXTNAME_MACRO___TIME__ "__TIME__"
#endif /* !TPP_EXTNAME_MACRO___TIME__ */
#define TPP_EXT_MACRO___TIME__ TPP_EXT_MACRO___TIME__
TPP_EXTENSION(TPP_EXT_MACRO___TIME__, TPP_EXTNAME_MACRO___TIME__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TIME__))
#define _tpp_lexer_has_MACRO___TIME__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TIME__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TIME__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___DATE__)
#ifndef TPP_EXTNAME_MACRO___DATE__
#define TPP_EXTNAME_MACRO___DATE__ "__DATE__"
#endif /* !TPP_EXTNAME_MACRO___DATE__ */
#define TPP_EXT_MACRO___DATE__ TPP_EXT_MACRO___DATE__
TPP_EXTENSION(TPP_EXT_MACRO___DATE__, TPP_EXTNAME_MACRO___DATE__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___DATE__))
#define _tpp_lexer_has_MACRO___DATE__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___DATE__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___DATE__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___COLUMN__)
#ifndef TPP_EXTNAME_MACRO___COLUMN__
#define TPP_EXTNAME_MACRO___COLUMN__ "column-macro"
#endif /* !TPP_EXTNAME_MACRO___COLUMN__ */
#define TPP_EXT_MACRO___COLUMN__ TPP_EXT_MACRO___COLUMN__
TPP_EXTENSION(TPP_EXT_MACRO___COLUMN__, TPP_EXTNAME_MACRO___COLUMN__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___COLUMN__))
#define _tpp_lexer_has_MACRO___COLUMN__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___COLUMN__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___COLUMN__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___BASE_FILE__)
#ifndef TPP_EXTNAME_MACRO___BASE_FILE__
#define TPP_EXTNAME_MACRO___BASE_FILE__ "basefile-macro"
#endif /* !TPP_EXTNAME_MACRO___BASE_FILE__ */
#define TPP_EXT_MACRO___BASE_FILE__ TPP_EXT_MACRO___BASE_FILE__
TPP_EXTENSION(TPP_EXT_MACRO___BASE_FILE__, TPP_EXTNAME_MACRO___BASE_FILE__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___BASE_FILE__))
#define _tpp_lexer_has_MACRO___BASE_FILE__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___BASE_FILE__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___BASE_FILE__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___FILE_NAME__)
#ifndef TPP_EXTNAME_MACRO___FILE_NAME__
#define TPP_EXTNAME_MACRO___FILE_NAME__ "__FILE_NAME__"
#endif /* !TPP_EXTNAME_MACRO___FILE_NAME__ */
#define TPP_EXT_MACRO___FILE_NAME__ TPP_EXT_MACRO___FILE_NAME__
TPP_EXTENSION(TPP_EXT_MACRO___FILE_NAME__, TPP_EXTNAME_MACRO___FILE_NAME__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___FILE_NAME__))
#define _tpp_lexer_has_MACRO___FILE_NAME__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___FILE_NAME__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___FILE_NAME__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___INCLUDE_LEVEL__)
#ifndef TPP_EXTNAME_MACRO___INCLUDE_LEVEL__
#define TPP_EXTNAME_MACRO___INCLUDE_LEVEL__ "include-level-macro"
#endif /* !TPP_EXTNAME_MACRO___INCLUDE_LEVEL__ */
#define TPP_EXT_MACRO___INCLUDE_LEVEL__ TPP_EXT_MACRO___INCLUDE_LEVEL__
TPP_EXTENSION(TPP_EXT_MACRO___INCLUDE_LEVEL__, TPP_EXTNAME_MACRO___INCLUDE_LEVEL__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___INCLUDE_LEVEL__))
#define _tpp_lexer_has_MACRO___INCLUDE_LEVEL__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___INCLUDE_LEVEL__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___INCLUDE_LEVEL__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___INCLUDE_DEPTH__)
#ifndef TPP_EXTNAME_MACRO___INCLUDE_DEPTH__
#define TPP_EXTNAME_MACRO___INCLUDE_DEPTH__ "include-depth-macro"
#endif /* !TPP_EXTNAME_MACRO___INCLUDE_DEPTH__ */
#define TPP_EXT_MACRO___INCLUDE_DEPTH__ TPP_EXT_MACRO___INCLUDE_DEPTH__
TPP_EXTENSION(TPP_EXT_MACRO___INCLUDE_DEPTH__, TPP_EXTNAME_MACRO___INCLUDE_DEPTH__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___INCLUDE_DEPTH__))
#define _tpp_lexer_has_MACRO___INCLUDE_DEPTH__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___INCLUDE_DEPTH__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___INCLUDE_DEPTH__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___COUNTER__)
#ifndef TPP_EXTNAME_MACRO___COUNTER__
#define TPP_EXTNAME_MACRO___COUNTER__ "counter-macro"
#endif /* !TPP_EXTNAME_MACRO___COUNTER__ */
#define TPP_EXT_MACRO___COUNTER__ TPP_EXT_MACRO___COUNTER__
TPP_EXTENSION(TPP_EXT_MACRO___COUNTER__, TPP_EXTNAME_MACRO___COUNTER__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___COUNTER__))
#define _tpp_lexer_has_MACRO___COUNTER__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___COUNTER__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___COUNTER__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TIMESTAMP__)
#ifndef TPP_EXTNAME_MACRO___TIMESTAMP__
#define TPP_EXTNAME_MACRO___TIMESTAMP__ "timestamp-macro"
#endif /* !TPP_EXTNAME_MACRO___TIMESTAMP__ */
#define TPP_EXT_MACRO___TIMESTAMP__ TPP_EXT_MACRO___TIMESTAMP__
TPP_EXTENSION(TPP_EXT_MACRO___TIMESTAMP__, TPP_EXTNAME_MACRO___TIMESTAMP__, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TIMESTAMP__))
#define _tpp_lexer_has_MACRO___TIMESTAMP__(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TIMESTAMP__)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TIMESTAMP__) */
#if TPP_CONF_IS_EXT(TPP_HAVE_NUMERIC_DATE_MACROS)
#ifndef TPP_EXTNAME_NUMERIC_DATE_MACROS
#define TPP_EXTNAME_NUMERIC_DATE_MACROS "numeric-date-macros"
#endif /* !TPP_EXTNAME_NUMERIC_DATE_MACROS */
#define TPP_EXT_NUMERIC_DATE_MACROS TPP_EXT_NUMERIC_DATE_MACROS
TPP_EXTENSION(TPP_EXT_NUMERIC_DATE_MACROS, TPP_EXTNAME_NUMERIC_DATE_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_NUMERIC_DATE_MACROS))
#define _tpp_lexer_has_NUMERIC_DATE_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_NUMERIC_DATE_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_NUMERIC_DATE_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_NUMERIC_TIME_MACROS)
#ifndef TPP_EXTNAME_NUMERIC_TIME_MACROS
#define TPP_EXTNAME_NUMERIC_TIME_MACROS "numeric-time-macros"
#endif /* !TPP_EXTNAME_NUMERIC_TIME_MACROS */
#define TPP_EXT_NUMERIC_TIME_MACROS TPP_EXT_NUMERIC_TIME_MACROS
TPP_EXTENSION(TPP_EXT_NUMERIC_TIME_MACROS, TPP_EXTNAME_NUMERIC_TIME_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_NUMERIC_TIME_MACROS))
#define _tpp_lexer_has_NUMERIC_TIME_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_NUMERIC_TIME_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_NUMERIC_TIME_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_EVAL)
#ifndef TPP_EXTNAME_MACRO___TPP_EVAL
#define TPP_EXTNAME_MACRO___TPP_EVAL "tpp-eval-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_EVAL */
#define TPP_EXT_MACRO___TPP_EVAL TPP_EXT_MACRO___TPP_EVAL
TPP_EXTENSION(TPP_EXT_MACRO___TPP_EVAL, TPP_EXTNAME_MACRO___TPP_EVAL, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_EVAL))
#define _tpp_lexer_has_MACRO___TPP_EVAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_EVAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_EVAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_EXEC)
#ifndef TPP_EXTNAME_MACRO___TPP_EXEC
#define TPP_EXTNAME_MACRO___TPP_EXEC "tpp-exec-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_EXEC */
#define TPP_EXT_MACRO___TPP_EXEC TPP_EXT_MACRO___TPP_EXEC
TPP_EXTENSION(TPP_EXT_MACRO___TPP_EXEC, TPP_EXTNAME_MACRO___TPP_EXEC, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_EXEC))
#define _tpp_lexer_has_MACRO___TPP_EXEC(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_EXEC)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_EXEC) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_UNIQUE)
#ifndef TPP_EXTNAME_MACRO___TPP_UNIQUE
#define TPP_EXTNAME_MACRO___TPP_UNIQUE "tpp-unique-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_UNIQUE */
#define TPP_EXT_MACRO___TPP_UNIQUE TPP_EXT_MACRO___TPP_UNIQUE
TPP_EXTENSION(TPP_EXT_MACRO___TPP_UNIQUE, TPP_EXTNAME_MACRO___TPP_UNIQUE, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_UNIQUE))
#define _tpp_lexer_has_MACRO___TPP_UNIQUE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_UNIQUE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_UNIQUE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_LOAD_FILE)
#ifndef TPP_EXTNAME_MACRO___TPP_LOAD_FILE
#define TPP_EXTNAME_MACRO___TPP_LOAD_FILE "tpp-load-file-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_LOAD_FILE */
#define TPP_EXT_MACRO___TPP_LOAD_FILE TPP_EXT_MACRO___TPP_LOAD_FILE
TPP_EXTENSION(TPP_EXT_MACRO___TPP_LOAD_FILE, TPP_EXTNAME_MACRO___TPP_LOAD_FILE, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_LOAD_FILE))
#define _tpp_lexer_has_MACRO___TPP_LOAD_FILE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_LOAD_FILE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_LOAD_FILE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_COUNTER)
#ifndef TPP_EXTNAME_MACRO___TPP_COUNTER
#define TPP_EXTNAME_MACRO___TPP_COUNTER "tpp-counter-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_COUNTER */
#define TPP_EXT_MACRO___TPP_COUNTER TPP_EXT_MACRO___TPP_COUNTER
TPP_EXTENSION(TPP_EXT_MACRO___TPP_COUNTER, TPP_EXTNAME_MACRO___TPP_COUNTER, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_COUNTER))
#define _tpp_lexer_has_MACRO___TPP_COUNTER(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_COUNTER)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_COUNTER) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_RANDOM)
#ifndef TPP_EXTNAME_MACRO___TPP_RANDOM
#define TPP_EXTNAME_MACRO___TPP_RANDOM "tpp-random-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_RANDOM */
#define TPP_EXT_MACRO___TPP_RANDOM TPP_EXT_MACRO___TPP_RANDOM
TPP_EXTENSION(TPP_EXT_MACRO___TPP_RANDOM, TPP_EXTNAME_MACRO___TPP_RANDOM, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_RANDOM))
#define _tpp_lexer_has_MACRO___TPP_RANDOM(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_RANDOM)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_RANDOM) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE)
#ifndef TPP_EXTNAME_MACRO___TPP_STR_DECOMPILE
#define TPP_EXTNAME_MACRO___TPP_STR_DECOMPILE "tpp-str-decompile-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_STR_DECOMPILE */
#define TPP_EXT_MACRO___TPP_STR_DECOMPILE TPP_EXT_MACRO___TPP_STR_DECOMPILE
TPP_EXTENSION(TPP_EXT_MACRO___TPP_STR_DECOMPILE, TPP_EXTNAME_MACRO___TPP_STR_DECOMPILE, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE))
#define _tpp_lexer_has_MACRO___TPP_STR_DECOMPILE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_STR_DECOMPILE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_PACK)
#ifndef TPP_EXTNAME_MACRO___TPP_STR_PACK
#define TPP_EXTNAME_MACRO___TPP_STR_PACK "tpp-str-pack-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_STR_PACK */
#define TPP_EXT_MACRO___TPP_STR_PACK TPP_EXT_MACRO___TPP_STR_PACK
TPP_EXTENSION(TPP_EXT_MACRO___TPP_STR_PACK, TPP_EXTNAME_MACRO___TPP_STR_PACK, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_PACK))
#define _tpp_lexer_has_MACRO___TPP_STR_PACK(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_STR_PACK)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_PACK) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_SUBSTR)
#ifndef TPP_EXTNAME_MACRO___TPP_STR_SUBSTR
#define TPP_EXTNAME_MACRO___TPP_STR_SUBSTR "tpp-str-substr-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_STR_SUBSTR */
#define TPP_EXT_MACRO___TPP_STR_SUBSTR TPP_EXT_MACRO___TPP_STR_SUBSTR
TPP_EXTENSION(TPP_EXT_MACRO___TPP_STR_SUBSTR, TPP_EXTNAME_MACRO___TPP_STR_SUBSTR, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_SUBSTR))
#define _tpp_lexer_has_MACRO___TPP_STR_SUBSTR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_STR_SUBSTR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_SUBSTR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_SIZE)
#ifndef TPP_EXTNAME_MACRO___TPP_STR_SIZE
#define TPP_EXTNAME_MACRO___TPP_STR_SIZE "tpp-str-size-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_STR_SIZE */
#define TPP_EXT_MACRO___TPP_STR_SIZE TPP_EXT_MACRO___TPP_STR_SIZE
TPP_EXTENSION(TPP_EXT_MACRO___TPP_STR_SIZE, TPP_EXTNAME_MACRO___TPP_STR_SIZE, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_SIZE))
#define _tpp_lexer_has_MACRO___TPP_STR_SIZE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_STR_SIZE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_STR_SIZE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS)
#ifndef TPP_EXTNAME_MACRO___TPP_COUNT_TOKENS
#define TPP_EXTNAME_MACRO___TPP_COUNT_TOKENS "tpp-count-tokens-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_COUNT_TOKENS */
#define TPP_EXT_MACRO___TPP_COUNT_TOKENS TPP_EXT_MACRO___TPP_COUNT_TOKENS
TPP_EXTENSION(TPP_EXT_MACRO___TPP_COUNT_TOKENS, TPP_EXTNAME_MACRO___TPP_COUNT_TOKENS, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS))
#define _tpp_lexer_has_MACRO___TPP_COUNT_TOKENS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_COUNT_TOKENS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_IDENTIFIER)
#ifndef TPP_EXTNAME_MACRO___TPP_IDENTIFIER
#define TPP_EXTNAME_MACRO___TPP_IDENTIFIER "tpp-identifier-macro"
#endif /* !TPP_EXTNAME_MACRO___TPP_IDENTIFIER */
#define TPP_EXT_MACRO___TPP_IDENTIFIER TPP_EXT_MACRO___TPP_IDENTIFIER
TPP_EXTENSION(TPP_EXT_MACRO___TPP_IDENTIFIER, TPP_EXTNAME_MACRO___TPP_IDENTIFIER, TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_IDENTIFIER))
#define _tpp_lexer_has_MACRO___TPP_IDENTIFIER(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO___TPP_IDENTIFIER)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO___TPP_IDENTIFIER) */
#if TPP_CONF_IS_EXT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
#ifndef TPP_EXTNAME_ALTERNATIVE_MACRO_PARENTHESIS
#define TPP_EXTNAME_ALTERNATIVE_MACRO_PARENTHESIS "alternative-macro-parenthesis"
#endif /* !TPP_EXTNAME_ALTERNATIVE_MACRO_PARENTHESIS */
#define TPP_EXT_ALTERNATIVE_MACRO_PARENTHESIS TPP_EXT_ALTERNATIVE_MACRO_PARENTHESIS
TPP_EXTENSION(TPP_EXT_ALTERNATIVE_MACRO_PARENTHESIS, TPP_EXTNAME_ALTERNATIVE_MACRO_PARENTHESIS, TPP_CONF_DEFAULT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS))
#define _tpp_lexer_has_ALTERNATIVE_MACRO_PARENTHESIS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_ALTERNATIVE_MACRO_PARENTHESIS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#ifndef TPP_EXTNAME_MACRO_ARGUMENT_WHITESPACE
#define TPP_EXTNAME_MACRO_ARGUMENT_WHITESPACE "macro-argument-whitespace"
#endif /* !TPP_EXTNAME_MACRO_ARGUMENT_WHITESPACE */
#define TPP_EXT_MACRO_ARGUMENT_WHITESPACE TPP_EXT_MACRO_ARGUMENT_WHITESPACE
TPP_EXTENSION(TPP_EXT_MACRO_ARGUMENT_WHITESPACE, TPP_EXTNAME_MACRO_ARGUMENT_WHITESPACE, TPP_CONF_DEFAULT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE))
#define _tpp_lexer_has_MACRO_ARGUMENT_WHITESPACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO_ARGUMENT_WHITESPACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO_RECURSION)
#ifndef TPP_EXTNAME_MACRO_RECURSION
#define TPP_EXTNAME_MACRO_RECURSION "macro-recursion"
#endif /* !TPP_EXTNAME_MACRO_RECURSION */
#define TPP_EXT_MACRO_RECURSION TPP_EXT_MACRO_RECURSION
TPP_EXTENSION(TPP_EXT_MACRO_RECURSION, TPP_EXTNAME_MACRO_RECURSION, TPP_CONF_DEFAULT(TPP_HAVE_MACRO_RECURSION))
#define _tpp_lexer_has_MACRO_RECURSION(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_MACRO_RECURSION)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TRADITIONAL_MACROS)
#ifndef TPP_EXTNAME_TRADITIONAL_MACROS
#define TPP_EXTNAME_TRADITIONAL_MACROS "traditional-macro"
#endif /* !TPP_EXTNAME_TRADITIONAL_MACROS */
#define TPP_EXT_TRADITIONAL_MACROS TPP_EXT_TRADITIONAL_MACROS
TPP_EXTENSION(TPP_EXT_TRADITIONAL_MACROS, TPP_EXTNAME_TRADITIONAL_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_TRADITIONAL_MACROS))
#define _tpp_lexer_has_TRADITIONAL_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TRADITIONAL_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TRADITIONAL_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_NAMED_VARARGS_IN_MACROS)
#ifndef TPP_EXTNAME_NAMED_VARARGS_IN_MACROS
#define TPP_EXTNAME_NAMED_VARARGS_IN_MACROS "named-varargs-in-macros"
#endif /* !TPP_EXTNAME_NAMED_VARARGS_IN_MACROS */
#define TPP_EXT_NAMED_VARARGS_IN_MACROS TPP_EXT_NAMED_VARARGS_IN_MACROS
TPP_EXTENSION(TPP_EXT_NAMED_VARARGS_IN_MACROS, TPP_EXTNAME_NAMED_VARARGS_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_NAMED_VARARGS_IN_MACROS))
#define _tpp_lexer_has_NAMED_VARARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_NAMED_VARARGS_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_NAMED_VARARGS_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_VA_ARGS_IN_MACROS)
#ifndef TPP_EXTNAME_VA_ARGS_IN_MACROS
#define TPP_EXTNAME_VA_ARGS_IN_MACROS "va-args-in-macros"
#endif /* !TPP_EXTNAME_VA_ARGS_IN_MACROS */
#define TPP_EXT_VA_ARGS_IN_MACROS TPP_EXT_VA_ARGS_IN_MACROS
TPP_EXTENSION(TPP_EXT_VA_ARGS_IN_MACROS, TPP_EXTNAME_VA_ARGS_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_VA_ARGS_IN_MACROS))
#define _tpp_lexer_has_VA_ARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_VA_ARGS_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_VA_ARGS_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_VA_COMMA_IN_MACROS)
#ifndef TPP_EXTNAME_VA_COMMA_IN_MACROS
#define TPP_EXTNAME_VA_COMMA_IN_MACROS "va-comma-in-macros"
#endif /* !TPP_EXTNAME_VA_COMMA_IN_MACROS */
#define TPP_EXT_VA_COMMA_IN_MACROS TPP_EXT_VA_COMMA_IN_MACROS
TPP_EXTENSION(TPP_EXT_VA_COMMA_IN_MACROS, TPP_EXTNAME_VA_COMMA_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_VA_COMMA_IN_MACROS))
#define _tpp_lexer_has_VA_COMMA_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_VA_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_VA_COMMA_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_VA_OPT_IN_MACROS)
#ifndef TPP_EXTNAME_VA_OPT_IN_MACROS
#define TPP_EXTNAME_VA_OPT_IN_MACROS "va-opt-in-macros"
#endif /* !TPP_EXTNAME_VA_OPT_IN_MACROS */
#define TPP_EXT_VA_OPT_IN_MACROS TPP_EXT_VA_OPT_IN_MACROS
TPP_EXTENSION(TPP_EXT_VA_OPT_IN_MACROS, TPP_EXTNAME_VA_OPT_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_VA_OPT_IN_MACROS))
#define _tpp_lexer_has_VA_OPT_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_VA_OPT_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_VA_OPT_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_VA_NARGS_IN_MACROS)
#ifndef TPP_EXTNAME_VA_NARGS_IN_MACROS
#define TPP_EXTNAME_VA_NARGS_IN_MACROS "va-nargs-in-macros"
#endif /* !TPP_EXTNAME_VA_NARGS_IN_MACROS */
#define TPP_EXT_VA_NARGS_IN_MACROS TPP_EXT_VA_NARGS_IN_MACROS
TPP_EXTENSION(TPP_EXT_VA_NARGS_IN_MACROS, TPP_EXTNAME_VA_NARGS_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_VA_NARGS_IN_MACROS))
#define _tpp_lexer_has_VA_NARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_VA_NARGS_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_VA_NARGS_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)
#ifndef TPP_EXTNAME_VA_GLUE_COMMA_IN_MACROS
#define TPP_EXTNAME_VA_GLUE_COMMA_IN_MACROS "glue-comma-in-macros"
#endif /* !TPP_EXTNAME_VA_GLUE_COMMA_IN_MACROS */
#define TPP_EXT_VA_GLUE_COMMA_IN_MACROS TPP_EXT_VA_GLUE_COMMA_IN_MACROS
TPP_EXTENSION(TPP_EXT_VA_GLUE_COMMA_IN_MACROS, TPP_EXTNAME_VA_GLUE_COMMA_IN_MACROS, TPP_CONF_DEFAULT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS))
#define _tpp_lexer_has_VA_GLUE_COMMA_IN_MACROS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_VA_GLUE_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT)
#ifndef TPP_EXTNAME_STRINGIZE_MACRO_ARGUMENT
#define TPP_EXTNAME_STRINGIZE_MACRO_ARGUMENT "stringize-macro-argument"
#endif /* !TPP_EXTNAME_STRINGIZE_MACRO_ARGUMENT */
#define TPP_EXT_STRINGIZE_MACRO_ARGUMENT TPP_EXT_STRINGIZE_MACRO_ARGUMENT
TPP_EXTENSION(TPP_EXT_STRINGIZE_MACRO_ARGUMENT, TPP_EXTNAME_STRINGIZE_MACRO_ARGUMENT, TPP_CONF_DEFAULT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT))
#define _tpp_lexer_has_STRINGIZE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRINGIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT)
#ifndef TPP_EXTNAME_CHARIZE_MACRO_ARGUMENT
#define TPP_EXTNAME_CHARIZE_MACRO_ARGUMENT "charize-macro-argument"
#endif /* !TPP_EXTNAME_CHARIZE_MACRO_ARGUMENT */
#define TPP_EXT_CHARIZE_MACRO_ARGUMENT TPP_EXT_CHARIZE_MACRO_ARGUMENT
TPP_EXTENSION(TPP_EXT_CHARIZE_MACRO_ARGUMENT, TPP_EXTNAME_CHARIZE_MACRO_ARGUMENT, TPP_CONF_DEFAULT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT))
#define _tpp_lexer_has_CHARIZE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_CHARIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT)
#ifndef TPP_EXTNAME_DONT_EXPAND_MACRO_ARGUMENT
#define TPP_EXTNAME_DONT_EXPAND_MACRO_ARGUMENT "dont-expand-macro-argument"
#endif /* !TPP_EXTNAME_DONT_EXPAND_MACRO_ARGUMENT */
#define TPP_EXT_DONT_EXPAND_MACRO_ARGUMENT TPP_EXT_DONT_EXPAND_MACRO_ARGUMENT
TPP_EXTENSION(TPP_EXT_DONT_EXPAND_MACRO_ARGUMENT, TPP_EXTNAME_DONT_EXPAND_MACRO_ARGUMENT, TPP_CONF_DEFAULT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT))
#define _tpp_lexer_has_DONT_EXPAND_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_DONT_EXPAND_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_GLUE_MACRO_ARGUMENT)
#ifndef TPP_EXTNAME_GLUE_MACRO_ARGUMENT
#define TPP_EXTNAME_GLUE_MACRO_ARGUMENT "glue-macro-argument"
#endif /* !TPP_EXTNAME_GLUE_MACRO_ARGUMENT */
#define TPP_EXT_GLUE_MACRO_ARGUMENT TPP_EXT_GLUE_MACRO_ARGUMENT
TPP_EXTENSION(TPP_EXT_GLUE_MACRO_ARGUMENT, TPP_EXTNAME_GLUE_MACRO_ARGUMENT, TPP_CONF_DEFAULT(TPP_HAVE_GLUE_MACRO_ARGUMENT))
#define _tpp_lexer_has_GLUE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_GLUE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_GLUE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_PUSH_MACRO)
#ifndef TPP_EXTNAME_PRAGMA_PUSH_MACRO
#define TPP_EXTNAME_PRAGMA_PUSH_MACRO "pragma-push-macro"
#endif /* !TPP_EXTNAME_PRAGMA_PUSH_MACRO */
#define TPP_EXT_PRAGMA_PUSH_MACRO TPP_EXT_PRAGMA_PUSH_MACRO
TPP_EXTENSION(TPP_EXT_PRAGMA_PUSH_MACRO, TPP_EXTNAME_PRAGMA_PUSH_MACRO, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_PUSH_MACRO))
#define _tpp_lexer_has_PRAGMA_PUSH_MACRO(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_PUSH_MACRO)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_PUSH_MACRO) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_ONCE)
#ifndef TPP_EXTNAME_PRAGMA_ONCE
#define TPP_EXTNAME_PRAGMA_ONCE "pragma-once"
#endif /* !TPP_EXTNAME_PRAGMA_ONCE */
#define TPP_EXT_PRAGMA_ONCE TPP_EXT_PRAGMA_ONCE
TPP_EXTENSION(TPP_EXT_PRAGMA_ONCE, TPP_EXTNAME_PRAGMA_ONCE, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_ONCE))
#define _tpp_lexer_has_PRAGMA_ONCE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_ONCE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_ONCE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_DEPRECATED)
#ifndef TPP_EXTNAME_PRAGMA_DEPRECATED
#define TPP_EXTNAME_PRAGMA_DEPRECATED "pragma-deprecated"
#endif /* !TPP_EXTNAME_PRAGMA_DEPRECATED */
#define TPP_EXT_PRAGMA_DEPRECATED TPP_EXT_PRAGMA_DEPRECATED
TPP_EXTENSION(TPP_EXT_PRAGMA_DEPRECATED, TPP_EXTNAME_PRAGMA_DEPRECATED, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_DEPRECATED))
#define _tpp_lexer_has_PRAGMA_DEPRECATED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_DEPRECATED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_DEPRECATED) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_EXTENSION)
#ifndef TPP_EXTNAME_PRAGMA_EXTENSION
#define TPP_EXTNAME_PRAGMA_EXTENSION "pragma-extension"
#endif /* !TPP_EXTNAME_PRAGMA_EXTENSION */
#define TPP_EXT_PRAGMA_EXTENSION TPP_EXT_PRAGMA_EXTENSION
TPP_EXTENSION(TPP_EXT_PRAGMA_EXTENSION, TPP_EXTNAME_PRAGMA_EXTENSION, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_EXTENSION))
#define _tpp_lexer_has_PRAGMA_EXTENSION(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_EXTENSION)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_EXTENSION) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_WARNING)
#ifndef TPP_EXTNAME_PRAGMA_WARNING
#define TPP_EXTNAME_PRAGMA_WARNING "pragma-warning"
#endif /* !TPP_EXTNAME_PRAGMA_WARNING */
#define TPP_EXT_PRAGMA_WARNING TPP_EXT_PRAGMA_WARNING
TPP_EXTENSION(TPP_EXT_PRAGMA_WARNING, TPP_EXTNAME_PRAGMA_WARNING, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_WARNING))
#define _tpp_lexer_has_PRAGMA_WARNING(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_WARNING)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_WARNING) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE)
#ifndef TPP_EXTNAME_PRAGMA_MESSAGE
#define TPP_EXTNAME_PRAGMA_MESSAGE "pragma-message"
#endif /* !TPP_EXTNAME_PRAGMA_MESSAGE */
#define TPP_EXT_PRAGMA_MESSAGE TPP_EXT_PRAGMA_MESSAGE
TPP_EXTENSION(TPP_EXT_PRAGMA_MESSAGE, TPP_EXTNAME_PRAGMA_MESSAGE, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE))
#define _tpp_lexer_has_PRAGMA_MESSAGE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_MESSAGE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_ERROR)
#ifndef TPP_EXTNAME_PRAGMA_ERROR
#define TPP_EXTNAME_PRAGMA_ERROR "pragma-error"
#endif /* !TPP_EXTNAME_PRAGMA_ERROR */
#define TPP_EXT_PRAGMA_ERROR TPP_EXT_PRAGMA_ERROR
TPP_EXTENSION(TPP_EXT_PRAGMA_ERROR, TPP_EXTNAME_PRAGMA_ERROR, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_ERROR))
#define _tpp_lexer_has_PRAGMA_ERROR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_ERROR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_ERROR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_REGION)
#ifndef TPP_EXTNAME_PRAGMA_REGION
#define TPP_EXTNAME_PRAGMA_REGION "pragma-region"
#endif /* !TPP_EXTNAME_PRAGMA_REGION */
#define TPP_EXT_PRAGMA_REGION TPP_EXT_PRAGMA_REGION
TPP_EXTENSION(TPP_EXT_PRAGMA_REGION, TPP_EXTNAME_PRAGMA_REGION, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_REGION))
#define _tpp_lexer_has_PRAGMA_REGION(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_REGION)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_REGION) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_TPP_EXEC)
#ifndef TPP_EXTNAME_PRAGMA_TPP_EXEC
#define TPP_EXTNAME_PRAGMA_TPP_EXEC "pragma-tpp-exec"
#endif /* !TPP_EXTNAME_PRAGMA_TPP_EXEC */
#define TPP_EXT_PRAGMA_TPP_EXEC TPP_EXT_PRAGMA_TPP_EXEC
TPP_EXTENSION(TPP_EXT_PRAGMA_TPP_EXEC, TPP_EXTNAME_PRAGMA_TPP_EXEC, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_TPP_EXEC))
#define _tpp_lexer_has_PRAGMA_TPP_EXEC(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_TPP_EXEC)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_TPP_EXEC) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#ifndef TPP_EXTNAME_PRAGMA_TPP_SET_KEYWORD_FLAGS
#define TPP_EXTNAME_PRAGMA_TPP_SET_KEYWORD_FLAGS "pragma-tpp-set-keyword-flags"
#endif /* !TPP_EXTNAME_PRAGMA_TPP_SET_KEYWORD_FLAGS */
#define TPP_EXT_PRAGMA_TPP_SET_KEYWORD_FLAGS TPP_EXT_PRAGMA_TPP_SET_KEYWORD_FLAGS
TPP_EXTENSION(TPP_EXT_PRAGMA_TPP_SET_KEYWORD_FLAGS, TPP_EXTNAME_PRAGMA_TPP_SET_KEYWORD_FLAGS, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS))
#define _tpp_lexer_has_PRAGMA_TPP_SET_KEYWORD_FLAGS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_POISON)
#ifndef TPP_EXTNAME_PRAGMA_GCC_POISON
#define TPP_EXTNAME_PRAGMA_GCC_POISON "pragma-gcc-poison"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_POISON */
#define TPP_EXT_PRAGMA_GCC_POISON TPP_EXT_PRAGMA_GCC_POISON
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_POISON, TPP_EXTNAME_PRAGMA_GCC_POISON, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_POISON))
#define _tpp_lexer_has_PRAGMA_GCC_POISON(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_POISON)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_POISON) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_WARNING)
#ifndef TPP_EXTNAME_PRAGMA_GCC_WARNING
#define TPP_EXTNAME_PRAGMA_GCC_WARNING "pragma-gcc-warning"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_WARNING */
#define TPP_EXT_PRAGMA_GCC_WARNING TPP_EXT_PRAGMA_GCC_WARNING
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_WARNING, TPP_EXTNAME_PRAGMA_GCC_WARNING, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_WARNING))
#define _tpp_lexer_has_PRAGMA_GCC_WARNING(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_WARNING)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_WARNING) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_ERROR)
#ifndef TPP_EXTNAME_PRAGMA_GCC_ERROR
#define TPP_EXTNAME_PRAGMA_GCC_ERROR "pragma-gcc-error"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_ERROR */
#define TPP_EXT_PRAGMA_GCC_ERROR TPP_EXT_PRAGMA_GCC_ERROR
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_ERROR, TPP_EXTNAME_PRAGMA_GCC_ERROR, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_ERROR))
#define _tpp_lexer_has_PRAGMA_GCC_ERROR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_ERROR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_ERROR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER)
#ifndef TPP_EXTNAME_PRAGMA_GCC_SYSTEM_HEADER
#define TPP_EXTNAME_PRAGMA_GCC_SYSTEM_HEADER "pragma-gcc-system-header"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_SYSTEM_HEADER */
#define TPP_EXT_PRAGMA_GCC_SYSTEM_HEADER TPP_EXT_PRAGMA_GCC_SYSTEM_HEADER
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_SYSTEM_HEADER, TPP_EXTNAME_PRAGMA_GCC_SYSTEM_HEADER, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER))
#define _tpp_lexer_has_PRAGMA_GCC_SYSTEM_HEADER(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_SYSTEM_HEADER)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
#ifndef TPP_EXTNAME_PRAGMA_GCC_DIAGNOSTIC
#define TPP_EXTNAME_PRAGMA_GCC_DIAGNOSTIC "pragma-gcc-diagnostic"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_DIAGNOSTIC */
#define TPP_EXT_PRAGMA_GCC_DIAGNOSTIC TPP_EXT_PRAGMA_GCC_DIAGNOSTIC
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_DIAGNOSTIC, TPP_EXTNAME_PRAGMA_GCC_DIAGNOSTIC, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC))
#define _tpp_lexer_has_PRAGMA_GCC_DIAGNOSTIC(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_DIAGNOSTIC)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#ifndef TPP_EXTNAME_PRAGMA_GCC_DEPENDENCY
#define TPP_EXTNAME_PRAGMA_GCC_DEPENDENCY "pragma-gcc-dependency"
#endif /* !TPP_EXTNAME_PRAGMA_GCC_DEPENDENCY */
#define TPP_EXT_PRAGMA_GCC_DEPENDENCY TPP_EXT_PRAGMA_GCC_DEPENDENCY
TPP_EXTENSION(TPP_EXT_PRAGMA_GCC_DEPENDENCY, TPP_EXTNAME_PRAGMA_GCC_DEPENDENCY, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY))
#define _tpp_lexer_has_PRAGMA_GCC_DEPENDENCY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_GCC_DEPENDENCY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TRIGRAPHS)
#ifndef TPP_EXTNAME_TRIGRAPHS
#define TPP_EXTNAME_TRIGRAPHS "trigraphs"
#endif /* !TPP_EXTNAME_TRIGRAPHS */
#define TPP_EXT_TRIGRAPHS TPP_EXT_TRIGRAPHS
TPP_EXTENSION(TPP_EXT_TRIGRAPHS, TPP_EXTNAME_TRIGRAPHS, TPP_CONF_DEFAULT(TPP_HAVE_TRIGRAPHS))
#define _tpp_lexer_has_TRIGRAPHS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TRIGRAPHS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TRIGRAPHS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_DIGRAPHS)
#ifndef TPP_EXTNAME_DIGRAPHS
#define TPP_EXTNAME_DIGRAPHS "digraphs"
#endif /* !TPP_EXTNAME_DIGRAPHS */
#define TPP_EXT_DIGRAPHS TPP_EXT_DIGRAPHS
TPP_EXTENSION(TPP_EXT_DIGRAPHS, TPP_EXTNAME_DIGRAPHS, TPP_CONF_DEFAULT(TPP_HAVE_DIGRAPHS))
#define _tpp_lexer_has_DIGRAPHS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_DIGRAPHS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_DIGRAPHS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LF)
#ifndef TPP_EXTNAME_TOK_LF
#define TPP_EXTNAME_TOK_LF "tok-lf"
#endif /* !TPP_EXTNAME_TOK_LF */
#define TPP_EXT_TOK_LF TPP_EXT_TOK_LF
TPP_EXTENSION(TPP_EXT_TOK_LF, TPP_EXTNAME_TOK_LF, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LF))
#define _tpp_lexer_has_TOK_LF(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LF)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LF) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SPACE)
#ifndef TPP_EXTNAME_TOK_SPACE
#define TPP_EXTNAME_TOK_SPACE "tok-space"
#endif /* !TPP_EXTNAME_TOK_SPACE */
#define TPP_EXT_TOK_SPACE TPP_EXT_TOK_SPACE
TPP_EXTENSION(TPP_EXT_TOK_SPACE, TPP_EXTNAME_TOK_SPACE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SPACE))
#define _tpp_lexer_has_TOK_SPACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SPACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SPACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_COMMENT)
#ifndef TPP_EXTNAME_TOK_COMMENT
#define TPP_EXTNAME_TOK_COMMENT "tok-comment"
#endif /* !TPP_EXTNAME_TOK_COMMENT */
#define TPP_EXT_TOK_COMMENT TPP_EXT_TOK_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_COMMENT, TPP_EXTNAME_TOK_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_COMMENT))
#define _tpp_lexer_has_TOK_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_COMMENT)
#ifndef TPP_EXTNAME_TOK_CXX_COMMENT
#define TPP_EXTNAME_TOK_CXX_COMMENT "tok-cxx-comment"
#endif /* !TPP_EXTNAME_TOK_CXX_COMMENT */
#define TPP_EXT_TOK_CXX_COMMENT TPP_EXT_TOK_CXX_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_CXX_COMMENT, TPP_EXTNAME_TOK_CXX_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_COMMENT))
#define _tpp_lexer_has_TOK_CXX_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_COMMENT)
#ifndef TPP_EXTNAME_TOK_C_COMMENT
#define TPP_EXTNAME_TOK_C_COMMENT "tok-c-comment"
#endif /* !TPP_EXTNAME_TOK_C_COMMENT */
#define TPP_EXT_TOK_C_COMMENT TPP_EXT_TOK_C_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_C_COMMENT, TPP_EXTNAME_TOK_C_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_COMMENT))
#define _tpp_lexer_has_TOK_C_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_C_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_COMMENT)
#ifndef TPP_EXTNAME_TOK_PASCAL_COMMENT
#define TPP_EXTNAME_TOK_PASCAL_COMMENT "tok-pascal-comment"
#endif /* !TPP_EXTNAME_TOK_PASCAL_COMMENT */
#define TPP_EXT_TOK_PASCAL_COMMENT TPP_EXT_TOK_PASCAL_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_PASCAL_COMMENT, TPP_EXTNAME_TOK_PASCAL_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_COMMENT))
#define _tpp_lexer_has_TOK_PASCAL_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PASCAL_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT)
#ifndef TPP_EXTNAME_TOK_PASCAL_BRACE_COMMENT
#define TPP_EXTNAME_TOK_PASCAL_BRACE_COMMENT "tok-pascal-brace-comment"
#endif /* !TPP_EXTNAME_TOK_PASCAL_BRACE_COMMENT */
#define TPP_EXT_TOK_PASCAL_BRACE_COMMENT TPP_EXT_TOK_PASCAL_BRACE_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_PASCAL_BRACE_COMMENT, TPP_EXTNAME_TOK_PASCAL_BRACE_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT))
#define _tpp_lexer_has_TOK_PASCAL_BRACE_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PASCAL_BRACE_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_HTML_COMMENT)
#ifndef TPP_EXTNAME_TOK_HTML_COMMENT
#define TPP_EXTNAME_TOK_HTML_COMMENT "tok-html-comment"
#endif /* !TPP_EXTNAME_TOK_HTML_COMMENT */
#define TPP_EXT_TOK_HTML_COMMENT TPP_EXT_TOK_HTML_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_HTML_COMMENT, TPP_EXTNAME_TOK_HTML_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_HTML_COMMENT))
#define _tpp_lexer_has_TOK_HTML_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_HTML_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_HTML_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SQL_COMMENT)
#ifndef TPP_EXTNAME_TOK_SQL_COMMENT
#define TPP_EXTNAME_TOK_SQL_COMMENT "tok-sql-comment"
#endif /* !TPP_EXTNAME_TOK_SQL_COMMENT */
#define TPP_EXT_TOK_SQL_COMMENT TPP_EXT_TOK_SQL_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SQL_COMMENT, TPP_EXTNAME_TOK_SQL_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SQL_COMMENT))
#define _tpp_lexer_has_TOK_SQL_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SQL_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SQL_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT_COMMENT)
#ifndef TPP_EXTNAME_TOK_AT_AT_COMMENT
#define TPP_EXTNAME_TOK_AT_AT_COMMENT "tok-at-at-comment"
#endif /* !TPP_EXTNAME_TOK_AT_AT_COMMENT */
#define TPP_EXT_TOK_AT_AT_COMMENT TPP_EXT_TOK_AT_AT_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_AT_AT_COMMENT, TPP_EXTNAME_TOK_AT_AT_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT_COMMENT))
#define _tpp_lexer_has_TOK_AT_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AT_AT_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SHELL_COMMENT)
#ifndef TPP_EXTNAME_TOK_SHELL_COMMENT
#define TPP_EXTNAME_TOK_SHELL_COMMENT "tok-shell-comment"
#endif /* !TPP_EXTNAME_TOK_SHELL_COMMENT */
#define TPP_EXT_TOK_SHELL_COMMENT TPP_EXT_TOK_SHELL_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SHELL_COMMENT, TPP_EXTNAME_TOK_SHELL_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SHELL_COMMENT))
#define _tpp_lexer_has_TOK_SHELL_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SHELL_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SHELL_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_COMMENT)
#ifndef TPP_EXTNAME_TOK_SLASH_COMMENT
#define TPP_EXTNAME_TOK_SLASH_COMMENT "tok-slash-comment"
#endif /* !TPP_EXTNAME_TOK_SLASH_COMMENT */
#define TPP_EXT_TOK_SLASH_COMMENT TPP_EXT_TOK_SLASH_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SLASH_COMMENT, TPP_EXTNAME_TOK_SLASH_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_COMMENT))
#define _tpp_lexer_has_TOK_SLASH_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SLASH_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_COMMENT)
#ifndef TPP_EXTNAME_TOK_AT_COMMENT
#define TPP_EXTNAME_TOK_AT_COMMENT "tok-at-comment"
#endif /* !TPP_EXTNAME_TOK_AT_COMMENT */
#define TPP_EXT_TOK_AT_COMMENT TPP_EXT_TOK_AT_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_AT_COMMENT, TPP_EXTNAME_TOK_AT_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_COMMENT))
#define _tpp_lexer_has_TOK_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AT_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_SHELL_COMMENT)
#ifndef TPP_EXTNAME_TOK_SOL_SHELL_COMMENT
#define TPP_EXTNAME_TOK_SOL_SHELL_COMMENT "tok-sol-shell-comment"
#endif /* !TPP_EXTNAME_TOK_SOL_SHELL_COMMENT */
#define TPP_EXT_TOK_SOL_SHELL_COMMENT TPP_EXT_TOK_SOL_SHELL_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SOL_SHELL_COMMENT, TPP_EXTNAME_TOK_SOL_SHELL_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_SHELL_COMMENT))
#define _tpp_lexer_has_TOK_SOL_SHELL_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SOL_SHELL_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_SHELL_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_SLASH_COMMENT)
#ifndef TPP_EXTNAME_TOK_SOL_SLASH_COMMENT
#define TPP_EXTNAME_TOK_SOL_SLASH_COMMENT "tok-sol-slash-comment"
#endif /* !TPP_EXTNAME_TOK_SOL_SLASH_COMMENT */
#define TPP_EXT_TOK_SOL_SLASH_COMMENT TPP_EXT_TOK_SOL_SLASH_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SOL_SLASH_COMMENT, TPP_EXTNAME_TOK_SOL_SLASH_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_SLASH_COMMENT))
#define _tpp_lexer_has_TOK_SOL_SLASH_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SOL_SLASH_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_SLASH_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_AT_COMMENT)
#ifndef TPP_EXTNAME_TOK_SOL_AT_COMMENT
#define TPP_EXTNAME_TOK_SOL_AT_COMMENT "tok-sol-at-comment"
#endif /* !TPP_EXTNAME_TOK_SOL_AT_COMMENT */
#define TPP_EXT_TOK_SOL_AT_COMMENT TPP_EXT_TOK_SOL_AT_COMMENT
TPP_EXTENSION(TPP_EXT_TOK_SOL_AT_COMMENT, TPP_EXTNAME_TOK_SOL_AT_COMMENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_AT_COMMENT))
#define _tpp_lexer_has_TOK_SOL_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SOL_AT_COMMENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SOL_AT_COMMENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOLLAR)
#ifndef TPP_EXTNAME_TOK_DOLLAR
#define TPP_EXTNAME_TOK_DOLLAR "tok-dollar"
#endif /* !TPP_EXTNAME_TOK_DOLLAR */
#define TPP_EXT_TOK_DOLLAR TPP_EXT_TOK_DOLLAR
TPP_EXTENSION(TPP_EXT_TOK_DOLLAR, TPP_EXTNAME_TOK_DOLLAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOLLAR))
#define _tpp_lexer_has_TOK_DOLLAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_DOLLAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOLLAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE)
#ifndef TPP_EXTNAME_THOUSANDS_SEPARATOR_UNDERSCORE
#define TPP_EXTNAME_THOUSANDS_SEPARATOR_UNDERSCORE "thousands-separator-underscore"
#endif /* !TPP_EXTNAME_THOUSANDS_SEPARATOR_UNDERSCORE */
#define TPP_EXT_THOUSANDS_SEPARATOR_UNDERSCORE TPP_EXT_THOUSANDS_SEPARATOR_UNDERSCORE
TPP_EXTENSION(TPP_EXT_THOUSANDS_SEPARATOR_UNDERSCORE, TPP_EXTNAME_THOUSANDS_SEPARATOR_UNDERSCORE, TPP_CONF_DEFAULT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE))
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_UNDERSCORE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_THOUSANDS_SEPARATOR_UNDERSCORE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK)
#ifndef TPP_EXTNAME_THOUSANDS_SEPARATOR_SINGLETICK
#define TPP_EXTNAME_THOUSANDS_SEPARATOR_SINGLETICK "thousands-separator-singletick"
#endif /* !TPP_EXTNAME_THOUSANDS_SEPARATOR_SINGLETICK */
#define TPP_EXT_THOUSANDS_SEPARATOR_SINGLETICK TPP_EXT_THOUSANDS_SEPARATOR_SINGLETICK
TPP_EXTENSION(TPP_EXT_THOUSANDS_SEPARATOR_SINGLETICK, TPP_EXTNAME_THOUSANDS_SEPARATOR_SINGLETICK, TPP_CONF_DEFAULT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK))
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_SINGLETICK(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_THOUSANDS_SEPARATOR_SINGLETICK)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_INT)
#ifndef TPP_EXTNAME_TOK_C_INT
#define TPP_EXTNAME_TOK_C_INT "tok-c-int"
#endif /* !TPP_EXTNAME_TOK_C_INT */
#define TPP_EXT_TOK_C_INT TPP_EXT_TOK_C_INT
TPP_EXTENSION(TPP_EXT_TOK_C_INT, TPP_EXTNAME_TOK_C_INT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_INT))
#define _tpp_lexer_has_TOK_C_INT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_C_INT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_INT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_HEX)
#ifndef TPP_EXTNAME_TOK_PASCAL_HEX
#define TPP_EXTNAME_TOK_PASCAL_HEX "tok-pascal-hex"
#endif /* !TPP_EXTNAME_TOK_PASCAL_HEX */
#define TPP_EXT_TOK_PASCAL_HEX TPP_EXT_TOK_PASCAL_HEX
TPP_EXTENSION(TPP_EXT_TOK_PASCAL_HEX, TPP_EXTNAME_TOK_PASCAL_HEX, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_HEX))
#define _tpp_lexer_has_TOK_PASCAL_HEX(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PASCAL_HEX)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PASCAL_HEX) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_FLOAT)
#ifndef TPP_EXTNAME_TOK_C_FLOAT
#define TPP_EXTNAME_TOK_C_FLOAT "tok-c-float"
#endif /* !TPP_EXTNAME_TOK_C_FLOAT */
#define TPP_EXT_TOK_C_FLOAT TPP_EXT_TOK_C_FLOAT
TPP_EXTENSION(TPP_EXT_TOK_C_FLOAT, TPP_EXTNAME_TOK_C_FLOAT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_FLOAT))
#define _tpp_lexer_has_TOK_C_FLOAT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_C_FLOAT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_FLOAT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_SMART_FLOAT_TOKENS)
#ifndef TPP_EXTNAME_SMART_FLOAT_TOKENS
#define TPP_EXTNAME_SMART_FLOAT_TOKENS "smart-float-tokens"
#endif /* !TPP_EXTNAME_SMART_FLOAT_TOKENS */
#define TPP_EXT_SMART_FLOAT_TOKENS TPP_EXT_SMART_FLOAT_TOKENS
TPP_EXTENSION(TPP_EXT_SMART_FLOAT_TOKENS, TPP_EXTNAME_SMART_FLOAT_TOKENS, TPP_CONF_DEFAULT(TPP_HAVE_SMART_FLOAT_TOKENS))
#define _tpp_lexer_has_SMART_FLOAT_TOKENS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_SMART_FLOAT_TOKENS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_SMART_FLOAT_TOKENS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_CHAR)
#ifndef TPP_EXTNAME_TOK_C_CHAR
#define TPP_EXTNAME_TOK_C_CHAR "tok-char"
#endif /* !TPP_EXTNAME_TOK_C_CHAR */
#define TPP_EXT_TOK_C_CHAR TPP_EXT_TOK_C_CHAR
TPP_EXTENSION(TPP_EXT_TOK_C_CHAR, TPP_EXTNAME_TOK_C_CHAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_CHAR))
#define _tpp_lexer_has_TOK_C_CHAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_C_CHAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_CHAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_STRING)
#ifndef TPP_EXTNAME_TOK_C_STRING
#define TPP_EXTNAME_TOK_C_STRING "tok-string"
#endif /* !TPP_EXTNAME_TOK_C_STRING */
#define TPP_EXT_TOK_C_STRING TPP_EXT_TOK_C_STRING
TPP_EXTENSION(TPP_EXT_TOK_C_STRING, TPP_EXTNAME_TOK_C_STRING, TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_STRING))
#define _tpp_lexer_has_TOK_C_STRING(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_C_STRING)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_C_STRING) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_RAW_STRING_LITERAL
#define TPP_EXTNAME_TOK_CXX_RAW_STRING_LITERAL "tok-cxx-raw-string-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_RAW_STRING_LITERAL */
#define TPP_EXT_TOK_CXX_RAW_STRING_LITERAL TPP_EXT_TOK_CXX_RAW_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_RAW_STRING_LITERAL, TPP_EXTNAME_TOK_CXX_RAW_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL))
#define _tpp_lexer_has_TOK_CXX_RAW_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_WIDE_STRING_LITERAL
#define TPP_EXTNAME_TOK_CXX_WIDE_STRING_LITERAL "tok-cxx-wide-string-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_WIDE_STRING_LITERAL */
#define TPP_EXT_TOK_CXX_WIDE_STRING_LITERAL TPP_EXT_TOK_CXX_WIDE_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_WIDE_STRING_LITERAL, TPP_EXTNAME_TOK_CXX_WIDE_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL))
#define _tpp_lexer_has_TOK_CXX_WIDE_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_WIDE_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF8_STRING_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF8_STRING_LITERAL "tok-cxx-utf8-string-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF8_STRING_LITERAL */
#define TPP_EXT_TOK_CXX_UTF8_STRING_LITERAL TPP_EXT_TOK_CXX_UTF8_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF8_STRING_LITERAL, TPP_EXTNAME_TOK_CXX_UTF8_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF8_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF8_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF16_STRING_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF16_STRING_LITERAL "tok-cxx-utf16-string-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF16_STRING_LITERAL */
#define TPP_EXT_TOK_CXX_UTF16_STRING_LITERAL TPP_EXT_TOK_CXX_UTF16_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF16_STRING_LITERAL, TPP_EXTNAME_TOK_CXX_UTF16_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF16_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF16_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF32_STRING_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF32_STRING_LITERAL "tok-cxx-utf32-string-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF32_STRING_LITERAL */
#define TPP_EXT_TOK_CXX_UTF32_STRING_LITERAL TPP_EXT_TOK_CXX_UTF32_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF32_STRING_LITERAL, TPP_EXTNAME_TOK_CXX_UTF32_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF32_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF32_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_RAW_CHAR_LITERAL
#define TPP_EXTNAME_TOK_CXX_RAW_CHAR_LITERAL "tok-cxx-raw-char-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_RAW_CHAR_LITERAL */
#define TPP_EXT_TOK_CXX_RAW_CHAR_LITERAL TPP_EXT_TOK_CXX_RAW_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_RAW_CHAR_LITERAL, TPP_EXTNAME_TOK_CXX_RAW_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_CXX_RAW_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_WIDE_CHAR_LITERAL
#define TPP_EXTNAME_TOK_CXX_WIDE_CHAR_LITERAL "tok-cxx-wide-char-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_WIDE_CHAR_LITERAL */
#define TPP_EXT_TOK_CXX_WIDE_CHAR_LITERAL TPP_EXT_TOK_CXX_WIDE_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_WIDE_CHAR_LITERAL, TPP_EXTNAME_TOK_CXX_WIDE_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_CXX_WIDE_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_WIDE_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF8_CHAR_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF8_CHAR_LITERAL "tok-cxx-utf8-char-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF8_CHAR_LITERAL */
#define TPP_EXT_TOK_CXX_UTF8_CHAR_LITERAL TPP_EXT_TOK_CXX_UTF8_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF8_CHAR_LITERAL, TPP_EXTNAME_TOK_CXX_UTF8_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF8_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF8_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF16_CHAR_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF16_CHAR_LITERAL "tok-cxx-utf16-char-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF16_CHAR_LITERAL */
#define TPP_EXT_TOK_CXX_UTF16_CHAR_LITERAL TPP_EXT_TOK_CXX_UTF16_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF16_CHAR_LITERAL, TPP_EXTNAME_TOK_CXX_UTF16_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF16_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF16_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_CXX_UTF32_CHAR_LITERAL
#define TPP_EXTNAME_TOK_CXX_UTF32_CHAR_LITERAL "tok-cxx-utf32-char-literal"
#endif /* !TPP_EXTNAME_TOK_CXX_UTF32_CHAR_LITERAL */
#define TPP_EXT_TOK_CXX_UTF32_CHAR_LITERAL TPP_EXT_TOK_CXX_UTF32_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_CXX_UTF32_CHAR_LITERAL, TPP_EXTNAME_TOK_CXX_UTF32_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_CXX_UTF32_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_CXX_UTF32_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RAW_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_RAW_STRING_LITERAL
#define TPP_EXTNAME_TOK_RAW_STRING_LITERAL "tok-raw-string-literal"
#endif /* !TPP_EXTNAME_TOK_RAW_STRING_LITERAL */
#define TPP_EXT_TOK_RAW_STRING_LITERAL TPP_EXT_TOK_RAW_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_RAW_STRING_LITERAL, TPP_EXTNAME_TOK_RAW_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RAW_STRING_LITERAL))
#define _tpp_lexer_has_TOK_RAW_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RAW_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_RAW_CHAR_LITERAL
#define TPP_EXTNAME_TOK_RAW_CHAR_LITERAL "tok-raw-char-literal"
#endif /* !TPP_EXTNAME_TOK_RAW_CHAR_LITERAL */
#define TPP_EXT_TOK_RAW_CHAR_LITERAL TPP_EXT_TOK_RAW_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_RAW_CHAR_LITERAL, TPP_EXTNAME_TOK_RAW_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RAW_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_RAW_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
#ifndef TPP_EXTNAME_TOK_BLOCK_STRING_LITERAL
#define TPP_EXTNAME_TOK_BLOCK_STRING_LITERAL "tok-block-string-literal"
#endif /* !TPP_EXTNAME_TOK_BLOCK_STRING_LITERAL */
#define TPP_EXT_TOK_BLOCK_STRING_LITERAL TPP_EXT_TOK_BLOCK_STRING_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_BLOCK_STRING_LITERAL, TPP_EXTNAME_TOK_BLOCK_STRING_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL))
#define _tpp_lexer_has_TOK_BLOCK_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_BLOCK_STRING_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
#ifndef TPP_EXTNAME_TOK_BLOCK_CHAR_LITERAL
#define TPP_EXTNAME_TOK_BLOCK_CHAR_LITERAL "tok-block-char-literal"
#endif /* !TPP_EXTNAME_TOK_BLOCK_CHAR_LITERAL */
#define TPP_EXT_TOK_BLOCK_CHAR_LITERAL TPP_EXT_TOK_BLOCK_CHAR_LITERAL
TPP_EXTENSION(TPP_EXT_TOK_BLOCK_CHAR_LITERAL, TPP_EXTNAME_TOK_BLOCK_CHAR_LITERAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL))
#define _tpp_lexer_has_TOK_BLOCK_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_BLOCK_CHAR_LITERAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_E)
#ifndef TPP_EXTNAME_STRING_ESCAPE_E
#define TPP_EXTNAME_STRING_ESCAPE_E "string-escape-e"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_E */
#define TPP_EXT_STRING_ESCAPE_E TPP_EXT_STRING_ESCAPE_E
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_E, TPP_EXTNAME_STRING_ESCAPE_E, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_E))
#define _tpp_lexer_has_STRING_ESCAPE_E(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_E)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_E) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_S)
#ifndef TPP_EXTNAME_STRING_ESCAPE_S
#define TPP_EXTNAME_STRING_ESCAPE_S "string-escape-s"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_S */
#define TPP_EXT_STRING_ESCAPE_S TPP_EXT_STRING_ESCAPE_S
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_S, TPP_EXTNAME_STRING_ESCAPE_S, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_S))
#define _tpp_lexer_has_STRING_ESCAPE_S(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_S)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_S) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT)
#ifndef TPP_EXTNAME_STRING_ESCAPE_OCT
#define TPP_EXTNAME_STRING_ESCAPE_OCT "string-escape-oct"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_OCT */
#define TPP_EXT_STRING_ESCAPE_OCT TPP_EXT_STRING_ESCAPE_OCT
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_OCT, TPP_EXTNAME_STRING_ESCAPE_OCT, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT))
#define _tpp_lexer_has_STRING_ESCAPE_OCT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_OCT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE)
#ifndef TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE
#define TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE "string-escape-oct-brace"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE */
#define TPP_EXT_STRING_ESCAPE_OCT_BRACE TPP_EXT_STRING_ESCAPE_OCT_BRACE
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_OCT_BRACE, TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE))
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_OCT_BRACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY)
#ifndef TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE_MANY
#define TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE_MANY "string-escape-oct-brace-many"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE_MANY */
#define TPP_EXT_STRING_ESCAPE_OCT_BRACE_MANY TPP_EXT_STRING_ESCAPE_OCT_BRACE_MANY
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_OCT_BRACE_MANY, TPP_EXTNAME_STRING_ESCAPE_OCT_BRACE_MANY, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY))
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_OCT_BRACE_MANY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX)
#ifndef TPP_EXTNAME_STRING_ESCAPE_HEX
#define TPP_EXTNAME_STRING_ESCAPE_HEX "string-escape-hex"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_HEX */
#define TPP_EXT_STRING_ESCAPE_HEX TPP_EXT_STRING_ESCAPE_HEX
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_HEX, TPP_EXTNAME_STRING_ESCAPE_HEX, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX))
#define _tpp_lexer_has_STRING_ESCAPE_HEX(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_HEX)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BIG)
#ifndef TPP_EXTNAME_STRING_ESCAPE_HEX_BIG
#define TPP_EXTNAME_STRING_ESCAPE_HEX_BIG "string-escape-hex-big"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_HEX_BIG */
#define TPP_EXT_STRING_ESCAPE_HEX_BIG TPP_EXT_STRING_ESCAPE_HEX_BIG
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_HEX_BIG, TPP_EXTNAME_STRING_ESCAPE_HEX_BIG, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BIG))
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BIG(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_HEX_BIG)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BIG) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE)
#ifndef TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE
#define TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE "string-escape-hex-brace"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE */
#define TPP_EXT_STRING_ESCAPE_HEX_BRACE TPP_EXT_STRING_ESCAPE_HEX_BRACE
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_HEX_BRACE, TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE))
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_HEX_BRACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY)
#ifndef TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE_MANY
#define TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE_MANY "string-escape-hex-brace-many"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE_MANY */
#define TPP_EXT_STRING_ESCAPE_HEX_BRACE_MANY TPP_EXT_STRING_ESCAPE_HEX_BRACE_MANY
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_HEX_BRACE_MANY, TPP_EXTNAME_STRING_ESCAPE_HEX_BRACE_MANY, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY))
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_HEX_BRACE_MANY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI)
#ifndef TPP_EXTNAME_STRING_ESCAPE_UNI
#define TPP_EXTNAME_STRING_ESCAPE_UNI "string-escape-uni"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_UNI */
#define TPP_EXT_STRING_ESCAPE_UNI TPP_EXT_STRING_ESCAPE_UNI
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_UNI, TPP_EXTNAME_STRING_ESCAPE_UNI, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI))
#define _tpp_lexer_has_STRING_ESCAPE_UNI(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_UNI)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE)
#ifndef TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE
#define TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE "string-escape-uni-brace"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE */
#define TPP_EXT_STRING_ESCAPE_UNI_BRACE TPP_EXT_STRING_ESCAPE_UNI_BRACE
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_UNI_BRACE, TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE))
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_UNI_BRACE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY)
#ifndef TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE_MANY
#define TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE_MANY "string-escape-uni-brace-many"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE_MANY */
#define TPP_EXT_STRING_ESCAPE_UNI_BRACE_MANY TPP_EXT_STRING_ESCAPE_UNI_BRACE_MANY
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_UNI_BRACE_MANY, TPP_EXTNAME_STRING_ESCAPE_UNI_BRACE_MANY, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY))
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_UNI_BRACE_MANY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_NAMED)
#ifndef TPP_EXTNAME_STRING_ESCAPE_NAMED
#define TPP_EXTNAME_STRING_ESCAPE_NAMED "string-escape-named"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_NAMED */
#define TPP_EXT_STRING_ESCAPE_NAMED TPP_EXT_STRING_ESCAPE_NAMED
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_NAMED, TPP_EXTNAME_STRING_ESCAPE_NAMED, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_NAMED))
#define _tpp_lexer_has_STRING_ESCAPE_NAMED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_NAMED) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY)
#ifndef TPP_EXTNAME_STRING_ESCAPE_NAMED_MANY
#define TPP_EXTNAME_STRING_ESCAPE_NAMED_MANY "string-escape-named-many"
#endif /* !TPP_EXTNAME_STRING_ESCAPE_NAMED_MANY */
#define TPP_EXT_STRING_ESCAPE_NAMED_MANY TPP_EXT_STRING_ESCAPE_NAMED_MANY
TPP_EXTENSION(TPP_EXT_STRING_ESCAPE_NAMED_MANY, TPP_EXTNAME_STRING_ESCAPE_NAMED_MANY, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY))
#define _tpp_lexer_has_STRING_ESCAPE_NAMED_MANY(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_ALLOW_MULTILINE)
#ifndef TPP_EXTNAME_STRING_ALLOW_MULTILINE
#define TPP_EXTNAME_STRING_ALLOW_MULTILINE "string-allow-multiline"
#endif /* !TPP_EXTNAME_STRING_ALLOW_MULTILINE */
#define TPP_EXT_STRING_ALLOW_MULTILINE TPP_EXT_STRING_ALLOW_MULTILINE
TPP_EXTENSION(TPP_EXT_STRING_ALLOW_MULTILINE, TPP_EXTNAME_STRING_ALLOW_MULTILINE, TPP_CONF_DEFAULT(TPP_HAVE_STRING_ALLOW_MULTILINE))
#define _tpp_lexer_has_STRING_ALLOW_MULTILINE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_ALLOW_MULTILINE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_ALLOW_MULTILINE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_STRING_AUTO_CONCAT)
#ifndef TPP_EXTNAME_STRING_AUTO_CONCAT
#define TPP_EXTNAME_STRING_AUTO_CONCAT "string-auto-concat"
#endif /* !TPP_EXTNAME_STRING_AUTO_CONCAT */
#define TPP_EXT_STRING_AUTO_CONCAT TPP_EXT_STRING_AUTO_CONCAT
TPP_EXTENSION(TPP_EXT_STRING_AUTO_CONCAT, TPP_EXTNAME_STRING_AUTO_CONCAT, TPP_CONF_DEFAULT(TPP_HAVE_STRING_AUTO_CONCAT))
#define _tpp_lexer_has_STRING_AUTO_CONCAT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_STRING_AUTO_CONCAT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_STRING_AUTO_CONCAT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES)
#ifndef TPP_EXTNAME_ESCAPE_NAMED_UNICODE_NAMES
#define TPP_EXTNAME_ESCAPE_NAMED_UNICODE_NAMES "named-escape-unicode"
#endif /* !TPP_EXTNAME_ESCAPE_NAMED_UNICODE_NAMES */
#define TPP_EXT_ESCAPE_NAMED_UNICODE_NAMES TPP_EXT_ESCAPE_NAMED_UNICODE_NAMES
TPP_EXTENSION(TPP_EXT_ESCAPE_NAMED_UNICODE_NAMES, TPP_EXTNAME_ESCAPE_NAMED_UNICODE_NAMES, TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES))
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_NAMES(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_ESCAPE_NAMED_UNICODE_NAMES)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) */
#if TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD)
#ifndef TPP_EXTNAME_ESCAPE_NAMED_UNICODE_ORD
#define TPP_EXTNAME_ESCAPE_NAMED_UNICODE_ORD "named-escape-ord"
#endif /* !TPP_EXTNAME_ESCAPE_NAMED_UNICODE_ORD */
#define TPP_EXT_ESCAPE_NAMED_UNICODE_ORD TPP_EXT_ESCAPE_NAMED_UNICODE_ORD
TPP_EXTENSION(TPP_EXT_ESCAPE_NAMED_UNICODE_ORD, TPP_EXTNAME_ESCAPE_NAMED_UNICODE_ORD, TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD))
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_ORD(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_ESCAPE_NAMED_UNICODE_ORD)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) */
#if TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_XML)
#ifndef TPP_EXTNAME_ESCAPE_NAMED_XML
#define TPP_EXTNAME_ESCAPE_NAMED_XML "named-escape-xml"
#endif /* !TPP_EXTNAME_ESCAPE_NAMED_XML */
#define TPP_EXT_ESCAPE_NAMED_XML TPP_EXT_ESCAPE_NAMED_XML
TPP_EXTENSION(TPP_EXT_ESCAPE_NAMED_XML, TPP_EXTNAME_ESCAPE_NAMED_XML, TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_XML))
#define _tpp_lexer_has_ESCAPE_NAMED_XML(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_ESCAPE_NAMED_XML)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_ESCAPE_NAMED_XML) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM)
#ifndef TPP_EXTNAME_TOK_EXCLAIM_EXCLAIM
#define TPP_EXTNAME_TOK_EXCLAIM_EXCLAIM "tok-exclaim_exclaim"
#endif /* !TPP_EXTNAME_TOK_EXCLAIM_EXCLAIM */
#define TPP_EXT_TOK_EXCLAIM_EXCLAIM TPP_EXT_TOK_EXCLAIM_EXCLAIM
TPP_EXTENSION(TPP_EXT_TOK_EXCLAIM_EXCLAIM, TPP_EXTNAME_TOK_EXCLAIM_EXCLAIM, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM))
#define _tpp_lexer_has_TOK_EXCLAIM_EXCLAIM(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EXCLAIM_EXCLAIM)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EQUAL)
#ifndef TPP_EXTNAME_TOK_EXCLAIM_EQUAL
#define TPP_EXTNAME_TOK_EXCLAIM_EQUAL "tok-exclaim_equal"
#endif /* !TPP_EXTNAME_TOK_EXCLAIM_EQUAL */
#define TPP_EXT_TOK_EXCLAIM_EQUAL TPP_EXT_TOK_EXCLAIM_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_EXCLAIM_EQUAL, TPP_EXTNAME_TOK_EXCLAIM_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EQUAL))
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EXCLAIM_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL)
#ifndef TPP_EXTNAME_TOK_EXCLAIM_EQUAL_EQUAL
#define TPP_EXTNAME_TOK_EXCLAIM_EQUAL_EQUAL "tok-exclaim_equal_equal"
#endif /* !TPP_EXTNAME_TOK_EXCLAIM_EQUAL_EQUAL */
#define TPP_EXT_TOK_EXCLAIM_EQUAL_EQUAL TPP_EXT_TOK_EXCLAIM_EQUAL_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_EXCLAIM_EQUAL_EQUAL, TPP_EXTNAME_TOK_EXCLAIM_EQUAL_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL))
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EXCLAIM_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_POUND_POUND)
#ifndef TPP_EXTNAME_TOK_POUND_POUND
#define TPP_EXTNAME_TOK_POUND_POUND "tok-pound_pound"
#endif /* !TPP_EXTNAME_TOK_POUND_POUND */
#define TPP_EXT_TOK_POUND_POUND TPP_EXT_TOK_POUND_POUND
TPP_EXTENSION(TPP_EXT_TOK_POUND_POUND, TPP_EXTNAME_TOK_POUND_POUND, TPP_CONF_DEFAULT(TPP_HAVE_TOK_POUND_POUND))
#define _tpp_lexer_has_TOK_POUND_POUND(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_POUND_POUND)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_POUND_POUND) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_PERCENT)
#ifndef TPP_EXTNAME_TOK_PERCENT_PERCENT
#define TPP_EXTNAME_TOK_PERCENT_PERCENT "tok-percent_percent"
#endif /* !TPP_EXTNAME_TOK_PERCENT_PERCENT */
#define TPP_EXT_TOK_PERCENT_PERCENT TPP_EXT_TOK_PERCENT_PERCENT
TPP_EXTENSION(TPP_EXT_TOK_PERCENT_PERCENT, TPP_EXTNAME_TOK_PERCENT_PERCENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_PERCENT))
#define _tpp_lexer_has_TOK_PERCENT_PERCENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_PERCENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL)
#ifndef TPP_EXTNAME_TOK_PERCENT_PERCENT_EQUAL
#define TPP_EXTNAME_TOK_PERCENT_PERCENT_EQUAL "tok-percent_percent_equal"
#endif /* !TPP_EXTNAME_TOK_PERCENT_PERCENT_EQUAL */
#define TPP_EXT_TOK_PERCENT_PERCENT_EQUAL TPP_EXT_TOK_PERCENT_PERCENT_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_PERCENT_PERCENT_EQUAL, TPP_EXTNAME_TOK_PERCENT_PERCENT_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL))
#define _tpp_lexer_has_TOK_PERCENT_PERCENT_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PERCENT_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_EQUAL)
#ifndef TPP_EXTNAME_TOK_PERCENT_EQUAL
#define TPP_EXTNAME_TOK_PERCENT_EQUAL "tok-percent_equal"
#endif /* !TPP_EXTNAME_TOK_PERCENT_EQUAL */
#define TPP_EXT_TOK_PERCENT_EQUAL TPP_EXT_TOK_PERCENT_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_PERCENT_EQUAL, TPP_EXTNAME_TOK_PERCENT_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_EQUAL))
#define _tpp_lexer_has_TOK_PERCENT_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PERCENT_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AMP_AMP)
#ifndef TPP_EXTNAME_TOK_AMP_AMP
#define TPP_EXTNAME_TOK_AMP_AMP "tok-amp_amp"
#endif /* !TPP_EXTNAME_TOK_AMP_AMP */
#define TPP_EXT_TOK_AMP_AMP TPP_EXT_TOK_AMP_AMP
TPP_EXTENSION(TPP_EXT_TOK_AMP_AMP, TPP_EXTNAME_TOK_AMP_AMP, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AMP_AMP))
#define _tpp_lexer_has_TOK_AMP_AMP(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AMP_AMP)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AMP_AMP) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AMP_EQUAL)
#ifndef TPP_EXTNAME_TOK_AMP_EQUAL
#define TPP_EXTNAME_TOK_AMP_EQUAL "tok-amp_equal"
#endif /* !TPP_EXTNAME_TOK_AMP_EQUAL */
#define TPP_EXT_TOK_AMP_EQUAL TPP_EXT_TOK_AMP_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_AMP_EQUAL, TPP_EXTNAME_TOK_AMP_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AMP_EQUAL))
#define _tpp_lexer_has_TOK_AMP_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AMP_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AMP_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_STAR)
#ifndef TPP_EXTNAME_TOK_STAR_STAR
#define TPP_EXTNAME_TOK_STAR_STAR "tok-star_star"
#endif /* !TPP_EXTNAME_TOK_STAR_STAR */
#define TPP_EXT_TOK_STAR_STAR TPP_EXT_TOK_STAR_STAR
TPP_EXTENSION(TPP_EXT_TOK_STAR_STAR, TPP_EXTNAME_TOK_STAR_STAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_STAR))
#define _tpp_lexer_has_TOK_STAR_STAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_STAR_STAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_STAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_STAR_EQUAL)
#ifndef TPP_EXTNAME_TOK_STAR_STAR_EQUAL
#define TPP_EXTNAME_TOK_STAR_STAR_EQUAL "tok-star_star_equal"
#endif /* !TPP_EXTNAME_TOK_STAR_STAR_EQUAL */
#define TPP_EXT_TOK_STAR_STAR_EQUAL TPP_EXT_TOK_STAR_STAR_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_STAR_STAR_EQUAL, TPP_EXTNAME_TOK_STAR_STAR_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_STAR_EQUAL))
#define _tpp_lexer_has_TOK_STAR_STAR_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_STAR_STAR_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_STAR_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_DOT)
#ifndef TPP_EXTNAME_TOK_STAR_DOT
#define TPP_EXTNAME_TOK_STAR_DOT "tok-star_dot"
#endif /* !TPP_EXTNAME_TOK_STAR_DOT */
#define TPP_EXT_TOK_STAR_DOT TPP_EXT_TOK_STAR_DOT
TPP_EXTENSION(TPP_EXT_TOK_STAR_DOT, TPP_EXTNAME_TOK_STAR_DOT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_DOT))
#define _tpp_lexer_has_TOK_STAR_DOT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_STAR_DOT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_DOT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_LANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_STAR_LANGLE_MINUS
#define TPP_EXTNAME_TOK_STAR_LANGLE_MINUS "tok-star_langle_minus"
#endif /* !TPP_EXTNAME_TOK_STAR_LANGLE_MINUS */
#define TPP_EXT_TOK_STAR_LANGLE_MINUS TPP_EXT_TOK_STAR_LANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_STAR_LANGLE_MINUS, TPP_EXTNAME_TOK_STAR_LANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_LANGLE_MINUS))
#define _tpp_lexer_has_TOK_STAR_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_STAR_LANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_LANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_EQUAL)
#ifndef TPP_EXTNAME_TOK_STAR_EQUAL
#define TPP_EXTNAME_TOK_STAR_EQUAL "tok-star_equal"
#endif /* !TPP_EXTNAME_TOK_STAR_EQUAL */
#define TPP_EXT_TOK_STAR_EQUAL TPP_EXT_TOK_STAR_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_STAR_EQUAL, TPP_EXTNAME_TOK_STAR_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_EQUAL))
#define _tpp_lexer_has_TOK_STAR_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_STAR_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_STAR_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PLUS_PLUS)
#ifndef TPP_EXTNAME_TOK_PLUS_PLUS
#define TPP_EXTNAME_TOK_PLUS_PLUS "tok-plus_plus"
#endif /* !TPP_EXTNAME_TOK_PLUS_PLUS */
#define TPP_EXT_TOK_PLUS_PLUS TPP_EXT_TOK_PLUS_PLUS
TPP_EXTENSION(TPP_EXT_TOK_PLUS_PLUS, TPP_EXTNAME_TOK_PLUS_PLUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PLUS_PLUS))
#define _tpp_lexer_has_TOK_PLUS_PLUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PLUS_PLUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PLUS_PLUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PLUS_EQUAL)
#ifndef TPP_EXTNAME_TOK_PLUS_EQUAL
#define TPP_EXTNAME_TOK_PLUS_EQUAL "tok-plus_equal"
#endif /* !TPP_EXTNAME_TOK_PLUS_EQUAL */
#define TPP_EXT_TOK_PLUS_EQUAL TPP_EXT_TOK_PLUS_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_PLUS_EQUAL, TPP_EXTNAME_TOK_PLUS_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PLUS_EQUAL))
#define _tpp_lexer_has_TOK_PLUS_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PLUS_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PLUS_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_MINUS)
#ifndef TPP_EXTNAME_TOK_MINUS_MINUS
#define TPP_EXTNAME_TOK_MINUS_MINUS "tok-minus_minus"
#endif /* !TPP_EXTNAME_TOK_MINUS_MINUS */
#define TPP_EXT_TOK_MINUS_MINUS TPP_EXT_TOK_MINUS_MINUS
TPP_EXTENSION(TPP_EXT_TOK_MINUS_MINUS, TPP_EXTNAME_TOK_MINUS_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_MINUS))
#define _tpp_lexer_has_TOK_MINUS_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_LANGLE
#define TPP_EXTNAME_TOK_MINUS_LANGLE "tok-minus_langle"
#endif /* !TPP_EXTNAME_TOK_MINUS_LANGLE */
#define TPP_EXT_TOK_MINUS_LANGLE TPP_EXT_TOK_MINUS_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_LANGLE, TPP_EXTNAME_TOK_MINUS_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE))
#define _tpp_lexer_has_TOK_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE "tok-minus_langle_langle"
#endif /* !TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE */
#define TPP_EXT_TOK_MINUS_LANGLE_LANGLE TPP_EXT_TOK_MINUS_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_LANGLE_LANGLE, TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE_LANGLE "tok-minus_langle_langle_langle"
#endif /* !TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE_LANGLE */
#define TPP_EXT_TOK_MINUS_LANGLE_LANGLE_LANGLE TPP_EXT_TOK_MINUS_LANGLE_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_LANGLE_LANGLE_LANGLE, TPP_EXTNAME_TOK_MINUS_LANGLE_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_EQUAL)
#ifndef TPP_EXTNAME_TOK_MINUS_EQUAL
#define TPP_EXTNAME_TOK_MINUS_EQUAL "tok-minus_equal"
#endif /* !TPP_EXTNAME_TOK_MINUS_EQUAL */
#define TPP_EXT_TOK_MINUS_EQUAL TPP_EXT_TOK_MINUS_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_MINUS_EQUAL, TPP_EXTNAME_TOK_MINUS_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_EQUAL))
#define _tpp_lexer_has_TOK_MINUS_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_RANGLE
#define TPP_EXTNAME_TOK_MINUS_RANGLE "tok-minus_rangle"
#endif /* !TPP_EXTNAME_TOK_MINUS_RANGLE */
#define TPP_EXT_TOK_MINUS_RANGLE TPP_EXT_TOK_MINUS_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_RANGLE, TPP_EXTNAME_TOK_MINUS_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE))
#define _tpp_lexer_has_TOK_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_STAR)
#ifndef TPP_EXTNAME_TOK_MINUS_RANGLE_STAR
#define TPP_EXTNAME_TOK_MINUS_RANGLE_STAR "tok-minus_rangle_star"
#endif /* !TPP_EXTNAME_TOK_MINUS_RANGLE_STAR */
#define TPP_EXT_TOK_MINUS_RANGLE_STAR TPP_EXT_TOK_MINUS_RANGLE_STAR
TPP_EXTENSION(TPP_EXT_TOK_MINUS_RANGLE_STAR, TPP_EXTNAME_TOK_MINUS_RANGLE_STAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_STAR))
#define _tpp_lexer_has_TOK_MINUS_RANGLE_STAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_RANGLE_STAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_STAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE "tok-minus_rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE */
#define TPP_EXT_TOK_MINUS_RANGLE_RANGLE TPP_EXT_TOK_MINUS_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_RANGLE_RANGLE, TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE_RANGLE "tok-minus_rangle_rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE_RANGLE */
#define TPP_EXT_TOK_MINUS_RANGLE_RANGLE_RANGLE TPP_EXT_TOK_MINUS_RANGLE_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_MINUS_RANGLE_RANGLE_RANGLE, TPP_EXTNAME_TOK_MINUS_RANGLE_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_MINUS_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_STAR)
#ifndef TPP_EXTNAME_TOK_DOT_STAR
#define TPP_EXTNAME_TOK_DOT_STAR "tok-dot_star"
#endif /* !TPP_EXTNAME_TOK_DOT_STAR */
#define TPP_EXT_TOK_DOT_STAR TPP_EXT_TOK_DOT_STAR
TPP_EXTENSION(TPP_EXT_TOK_DOT_STAR, TPP_EXTNAME_TOK_DOT_STAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_STAR))
#define _tpp_lexer_has_TOK_DOT_STAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_DOT_STAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_STAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_DOT)
#ifndef TPP_EXTNAME_TOK_DOT_DOT
#define TPP_EXTNAME_TOK_DOT_DOT "tok-dot_dot"
#endif /* !TPP_EXTNAME_TOK_DOT_DOT */
#define TPP_EXT_TOK_DOT_DOT TPP_EXT_TOK_DOT_DOT
TPP_EXTENSION(TPP_EXT_TOK_DOT_DOT, TPP_EXTNAME_TOK_DOT_DOT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_DOT))
#define _tpp_lexer_has_TOK_DOT_DOT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_DOT_DOT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_DOT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_DOT_DOT)
#ifndef TPP_EXTNAME_TOK_DOT_DOT_DOT
#define TPP_EXTNAME_TOK_DOT_DOT_DOT "tok-dot_dot_dot"
#endif /* !TPP_EXTNAME_TOK_DOT_DOT_DOT */
#define TPP_EXT_TOK_DOT_DOT_DOT TPP_EXT_TOK_DOT_DOT_DOT
TPP_EXTENSION(TPP_EXT_TOK_DOT_DOT_DOT, TPP_EXTNAME_TOK_DOT_DOT_DOT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_DOT_DOT))
#define _tpp_lexer_has_TOK_DOT_DOT_DOT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_DOT_DOT_DOT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_DOT_DOT_DOT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_SLASH)
#ifndef TPP_EXTNAME_TOK_SLASH_SLASH
#define TPP_EXTNAME_TOK_SLASH_SLASH "tok-slash_slash"
#endif /* !TPP_EXTNAME_TOK_SLASH_SLASH */
#define TPP_EXT_TOK_SLASH_SLASH TPP_EXT_TOK_SLASH_SLASH
TPP_EXTENSION(TPP_EXT_TOK_SLASH_SLASH, TPP_EXTNAME_TOK_SLASH_SLASH, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_SLASH))
#define _tpp_lexer_has_TOK_SLASH_SLASH(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SLASH_SLASH)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_SLASH) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL)
#ifndef TPP_EXTNAME_TOK_SLASH_SLASH_EQUAL
#define TPP_EXTNAME_TOK_SLASH_SLASH_EQUAL "tok-slash_slash_equal"
#endif /* !TPP_EXTNAME_TOK_SLASH_SLASH_EQUAL */
#define TPP_EXT_TOK_SLASH_SLASH_EQUAL TPP_EXT_TOK_SLASH_SLASH_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_SLASH_SLASH_EQUAL, TPP_EXTNAME_TOK_SLASH_SLASH_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL))
#define _tpp_lexer_has_TOK_SLASH_SLASH_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SLASH_SLASH_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_EQUAL)
#ifndef TPP_EXTNAME_TOK_SLASH_EQUAL
#define TPP_EXTNAME_TOK_SLASH_EQUAL "tok-slash_equal"
#endif /* !TPP_EXTNAME_TOK_SLASH_EQUAL */
#define TPP_EXT_TOK_SLASH_EQUAL TPP_EXT_TOK_SLASH_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_SLASH_EQUAL, TPP_EXTNAME_TOK_SLASH_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_EQUAL))
#define _tpp_lexer_has_TOK_SLASH_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_SLASH_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_SLASH_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_COLON_COLON)
#ifndef TPP_EXTNAME_TOK_COLON_COLON
#define TPP_EXTNAME_TOK_COLON_COLON "tok-colon_colon"
#endif /* !TPP_EXTNAME_TOK_COLON_COLON */
#define TPP_EXT_TOK_COLON_COLON TPP_EXT_TOK_COLON_COLON
TPP_EXTENSION(TPP_EXT_TOK_COLON_COLON, TPP_EXTNAME_TOK_COLON_COLON, TPP_CONF_DEFAULT(TPP_HAVE_TOK_COLON_COLON))
#define _tpp_lexer_has_TOK_COLON_COLON(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_COLON_COLON)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_COLON_COLON) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_COLON_EQUAL)
#ifndef TPP_EXTNAME_TOK_COLON_EQUAL
#define TPP_EXTNAME_TOK_COLON_EQUAL "tok-colon_equal"
#endif /* !TPP_EXTNAME_TOK_COLON_EQUAL */
#define TPP_EXT_TOK_COLON_EQUAL TPP_EXT_TOK_COLON_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_COLON_EQUAL, TPP_EXTNAME_TOK_COLON_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_COLON_EQUAL))
#define _tpp_lexer_has_TOK_COLON_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_COLON_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_COLON_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_LANGLE_MINUS
#define TPP_EXTNAME_TOK_LANGLE_MINUS "tok-langle_minus"
#endif /* !TPP_EXTNAME_TOK_LANGLE_MINUS */
#define TPP_EXT_TOK_LANGLE_MINUS TPP_EXT_TOK_LANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_MINUS, TPP_EXTNAME_TOK_LANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS))
#define _tpp_lexer_has_TOK_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_MINUS_LANGLE
#define TPP_EXTNAME_TOK_LANGLE_MINUS_LANGLE "tok-langle_minus_langle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_MINUS_LANGLE */
#define TPP_EXT_TOK_LANGLE_MINUS_LANGLE TPP_EXT_TOK_LANGLE_MINUS_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_MINUS_LANGLE, TPP_EXTNAME_TOK_LANGLE_MINUS_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE))
#define _tpp_lexer_has_TOK_LANGLE_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_MINUS_RANGLE
#define TPP_EXTNAME_TOK_LANGLE_MINUS_RANGLE "tok-langle_minus_rangle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_MINUS_RANGLE */
#define TPP_EXT_TOK_LANGLE_MINUS_RANGLE TPP_EXT_TOK_LANGLE_MINUS_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_MINUS_RANGLE, TPP_EXTNAME_TOK_LANGLE_MINUS_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE))
#define _tpp_lexer_has_TOK_LANGLE_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_LANGLE_LANGLE "tok-langle_langle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE */
#define TPP_EXT_TOK_LANGLE_LANGLE TPP_EXT_TOK_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE, TPP_EXTNAME_TOK_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE_MINUS
#define TPP_EXTNAME_TOK_LANGLE_LANGLE_MINUS "tok-langle_langle_minus"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE_MINUS */
#define TPP_EXT_TOK_LANGLE_LANGLE_MINUS TPP_EXT_TOK_LANGLE_LANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE_MINUS, TPP_EXTNAME_TOK_LANGLE_LANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE "tok-langle_langle_langle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE */
#define TPP_EXT_TOK_LANGLE_LANGLE_LANGLE TPP_EXT_TOK_LANGLE_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE_LANGLE, TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_MINUS
#define TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_MINUS "tok-langle_langle_langle_minus"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_MINUS */
#define TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_MINUS TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_MINUS, TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_EQUAL
#define TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_EQUAL "tok-langle_langle_langle_equal"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_EQUAL */
#define TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_EQUAL TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_EQUAL, TPP_EXTNAME_TOK_LANGLE_LANGLE_LANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_LANGLE_LANGLE_EQUAL
#define TPP_EXTNAME_TOK_LANGLE_LANGLE_EQUAL "tok-langle_langle_equal"
#endif /* !TPP_EXTNAME_TOK_LANGLE_LANGLE_EQUAL */
#define TPP_EXT_TOK_LANGLE_LANGLE_EQUAL TPP_EXT_TOK_LANGLE_LANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_LANGLE_EQUAL, TPP_EXTNAME_TOK_LANGLE_LANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL))
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_LANGLE_EQUAL
#define TPP_EXTNAME_TOK_LANGLE_EQUAL "tok-langle_equal"
#endif /* !TPP_EXTNAME_TOK_LANGLE_EQUAL */
#define TPP_EXT_TOK_LANGLE_EQUAL TPP_EXT_TOK_LANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_EQUAL, TPP_EXTNAME_TOK_LANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL))
#define _tpp_lexer_has_TOK_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_EQUAL_LANGLE
#define TPP_EXTNAME_TOK_LANGLE_EQUAL_LANGLE "tok-langle_equal_langle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_EQUAL_LANGLE */
#define TPP_EXT_TOK_LANGLE_EQUAL_LANGLE TPP_EXT_TOK_LANGLE_EQUAL_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_EQUAL_LANGLE, TPP_EXTNAME_TOK_LANGLE_EQUAL_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE))
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_EQUAL_RANGLE
#define TPP_EXTNAME_TOK_LANGLE_EQUAL_RANGLE "tok-langle_equal_rangle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_EQUAL_RANGLE */
#define TPP_EXT_TOK_LANGLE_EQUAL_RANGLE TPP_EXT_TOK_LANGLE_EQUAL_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_EQUAL_RANGLE, TPP_EXTNAME_TOK_LANGLE_EQUAL_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE))
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_LANGLE_RANGLE
#define TPP_EXTNAME_TOK_LANGLE_RANGLE "tok-langle_rangle"
#endif /* !TPP_EXTNAME_TOK_LANGLE_RANGLE */
#define TPP_EXT_TOK_LANGLE_RANGLE TPP_EXT_TOK_LANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_LANGLE_RANGLE, TPP_EXTNAME_TOK_LANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_RANGLE))
#define _tpp_lexer_has_TOK_LANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_LANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_LANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EXCLAIM)
#ifndef TPP_EXTNAME_TOK_EQUAL_EXCLAIM
#define TPP_EXTNAME_TOK_EQUAL_EXCLAIM "tok-equal_exclaim"
#endif /* !TPP_EXTNAME_TOK_EQUAL_EXCLAIM */
#define TPP_EXT_TOK_EQUAL_EXCLAIM TPP_EXT_TOK_EQUAL_EXCLAIM
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_EXCLAIM, TPP_EXTNAME_TOK_EQUAL_EXCLAIM, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EXCLAIM))
#define _tpp_lexer_has_TOK_EQUAL_EXCLAIM(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PERCENT)
#ifndef TPP_EXTNAME_TOK_EQUAL_PERCENT
#define TPP_EXTNAME_TOK_EQUAL_PERCENT "tok-equal_percent"
#endif /* !TPP_EXTNAME_TOK_EQUAL_PERCENT */
#define TPP_EXT_TOK_EQUAL_PERCENT TPP_EXT_TOK_EQUAL_PERCENT
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_PERCENT, TPP_EXTNAME_TOK_EQUAL_PERCENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PERCENT))
#define _tpp_lexer_has_TOK_EQUAL_PERCENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_PERCENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PERCENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT)
#ifndef TPP_EXTNAME_TOK_EQUAL_PERCENT_PERCENT
#define TPP_EXTNAME_TOK_EQUAL_PERCENT_PERCENT "tok-equal_percent_percent"
#endif /* !TPP_EXTNAME_TOK_EQUAL_PERCENT_PERCENT */
#define TPP_EXT_TOK_EQUAL_PERCENT_PERCENT TPP_EXT_TOK_EQUAL_PERCENT_PERCENT
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_PERCENT_PERCENT, TPP_EXTNAME_TOK_EQUAL_PERCENT_PERCENT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT))
#define _tpp_lexer_has_TOK_EQUAL_PERCENT_PERCENT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AMP)
#ifndef TPP_EXTNAME_TOK_EQUAL_AMP
#define TPP_EXTNAME_TOK_EQUAL_AMP "tok-equal_amp"
#endif /* !TPP_EXTNAME_TOK_EQUAL_AMP */
#define TPP_EXT_TOK_EQUAL_AMP TPP_EXT_TOK_EQUAL_AMP
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_AMP, TPP_EXTNAME_TOK_EQUAL_AMP, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AMP))
#define _tpp_lexer_has_TOK_EQUAL_AMP(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_AMP)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AMP) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_STAR)
#ifndef TPP_EXTNAME_TOK_EQUAL_STAR
#define TPP_EXTNAME_TOK_EQUAL_STAR "tok-equal_star"
#endif /* !TPP_EXTNAME_TOK_EQUAL_STAR */
#define TPP_EXT_TOK_EQUAL_STAR TPP_EXT_TOK_EQUAL_STAR
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_STAR, TPP_EXTNAME_TOK_EQUAL_STAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_STAR))
#define _tpp_lexer_has_TOK_EQUAL_STAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_STAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_STAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_STAR_STAR)
#ifndef TPP_EXTNAME_TOK_EQUAL_STAR_STAR
#define TPP_EXTNAME_TOK_EQUAL_STAR_STAR "tok-equal_star_star"
#endif /* !TPP_EXTNAME_TOK_EQUAL_STAR_STAR */
#define TPP_EXT_TOK_EQUAL_STAR_STAR TPP_EXT_TOK_EQUAL_STAR_STAR
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_STAR_STAR, TPP_EXTNAME_TOK_EQUAL_STAR_STAR, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_STAR_STAR))
#define _tpp_lexer_has_TOK_EQUAL_STAR_STAR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_STAR_STAR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_STAR_STAR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PLUS)
#ifndef TPP_EXTNAME_TOK_EQUAL_PLUS
#define TPP_EXTNAME_TOK_EQUAL_PLUS "tok-equal_plus"
#endif /* !TPP_EXTNAME_TOK_EQUAL_PLUS */
#define TPP_EXT_TOK_EQUAL_PLUS TPP_EXT_TOK_EQUAL_PLUS
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_PLUS, TPP_EXTNAME_TOK_EQUAL_PLUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PLUS))
#define _tpp_lexer_has_TOK_EQUAL_PLUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_PLUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PLUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_MINUS)
#ifndef TPP_EXTNAME_TOK_EQUAL_MINUS
#define TPP_EXTNAME_TOK_EQUAL_MINUS "tok-equal_minus"
#endif /* !TPP_EXTNAME_TOK_EQUAL_MINUS */
#define TPP_EXT_TOK_EQUAL_MINUS TPP_EXT_TOK_EQUAL_MINUS
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_MINUS, TPP_EXTNAME_TOK_EQUAL_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_MINUS))
#define _tpp_lexer_has_TOK_EQUAL_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_SLASH)
#ifndef TPP_EXTNAME_TOK_EQUAL_SLASH
#define TPP_EXTNAME_TOK_EQUAL_SLASH "tok-equal_slash"
#endif /* !TPP_EXTNAME_TOK_EQUAL_SLASH */
#define TPP_EXT_TOK_EQUAL_SLASH TPP_EXT_TOK_EQUAL_SLASH
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_SLASH, TPP_EXTNAME_TOK_EQUAL_SLASH, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_SLASH))
#define _tpp_lexer_has_TOK_EQUAL_SLASH(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_SLASH)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_SLASH) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH)
#ifndef TPP_EXTNAME_TOK_EQUAL_SLASH_SLASH
#define TPP_EXTNAME_TOK_EQUAL_SLASH_SLASH "tok-equal_slash_slash"
#endif /* !TPP_EXTNAME_TOK_EQUAL_SLASH_SLASH */
#define TPP_EXT_TOK_EQUAL_SLASH_SLASH TPP_EXT_TOK_EQUAL_SLASH_SLASH
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_SLASH_SLASH, TPP_EXTNAME_TOK_EQUAL_SLASH_SLASH, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH))
#define _tpp_lexer_has_TOK_EQUAL_SLASH_SLASH(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_SLASH_SLASH)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_COLON)
#ifndef TPP_EXTNAME_TOK_EQUAL_COLON
#define TPP_EXTNAME_TOK_EQUAL_COLON "tok-equal_colon"
#endif /* !TPP_EXTNAME_TOK_EQUAL_COLON */
#define TPP_EXT_TOK_EQUAL_COLON TPP_EXT_TOK_EQUAL_COLON
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_COLON, TPP_EXTNAME_TOK_EQUAL_COLON, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_COLON))
#define _tpp_lexer_has_TOK_EQUAL_COLON(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_COLON)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_COLON) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_LANGLE
#define TPP_EXTNAME_TOK_EQUAL_LANGLE "tok-equal_langle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_LANGLE */
#define TPP_EXT_TOK_EQUAL_LANGLE TPP_EXT_TOK_EQUAL_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_LANGLE, TPP_EXTNAME_TOK_EQUAL_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE))
#define _tpp_lexer_has_TOK_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE "tok-equal_langle_langle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE */
#define TPP_EXT_TOK_EQUAL_LANGLE_LANGLE TPP_EXT_TOK_EQUAL_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_LANGLE_LANGLE, TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE_LANGLE
#define TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE_LANGLE "tok-equal_langle_langle_langle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE_LANGLE */
#define TPP_EXT_TOK_EQUAL_LANGLE_LANGLE_LANGLE TPP_EXT_TOK_EQUAL_LANGLE_LANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_LANGLE_LANGLE_LANGLE, TPP_EXTNAME_TOK_EQUAL_LANGLE_LANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE))
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL)
#ifndef TPP_EXTNAME_TOK_EQUAL_EQUAL
#define TPP_EXTNAME_TOK_EQUAL_EQUAL "tok-equal_equal"
#endif /* !TPP_EXTNAME_TOK_EQUAL_EQUAL */
#define TPP_EXT_TOK_EQUAL_EQUAL TPP_EXT_TOK_EQUAL_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_EQUAL, TPP_EXTNAME_TOK_EQUAL_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL))
#define _tpp_lexer_has_TOK_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM)
#ifndef TPP_EXTNAME_TOK_EQUAL_EQUAL_EXCLAIM
#define TPP_EXTNAME_TOK_EQUAL_EQUAL_EXCLAIM "tok-equal_equal_exclaim"
#endif /* !TPP_EXTNAME_TOK_EQUAL_EQUAL_EXCLAIM */
#define TPP_EXT_TOK_EQUAL_EQUAL_EXCLAIM TPP_EXT_TOK_EQUAL_EQUAL_EXCLAIM
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_EQUAL_EXCLAIM, TPP_EXTNAME_TOK_EQUAL_EQUAL_EXCLAIM, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM))
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EXCLAIM(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL)
#ifndef TPP_EXTNAME_TOK_EQUAL_EQUAL_EQUAL
#define TPP_EXTNAME_TOK_EQUAL_EQUAL_EQUAL "tok-equal_equal_equal"
#endif /* !TPP_EXTNAME_TOK_EQUAL_EQUAL_EQUAL */
#define TPP_EXT_TOK_EQUAL_EQUAL_EQUAL TPP_EXT_TOK_EQUAL_EQUAL_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_EQUAL_EQUAL, TPP_EXTNAME_TOK_EQUAL_EQUAL_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL))
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_RANGLE
#define TPP_EXTNAME_TOK_EQUAL_RANGLE "tok-equal_rangle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_RANGLE */
#define TPP_EXT_TOK_EQUAL_RANGLE TPP_EXT_TOK_EQUAL_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_RANGLE, TPP_EXTNAME_TOK_EQUAL_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE))
#define _tpp_lexer_has_TOK_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE "tok-equal_rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE */
#define TPP_EXT_TOK_EQUAL_RANGLE_RANGLE TPP_EXT_TOK_EQUAL_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_RANGLE_RANGLE, TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE_RANGLE "tok-equal_rangle_rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE_RANGLE */
#define TPP_EXT_TOK_EQUAL_RANGLE_RANGLE_RANGLE TPP_EXT_TOK_EQUAL_RANGLE_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_RANGLE_RANGLE_RANGLE, TPP_EXTNAME_TOK_EQUAL_RANGLE_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_QMARK)
#ifndef TPP_EXTNAME_TOK_EQUAL_QMARK
#define TPP_EXTNAME_TOK_EQUAL_QMARK "tok-equal_qmark"
#endif /* !TPP_EXTNAME_TOK_EQUAL_QMARK */
#define TPP_EXT_TOK_EQUAL_QMARK TPP_EXT_TOK_EQUAL_QMARK
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_QMARK, TPP_EXTNAME_TOK_EQUAL_QMARK, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_QMARK))
#define _tpp_lexer_has_TOK_EQUAL_QMARK(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_QMARK)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_QMARK) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AT)
#ifndef TPP_EXTNAME_TOK_EQUAL_AT
#define TPP_EXTNAME_TOK_EQUAL_AT "tok-equal_at"
#endif /* !TPP_EXTNAME_TOK_EQUAL_AT */
#define TPP_EXT_TOK_EQUAL_AT TPP_EXT_TOK_EQUAL_AT
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_AT, TPP_EXTNAME_TOK_EQUAL_AT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AT))
#define _tpp_lexer_has_TOK_EQUAL_AT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_AT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AT_AT)
#ifndef TPP_EXTNAME_TOK_EQUAL_AT_AT
#define TPP_EXTNAME_TOK_EQUAL_AT_AT "tok-equal_at_at"
#endif /* !TPP_EXTNAME_TOK_EQUAL_AT_AT */
#define TPP_EXT_TOK_EQUAL_AT_AT TPP_EXT_TOK_EQUAL_AT_AT
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_AT_AT, TPP_EXTNAME_TOK_EQUAL_AT_AT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AT_AT))
#define _tpp_lexer_has_TOK_EQUAL_AT_AT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_AT_AT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_AT_AT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_HAT)
#ifndef TPP_EXTNAME_TOK_EQUAL_HAT
#define TPP_EXTNAME_TOK_EQUAL_HAT "tok-equal_hat"
#endif /* !TPP_EXTNAME_TOK_EQUAL_HAT */
#define TPP_EXT_TOK_EQUAL_HAT TPP_EXT_TOK_EQUAL_HAT
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_HAT, TPP_EXTNAME_TOK_EQUAL_HAT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_HAT))
#define _tpp_lexer_has_TOK_EQUAL_HAT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_HAT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_HAT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PIPE)
#ifndef TPP_EXTNAME_TOK_EQUAL_PIPE
#define TPP_EXTNAME_TOK_EQUAL_PIPE "tok-equal_pipe"
#endif /* !TPP_EXTNAME_TOK_EQUAL_PIPE */
#define TPP_EXT_TOK_EQUAL_PIPE TPP_EXT_TOK_EQUAL_PIPE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_PIPE, TPP_EXTNAME_TOK_EQUAL_PIPE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PIPE))
#define _tpp_lexer_has_TOK_EQUAL_PIPE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_PIPE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_PIPE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_TILDE)
#ifndef TPP_EXTNAME_TOK_EQUAL_TILDE
#define TPP_EXTNAME_TOK_EQUAL_TILDE "tok-equal_tilde"
#endif /* !TPP_EXTNAME_TOK_EQUAL_TILDE */
#define TPP_EXT_TOK_EQUAL_TILDE TPP_EXT_TOK_EQUAL_TILDE
TPP_EXTENSION(TPP_EXT_TOK_EQUAL_TILDE, TPP_EXTNAME_TOK_EQUAL_TILDE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_TILDE))
#define _tpp_lexer_has_TOK_EQUAL_TILDE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_EQUAL_TILDE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_EQUAL_TILDE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_RANGLE_MINUS
#define TPP_EXTNAME_TOK_RANGLE_MINUS "tok-rangle_minus"
#endif /* !TPP_EXTNAME_TOK_RANGLE_MINUS */
#define TPP_EXT_TOK_RANGLE_MINUS TPP_EXT_TOK_RANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_MINUS, TPP_EXTNAME_TOK_RANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS))
#define _tpp_lexer_has_TOK_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_MINUS_LANGLE
#define TPP_EXTNAME_TOK_RANGLE_MINUS_LANGLE "tok-rangle_minus_langle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_MINUS_LANGLE */
#define TPP_EXT_TOK_RANGLE_MINUS_LANGLE TPP_EXT_TOK_RANGLE_MINUS_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_MINUS_LANGLE, TPP_EXTNAME_TOK_RANGLE_MINUS_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE))
#define _tpp_lexer_has_TOK_RANGLE_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_MINUS_RANGLE
#define TPP_EXTNAME_TOK_RANGLE_MINUS_RANGLE "tok-rangle_minus_rangle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_MINUS_RANGLE */
#define TPP_EXT_TOK_RANGLE_MINUS_RANGLE TPP_EXT_TOK_RANGLE_MINUS_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_MINUS_RANGLE, TPP_EXTNAME_TOK_RANGLE_MINUS_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE))
#define _tpp_lexer_has_TOK_RANGLE_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_LANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_LANGLE
#define TPP_EXTNAME_TOK_RANGLE_LANGLE "tok-rangle_langle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_LANGLE */
#define TPP_EXT_TOK_RANGLE_LANGLE TPP_EXT_TOK_RANGLE_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_LANGLE, TPP_EXTNAME_TOK_RANGLE_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_LANGLE))
#define _tpp_lexer_has_TOK_RANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_RANGLE_EQUAL
#define TPP_EXTNAME_TOK_RANGLE_EQUAL "tok-rangle_equal"
#endif /* !TPP_EXTNAME_TOK_RANGLE_EQUAL */
#define TPP_EXT_TOK_RANGLE_EQUAL TPP_EXT_TOK_RANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_EQUAL, TPP_EXTNAME_TOK_RANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL))
#define _tpp_lexer_has_TOK_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_EQUAL_LANGLE
#define TPP_EXTNAME_TOK_RANGLE_EQUAL_LANGLE "tok-rangle_equal_langle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_EQUAL_LANGLE */
#define TPP_EXT_TOK_RANGLE_EQUAL_LANGLE TPP_EXT_TOK_RANGLE_EQUAL_LANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_EQUAL_LANGLE, TPP_EXTNAME_TOK_RANGLE_EQUAL_LANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE))
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_EQUAL_RANGLE
#define TPP_EXTNAME_TOK_RANGLE_EQUAL_RANGLE "tok-rangle_equal_rangle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_EQUAL_RANGLE */
#define TPP_EXT_TOK_RANGLE_EQUAL_RANGLE TPP_EXT_TOK_RANGLE_EQUAL_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_EQUAL_RANGLE, TPP_EXTNAME_TOK_RANGLE_EQUAL_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE))
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_RANGLE_RANGLE "tok-rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE */
#define TPP_EXT_TOK_RANGLE_RANGLE TPP_EXT_TOK_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE, TPP_EXTNAME_TOK_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE_MINUS
#define TPP_EXTNAME_TOK_RANGLE_RANGLE_MINUS "tok-rangle_rangle_minus"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE_MINUS */
#define TPP_EXT_TOK_RANGLE_RANGLE_MINUS TPP_EXT_TOK_RANGLE_RANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE_MINUS, TPP_EXTNAME_TOK_RANGLE_RANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE_EQUAL
#define TPP_EXTNAME_TOK_RANGLE_RANGLE_EQUAL "tok-rangle_rangle_equal"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE_EQUAL */
#define TPP_EXT_TOK_RANGLE_RANGLE_EQUAL TPP_EXT_TOK_RANGLE_RANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE_EQUAL, TPP_EXTNAME_TOK_RANGLE_RANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE
#define TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE "tok-rangle_rangle_rangle"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE */
#define TPP_EXT_TOK_RANGLE_RANGLE_RANGLE TPP_EXT_TOK_RANGLE_RANGLE_RANGLE
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE_RANGLE, TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_MINUS
#define TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_MINUS "tok-rangle_rangle_rangle_minus"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_MINUS */
#define TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_MINUS TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_MINUS
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_MINUS, TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_MINUS, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
#ifndef TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_EQUAL
#define TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_EQUAL "tok-rangle_rangle_rangle_equal"
#endif /* !TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_EQUAL */
#define TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_EQUAL TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_EQUAL, TPP_EXTNAME_TOK_RANGLE_RANGLE_RANGLE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL))
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_QMARK_EQUAL)
#ifndef TPP_EXTNAME_TOK_QMARK_EQUAL
#define TPP_EXTNAME_TOK_QMARK_EQUAL "tok-qmark_equal"
#endif /* !TPP_EXTNAME_TOK_QMARK_EQUAL */
#define TPP_EXT_TOK_QMARK_EQUAL TPP_EXT_TOK_QMARK_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_QMARK_EQUAL, TPP_EXTNAME_TOK_QMARK_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_QMARK_EQUAL))
#define _tpp_lexer_has_TOK_QMARK_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_QMARK_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_QMARK_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_QMARK_QMARK)
#ifndef TPP_EXTNAME_TOK_QMARK_QMARK
#define TPP_EXTNAME_TOK_QMARK_QMARK "tok-qmark_qmark"
#endif /* !TPP_EXTNAME_TOK_QMARK_QMARK */
#define TPP_EXT_TOK_QMARK_QMARK TPP_EXT_TOK_QMARK_QMARK
TPP_EXTENSION(TPP_EXT_TOK_QMARK_QMARK, TPP_EXTNAME_TOK_QMARK_QMARK, TPP_CONF_DEFAULT(TPP_HAVE_TOK_QMARK_QMARK))
#define _tpp_lexer_has_TOK_QMARK_QMARK(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_QMARK_QMARK)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_QMARK_QMARK) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_EQUAL)
#ifndef TPP_EXTNAME_TOK_AT_EQUAL
#define TPP_EXTNAME_TOK_AT_EQUAL "tok-at_equal"
#endif /* !TPP_EXTNAME_TOK_AT_EQUAL */
#define TPP_EXT_TOK_AT_EQUAL TPP_EXT_TOK_AT_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_AT_EQUAL, TPP_EXTNAME_TOK_AT_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_EQUAL))
#define _tpp_lexer_has_TOK_AT_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AT_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT)
#ifndef TPP_EXTNAME_TOK_AT_AT
#define TPP_EXTNAME_TOK_AT_AT "tok-at_at"
#endif /* !TPP_EXTNAME_TOK_AT_AT */
#define TPP_EXT_TOK_AT_AT TPP_EXT_TOK_AT_AT
TPP_EXTENSION(TPP_EXT_TOK_AT_AT, TPP_EXTNAME_TOK_AT_AT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT))
#define _tpp_lexer_has_TOK_AT_AT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AT_AT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT_EQUAL)
#ifndef TPP_EXTNAME_TOK_AT_AT_EQUAL
#define TPP_EXTNAME_TOK_AT_AT_EQUAL "tok-at_at_equal"
#endif /* !TPP_EXTNAME_TOK_AT_AT_EQUAL */
#define TPP_EXT_TOK_AT_AT_EQUAL TPP_EXT_TOK_AT_AT_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_AT_AT_EQUAL, TPP_EXTNAME_TOK_AT_AT_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT_EQUAL))
#define _tpp_lexer_has_TOK_AT_AT_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_AT_AT_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_AT_AT_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_HAT_EQUAL)
#ifndef TPP_EXTNAME_TOK_HAT_EQUAL
#define TPP_EXTNAME_TOK_HAT_EQUAL "tok-hat_equal"
#endif /* !TPP_EXTNAME_TOK_HAT_EQUAL */
#define TPP_EXT_TOK_HAT_EQUAL TPP_EXT_TOK_HAT_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_HAT_EQUAL, TPP_EXTNAME_TOK_HAT_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_HAT_EQUAL))
#define _tpp_lexer_has_TOK_HAT_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_HAT_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_HAT_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_HAT_HAT)
#ifndef TPP_EXTNAME_TOK_HAT_HAT
#define TPP_EXTNAME_TOK_HAT_HAT "tok-hat_hat"
#endif /* !TPP_EXTNAME_TOK_HAT_HAT */
#define TPP_EXT_TOK_HAT_HAT TPP_EXT_TOK_HAT_HAT
TPP_EXTENSION(TPP_EXT_TOK_HAT_HAT, TPP_EXTNAME_TOK_HAT_HAT, TPP_CONF_DEFAULT(TPP_HAVE_TOK_HAT_HAT))
#define _tpp_lexer_has_TOK_HAT_HAT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_HAT_HAT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_HAT_HAT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PIPE_EQUAL)
#ifndef TPP_EXTNAME_TOK_PIPE_EQUAL
#define TPP_EXTNAME_TOK_PIPE_EQUAL "tok-pipe_equal"
#endif /* !TPP_EXTNAME_TOK_PIPE_EQUAL */
#define TPP_EXT_TOK_PIPE_EQUAL TPP_EXT_TOK_PIPE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_PIPE_EQUAL, TPP_EXTNAME_TOK_PIPE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PIPE_EQUAL))
#define _tpp_lexer_has_TOK_PIPE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PIPE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PIPE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_PIPE_PIPE)
#ifndef TPP_EXTNAME_TOK_PIPE_PIPE
#define TPP_EXTNAME_TOK_PIPE_PIPE "tok-pipe_pipe"
#endif /* !TPP_EXTNAME_TOK_PIPE_PIPE */
#define TPP_EXT_TOK_PIPE_PIPE TPP_EXT_TOK_PIPE_PIPE
TPP_EXTENSION(TPP_EXT_TOK_PIPE_PIPE, TPP_EXTNAME_TOK_PIPE_PIPE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_PIPE_PIPE))
#define _tpp_lexer_has_TOK_PIPE_PIPE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_PIPE_PIPE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_PIPE_PIPE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_TILDE_EQUAL)
#ifndef TPP_EXTNAME_TOK_TILDE_EQUAL
#define TPP_EXTNAME_TOK_TILDE_EQUAL "tok-tilde_equal"
#endif /* !TPP_EXTNAME_TOK_TILDE_EQUAL */
#define TPP_EXT_TOK_TILDE_EQUAL TPP_EXT_TOK_TILDE_EQUAL
TPP_EXTENSION(TPP_EXT_TOK_TILDE_EQUAL, TPP_EXTNAME_TOK_TILDE_EQUAL, TPP_CONF_DEFAULT(TPP_HAVE_TOK_TILDE_EQUAL))
#define _tpp_lexer_has_TOK_TILDE_EQUAL(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_TILDE_EQUAL)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_TILDE_EQUAL) */
#if TPP_CONF_IS_EXT(TPP_HAVE_TOK_TILDE_TILDE)
#ifndef TPP_EXTNAME_TOK_TILDE_TILDE
#define TPP_EXTNAME_TOK_TILDE_TILDE "tok-tilde_tilde"
#endif /* !TPP_EXTNAME_TOK_TILDE_TILDE */
#define TPP_EXT_TOK_TILDE_TILDE TPP_EXT_TOK_TILDE_TILDE
TPP_EXTENSION(TPP_EXT_TOK_TILDE_TILDE, TPP_EXTNAME_TOK_TILDE_TILDE, TPP_CONF_DEFAULT(TPP_HAVE_TOK_TILDE_TILDE))
#define _tpp_lexer_has_TOK_TILDE_TILDE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_TOK_TILDE_TILDE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_TOK_TILDE_TILDE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_DEFINED)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_DEFINED
#define TPP_EXTNAME_BUILTIN_EXPR_DEFINED "defined-in-expressions"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_DEFINED */
#define TPP_EXT_BUILTIN_EXPR_DEFINED TPP_EXT_BUILTIN_EXPR_DEFINED
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_DEFINED, TPP_EXTNAME_BUILTIN_EXPR_DEFINED, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_DEFINED))
#define _tpp_lexer_has_BUILTIN_EXPR_DEFINED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_DEFINED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_DEFINED) */
#if TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
#ifndef TPP_EXTNAME_DONT_EXPAND_DEFINED_IN_EXPR
#define TPP_EXTNAME_DONT_EXPAND_DEFINED_IN_EXPR "dont-expand-defined"
#endif /* !TPP_EXTNAME_DONT_EXPAND_DEFINED_IN_EXPR */
#define TPP_EXT_DONT_EXPAND_DEFINED_IN_EXPR TPP_EXT_DONT_EXPAND_DEFINED_IN_EXPR
TPP_EXTENSION(TPP_EXT_DONT_EXPAND_DEFINED_IN_EXPR, TPP_EXTNAME_DONT_EXPAND_DEFINED_IN_EXPR, TPP_CONF_DEFAULT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR))
#define _tpp_lexer_has_DONT_EXPAND_DEFINED_IN_EXPR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_DONT_EXPAND_DEFINED_IN_EXPR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_STRINGS)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_STRINGS
#define TPP_EXTNAME_BUILTIN_EXPR_STRINGS "strings-in-expressions"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_STRINGS */
#define TPP_EXT_BUILTIN_EXPR_STRINGS TPP_EXT_BUILTIN_EXPR_STRINGS
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_STRINGS, TPP_EXTNAME_BUILTIN_EXPR_STRINGS, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_STRINGS))
#define _tpp_lexer_has_BUILTIN_EXPR_STRINGS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_STRINGS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_STRINGS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_FLOATS)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_FLOATS
#define TPP_EXTNAME_BUILTIN_EXPR_FLOATS "floats-in-expressions"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_FLOATS */
#define TPP_EXT_BUILTIN_EXPR_FLOATS TPP_EXT_BUILTIN_EXPR_FLOATS
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_FLOATS, TPP_EXTNAME_BUILTIN_EXPR_FLOATS, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_FLOATS))
#define _tpp_lexer_has_BUILTIN_EXPR_FLOATS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_FLOATS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_FLOATS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT
#define TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT "if-else-optional-true"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT */
#define TPP_EXT_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT TPP_EXT_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT, TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT))
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
#define TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS "ifelse-in-expressions"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS */
#define TPP_EXT_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS TPP_EXT_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS, TPP_EXTNAME_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS))
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_LOGICAL_XOR
#define TPP_EXTNAME_BUILTIN_EXPR_LOGICAL_XOR "logical-xor-in-expressions"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_LOGICAL_XOR */
#define TPP_EXT_BUILTIN_EXPR_LOGICAL_XOR TPP_EXT_BUILTIN_EXPR_LOGICAL_XOR
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_LOGICAL_XOR, TPP_EXTNAME_BUILTIN_EXPR_LOGICAL_XOR, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR))
#define _tpp_lexer_has_BUILTIN_EXPR_LOGICAL_XOR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_LOGICAL_XOR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
#ifndef TPP_EXTNAME_BUILTIN_EXPR_CHARACTER_LITERALS
#define TPP_EXTNAME_BUILTIN_EXPR_CHARACTER_LITERALS "character-literals"
#endif /* !TPP_EXTNAME_BUILTIN_EXPR_CHARACTER_LITERALS */
#define TPP_EXT_BUILTIN_EXPR_CHARACTER_LITERALS TPP_EXT_BUILTIN_EXPR_CHARACTER_LITERALS
TPP_EXTENSION(TPP_EXT_BUILTIN_EXPR_CHARACTER_LITERALS, TPP_EXTNAME_BUILTIN_EXPR_CHARACTER_LITERALS, TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS))
#define _tpp_lexer_has_BUILTIN_EXPR_CHARACTER_LITERALS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_BUILTIN_EXPR_CHARACTER_LITERALS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_EXTERN_C_FOR_SYSHDR)
#ifndef TPP_EXTNAME_EXTERN_C_FOR_SYSHDR
#define TPP_EXTNAME_EXTERN_C_FOR_SYSHDR "extern-c-for-syshdr"
#endif /* !TPP_EXTNAME_EXTERN_C_FOR_SYSHDR */
#define TPP_EXT_EXTERN_C_FOR_SYSHDR TPP_EXT_EXTERN_C_FOR_SYSHDR
TPP_EXTENSION(TPP_EXT_EXTERN_C_FOR_SYSHDR, TPP_EXTNAME_EXTERN_C_FOR_SYSHDR, TPP_CONF_DEFAULT(TPP_HAVE_EXTERN_C_FOR_SYSHDR))
#define _tpp_lexer_has_EXTERN_C_FOR_SYSHDR(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_EXTERN_C_FOR_SYSHDR)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_EXTERN_C_FOR_SYSHDR) */
#if TPP_CONF_IS_EXT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)
#ifndef TPP_EXTNAME_SEARCH_SYSTEM_INCLUDE_PATH
#define TPP_EXTNAME_SEARCH_SYSTEM_INCLUDE_PATH "stdinc"
#endif /* !TPP_EXTNAME_SEARCH_SYSTEM_INCLUDE_PATH */
#define TPP_EXT_SEARCH_SYSTEM_INCLUDE_PATH TPP_EXT_SEARCH_SYSTEM_INCLUDE_PATH
TPP_EXTENSION(TPP_EXT_SEARCH_SYSTEM_INCLUDE_PATH, TPP_EXTNAME_SEARCH_SYSTEM_INCLUDE_PATH, TPP_CONF_DEFAULT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH))
#define _tpp_lexer_has_SEARCH_SYSTEM_INCLUDE_PATH(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_SEARCH_SYSTEM_INCLUDE_PATH)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH) */
#if TPP_CONF_IS_EXT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE)
#ifndef TPP_EXTNAME_INCLUDE_RELATIVE_TO_EVERY_FILE
#define TPP_EXTNAME_INCLUDE_RELATIVE_TO_EVERY_FILE "include-relative-to-every-file"
#endif /* !TPP_EXTNAME_INCLUDE_RELATIVE_TO_EVERY_FILE */
#define TPP_EXT_INCLUDE_RELATIVE_TO_EVERY_FILE TPP_EXT_INCLUDE_RELATIVE_TO_EVERY_FILE
TPP_EXTENSION(TPP_EXT_INCLUDE_RELATIVE_TO_EVERY_FILE, TPP_EXTNAME_INCLUDE_RELATIVE_TO_EVERY_FILE, TPP_CONF_DEFAULT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE))
#define _tpp_lexer_has_INCLUDE_RELATIVE_TO_EVERY_FILE(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_INCLUDE_RELATIVE_TO_EVERY_FILE)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE) */
#if TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS)
#ifndef TPP_EXTNAME_LEXER_DECODEINT_HEX_LITERALS
#define TPP_EXTNAME_LEXER_DECODEINT_HEX_LITERALS "hex-literals"
#endif /* !TPP_EXTNAME_LEXER_DECODEINT_HEX_LITERALS */
#define TPP_EXT_LEXER_DECODEINT_HEX_LITERALS TPP_EXT_LEXER_DECODEINT_HEX_LITERALS
TPP_EXTENSION(TPP_EXT_LEXER_DECODEINT_HEX_LITERALS, TPP_EXTNAME_LEXER_DECODEINT_HEX_LITERALS, TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS))
#define _tpp_lexer_has_LEXER_DECODEINT_HEX_LITERALS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_LEXER_DECODEINT_HEX_LITERALS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS)
#ifndef TPP_EXTNAME_LEXER_DECODEINT_BINARY_LITERALS
#define TPP_EXTNAME_LEXER_DECODEINT_BINARY_LITERALS "binary-literals"
#endif /* !TPP_EXTNAME_LEXER_DECODEINT_BINARY_LITERALS */
#define TPP_EXT_LEXER_DECODEINT_BINARY_LITERALS TPP_EXT_LEXER_DECODEINT_BINARY_LITERALS
TPP_EXTENSION(TPP_EXT_LEXER_DECODEINT_BINARY_LITERALS, TPP_EXTNAME_LEXER_DECODEINT_BINARY_LITERALS, TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS))
#define _tpp_lexer_has_LEXER_DECODEINT_BINARY_LITERALS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_LEXER_DECODEINT_BINARY_LITERALS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS)
#ifndef TPP_EXTNAME_LEXER_DECODEINT_OCTAL_LITERALS
#define TPP_EXTNAME_LEXER_DECODEINT_OCTAL_LITERALS "octal-literals"
#endif /* !TPP_EXTNAME_LEXER_DECODEINT_OCTAL_LITERALS */
#define TPP_EXT_LEXER_DECODEINT_OCTAL_LITERALS TPP_EXT_LEXER_DECODEINT_OCTAL_LITERALS
TPP_EXTENSION(TPP_EXT_LEXER_DECODEINT_OCTAL_LITERALS, TPP_EXTNAME_LEXER_DECODEINT_OCTAL_LITERALS, TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS))
#define _tpp_lexer_has_LEXER_DECODEINT_OCTAL_LITERALS(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_LEXER_DECODEINT_OCTAL_LITERALS)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)
#ifndef TPP_EXTNAME_PRAGMA_MESSAGE_PRINTS_LOCATION
#define TPP_EXTNAME_PRAGMA_MESSAGE_PRINTS_LOCATION "pragma-message-prints-location"
#endif /* !TPP_EXTNAME_PRAGMA_MESSAGE_PRINTS_LOCATION */
#define TPP_EXT_PRAGMA_MESSAGE_PRINTS_LOCATION TPP_EXT_PRAGMA_MESSAGE_PRINTS_LOCATION
TPP_EXTENSION(TPP_EXT_PRAGMA_MESSAGE_PRINTS_LOCATION, TPP_EXTNAME_PRAGMA_MESSAGE_PRINTS_LOCATION, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION))
#define _tpp_lexer_has_PRAGMA_MESSAGE_PRINTS_LOCATION(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_MESSAGE_PRINTS_LOCATION)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION) */
#if TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
#ifndef TPP_EXTNAME_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED
#define TPP_EXTNAME_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED "pragma-message-omits-trailing-linefeed"
#endif /* !TPP_EXTNAME_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED */
#define TPP_EXT_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED TPP_EXT_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED
TPP_EXTENSION(TPP_EXT_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED, TPP_EXTNAME_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED, TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED))
#define _tpp_lexer_has_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED(self) (self)->TPP_INTERNAL(tl_exts).TPP_INTERNAL(te_state).TPP_INTERNAL(tes_flags).TPP_INTERNAL(tef_TPP_EXT_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
#endif /* TPP_CONF_IS_EXT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED) */






/* Declare builtin warnings. */

/************************************************************************/
/* -Wcomment                                                            */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_COMMENT
#define TPP_HAVE_TPP_WG_COMMENT \
	(TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT || TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED)
#endif /* !TPP_HAVE_TPP_WG_COMMENT */
#if TPP_HAVE_TPP_WG_COMMENT
#define TPP_WG_COMMENT TPP_WG_COMMENT
TPP_WGROUP(TPP_WG_COMMENT, 2("comment", "comments"), TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_COMMENT */

#if TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT
#define TPP_W_SLASHSTAR_INSIDE_OF_COMMENT TPP_W_SLASHSTAR_INSIDE_OF_COMMENT
TPP_WARNING(TPP_W_SLASHSTAR_INSIDE_OF_COMMENT, 1(TPP_WG_COMMENT), 0(), ~,
            "%[/*%] repeated inside of comment")
#endif /* TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT */

#if TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED
#define TPP_W_LINE_COMMENT_CONTINUED TPP_W_LINE_COMMENT_CONTINUED
TPP_WARNING(TPP_W_LINE_COMMENT_CONTINUED, 1(TPP_WG_COMMENT), 1(4010), TPP_WSTATE_UNDEFINED,
            "line-comment continued")
#endif /* TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED */


/************************************************************************/
/* -Wtrigraphs                                                          */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_TRIGRAPHS
#define TPP_HAVE_TPP_WG_TRIGRAPHS \
	(TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH)
#endif /* !TPP_HAVE_TPP_WG_TRIGRAPHS */
#if TPP_HAVE_TPP_WG_TRIGRAPHS
#define TPP_WG_TRIGRAPHS TPP_WG_TRIGRAPHS
TPP_WGROUP(TPP_WG_TRIGRAPHS, 1("trigraphs"), TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_TRIGRAPHS */

#if TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH
#define TPP_W_ENCOUNTERED_TRIGRAPH TPP_W_ENCOUNTERED_TRIGRAPH
TPP_WARNING(TPP_W_ENCOUNTERED_TRIGRAPH, 1(TPP_WG_TRIGRAPHS), 0(), ~,
            "encountered trigraph character sequence %.3Pt")
#endif /* TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH */


/************************************************************************/
/* -Wsyntax                                                             */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_SYNTAX
#define TPP_HAVE_TPP_WG_SYNTAX                                        \
	(TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED ||                  \
	 TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF ||                       \
	 TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF ||                      \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN ||                               \
	 TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE ||                              \
	 TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER ||                        \
	 TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE ||               \
	 TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE ||            \
	 TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE ||          \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST ||       \
	 TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME ||                 \
	 TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT ||                   \
	 TPP_HAVE_TPP_W_EXPECTED_STRING ||                                \
	 TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING ||                        \
	 TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF ||                               \
	 TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE ||                        \
	 TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF ||                        \
	 TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF ||                               \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION ||                 \
	 TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF ||                \
	 TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED ||              \
	 TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION ||            \
	 TPP_HAVE_TPP_W_INVALID_INTEGER ||                                \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK ||               \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING ||             \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON || \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC ||      \
	 TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH ||    \
	 TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE)
#endif /* !TPP_HAVE_TPP_WG_SYNTAX */
#if TPP_HAVE_TPP_WG_SYNTAX
#ifndef TPP_WGNAME_SYNTAX
#define TPP_WGNAME_SYNTAX 1("syntax")
#endif /* !TPP_WGNAME_SYNTAX */
#define TPP_WG_SYNTAX TPP_WG_SYNTAX
TPP_WGROUP(TPP_WG_SYNTAX, TPP_WGNAME_SYNTAX, TPP_WSTATE_ERROR_OR_FATAL)
#endif /* TPP_HAVE_TPP_WG_SYNTAX */

#if TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED
#define TPP_W_STRING_TERMINATED_BY_LINEFEED TPP_W_STRING_TERMINATED_BY_LINEFEED
TPP_WARNING(TPP_W_STRING_TERMINATED_BY_LINEFEED, 1(TPP_WG_SYNTAX), 0(), ~,
            "string was terminated by a linefeed")
#endif /* TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED */

#if TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF
#define TPP_W_STRING_TERMINATED_BY_EOF TPP_W_STRING_TERMINATED_BY_EOF
TPP_WARNING(TPP_W_STRING_TERMINATED_BY_EOF, 1(TPP_WG_SYNTAX), 0(), ~,
            "string was terminated by EOF")
#endif /* TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF */

#if TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF
#define TPP_W_COMMENT_TERMINATED_BY_EOF TPP_W_COMMENT_TERMINATED_BY_EOF
TPP_WARNING(TPP_W_COMMENT_TERMINATED_BY_EOF, 1(TPP_WG_SYNTAX), 0(), ~,
            "comment was terminated by EOF")
#endif /* TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN
#define TPP_W_UNEXPECTED_TOKEN TPP_W_UNEXPECTED_TOKEN
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[%s%] but got %Pt")
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN */

#if TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE
#define TPP_W_UNKNOWN_DIRECTIVE TPP_W_UNKNOWN_DIRECTIVE
TPP_WARNING(TPP_W_UNKNOWN_DIRECTIVE, 1(TPP_WG_SYNTAX), 1(1021), TPP_WSTATE_UNDEFINED,
            "unknown preprocessor directive: %Pt")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE */

#if TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER
#define TPP_W_UNKNOWN_EMBED_PARAMETER TPP_W_UNKNOWN_EMBED_PARAMETER
TPP_WARNING(TPP_W_UNKNOWN_EMBED_PARAMETER, 1(TPP_WG_SYNTAX), 0(), ~,
            "unknown %[#embed%] parameter: %Pt")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER */

#if TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE
#define TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE
TPP_WARNING(TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE, 1(TPP_WG_SYNTAX), 1(4006), TPP_WSTATE_UNDEFINED,
            "no macro name given in %[#%s%] directive")
#endif /* TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE */

#if TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE
#define TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE
TPP_WARNING(TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE, 1(TPP_WG_SYNTAX), 0(), ~,
            "no assertion key given in %[#%s%] directive")
#endif /* TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE */

#if TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE
#define TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE
TPP_WARNING(TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected <keyword> after %[#%s %s(%], but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST
#define TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST, 1(TPP_WG_SYNTAX), 1(2010), TPP_WSTATE_UNDEFINED,
            "unexpected token %Pt in macro parameter list")
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST */

#if TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME
#define TPP_W_DUPLICATE_MACRO_PARAMETER_NAME TPP_W_DUPLICATE_MACRO_PARAMETER_NAME
TPP_WARNING(TPP_W_DUPLICATE_MACRO_PARAMETER_NAME, 1(TPP_WG_SYNTAX), 1(2009), TPP_WSTATE_UNDEFINED,
            "duplicate macro parameter name %Pt")
#endif /* TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME */

#if TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT
#define TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT
TPP_WARNING(TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT, 1(TPP_WG_SYNTAX), 1(7514), TPP_WSTATE_UNDEFINED,
            "expected %[(%] after %[__VA_OPT__%] in macro body")
#endif /* TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT */

#if TPP_HAVE_TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT
#define TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT
TPP_WARNING(TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT, 1(TPP_WG_SYNTAX), 1(7615), TPP_WSTATE_UNDEFINED,
            "expected %[)%] after %[__VA_OPT__%] in macro body")
#endif /* TPP_HAVE_TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT */

#if TPP_HAVE_TPP_W_EXPECTED_STRING
#define TPP_W_EXPECTED_STRING TPP_W_EXPECTED_STRING
TPP_WARNING(TPP_W_EXPECTED_STRING, 1(TPP_WG_SYNTAX), 1(4081), TPP_WSTATE_UNDEFINED,
            "expected <string>, but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_STRING */

#if TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING
#define TPP_W_EXPECTED_INCLUDE_STRING TPP_W_EXPECTED_INCLUDE_STRING
TPP_WARNING(TPP_W_EXPECTED_INCLUDE_STRING, 1(TPP_WG_SYNTAX), 1(2006), TPP_WSTATE_UNDEFINED,
            "expected <include-string>, but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING */

#if TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF
#define TPP_W_EOF_BEFORE_ENDIF TPP_W_EOF_BEFORE_ENDIF
TPP_WARNING(TPP_W_EOF_BEFORE_ENDIF, 1(TPP_WG_SYNTAX), 1(1070), TPP_WSTATE_UNDEFINED,
            "unterminated %[#if%]-directive")
#endif /* TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF */

#if TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE
#define TPP_W_ELIF_OR_ELSE_AFTER_ELSE TPP_W_ELIF_OR_ELSE_AFTER_ELSE
TPP_WARNING_EX(TPP_W_ELIF_OR_ELSE_AFTER_ELSE, 1(TPP_WG_SYNTAX), 1(1022), TPP_WSTATE_UNDEFINED, {
	tpp_ifdef_stack_entry const *const entry = tpp_current_va_arg(tpp_ifdef_stack_entry const *);
	char const *const directive_name = tpp_current_va_arg(char const *);
	tpp_lexer_printf_info *const info = tpp_current_info();
	tpp_lcinfo const saved_lc = info->tlpfi_lc;
	tpp_warn_printf1(info, "%[#%s%]-directive after %[#else%]\n", directive_name);

	info->tlpfi_lc = tpp_ifdef_stack_entry_getupdated(entry);
	tpp_warn_print_file_and_line(info);
	tpp_warn_printf0(info, "note: see associated %[#else%]\n");

	info->tlpfi_lc = tpp_ifdef_stack_entry_getcreated(entry);
	tpp_warn_print_file_and_line(info);
	tpp_warn_printf0(info, "note: see associated %[#if%], %[#ifdef%] or %[#ifndef%]\n");

	info->tlpfi_lc = saved_lc;
})
#endif /* TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE */

#if TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF
#define TPP_W_ELIF_OR_ELSE_WITHOUT_IF TPP_W_ELIF_OR_ELSE_WITHOUT_IF
TPP_WARNING(TPP_W_ELIF_OR_ELSE_WITHOUT_IF, 1(TPP_WG_SYNTAX), 2(1018, 1019), TPP_WSTATE_UNDEFINED,
            "%[#%s%]-directive without preceding %[#if%], %[#ifdef%] or %[#ifndef%]")
#endif /* TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF */

#if TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF
#define TPP_W_ENDIF_WITHOUT_IF TPP_W_ENDIF_WITHOUT_IF
TPP_WARNING(TPP_W_ENDIF_WITHOUT_IF, 1(TPP_WG_SYNTAX), 1(1020), TPP_WSTATE_UNDEFINED,
            "%[#endif%]-directive without preceding %[#if%], %[#ifdef%] or %[#ifndef%]")
#endif /* TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION
#define TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION, 1(TPP_WG_SYNTAX), 1(1017), TPP_WSTATE_UNDEFINED,
            "unexpected token %Pt in preprocessor expression")
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION */

#if TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF
#define TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF
TPP_WARNING(TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF, 1(TPP_WG_SYNTAX), 1(1016), TPP_WSTATE_UNDEFINED,
            "expected <keyword> after %[#%s%], but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF */

#if TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED
#define TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED
TPP_WARNING(TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED, 1(TPP_WG_SYNTAX), 1(2003), TPP_WSTATE_UNDEFINED,
            "expected <keyword> after %[defined%] in expression, but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED */

#if TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION
#define TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION
TPP_WARNING(TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected <keyword> in %[#%s(<here>)%], but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION */

#if TPP_HAVE_TPP_W_INVALID_INTEGER
#define TPP_W_INVALID_INTEGER TPP_W_INVALID_INTEGER
TPP_WARNING(TPP_W_INVALID_INTEGER, 1(TPP_WG_SYNTAX), 1(3688), TPP_WSTATE_UNDEFINED,
            "invalid integer literal: %Pt")
#endif /* TPP_HAVE_TPP_W_INVALID_INTEGER */

#if TPP_HAVE_TPP_W_INVALID_FLOAT
#define TPP_W_INVALID_FLOAT TPP_W_INVALID_FLOAT
TPP_WARNING(TPP_W_INVALID_FLOAT, 1(TPP_WG_SYNTAX), 0(), ~,
            "invalid float literal: %Pt")
#endif /* TPP_HAVE_TPP_W_INVALID_FLOAT */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK
#define TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK
#if TPP_HAVE_TOK_INT
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[<integer>%], %[<string>%] or %[,%] in %[__TPP_STR_PACK%] but got %Pt")
#else /* TPP_HAVE_TOK_INT */
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[<integer>%] or %[,%] in %[__TPP_STR_PACK%] but got %Pt")
#endif /* !TPP_HAVE_TOK_INT */
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING
#define TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING
#if TPP_HAVE_WARNINGS_PUSH_POP
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_PUSH "%[push%], %[pop%], "
#else /* TPP_HAVE_WARNINGS_PUSH_POP */
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_PUSH /* nothing */
#endif /* !TPP_HAVE_WARNINGS_PUSH_POP */
#if TPP_HAVE_TOK_INT
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_INT "%[<integer>%], "
#else /* TPP_HAVE_TOK_INT */
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_INT /* nothing */
#endif /* !TPP_HAVE_TOK_INT */
#if TPP_HAVE_WARNING_SUPPRESS
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_SUPPRESS "%[suppress%], "
#else /* TPP_HAVE_WARNING_SUPPRESS */
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_SUPPRESS /* nothing */
#endif /* !TPP_HAVE_WARNING_SUPPRESS */
#if TPP_HAVE_WARNING_DEFAULT
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_DEFAULT "%[default%], "
#else /* TPP_HAVE_WARNING_DEFAULT */
#define TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_DEFAULT /* nothing */
#endif /* !TPP_HAVE_WARNING_DEFAULT */
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected "
            TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_PUSH
            TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_INT
            "%[disable%], %[enable%], %[error%], "
            TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_SUPPRESS
            TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_DEFAULT
            "%[fatal%] or %[<string>%] after %[#pragma warning(%] but got %Pt")
#undef TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_DEFAULT
#undef TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_SUPPRESS
#undef TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_INT
#undef TPP_PRIVATE_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_PUSH
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON
#if TPP_HAVE_WARNING_NUMBERS && TPP_HAVE_TOK_INT
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON_INTEGER_OR "%[<integer>%] or "
#else /* TPP_HAVE_WARNING_NUMBERS && TPP_HAVE_TOK_INT */
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON_INTEGER_OR /* nothing */
#endif /* !TPP_HAVE_WARNING_NUMBERS || !TPP_HAVE_TOK_INT */
#define TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected "
            _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON_INTEGER_OR
            "%[<string>%] after %[#pragma warning(<mode>:%] but got %Pt")
#undef _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON_INTEGER_OR
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC
#define TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC
#if TPP_HAVE_WARNINGS_PUSH_POP
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[push%], %[pop%], %[warning%], %[error%] or %[ignored%] after %[#pragma GCC diagnostic%] but got %Pt")
#else /* TPP_HAVE_WARNINGS_PUSH_POP */
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[warning%], %[error%] or %[ignored%] after %[#pragma GCC diagnostic%] but got %Pt")
#endif /* !TPP_HAVE_WARNINGS_PUSH_POP */
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC */

#if TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH
#if TPP_HAVE_INCLUDE_PATH_PUSH_POP
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_PUSHPOP ", %[push%], %[pop%]"
#else /* TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_PUSHPOP /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#if TPP_HAVE_INCLUDE_PATH_QUOTE
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_QUOTE ", %[quote%]"
#else /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_QUOTE /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_SYSTEM ", %[system%]"
#else /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_SYSTEM /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_DIRAFTER ", %[dirafter%]"
#else /* TPP_HAVE_INCLUDE_PATH_AFTER */
#define _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_DIRAFTER /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_AFTER */
#define TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH
TPP_WARNING(TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH, 1(TPP_WG_SYNTAX), 0(), ~,
            "expected %[default%], %[clear%]"
            _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_PUSHPOP
            _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_QUOTE
            _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_SYSTEM
            _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_DIRAFTER
            " or %[<string>%] in %[#pragma TPP include_path(...)%] but got %Pt")
#undef _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_PUSHPOP
#undef _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_QUOTE
#undef _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_SYSTEM
#undef _TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH_DIRAFTER
#endif /* TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH */

#if TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE
#define TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE
TPP_WARNING(TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE, 1(TPP_WG_SYNTAX), 1(2005), TPP_WSTATE_UNDEFINED,
            "expected %[<integer>%], after %[#line%] but got %Pt")
#endif /* TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE */




/************************************************************************/
/* -Wuser, -Wcpp                                                        */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_USER
#define TPP_HAVE_TPP_WG_USER (TPP_HAVE_TPP_W_ERROR || TPP_HAVE_TPP_W_WARNING)
#endif /* !TPP_HAVE_TPP_WG_USER */
#ifndef TPP_HAVE_TPP_WG_CPP
#define TPP_HAVE_TPP_WG_CPP (TPP_HAVE_TPP_W_WARNING)
#endif /* !TPP_HAVE_TPP_WG_CPP */
#if TPP_HAVE_TPP_WG_USER
#ifndef TPP_WGNAME_USER
#define TPP_WGNAME_USER 1("user")
#endif /* !TPP_WGNAME_USER */
#define TPP_WG_USER TPP_WG_USER
TPP_WGROUP(TPP_WG_USER, TPP_WGNAME_USER, TPP_WSTATE_ERROR_OR_FATAL)
#endif /* TPP_HAVE_TPP_WG_USER */
#if TPP_HAVE_TPP_WG_CPP
#ifndef TPP_WGNAME_CPP
#define TPP_WGNAME_CPP 1("cpp")
#endif /* !TPP_WGNAME_CPP */
#define TPP_WG_CPP TPP_WG_CPP
TPP_WGROUP(TPP_WG_CPP, TPP_WGNAME_CPP, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_CPP */

#if TPP_HAVE_TPP_W_ERROR
#define TPP_W_ERROR TPP_W_ERROR
TPP_WARNING(TPP_W_ERROR, 1(TPP_WG_USER), 0(), ~, "%.*s")
#endif /* TPP_HAVE_TPP_W_ERROR */

#if TPP_HAVE_TPP_W_WARNING
#define TPP_W_WARNING TPP_W_WARNING
TPP_WARNING(TPP_W_WARNING, 2(TPP_WG_USER, TPP_WG_CPP), 0(), ~, "%.*s")
#endif /* TPP_HAVE_TPP_W_WARNING */


/************************************************************************/
/* -Wunknown-pragmas                                                    */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_UNKNOWN_PRAGMAS
#define TPP_HAVE_TPP_WG_UNKNOWN_PRAGMAS (TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS)
#endif /* !TPP_HAVE_TPP_WG_UNKNOWN_PRAGMAS */
#if TPP_HAVE_TPP_WG_UNKNOWN_PRAGMAS
#ifndef TPP_WGNAME_UNKNOWN_PRAGMAS
#define TPP_WGNAME_UNKNOWN_PRAGMAS 1("unknown-pragmas")
#endif /* !TPP_WGNAME_UNKNOWN_PRAGMAS */
#define TPP_WG_UNKNOWN_PRAGMAS TPP_WG_UNKNOWN_PRAGMAS
TPP_WGROUP(TPP_WG_UNKNOWN_PRAGMAS, TPP_WGNAME_UNKNOWN_PRAGMAS, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_UNKNOWN_PRAGMAS */

#if TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS
#define TPP_W_UNKNOWN_PRAGMAS TPP_W_UNKNOWN_PRAGMAS
TPP_WARNING(TPP_W_UNKNOWN_PRAGMAS, 1(TPP_WG_UNKNOWN_PRAGMAS), 1(4068), TPP_WSTATE_UNDEFINED,
            "unknown pragma %Pt")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS */

#if TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE
#define TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE
TPP_WARNING(TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE, 1(TPP_WG_UNKNOWN_PRAGMAS), 1(4083), TPP_WSTATE_UNDEFINED,
            "extra tokens at end of %[#pragma%] directive: %Pt")
#endif /* TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE */


/************************************************************************/
/* -Wpragma-once-outside-header                                         */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER
#define TPP_HAVE_TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER (TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER)
#endif /* !TPP_HAVE_TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER */
#if TPP_HAVE_TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER
#ifndef TPP_WGNAME_PRAGMA_ONCE_OUTSIDE_HEADER
#define TPP_WGNAME_PRAGMA_ONCE_OUTSIDE_HEADER 1("pragma-once-outside-header")
#endif /* !TPP_WGNAME_PRAGMA_ONCE_OUTSIDE_HEADER */
#define TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER
TPP_WGROUP(TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER, TPP_WGNAME_PRAGMA_ONCE_OUTSIDE_HEADER, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER */

#if TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER
#define TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER
TPP_WARNING(TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER, 1(TPP_WG_PRAGMA_ONCE_OUTSIDE_HEADER), 0(), ~,
            "%[#pragma once%] in main file")
#endif /* TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER */


/************************************************************************/
/* -Wundef                                                              */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_UNDEF
#define TPP_HAVE_TPP_WG_UNDEF (TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION)
#endif /* !TPP_HAVE_TPP_WG_UNDEF */
#if TPP_HAVE_TPP_WG_UNDEF
#ifndef TPP_WGNAME_UNDEF
#define TPP_WGNAME_UNDEF 1("undef")
#endif /* !TPP_WGNAME_UNDEF */
#define TPP_WG_UNDEF TPP_WG_UNDEF
TPP_WGROUP(TPP_WG_UNDEF, TPP_WGNAME_UNDEF, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_UNDEF */

#if TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION
#define TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION
TPP_WARNING(TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION, 1(TPP_WG_UNDEF), 0(), ~,
            "undefined keyword %Pt is replaced with %[0%] in expression")
#endif /* TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION */


/************************************************************************/
/* -Wendif-labels                                                              */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_ENDIF_LABELS
#define TPP_HAVE_TPP_WG_ENDIF_LABELS (TPP_HAVE_TPP_W_ENDIF_LABELS)
#endif /* !TPP_HAVE_TPP_WG_ENDIF_LABELS */
#if TPP_HAVE_TPP_WG_ENDIF_LABELS
#ifndef TPP_WGNAME_ENDIF_LABELS
#define TPP_WGNAME_ENDIF_LABELS 1("endif-labels")
#endif /* !TPP_WGNAME_ENDIF_LABELS */
#define TPP_WG_ENDIF_LABELS TPP_WG_ENDIF_LABELS
TPP_WGROUP(TPP_WG_ENDIF_LABELS, TPP_WGNAME_ENDIF_LABELS, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_ENDIF_LABELS */

#if TPP_HAVE_TPP_W_ENDIF_LABELS
#define TPP_W_ENDIF_LABELS TPP_W_ENDIF_LABELS
TPP_WARNING(TPP_W_ENDIF_LABELS, 1(TPP_WG_ENDIF_LABELS), 0(), ~,
            "endif-label %Pt used")
#endif /* TPP_HAVE_TPP_W_ENDIF_LABELS */


/************************************************************************/
/* -Wdeprecated                                                         */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_DEPRECATED
#define TPP_HAVE_TPP_WG_DEPRECATED (TPP_HAVE_TPP_W_DEPRECATED_KEYWORD)
#endif /* !TPP_HAVE_TPP_WG_DEPRECATED */
#if TPP_HAVE_TPP_WG_DEPRECATED
#ifndef TPP_WGNAME_DEPRECATED
#define TPP_WGNAME_DEPRECATED 1("deprecated")
#endif /* !TPP_WGNAME_DEPRECATED */
#define TPP_WG_DEPRECATED TPP_WG_DEPRECATED
TPP_WGROUP(TPP_WG_DEPRECATED, TPP_WGNAME_DEPRECATED, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_DEPRECATED */

#if TPP_HAVE_TPP_W_DEPRECATED_KEYWORD
#define TPP_W_DEPRECATED_KEYWORD TPP_W_DEPRECATED_KEYWORD
TPP_WARNING(TPP_W_DEPRECATED_KEYWORD, 1(TPP_WG_DEPRECATED), 1(4995), TPP_WSTATE_UNDEFINED,
            "deprecated keyword %Pt used")
#endif /* TPP_HAVE_TPP_W_DEPRECATED_KEYWORD */


/************************************************************************/
/* -Wstring-escape                                                      */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_STRING_ESCAPE
#define TPP_HAVE_TPP_WG_STRING_ESCAPE                 \
	(TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE || \
	 TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE)
#endif /* !TPP_HAVE_TPP_WG_STRING_ESCAPE */
#if TPP_HAVE_TPP_WG_STRING_ESCAPE
#ifndef TPP_WGNAME_STRING_ESCAPE
#define TPP_WGNAME_STRING_ESCAPE 1("string-escape")
#endif /* !TPP_WGNAME_STRING_ESCAPE */
#define TPP_WG_STRING_ESCAPE TPP_WG_STRING_ESCAPE
TPP_WGROUP(TPP_WG_STRING_ESCAPE, TPP_WGNAME_STRING_ESCAPE, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_STRING_ESCAPE */

#if TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE
#define TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE
TPP_WARNING(TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE, 1(TPP_WG_STRING_ESCAPE), 1(4129), TPP_WSTATE_UNDEFINED,
            "unknown escape sequence: %Pt")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE */

#if TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE
#define TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE
TPP_WARNING(TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE, 1(TPP_WG_STRING_ESCAPE), 0(), ~,
            "unknown named escaped sequence: %Pt")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE */


/************************************************************************/
/* -Wmultichar                                                          */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_MULTICHAR_LITERAL
#define TPP_HAVE_TPP_WG_MULTICHAR_LITERAL (TPP_HAVE_TPP_W_MULTICHAR_LITERAL)
#endif /* !TPP_HAVE_TPP_WG_MULTICHAR_LITERAL */
#if TPP_HAVE_TPP_WG_MULTICHAR_LITERAL
#ifndef TPP_WGNAME_MULTICHAR_LITERAL
#define TPP_WGNAME_MULTICHAR_LITERAL 1("multichar")
#endif /* !TPP_WGNAME_MULTICHAR_LITERAL */
#define TPP_WG_MULTICHAR_LITERAL TPP_WG_MULTICHAR_LITERAL
TPP_WGROUP(TPP_WG_MULTICHAR_LITERAL, TPP_WGNAME_MULTICHAR_LITERAL, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_MULTICHAR_LITERAL */

#if TPP_HAVE_TPP_W_MULTICHAR_LITERAL
#define TPP_W_MULTICHAR_LITERAL TPP_W_MULTICHAR_LITERAL
TPP_WARNING(TPP_W_MULTICHAR_LITERAL, 1(TPP_WG_MULTICHAR_LITERAL), 0(), ~,
            "multichar literal %Pt used")
#endif /* TPP_HAVE_TPP_W_MULTICHAR_LITERAL */


/************************************************************************/
/* -Wmultiline-string                                                   */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_MULTILINE_STRING
#define TPP_HAVE_TPP_WG_MULTILINE_STRING (TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED)
#endif /* !TPP_HAVE_TPP_WG_MULTILINE_STRING */
#if TPP_HAVE_TPP_WG_MULTILINE_STRING
#ifndef TPP_WGNAME_MULTILINE_STRING
#define TPP_WGNAME_MULTILINE_STRING 1("multiline-string")
#endif /* !TPP_WGNAME_MULTILINE_STRING */
#define TPP_WG_MULTILINE_STRING TPP_WG_MULTILINE_STRING
TPP_WGROUP(TPP_WG_MULTILINE_STRING, TPP_WGNAME_MULTILINE_STRING, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_MULTILINE_STRING */

#if TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED
#define TPP_W_STRING_CONTINUED_AFTER_LINEFEED TPP_W_STRING_CONTINUED_AFTER_LINEFEED
TPP_WARNING(TPP_W_STRING_CONTINUED_AFTER_LINEFEED, 1(TPP_WG_MULTILINE_STRING), 0(), ~,
            "string continues after linefeed")
#endif /* TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED */



/************************************************************************/
/* -Wdate-time                                                          */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_DATE_TIME
#define TPP_HAVE_TPP_WG_DATE_TIME (TPP_HAVE_TPP_W_DATE_TIME)
#endif /* !TPP_HAVE_TPP_WG_DATE_TIME */
#if TPP_HAVE_TPP_WG_DATE_TIME
#ifndef TPP_WGNAME_DATE_TIME
#define TPP_WGNAME_DATE_TIME 1("date-time")
#endif /* !TPP_WGNAME_DATE_TIME */
#define TPP_WG_DATE_TIME TPP_WG_DATE_TIME
TPP_WGROUP(TPP_WG_DATE_TIME, TPP_WGNAME_DATE_TIME, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_DATE_TIME */

#if TPP_HAVE_TPP_W_DATE_TIME
#define TPP_W_DATE_TIME TPP_W_DATE_TIME
TPP_WARNING(TPP_W_DATE_TIME, 1(TPP_WG_DATE_TIME), 0(), ~,
            "date-time macro used")
#endif /* TPP_HAVE_TPP_W_DATE_TIME */


/************************************************************************/
/* -Wmacros                                                             */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_MACROS
#define TPP_HAVE_TPP_WG_MACROS              \
	(TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST || \
	 TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS)
#endif /* !TPP_HAVE_TPP_WG_MACROS */
#if TPP_HAVE_TPP_WG_MACROS
#ifndef TPP_WGNAME_MACROS
#define TPP_WGNAME_MACROS 1("macros")
#endif /* !TPP_WGNAME_MACROS */
#define TPP_WG_MACROS TPP_WG_MACROS
TPP_WGROUP(TPP_WG_MACROS, TPP_WGNAME_MACROS, TPP_WSTATE_ERROR_OR_FATAL)
#endif /* TPP_HAVE_TPP_WG_MACROS */

#if TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST
#define TPP_W_EOF_IN_ARGUMENT_LIST TPP_W_EOF_IN_ARGUMENT_LIST
TPP_WARNING(TPP_W_EOF_IN_ARGUMENT_LIST, 1(TPP_WG_MACROS), 1(1057), TPP_WSTATE_UNDEFINED,
            "eof in argument list for %[%s%]")
#endif /* TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST */

#if TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS
#define TPP_W_TOO_MANY_ARGUMENTS TPP_W_TOO_MANY_ARGUMENTS
TPP_WARNING(TPP_W_TOO_MANY_ARGUMENTS, 1(TPP_WG_MACROS), 1(4002), TPP_WSTATE_UNDEFINED,
            "too many arguments for %[%s%] which takes %u when %u were given")
#endif /* TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS */

#if TPP_HAVE_TPP_W_TOO_FEW_ARGUMENTS
#define TPP_W_TOO_FEW_ARGUMENTS TPP_W_TOO_FEW_ARGUMENTS
TPP_WARNING(TPP_W_TOO_FEW_ARGUMENTS, 1(TPP_WG_MACROS), 1(4003), TPP_WSTATE_UNDEFINED,
            "too few arguments for %[%s%] which takes %u when %u were given")
#endif /* TPP_HAVE_TPP_W_TOO_FEW_ARGUMENTS */


/************************************************************************/
/* -Wmacros                                                             */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_EXPANSION_TO_DEFINED
#define TPP_HAVE_TPP_WG_EXPANSION_TO_DEFINED \
	(TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED)
#endif /* !TPP_HAVE_TPP_WG_EXPANSION_TO_DEFINED */
#if TPP_HAVE_TPP_WG_EXPANSION_TO_DEFINED
#ifndef TPP_WGNAME_EXPANSION_TO_DEFINED
#define TPP_WGNAME_EXPANSION_TO_DEFINED 1("expansion-to-defined")
#endif /* !TPP_WGNAME_EXPANSION_TO_DEFINED */
#define TPP_WG_EXPANSION_TO_DEFINED TPP_WG_EXPANSION_TO_DEFINED
TPP_WGROUP(TPP_WG_EXPANSION_TO_DEFINED, TPP_WGNAME_EXPANSION_TO_DEFINED, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_EXPANSION_TO_DEFINED */

#if TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED
#define TPP_W_EXPANSION_TO_DEFINED TPP_W_EXPANSION_TO_DEFINED
#if TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
TPP_WARNING(TPP_W_EXPANSION_TO_DEFINED, 1(TPP_WG_EXPANSION_TO_DEFINED), 0(), ~,
            "using %[defined%] on macro argument %Pt will not work, because macros are expanded "
            /**/ "before %[defined%] will seem them. If you want to prevent expansion in this "
            /**/ "specific case, enable %[#pragma extension(\"-f" TPP_EXTNAME_DONT_EXPAND_DEFINED_IN_EXPR "\")%]")
#else /* TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
TPP_WARNING(TPP_W_EXPANSION_TO_DEFINED, 1(TPP_WG_EXPANSION_TO_DEFINED), 0(), ~,
            "using %[defined%] on macro argument %Pt will not work, because macros are expanded "
            /**/ "before %[defined%] will seem them.")
#endif /* !TPP_CONF_IS_EXT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
#endif /* TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED */


/************************************************************************/
/* -Wextension                                                          */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_EXTENSION
#define TPP_HAVE_TPP_WG_EXTENSION        \
	(TPP_HAVE_TPP_W_UNKNOWN_EXTENSION || \
	 TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS)
#endif /* !TPP_HAVE_TPP_WG_EXTENSION */
#if TPP_HAVE_TPP_WG_EXTENSION
#ifndef TPP_WGNAME_EXTENSION
#define TPP_WGNAME_EXTENSION 1("extension")
#endif /* !TPP_WGNAME_EXTENSION */
#define TPP_WG_EXTENSION TPP_WG_EXTENSION
TPP_WGROUP(TPP_WG_EXTENSION, TPP_WGNAME_EXTENSION, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_EXTENSION */

#if TPP_HAVE_TPP_W_UNKNOWN_EXTENSION
#define TPP_W_UNKNOWN_EXTENSION TPP_W_UNKNOWN_EXTENSION
#if TPP_HAVE_TPP_EXTENSION_NEAREST
TPP_WARNING(TPP_W_UNKNOWN_EXTENSION, 1(TPP_WG_EXTENSION), 0(), ~,
            "unknown extension %[-f%.*s%], did you mean %[-f%s%]")
#else /* TPP_HAVE_TPP_EXTENSION_NEAREST */
TPP_WARNING(TPP_W_UNKNOWN_EXTENSION, 1(TPP_WG_EXTENSION), 0(), ~,
            "unknown extension %[-f%.*s%]")
#endif /* !TPP_HAVE_TPP_EXTENSION_NEAREST */
#endif /* TPP_HAVE_TPP_W_UNKNOWN_EXTENSION */

#if TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS
#define TPP_W_CANNOT_POP_EXTENSIONS TPP_W_CANNOT_POP_EXTENSIONS
TPP_WARNING(TPP_W_CANNOT_POP_EXTENSIONS, 1(TPP_WG_EXTENSION), 0(), ~,
            "cannot %[#pragma extension(pop)%]: no preceding %[push%]")
#endif /* TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS */


/************************************************************************/
/* -Wwarning                                                          */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_WARNING
#define TPP_HAVE_TPP_WG_WARNING               \
	(TPP_HAVE_TPP_W_UNKNOWN_WARNING ||        \
	 TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER || \
	 TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS)
#endif /* !TPP_HAVE_TPP_WG_WARNING */
#if TPP_HAVE_TPP_WG_WARNING
#ifndef TPP_WGNAME_WARNING
#define TPP_WGNAME_WARNING 1("warning")
#endif /* !TPP_WGNAME_WARNING */
#define TPP_WG_WARNING TPP_WG_WARNING
TPP_WGROUP(TPP_WG_WARNING, TPP_WGNAME_WARNING, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_WARNING */

#if TPP_HAVE_TPP_W_UNKNOWN_WARNING
#define TPP_W_UNKNOWN_WARNING TPP_W_UNKNOWN_WARNING
#if TPP_HAVE_TPP_WARNING_GROUP_NEAREST
TPP_WARNING(TPP_W_UNKNOWN_WARNING, 1(TPP_WG_WARNING), 0(), ~,
            "unknown warning %[-W%.*s%], did you mean %[-W%s%]")
#else /* TPP_HAVE_TPP_WARNING_GROUP_NEAREST */
TPP_WARNING(TPP_W_UNKNOWN_WARNING, 1(TPP_WG_WARNING), 0(), ~,
            "unknown warning %[-W%.*s%]")
#endif /* !TPP_HAVE_TPP_WARNING_GROUP_NEAREST */
#endif /* TPP_HAVE_TPP_W_UNKNOWN_WARNING */

#if TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER
#define TPP_W_UNKNOWN_WARNING_NUMBER TPP_W_UNKNOWN_WARNING_NUMBER
TPP_WARNING(TPP_W_UNKNOWN_WARNING_NUMBER, 1(TPP_WG_WARNING), 1(4616), TPP_WSTATE_UNDEFINED,
            "unknown warning number %[%d%]")
#endif /* TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER */

#if TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS
#define TPP_W_CANNOT_POP_WARNINGS TPP_W_CANNOT_POP_WARNINGS
TPP_WARNING(TPP_W_CANNOT_POP_WARNINGS, 1(TPP_WG_WARNING), 1(4193), TPP_WSTATE_UNDEFINED,
            "cannot %[#pragma warning(pop)%]: no preceding %[push%]")
#endif /* TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS */


/************************************************************************/
/* -Wenviron                                                            */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_ENVIRON
#define TPP_HAVE_TPP_WG_ENVIRON \
	(TPP_HAVE_TPP_W_NO_SUCH_FILE)
#endif /* !TPP_HAVE_TPP_WG_ENVIRON */
#if TPP_HAVE_TPP_WG_ENVIRON
#ifndef TPP_WGNAME_ENVIRON
#define TPP_WGNAME_ENVIRON 1("environ")
#endif /* !TPP_WGNAME_ENVIRON */
#define TPP_WG_ENVIRON TPP_WG_ENVIRON
TPP_WGROUP(TPP_WG_ENVIRON, TPP_WGNAME_ENVIRON, TPP_WSTATE_ERROR_OR_FATAL) /* XXX: Some other warning name? */
#endif /* TPP_HAVE_TPP_WG_ENVIRON */

#if TPP_HAVE_TPP_W_NO_SUCH_FILE
#define TPP_W_NO_SUCH_FILE TPP_W_NO_SUCH_FILE
TPP_WARNING(TPP_W_NO_SUCH_FILE, 1(TPP_WG_ENVIRON), 1(1083), TPP_WSTATE_UNDEFINED,
            "no such file: %Pt")
#endif /* TPP_HAVE_TPP_W_NO_SUCH_FILE */


/************************************************************************/
/* -Wnon-portable-casing                                                */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_NON_PORTABLE_CASING
#define TPP_HAVE_TPP_WG_NON_PORTABLE_CASING \
	(TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING)
#endif /* !TPP_HAVE_TPP_WG_NON_PORTABLE_CASING */
#if TPP_HAVE_TPP_WG_NON_PORTABLE_CASING
#ifndef TPP_WGNAME_NON_PORTABLE_CASING
#define TPP_WGNAME_NON_PORTABLE_CASING 1("non-portable-casing")
#endif /* !TPP_WGNAME_NON_PORTABLE_CASING */
#define TPP_WG_NON_PORTABLE_CASING TPP_WG_NON_PORTABLE_CASING
TPP_WGROUP(TPP_WG_NON_PORTABLE_CASING, TPP_WGNAME_NON_PORTABLE_CASING, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_NON_PORTABLE_CASING */

#if TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING
#define TPP_W_NONPORTABLE_FILENAME_CASING TPP_W_NONPORTABLE_FILENAME_CASING
TPP_WARNING(TPP_W_NONPORTABLE_FILENAME_CASING, 1(TPP_WG_NON_PORTABLE_CASING), 0(), ~,
            "non-portable filename casing in %Pt should be %[%s%]")
#endif /* TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING */



/************************************************************************/
/* -Wdependency                                                         */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_DEPENDENCY
#define TPP_HAVE_TPP_WG_DEPENDENCY \
	(TPP_HAVE_TPP_W_DEPENDENCY_CHANGED)
#endif /* !TPP_HAVE_TPP_WG_DEPENDENCY */
#if TPP_HAVE_TPP_WG_DEPENDENCY
#ifndef TPP_WGNAME_DEPENDENCY
#define TPP_WGNAME_DEPENDENCY 1("dependency")
#endif /* !TPP_WGNAME_DEPENDENCY */
#define TPP_WG_DEPENDENCY TPP_WG_DEPENDENCY
TPP_WGROUP(TPP_WG_DEPENDENCY, TPP_WGNAME_DEPENDENCY, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_DEPENDENCY */

#if TPP_HAVE_TPP_W_DEPENDENCY_CHANGED
#define TPP_W_DEPENDENCY_CHANGED TPP_W_DEPENDENCY_CHANGED
TPP_WARNING(TPP_W_DEPENDENCY_CHANGED, 1(TPP_WG_DEPENDENCY), 0(), ~,
            "dependency changed: %[%s%]%s%.*s")
#endif /* TPP_HAVE_TPP_W_DEPENDENCY_CHANGED */


/************************************************************************/
/* -Wlimit                                                              */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_LIMIT
#define TPP_HAVE_TPP_WG_LIMIT                           \
	(TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED || \
	 TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED)
#endif /* !TPP_HAVE_TPP_WG_LIMIT */
#if TPP_HAVE_TPP_WG_LIMIT
#ifndef TPP_WGNAME_LIMIT
#define TPP_WGNAME_LIMIT 1("limit")
#endif /* !TPP_WGNAME_LIMIT */
#define TPP_WG_LIMIT TPP_WG_LIMIT
TPP_WGROUP(TPP_WG_LIMIT, TPP_WGNAME_LIMIT, TPP_WSTATE_FATAL)
#endif /* TPP_HAVE_TPP_WG_LIMIT */

#if TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED
#define TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED
TPP_WARNING(TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED, 1(TPP_WG_LIMIT), 1(1014), TPP_WSTATE_UNDEFINED,
            "file included too many times: %[%s%]")
#endif /* TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED */

#if TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED
#define TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED
#if TPP_CONF_IS_EXT(TPP_HAVE_MACRO_RECURSION)
#define _TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED_FEATUREHINT "%[-f" TPP_EXTNAME_MACRO_RECURSION "%]: "
#else /* TPP_CONF_IS_EXT(TPP_HAVE_MACRO_RECURSION) */
#define _TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED_FEATUREHINT /* nothing */
#endif /* !TPP_CONF_IS_EXT(TPP_HAVE_MACRO_RECURSION) */
TPP_WARNING_EX(TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED, 1(TPP_WG_LIMIT), 0(), ~, {
	tpp_keyword const *const macro_keyword = tpp_current_va_arg(tpp_keyword const *);
	tpp_macro const *const macro = tpp_current_va_arg(tpp_macro const *);
	tpp_warn_printf1(tpp_current_info(), _TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED_FEATUREHINT
	                                     "self-recursive macro %[%s%] expanded to itself too many times",
	                 tpp_keyword_getcstr(macro_keyword));
	if (tpp_macro_getdeffilename(macro)) {
		tpp_warn_print_file_and_line_lc(tpp_macro_getdeffilename(macro),
		                                tpp_macro_getdeflcinfo(macro));
		tpp_warn_printf1(tpp_current_info(), "note: see definition of %[%s%]\n",
		                 tpp_keyword_getcstr(macro_keyword));
	}
})
#undef _TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED_FEATUREHINT
#endif /* TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED */


/************************************************************************/
/* -Wquality                                                            */
/************************************************************************/
#ifndef TPP_HAVE_TPP_WG_QUALITY
#define TPP_HAVE_TPP_WG_QUALITY \
	(TPP_HAVE_TPP_W_PAREN_AROUND_LAND)
#endif /* !TPP_HAVE_TPP_WG_QUALITY */
#if TPP_HAVE_TPP_WG_QUALITY
#ifndef TPP_WGNAME_QUALITY
#define TPP_WGNAME_QUALITY 1("quality")
#endif /* !TPP_WGNAME_QUALITY */
#define TPP_WG_QUALITY TPP_WG_QUALITY
TPP_WGROUP(TPP_WG_QUALITY, TPP_WGNAME_QUALITY, TPP_WSTATE_WARN)
#endif /* TPP_HAVE_TPP_WG_QUALITY */

#if TPP_HAVE_TPP_W_PAREN_AROUND_LAND
#define TPP_W_PAREN_AROUND_LAND TPP_W_PAREN_AROUND_LAND
TPP_WARNING(TPP_W_PAREN_AROUND_LAND, 1(TPP_WG_QUALITY), 0(), ~,
            "Consider adding %[()%] around preceding %[&&%] to prevent confusion with %[||%]")
#endif /* TPP_HAVE_TPP_W_PAREN_AROUND_LAND */



/************************************************************************/
/* Misc warnings...                                                     */
/************************************************************************/
#if TPP_HAVE_TPP_W_POP_MACRO_EMPTY_STACK
#define TPP_W_POP_MACRO_EMPTY_STACK TPP_W_POP_MACRO_EMPTY_STACK
TPP_WARNING(TPP_W_POP_MACRO_EMPTY_STACK, 0(), 1(4602), TPP_WSTATE_WARN,
            "cannot %[#pragma pop_macro(\"%.*s\")%]: no preceding %[#pragma push_macro%]")
#endif /* TPP_HAVE_TPP_W_POP_MACRO_EMPTY_STACK */

#if TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE
#define TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE
TPP_WARNING(TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE, 0(), 1(4067), TPP_WSTATE_WARN,
            "extra token %Pt after %[#%s%] directive")
#endif /* TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE */

#if TPP_HAVE_TPP_W_CANNOT_UNDEF_BUILTIN_MACRO
#define TPP_W_CANNOT_UNDEF_BUILTIN_MACRO TPP_W_CANNOT_UNDEF_BUILTIN_MACRO
TPP_WARNING(TPP_W_CANNOT_UNDEF_BUILTIN_MACRO, 0(), 1(4117), TPP_WSTATE_WARN,
            "cannot %[#undef%] builtin keyword %[%s%]")
#endif /* TPP_HAVE_TPP_W_CANNOT_UNDEF_BUILTIN_MACRO */

#if TPP_HAVE_TPP_W_DEFINE_BUILTIN_MACRO
#define TPP_W_DEFINE_BUILTIN_MACRO TPP_W_DEFINE_BUILTIN_MACRO
TPP_WARNING(TPP_W_DEFINE_BUILTIN_MACRO, 0(), 1(4118), TPP_WSTATE_WARN,
            "builtin macro %[%s%] redefined")
#endif /* TPP_HAVE_TPP_W_DEFINE_BUILTIN_MACRO */

#if TPP_HAVE_TPP_W_REDEFINE_MACRO
#define TPP_W_REDEFINE_MACRO TPP_W_REDEFINE_MACRO
TPP_WARNING_EX(TPP_W_REDEFINE_MACRO, 0(), 1(4005), TPP_WSTATE_WARN, {
	tpp_keyword const *keyword = tpp_current_va_arg(tpp_keyword const *);
	tpp_macro const *const old_definition = tpp_keyword_getmacro(keyword);
	tpp_warn_printf1(tpp_current_info(), "macro %[%s%] redefined\n", tpp_keyword_getcstr(keyword));
	if (tpp_macro_getdeffilename(old_definition)) {
		tpp_warn_print_file_and_line_lc(tpp_macro_getdeffilename(old_definition),
		                           tpp_macro_getdeflcinfo(old_definition));
		tpp_warn_printf1(tpp_current_info(), "note: see previous definition of %[%s%]\n",
		                 tpp_keyword_getcstr(keyword));
	}
})
#endif /* TPP_HAVE_TPP_W_REDEFINE_MACRO */

#if TPP_HAVE_TPP_W_BAD_EXPRESSION_OPERANDS
#define TPP_W_BAD_EXPRESSION_OPERANDS TPP_W_BAD_EXPRESSION_OPERANDS
TPP_WARNING(TPP_W_BAD_EXPRESSION_OPERANDS, 0(), 0(), TPP_WSTATE_ERROR_OR_FATAL,
            "bad operand types in %[%s%s%s%s%s%s%]")
#endif /* TPP_HAVE_TPP_W_BAD_EXPRESSION_OPERANDS */

#if TPP_HAVE_TPP_W_DIVIDE_BY_ZERO
#define TPP_W_DIVIDE_BY_ZERO TPP_W_DIVIDE_BY_ZERO
TPP_WARNING(TPP_W_DIVIDE_BY_ZERO, 0(), 1(2124), TPP_WSTATE_ERROR_OR_FATAL,
            "division by zero")
#endif /* TPP_HAVE_TPP_W_DIVIDE_BY_ZERO */

#if TPP_HAVE_TPP_W_CHARACTER_TOO_LARGE
#define TPP_W_CHARACTER_TOO_LARGE TPP_W_CHARACTER_TOO_LARGE
TPP_WARNING(TPP_W_CHARACTER_TOO_LARGE, 0(), 1(2022), TPP_WSTATE_ERROR_OR_FATAL,
            "character value is too large: %Pt")
#endif /* TPP_HAVE_TPP_W_CHARACTER_TOO_LARGE */

#if TPP_HAVE_TPP_W_CANNOT_POP_INCLUDE_PATHS
#define TPP_W_CANNOT_POP_INCLUDE_PATHS TPP_W_CANNOT_POP_INCLUDE_PATHS
TPP_WARNING(TPP_W_CANNOT_POP_INCLUDE_PATHS, 0(), 0(), ~,
            "cannot %[#pragma TPP include_path(pop)%]: no preceding %[push%]")
#endif /* TPP_HAVE_TPP_W_CANNOT_POP_INCLUDE_PATHS */

#if TPP_HAVE_TPP_W_ILLEGAL_UTF8_SEQUENCE
#define TPP_W_ILLEGAL_UTF8_SEQUENCE TPP_W_ILLEGAL_UTF8_SEQUENCE
TPP_WARNING(TPP_W_ILLEGAL_UTF8_SEQUENCE, 0(), 0(), ~,
            "illegal utf-8 sequence: %Pt")
#endif /* TPP_HAVE_TPP_W_ILLEGAL_UTF8_SEQUENCE */


/* Pull in user definitions (if defined) */
#ifdef TPP_CONFIG_USERDEFS_FILENAME
#include TPP_CONFIG_USERDEFS_FILENAME
#endif /* TPP_CONFIG_USERDEFS_FILENAME */


#undef TPP_KWD
#undef TPP_KWD_FLAGS
#undef TPP_EXTENSION
#undef TPP_WGROUP
#undef TPP_WARNING
#undef TPP_WARNING_EX
#undef TPP_WARNING_WITH_NUMBER
#undef TPP_WARNING_WITH_NUMBER_EX
#undef TPP_MACRO
#undef TPP_BUILTIN_MACRO

#else /* TPP_DEFS */
#define GUARD_TPP_AMALGAMATION_H 1

/************************************************************************/
/* File: parts/api.h                                                    */
/************************************************************************/
#ifndef TPP_BUILDING
#define TPP_BUILDING 0
#endif /* !TPP_BUILDING */

#if TPP_BUILDING
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_WARNINGS
#define _CRT_OBSOLETE_NO_DEPRECATE

/* Disable some warnings */
#pragma warning(disable: 4065) /* "switch statement contains 'default' but no 'case' labels" (cannot be avoided under certain feature-configurations) */
#pragma warning(disable: 4127) /* Conditional expression is constant (cannot be avoided when features are compile-time enabled/disabled) */

/* Disable some garbage inspection warnings */
#pragma warning(disable: 26446)
#pragma warning(disable: 26482)
#pragma warning(disable: 26438)
#pragma warning(disable: 26494)
#pragma warning(disable: 26496)
#pragma warning(disable: 26485)
#pragma warning(disable: 26448)
#pragma warning(disable: 26461) /* Kind-of like this one, but also warns in cases where adding "const" causes compiler errors due to function prototype conflicts... */
#endif /* _MSC_VER */
#endif /* TPP_BUILDING */

/************************************************************************/
/* HOST COMPILER/SYSTEM/OS CONFIGURATION: TPP_HOST_*                    */
/************************************************************************/

/* Define if host OS is like windows */
#ifndef TPP_OS_WINDOWS
#if (defined(_WIN64) || defined(WIN64) || \
     defined(_WIN32) || defined(WIN32) || defined(__WIN32__))
#define TPP_OS_WINDOWS 1
#else /* ... */
#define TPP_OS_WINDOWS 0
#endif /* !... */
#endif /* !TPP_OS_WINDOWS */

/* Define if host OS is like unix */
#ifndef TPP_OS_UNIX
#if (defined(__unix__) || defined(__unix) || defined(unix) || \
     defined(__posix__) || defined(__posix) || defined(posix))
#define TPP_OS_UNIX 1
#else /* ... */
#define TPP_OS_UNIX 0
#endif /* !... */
#endif /* !TPP_OS_UNIX */

/* >> #define TPP_HOST_NO_SYSTEM_INCLUDES 1
 * Prevent TPP sources from doing `#include <foo.h>' -- instead, you must pre-
 * include all dependencies yourself before doing `#include "tpp-amalgamation.h"` */
#ifndef TPP_HOST_NO_SYSTEM_INCLUDES
#define TPP_HOST_NO_SYSTEM_INCLUDES 0
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */

#ifndef TPP_HOST_HAS_ATTRIBUTE
#ifdef __has_attribute
#define TPP_HOST_HAS_ATTRIBUTE(x) __has_attribute(x)
#else /* __has_attribute */
#define TPP_HOST_HAS_ATTRIBUTE(x) 0
#endif /* !__has_attribute */
#endif /* !TPP_HOST_HAS_ATTRIBUTE */

#ifndef TPP_HOST_HAS_DECLSPEC_ATTRIBUTE
#ifdef __has_declspec_attribute
#define TPP_HOST_HAS_DECLSPEC_ATTRIBUTE(x) __has_declspec_attribute(x)
#else /* __has_declspec_attribute */
#define TPP_HOST_HAS_DECLSPEC_ATTRIBUTE(x) 0
#endif /* !__has_declspec_attribute */
#endif /* !TPP_HOST_HAS_DECLSPEC_ATTRIBUTE */

#ifndef TPP_HOST_HAS_CPP_ATTRIBUTE
#ifdef __has_cpp_attribute
#define TPP_HOST_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
#else /* __has_cpp_attribute */
#define TPP_HOST_HAS_CPP_ATTRIBUTE(x) 0
#endif /* !__has_cpp_attribute */
#endif /* !TPP_HOST_HAS_CPP_ATTRIBUTE */

#ifndef TPP_HOST_HAS_INCLUDE
#ifdef __has_include
#define TPP_HOST_HAS_INCLUDE(x) __has_include(x)
#else /* __has_include */
#define TPP_HOST_HAS_INCLUDE(x) 0
#endif /* !__has_include */
#endif /* !TPP_HOST_HAS_INCLUDE */

#ifndef TPP_HOST_HAS_BUILTIN
#ifdef __has_builtin
#define TPP_HOST_HAS_BUILTIN(x) __has_builtin(x)
#else /* __has_builtin */
#define TPP_HOST_HAS_BUILTIN(x) 0
#endif /* !__has_builtin */
#endif /* !TPP_HOST_HAS_BUILTIN */

/* Does the host preprocessor have support for __VA_ARGS__? */
#ifndef TPP_HOST_HAVE_PP_VARARGS
#define TPP_HOST_HAVE_PP_VARARGS 1
#endif /* !TPP_HOST_HAVE_PP_VARARGS */

/* These headers should always be available (even when -ffreestanding)
 * Still: If "TPP_HOST_NO_SYSTEM_INCLUDES" is defined, don't include anything! */
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdarg.h>
#include <limits.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */



/************************************************************************/
/* TPP3 VERSION NUMBERS                                                 */
/************************************************************************/
#define TPP_API_VERSION              300   /* Api version (Version of this api). */
#define TPP_PREPROCESSOR_VERSION     300   /* Preprocessor version. */
#define TPP_PREPROCESSOR_VERSION_STR "300" /* str(TPP_PREPROCESSOR_VERSION) */



/************************************************************************/
/* TPP API CONFIGURATION                                                */
/************************************************************************/

/* The standard calling convention used by TPP APIs */
#ifndef TPPCALL
#define TPPCALL /* nothing */
#endif /* !TPPCALL */

/* The standard calling convention used by TPP APIs for variadic functions. */
#ifndef TPPVCALL
#define TPPVCALL /* nothing */
#endif /* !TPPVCALL */

/* Declaration providers for internal functions used across multiple source files.
 * HINT: These get hard-overwritten to "static" in "tpp-amalgamation.c" */
#ifndef TPP_IMPL
#if (defined(_WIN64) || defined(WIN64) || \
     defined(_WIN32) || defined(WIN32) || \
     defined(__WIN32__) || defined(__CYGWIN__))
#define TPP_IMPL /* nothing */
#elif TPP_HOST_HAS_ATTRIBUTE(__visibility__)
#define TPP_IMPL __attribute__((__visibility__("hidden")))
#else /* ... */
#define TPP_IMPL /* nothing */
#endif /* !... */
#endif /* !TPP_IMPL */
#ifndef TPP_DECL
#define TPP_DECL extern TPP_IMPL
#endif /* !TPP_DECL */
#ifndef TPP_CONST_IMPL
#ifdef __cplusplus
#define TPP_CONST_IMPL extern TPP_IMPL
#else /* __cplusplus */
#define TPP_CONST_IMPL TPP_IMPL
#endif /* !__cplusplus */
#endif /* !TPP_CONST_IMPL */
#ifndef TPP_CONST_DECL
#define TPP_CONST_DECL TPP_DECL
#endif /* !TPP_CONST_DECL */
#ifndef tpp_restrict
#ifdef restrict
#define tpp_restrict restrict
#elif defined(_MSC_VER) || defined(__GNUC__)
#define tpp_restrict __restrict
#elif defined(__STDC__)
#define tpp_restrict restrict /* C99 */
#else /* ... */
#define tpp_restrict /* nothing */
#endif /* !... */
#endif /* !tpp_restrict */
#ifndef TPP_NONNULL
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__nonnull__)
#define TPP_NONNULL(x) __attribute__((__nonnull__ x))
#else /* ... */
#define TPP_NONNULL(x) /* nothing */
#endif /* !... */
#endif /* !TPP_NONNULL */
#ifndef TPP_WUNUSED
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__warn_unused_result__)
#define TPP_WUNUSED __attribute__((__warn_unused_result__))
#else /* ... */
#define TPP_WUNUSED /* nothing */
#endif /* !... */
#endif /* !TPP_WUNUSED */
#ifndef TPP_RETNONNULL
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__returns_nonnull__)
#define TPP_RETNONNULL __attribute__((__returns_nonnull__))
#else /* ... */
#define TPP_RETNONNULL /* nothing */
#endif /* !... */
#endif /* !TPP_RETNONNULL */
#ifndef TPP_PURECALL
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__pure__)
#define TPP_PURECALL __attribute__((__pure__))
#elif defined(_MSC_VER) || TPP_HOST_HAS_DECLSPEC_ATTRIBUTE(noalias)
#define TPP_PURECALL __declspec(noalias)
#else /* ... */
#define TPP_PURECALL /* nothing */
#endif /* !... */
#endif /* !TPP_PURECALL */
#ifndef TPP_CONSTCALL
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__const__)
#define TPP_CONSTCALL __attribute__((__const__))
#else /* ... */
#define TPP_CONSTCALL TPP_PURECALL
#endif /* !... */
#endif /* !TPP_CONSTCALL */
#ifndef TPP_COLDCALL
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__cold__)
#define TPP_COLDCALL __attribute__((__cold__))
#else /* ... */
#define TPP_COLDCALL /* nothing */
#endif /* !... */
#endif /* !TPP_COLDCALL */
#ifndef TPP_NOINLINE
#if defined(__GNUC__) || TPP_HOST_HAS_ATTRIBUTE(__noinline__)
#define TPP_NOINLINE __attribute__((__noinline__))
#elif defined(_MSC_VER) || TPP_HOST_HAS_DECLSPEC_ATTRIBUTE(noinline)
#define TPP_NOINLINE __declspec(noinline)
#else /* ... */
#define TPP_NOINLINE /* nothing */
#endif /* !... */
#endif /* !TPP_NOINLINE */
#ifndef TPP_FLEX_ARRAY
#define TPP_FLEX_ARRAY 4096
#endif /* !TPP_FLEX_ARRAY */
#ifndef TPP_FALLTHRU
#if TPP_HOST_HAS_CPP_ATTRIBUTE(fallthrough)
#define TPP_FALLTHRU [[fallthrough]];
#elif TPP_HOST_HAS_ATTRIBUTE(__fallthrough__)
#define TPP_FALLTHRU __attribute__((__fallthrough__));
#elif defined(__GNUC__) && (__GNUC__ > 6 || (__GNUC__ == 6 && __GNUC_MINOR__ >= 3))
#define TPP_FALLTHRU __attribute__((__fallthrough__));
#else /* ... */
#define TPP_FALLTHRU /* @fallthrough@ */
#endif /* !... */
#endif /* !TPP_FALLTHRU */

#ifndef TPP_CHAR_BIT
#ifdef CHAR_BIT
#define TPP_CHAR_BIT CHAR_BIT
#elif defined(__CHAR_BIT__)
#define TPP_CHAR_BIT __CHAR_BIT__
#else /* ... */
#define TPP_CHAR_BIT 8
#endif /* !... */
#endif /* !TPP_CHAR_BIT */


/* Used to wrap an identifier that is considered to be internal to TPP
 * Identifiers wrapped as such should **NOT** be accessed directly.
 * Instead, the provided TPP APIs should be used. */
#ifndef TPP_INTERNAL
#if TPP_BUILDING
#define TPP_INTERNAL(x) x
#else /* TPP_BUILDING */
#define TPP_INTERNAL(x) _##x
#endif /* !TPP_BUILDING */
#endif /* !TPP_INTERNAL */

#ifndef TPP_HAVE_TPP2_COMPAT
#define TPP_HAVE_TPP2_COMPAT 0
#endif /* !TPP_HAVE_TPP2_COMPAT */

#ifndef TPP_DEBUG
#ifdef NDEBUG
#define TPP_DEBUG 0
#else /* NDEBUG */
#define TPP_DEBUG 1
#endif /* !NDEBUG */
#endif /* !TPP_DEBUG */

#ifndef TPP_INLINE
#if defined(__cplusplus) || defined(inline)
#define TPP_INLINE static inline
#elif defined(_MSC_VER)
#define TPP_INLINE static __inline
#elif defined(__GNUC__) || defined(__TCC__) || defined(__DCC_VERSION__)
#define TPP_INLINE static __inline__
#else /* ... */
#define TPP_INLINE static
#endif /* !... */
#endif /* !TPP_INLINE */

#ifdef __cplusplus
#define TPP_DECL_BEGIN extern "C" {
#define TPP_DECL_END   }
#else /* __cplusplus */
#define TPP_DECL_BEGIN /* nothing */
#define TPP_DECL_END   /* nothing */
#endif /* !__cplusplus */

#ifndef tpp_offsetof
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <stddef.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_offsetof offsetof
#endif /* !tpp_offsetof */

#ifndef tpp_lengthof
#define tpp_lengthof(a) (sizeof(a) / sizeof(*(a)))
#endif /* !tpp_lengthof */

#ifndef tpp_unreachable
#ifdef _MSC_VER
#define tpp_unreachable() __assume(0)
#elif TPP_HOST_HAS_BUILTIN(__builtin_unreachable)
#define tpp_unreachable() __builtin_unreachable()
#else /* ... */
#define tpp_unreachable() do{}while(1)
#endif /* !... */
#endif /* !tpp_unreachable */

#ifndef tpp_expect
#if TPP_HOST_HAS_BUILTIN(__builtin_expect)
#define tpp_expect(expr, expected) __builtin_expect(expr, expected)
#else /* TPP_HOST_HAS_BUILTIN(__builtin_expect) */
#define tpp_expect(expr, expected) expr
#define tpp_expect_IS_NOOP
#endif /* !TPP_HOST_HAS_BUILTIN(__builtin_expect) */
#endif /* !tpp_expect */

#ifndef tpp_likely
#ifdef tpp_expect_IS_NOOP
#define tpp_likely   /* nothing */
#define tpp_unlikely /* nothing */
#else /* tpp_expect_IS_NOOP */
#define tpp_likely(expr)   (tpp_expect(!!(expr), 1))
#define tpp_unlikely(expr) (tpp_expect(!!(expr), 0))
#endif /* !tpp_expect_IS_NOOP */
#endif /* !tpp_unlikely */

#ifndef tpp_size
#define tpp_size size_t
#endif /* !tpp_size */
#ifndef TPP_SIZE_MAX
#define TPP_SIZE_MAX SIZE_MAX
#endif /* !TPP_SIZE_MAX */
#ifndef TPP_SIZEOF_tpp_size
#if TPP_SIZE_MAX == UINT32_C(0xffffffff)
#define TPP_SIZEOF_tpp_size 4
#elif TPP_SIZE_MAX == UINT64_C(0xffffffffffffffff)
#define TPP_SIZEOF_tpp_size 8
#elif TPP_SIZE_MAX == UINT16_C(0xffff)
#define TPP_SIZEOF_tpp_size 2
#elif TPP_SIZE_MAX == UINT8_C(0xff)
#define TPP_SIZEOF_tpp_size 1
#else /* ... */
#error "Unsupported 'TPP_SIZE_MAX' - Please provide your own '#define TPP_SIZEOF_tpp_size'"
#endif /* !... */
#endif /* !TPP_SIZEOF_tpp_size */
#ifndef tpp_ssize
#define tpp_ssize ptrdiff_t
#endif /* !tpp_ssize */
#ifndef tpp_hash
#if UINT_FAST32_MAX == UINT32_C(0xffffffff)
#define TPP_SIZEOF_tpp_hash 4
#elif UINT_FAST32_MAX == UINT64_C(0xffffffffffffffff)
#define TPP_SIZEOF_tpp_hash 8
#else /* UINT_FAST32_MAX == ... */
#error "Unrecognized 'UINT_FAST32_MAX'"
#endif /* UINT_FAST32_MAX != ... */
#define tpp_hash uint_fast32_t
#ifdef UINT32_C
#define TPP_HASH_C UINT32_C
#else /* UINT32_C */
#define TPP_HASH_C(x) x
#endif /* !UINT32_C */
#endif /* !tpp_hash */
#ifndef tpp_line
#if UINT_FAST32_MAX == UINT32_C(0xffffffff)
#define TPP_SIZEOF_tpp_line   4
#define TPP_SIZEOF_tpp_column 4
#elif UINT_FAST32_MAX == UINT64_C(0xffffffffffffffff)
#define TPP_SIZEOF_tpp_line   8
#define TPP_SIZEOF_tpp_column 8
#else /* UINT_FAST32_MAX == ... */
#error "Unrecognized 'UINT_FAST32_MAX'"
#endif /* UINT_FAST32_MAX != ... */
#define tpp_line   int_fast32_t
#define tpp_column int_fast32_t
#endif /* !tpp_line */
#ifndef tpp_char
#define tpp_char unsigned char
#endif /* !tpp_char */
#ifndef tpp_unichar
#define tpp_unichar uint_least32_t
#endif /* !tpp_unichar */

#ifndef tpp_intmax
#define tpp_intmax      intmax_t
#define tpp_uintmax     uintmax_t
#define TPP_UINTMAX_MAX UINTMAX_MAX
#define TPP_UINTMAX_C   UINTMAX_C
#endif /* !tpp_intmax */

/* Counter type used to implement __COUNTER__ and __TPP_COUNTER */
#ifndef tpp_counter
#define tpp_counter tpp_size
#endif /* !tpp_counter */

#ifndef tpp_float
#define tpp_float long double
#endif /* !tpp_float */

#ifndef TPP_REF
#define TPP_REF       /* nothing */
#define TPP_REF_IF(c) /* nothing */
#endif /* !TPP_REF */

#ifndef TPP_STATIC_ASSERT
#define _TPP_STATIC_ASSERT_ID2(line) tpp_static_assert_##line
#define _TPP_STATIC_ASSERT_ID(line) _TPP_STATIC_ASSERT_ID2(line)
#define TPP_STATIC_ASSERT(expr) typedef int _TPP_STATIC_ASSERT_ID(__LINE__)[(expr) ? 1 : -1]
#endif /* !TPP_STATIC_ASSERT */



/* String API */
#ifndef tpp_memcpy
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <string.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_strlen      strlen
#define tpp_strchr      strchr
#define tpp_strnlen     strnlen
#define tpp_strcmp      strcmp
#define tpp_memcmp      memcmp
#define tpp_memcpy      memcpy
#define tpp_memset      memset
#define tpp_memchr      memchr
#define tpp_memmove     memmove
#define tpp_memmoveup   memmove /* Same as "tpp_memmove", but guaranties that "dst >= src" */
#define tpp_memmovedown memmove /* Same as "tpp_memmove", but guaranties that "dst <= src" */
#if 0 /* Define if available; else, TPP will provide its own */
#define tpp_memmem      memmem
#endif
#endif /* !tpp_memcpy */
#ifndef tpp_mempcpy
#define tpp_mempcpy(d, s, n) ((void *)((char *)tpp_memcpy(d, s, n) + (n)))
#endif /* !tpp_mempcpy */
#ifndef tpp_bzero
#define tpp_bzero(p, n) (void)tpp_memset(p, 0, n)
#endif /* !tpp_bzero */
#ifndef tpp_dbg_memset
#if TPP_DEBUG
#define tpp_dbg_memset(p, n) (void)tpp_memset(p, 0xcc, n)
#else /* TPP_DEBUG */
#define tpp_dbg_memset(p, n) (void)0
#endif /* !TPP_DEBUG */
#endif /* !tpp_dbg_memset */



/* Heap API */
#ifndef tpp_malloc
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <stdlib.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_trymalloc(s)     malloc(s)     /* tpp_trymalloc -- use when failure allows for re-try */
#define tpp_malloc(s)        malloc(s)     /* tpp_malloc    -- use when failure means error-propagation */
#define tpp_tryrealloc(p, s) realloc(p, s)
#define tpp_realloc(p, s)    realloc(p, s)
#define tpp_free(p)          free(p)
#endif /* !tpp_malloc */

#ifndef tpp_alloca
#if TPP_HOST_HAS_BUILTIN(__builtin_alloca)
#define tpp_alloca __builtin_alloca
#elif defined(_MSC_VER)
#include <malloc.h>
#define tpp_alloca _alloca
#elif TPP_HOST_HAS_INCLUDE(<alloca.h>)
#include <alloca.h>
#ifdef alloca
#define tpp_alloca alloca
#endif /* alloca */
#endif /* ... */
#endif /* !tpp_alloca */


/* Assertions API */
#ifndef tpp_assert
#if TPP_DEBUG
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <assert.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_assert assert
#else /* TPP_DEBUG */
#define tpp_assert(expr) (void)0
#endif /* !TPP_DEBUG */
#endif /* !tpp_assert */



/* Wrapper that is placed around every system call that TPP may make.
 * You can override this to inject additional checks before/after each system call.
 * @param: return_error: A macro "#define return_error(error) <...>" that may be
 *                       called from within the body of "TPP_SYSCALL". It's effect
 *                       is that the associated function will return with the "error"
 *                       specified. You should only use this with "TPP_EIO" or
 *                       "TPP_ENOMEM", which will then be propagated accordingly.
 *                       Trying to return other errors may cause undefined behavior
 *
 * Example:
 * >> #define TPP_SYSCALL(expr, return_error) \
 * >>     do {                                \
 * >>         if (CHECK_FOR_INTERRUPTS())     \
 * >>             return_error(TPP_EIO);      \
 * >>         BEGIN_BLOCKING;                 \
 * >>         expr;                           \
 * >>         END_BLOCKING;                   \
 * >>     } while (0)
 */
#ifndef TPP_SYSCALL
#define TPP_SYSCALL(expr, return_error) \
	do {                                \
		TPP_SYSCALL_NOFAIL(expr);       \
	} while (0)
#endif /* !TPP_SYSCALL */
/* Same as "TPP_SYSCALL()", but used in places where there's
 * no way to indicate errors (e.g. "tpp_io_close()") */
#ifndef TPP_SYSCALL_NOFAIL
#define TPP_SYSCALL_NOFAIL(expr) \
	do {                         \
		expr;                    \
	} while (0)
#endif /* !TPP_SYSCALL_NOFAIL */


TPP_DECL_BEGIN

/* Format-printer API */
#ifndef tpp_formatprinter
#define tpp_formatprinter tpp_formatprinter
#define TPP_FORMATPRINTER_CC TPPCALL
typedef tpp_ssize (TPP_FORMATPRINTER_CC *tpp_formatprinter)(void *arg, tpp_char const *text, tpp_size num_bytes);
#define tpp_formatprinter_print(printer, arg, text, num_bytes) \
	((*printer)(arg, text, num_bytes))
#define tpp_formatprinter_print_conststr(printer, arg, STR) \
	((*printer)(arg, (tpp_char const *)(STR), sizeof(STR) - sizeof(char)))
#define TPP_FORMATPRINTER_DEFINE(name, arg, text, num_bytes) \
	tpp_ssize (TPP_FORMATPRINTER_CC name)(void *arg, tpp_char const *text, tpp_size num_bytes)
#endif /* !tpp_formatprinter */
#ifndef tpp_formatprinter_print_cstr
#define tpp_formatprinter_print_cstr_IS_DEFAULT
#define tpp_formatprinter_print_cstr(printer, arg, text, num_bytes) \
	tpp_formatprinter_print(printer, arg, (tpp_char const *)(text), num_bytes)
#endif /* !tpp_formatprinter_print_cstr */



/* Line/Column-information API */
#ifndef tpp_lcinfo
#if defined(INT_LEAST64_MAX) && defined(UINT32_MAX) && !TPP_HAVE_TPP2_COMPAT
typedef int_least64_t tpp_lcinfo;
#define tpp_lcinfo tpp_lcinfo

#define tpp_lcinfo_equals(a, b)  ((a) == (b))
#define tpp_lcinfo_getline(self) ((tpp_line)((int32_t)(uint32_t)(self)))
#define tpp_lcinfo_getcol(self)  ((tpp_column)((int32_t)(uint32_t)((self) >> 32)))
#define tpp_lcinfo_of(line, col)                  \
	(((int_least64_t)(uint32_t)(int32_t)(line)) | \
	 ((int_least64_t)(uint32_t)(int32_t)(col) << 32))
#else /* INT_LEAST64_MAX && UINT32_MAX && !TPP_HAVE_TPP2_COMPAT */
typedef struct tpp_lcinfo {
	tpp_line   TPP_INTERNAL(lci_line); /* Line */
	tpp_column TPP_INTERNAL(lci_col);  /* Column */
} tpp_lcinfo;
#define tpp_lcinfo tpp_lcinfo

#define tpp_lcinfo_getline(self) ((tpp_line)(self).TPP_INTERNAL(lci_line))
#define tpp_lcinfo_getcol(self)  ((tpp_column)(self).TPP_INTERNAL(lci_col))
#define tpp_lcinfo_init(self, line, col) \
	(void)((self).TPP_INTERNAL(lci_line) = line,       \
	       (self).TPP_INTERNAL(lci_col)  = col)

TPP_INLINE TPP_WUNUSED tpp_lcinfo TPPCALL
tpp_lcinfo_of(tpp_line line, tpp_column col) {
	tpp_lcinfo result;
	result.TPP_INTERNAL(lci_line) = line;
	result.TPP_INTERNAL(lci_col)  = col;
	return result;
}
#endif /* !INT_LEAST64_MAX || !UINT32_MAX || TPP_HAVE_TPP2_COMPAT */
#endif /* !tpp_lcinfo */

#ifndef tpp_lcinfo_init
#define tpp_lcinfo_init(self, line, col) \
	(void)((self) = tpp_lcinfo_of(line, col))
#endif /* !tpp_lcinfo_init */
#ifndef tpp_lcinfo_equals
#define tpp_lcinfo_equals(a, b)                        \
	(tpp_lcinfo_getline(a) == tpp_lcinfo_getline(b) && \
	 tpp_lcinfo_getcol(a) == tpp_lcinfo_getcol(b))
#endif /* !tpp_lcinfo_equals */

/* Specifies an invalid LC information object */
#ifndef TPP_LCINFO_INVALID
#define TPP_LCINFO_INVALID            tpp_lcinfo_of(-1, -1)
#define tpp_lcinfo_isvalid(x)         (tpp_lcinfo_getcol(x) >= 0)
#define tpp_lcinfo_init_invalid(self) tpp_lcinfo_init(self, -1, -1)
#endif /* !TPP_LCINFO_INVALID */

/* Check if "x" represents valid line/column information */
#ifndef tpp_lcinfo_isvalid
#define tpp_lcinfo_isvalid(x) (!tpp_lcinfo_equals(x, TPP_LCINFO_INVALID))
#endif /* !tpp_lcinfo_isvalid */
#ifndef tpp_lcinfo_init_invalid
#define tpp_lcinfo_init_invalid(self) (void)((self) = TPP_LCINFO_INVALID)
#endif /* !tpp_lcinfo_init_invalid */



/* Non-atomic reference counter API */
#ifndef tpp_refcnt
/* NOTE: Multi-threaded applications can leave this alone: a single
 *       TPP lexer can only ever be used by a single thread, meaning
 *       that reference counts don't need to be atomic, because all
 *       components are thread-local. */
typedef struct {
	uint_fast32_t trc_count; /* Reference counter */
} tpp_refcnt;
#define tpp_refcnt             tpp_refcnt
#define TPP_REFCNT_INIT(v)     { v }
#define tpp_refcnt_init(p, v)  (void)((p)->trc_count = (v))
#define tpp_refcnt_inc(p)      (void)(++(p)->trc_count)
#define tpp_refcnt_decfetch(p) (--(p)->trc_count)
#define tpp_refcnt_isshared(p) ((p)->trc_count > 1)
#endif /* !tpp_refcnt */
#ifndef tpp_refcnt_dec
#define tpp_refcnt_dec(p) (void)tpp_refcnt_decfetch(p)
#endif /* !tpp_refcnt_dec */



/* Atomic reference counter API */
#ifndef tpp_refcnt_atomic
/* WARNING: Multi-threaded applications must override this: this kind of
 *          reference counter is used in places where the linked component
 *          may be shared between multiple lexers (and thus: threads) */
typedef struct {
	uint_fast32_t trca_count; /* Reference counter */
} tpp_refcnt_atomic;
#define tpp_refcnt_atomic             tpp_refcnt_atomic
#define TPP_REFCNT_ATOMIC_INIT(v)     { v }
#define tpp_refcnt_atomic_init(p, v)  (void)((p)->trca_count = (v))
#define tpp_refcnt_atomic_inc(p)      (void)(++(p)->trca_count)
#define tpp_refcnt_atomic_decfetch(p) (--(p)->trca_count)
#define tpp_refcnt_atomic_isshared(p) ((p)->trca_count > 1)
#endif /* !tpp_refcnt_atomic */
#ifndef tpp_refcnt_atomic_dec
#define tpp_refcnt_atomic_dec(p) (void)tpp_refcnt_atomic_decfetch(p)
#endif /* !tpp_refcnt_atomic_dec */



/* Execute-once block */
#ifndef tpp_once
/* WARNING: Multi-threaded applications must override this */
#define tpp_once(expr)             \
	do {                           \
		static int _to_didrun = 0; \
		if (!_to_didrun) {         \
			_to_didrun = 1;        \
			expr;                  \
		}                          \
	} while (0)
#endif /* !tpp_once */

/************************************************************************/
/* File: parts/tuple.h                                                  */
/************************************************************************/

/* Preprocessor tuples:
 * >> 0()                  // Empty tuple
 * >> 1(VALUE)             // 1-element tuple
 * >> 2(VALUE1, VALUE2)    // 2-element tuple
 * >> ...
 */

#define _TPP_TUPLE_NE_0() 0
#define _TPP_TUPLE_NE_1(a) 1
#define _TPP_TUPLE_NE_2(a, b) 1
#define _TPP_TUPLE_NE_3(a, b, c) 1
#define _TPP_TUPLE_NE_4(a, b, c, d) 1
#define _TPP_TUPLE_NE_5(a, b, c, d, e) 1
#define _TPP_TUPLE_NE_6(a, b, c, d, e, f) 1
#define _TPP_TUPLE_NE_7(a, b, c, d, e, f, g) 1
#define _TPP_TUPLE_NE_8(a, b, c, d, e, f, g, h) 1
#define _TPP_TUPLE_NE_9(a, b, c, d, e, f, g, h, i) 1
#define _TPP_TUPLE_SIZE_0() 0
#define _TPP_TUPLE_SIZE_1(a) 1
#define _TPP_TUPLE_SIZE_2(a, b) 2
#define _TPP_TUPLE_SIZE_3(a, b, c) 3
#define _TPP_TUPLE_SIZE_4(a, b, c, d) 4
#define _TPP_TUPLE_SIZE_5(a, b, c, d, e) 5
#define _TPP_TUPLE_SIZE_6(a, b, c, d, e, f) 6
#define _TPP_TUPLE_SIZE_7(a, b, c, d, e, f, g) 7
#define _TPP_TUPLE_SIZE_8(a, b, c, d, e, f, g, h) 8
#define _TPP_TUPLE_SIZE_9(a, b, c, d, e, f, g, h, i) 9
#define _TPP_TUPLE_GET_0_1(a) a
#define _TPP_TUPLE_GET_0_2(a, b) a
#define _TPP_TUPLE_GET_1_2(a, b) b
#define _TPP_TUPLE_GET_0_3(a, b, c) a
#define _TPP_TUPLE_GET_1_3(a, b, c) b
#define _TPP_TUPLE_GET_2_3(a, b, c) c
#define _TPP_TUPLE_GET_0_4(a, b, c, d) a
#define _TPP_TUPLE_GET_1_4(a, b, c, d) b
#define _TPP_TUPLE_GET_2_4(a, b, c, d) c
#define _TPP_TUPLE_GET_3_4(a, b, c, d) d
#define _TPP_TUPLE_GET_0_5(a, b, c, d, e) a
#define _TPP_TUPLE_GET_1_5(a, b, c, d, e) b
#define _TPP_TUPLE_GET_2_5(a, b, c, d, e) c
#define _TPP_TUPLE_GET_3_5(a, b, c, d, e) d
#define _TPP_TUPLE_GET_4_5(a, b, c, d, e) e
#define _TPP_TUPLE_GET_0_6(a, b, c, d, e, f) a
#define _TPP_TUPLE_GET_1_6(a, b, c, d, e, f) b
#define _TPP_TUPLE_GET_2_6(a, b, c, d, e, f) c
#define _TPP_TUPLE_GET_3_6(a, b, c, d, e, f) d
#define _TPP_TUPLE_GET_4_6(a, b, c, d, e, f) e
#define _TPP_TUPLE_GET_5_6(a, b, c, d, e, f) f
#define _TPP_TUPLE_GET_0_7(a, b, c, d, e, f, g) a
#define _TPP_TUPLE_GET_1_7(a, b, c, d, e, f, g) b
#define _TPP_TUPLE_GET_2_7(a, b, c, d, e, f, g) c
#define _TPP_TUPLE_GET_3_7(a, b, c, d, e, f, g) d
#define _TPP_TUPLE_GET_4_7(a, b, c, d, e, f, g) e
#define _TPP_TUPLE_GET_5_7(a, b, c, d, e, f, g) f
#define _TPP_TUPLE_GET_6_7(a, b, c, d, e, f, g) g
#define _TPP_TUPLE_GET_0_8(a, b, c, d, e, f, g, h) a
#define _TPP_TUPLE_GET_1_8(a, b, c, d, e, f, g, h) b
#define _TPP_TUPLE_GET_2_8(a, b, c, d, e, f, g, h) c
#define _TPP_TUPLE_GET_3_8(a, b, c, d, e, f, g, h) d
#define _TPP_TUPLE_GET_4_8(a, b, c, d, e, f, g, h) e
#define _TPP_TUPLE_GET_5_8(a, b, c, d, e, f, g, h) f
#define _TPP_TUPLE_GET_6_8(a, b, c, d, e, f, g, h) g
#define _TPP_TUPLE_GET_7_8(a, b, c, d, e, f, g, h) h
#define _TPP_TUPLE_GET_0_9(a, b, c, d, e, f, g, h, i) a
#define _TPP_TUPLE_GET_1_9(a, b, c, d, e, f, g, h, i) b
#define _TPP_TUPLE_GET_2_9(a, b, c, d, e, f, g, h, i) c
#define _TPP_TUPLE_GET_3_9(a, b, c, d, e, f, g, h, i) d
#define _TPP_TUPLE_GET_4_9(a, b, c, d, e, f, g, h, i) e
#define _TPP_TUPLE_GET_5_9(a, b, c, d, e, f, g, h, i) f
#define _TPP_TUPLE_GET_6_9(a, b, c, d, e, f, g, h, i) g
#define _TPP_TUPLE_GET_7_9(a, b, c, d, e, f, g, h, i) h
#define _TPP_TUPLE_GET_8_9(a, b, c, d, e, f, g, h, i) i
#define _TPP_TUPLE_FOREACH_0(tuple, sep, item, _)
#define _TPP_TUPLE_FOREACH_1(tuple, sep, item, _) \
	item(_, 0, TPP_TUPLE_GET(tuple, 0))
#define _TPP_TUPLE_FOREACH_2(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_1(tuple, sep, item, _) \
	sep(_, 0, TPP_TUPLE_GET(tuple, 0), 1, TPP_TUPLE_GET(tuple, 1)) \
	item(_, 1, TPP_TUPLE_GET(tuple, 1))
#define _TPP_TUPLE_FOREACH_3(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_2(tuple, sep, item, _) \
	sep(_, 1, TPP_TUPLE_GET(tuple, 1), 2, TPP_TUPLE_GET(tuple, 2)) \
	item(_, 2, TPP_TUPLE_GET(tuple, 2))
#define _TPP_TUPLE_FOREACH_4(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_3(tuple, sep, item, _) \
	sep(_, 2, TPP_TUPLE_GET(tuple, 2), 3, TPP_TUPLE_GET(tuple, 3)) \
	item(_, 3, TPP_TUPLE_GET(tuple, 3))
#define _TPP_TUPLE_FOREACH_5(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_4(tuple, sep, item, _) \
	sep(_, 3, TPP_TUPLE_GET(tuple, 3), 4, TPP_TUPLE_GET(tuple, 4)) \
	item(_, 4, TPP_TUPLE_GET(tuple, 4))
#define _TPP_TUPLE_FOREACH_6(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_5(tuple, sep, item, _) \
	sep(_, 4, TPP_TUPLE_GET(tuple, 4), 5, TPP_TUPLE_GET(tuple, 5)) \
	item(_, 5, TPP_TUPLE_GET(tuple, 5))
#define _TPP_TUPLE_FOREACH_7(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_6(tuple, sep, item, _) \
	sep(_, 5, TPP_TUPLE_GET(tuple, 5), 6, TPP_TUPLE_GET(tuple, 6)) \
	item(_, 6, TPP_TUPLE_GET(tuple, 6))
#define _TPP_TUPLE_FOREACH_8(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_7(tuple, sep, item, _) \
	sep(_, 6, TPP_TUPLE_GET(tuple, 6), 7, TPP_TUPLE_GET(tuple, 7)) \
	item(_, 7, TPP_TUPLE_GET(tuple, 7))
#define _TPP_TUPLE_FOREACH_9(tuple, sep, item, _) \
	_TPP_TUPLE_FOREACH_8(tuple, sep, item, _) \
	sep(_, 7, TPP_TUPLE_GET(tuple, 7), 8, TPP_TUPLE_GET(tuple, 8)) \
	item(_, 8, TPP_TUPLE_GET(tuple, 8))

/* >> TPP_TUPLE_NONEMPTY(tuple)
 * expands to "0" if "tuple" is empty; otherwise, expands to "1" */
#define TPP_TUPLE_NONEMPTY(tuple)  _TPP_TUPLE_NONEMPTY(tuple)
#define _TPP_TUPLE_NONEMPTY(tuple) _TPP_TUPLE_NONEMPTY_(_TPP_TUPLE_NE_##tuple)
#define _TPP_TUPLE_NONEMPTY_(x)    x

/* >> TPP_TUPLE_IF_NONEMPTY(tuple, what, _)
 * expands to "what(_)" if "tuple" is non-empty; otherwise, expands to nothing */
#define TPP_TUPLE_IF_NONEMPTY(tuple, what, _) _TPP_TUPLE_IF_NONEMPTY(TPP_TUPLE_NONEMPTY(tuple), what, _)
#define _TPP_TUPLE_IF_NONEMPTY(if, what, _)   _TPP_TUPLE_IF_NONEMPTY_(if, what, _)
#define _TPP_TUPLE_IF_NONEMPTY_(if, what, _)  _TPP_TUPLE_IF_NONEMPTY_##if (what, _)
#define _TPP_TUPLE_IF_NONEMPTY_1(what, _)     what(_)
#define _TPP_TUPLE_IF_NONEMPTY_0(what, _)

/* >> TPP_TUPLE_IF_EMPTY(tuple, what, _)
 * expands to "what(_)" if "tuple" is empty; otherwise, expands to nothing */
#define TPP_TUPLE_IF_EMPTY(tuple, what, _) _TPP_TUPLE_IF_EMPTY(TPP_TUPLE_NONEMPTY(tuple), what, _)
#define _TPP_TUPLE_IF_EMPTY(if, what, _)   _TPP_TUPLE_IF_EMPTY_(if, what, _)
#define _TPP_TUPLE_IF_EMPTY_(if, what, _)  _TPP_TUPLE_IF_EMPTY_##if (what, _)
#define _TPP_TUPLE_IF_EMPTY_0(what, _)     what(_)
#define _TPP_TUPLE_IF_EMPTY_1(what, _)

/* >> TPP_TUPLE_SIZE(tuple)
 * expands to a decimal number describing the size of "tuple" */
#define TPP_TUPLE_SIZE(tuple)  _TPP_TUPLE_SIZE(tuple)
#define _TPP_TUPLE_SIZE(tuple) _TPP_TUPLE_SIZE_(_TPP_TUPLE_SIZE_##tuple)
#define _TPP_TUPLE_SIZE_(x)    x

/* >> TPP_TUPLE_GET(tuple, i)
 * expands to the i'th element of "tuple" */
#define TPP_TUPLE_GET(tuple, i)  _TPP_TUPLE_GET(tuple, i)
#define _TPP_TUPLE_GET(tuple, i) _TPP_TUPLE_GET_(_TPP_TUPLE_GET_##i##_##tuple)
#define _TPP_TUPLE_GET_(x)       x

/* >> TPP_TUPLE_FOREACH(tuple, sep, item, _)
 *    >> sep(_, prev_index, prev_value, next_index, next_value)
 *    >> item(_, index, value)
 * expands to:
 *    - item(_, 0, TPP_TUPLE_GET(tuple, 0))
 *    - sep(_, 0, TPP_TUPLE_GET(tuple, 0), 1, TPP_TUPLE_GET(tuple, 1))
 *    - item(_, 1, TPP_TUPLE_GET(tuple, 1))
 *    - sep(_, 1, TPP_TUPLE_GET(tuple, 1), 2, TPP_TUPLE_GET(tuple, 2))
 *    - item(_, 2, TPP_TUPLE_GET(tuple, 2))
 *    - ...
 *    - item(_, N-1, TPP_TUPLE_GET(tuple, N-1))
 */
#define TPP_TUPLE_FOREACH(tuple, sep, item, _)         _TPP_TUPLE_FOREACH(tuple, _TPP_TUPLE_SIZE(tuple), sep, item, _)
#define _TPP_TUPLE_FOREACH(tuple, size, sep, item, _)  _TPP_TUPLE_FOREACH_(tuple, size, sep, item, _)
#define _TPP_TUPLE_FOREACH_(tuple, size, sep, item, _) _TPP_TUPLE_FOREACH_##size(tuple, sep, item, _)

#define TPP_TUPLE_FOREACH_DUMMY_SEP(_, prev_index, prev_value, next_index, next_value) /* nothing */

TPP_DECL_END

/************************************************************************/
/* File: parts/config.h                                                 */
/************************************************************************/
/************************************************************************/
/*                                                                      */
/* To learn how to supply your own keyword/warning/extension/etc.       */
/* definitions to TPP3, see comment at start of "File: parts/defs.h"    */
/*                                                                      */
/************************************************************************/



/************************************************************************/
/* API limits:
 * - Positive: compile-time hard-code
 * - Negative: runtime configurable (with absolute value used as default)
 */
/************************************************************************/

/* TPP tab size: number of columns to assign to `U+0008` (`\t`) characters.
 * Used when calculating line/column information for messages, as well as
 * the builtin `__COLUMN__` macro (see `TPP_HAVE_MACRO___COLUMN__`)
 *
 * - when positive: compile-time hard-code
 * - when negative: runtime-configurable, with absolute value being used as default
 *
 * **Getter**: `tpp_gettabsize()`<br/>
 * **Setter**: `tpp_settabsize(v)`
 */
#ifndef TPP_TABSIZE
#define TPP_TABSIZE ((TPP_PROFILE == TPP_PROFILE_ALL) ? -4 : 4)
#endif /* !TPP_TABSIZE */

/* Max # of `TPP_WSTATE_ERROR` (continue compilation and fail later) warnings that
 * can be emitted before the next one will be treated as `TPP_WSTATE_FATAL` (fail
 * immediately)
 *
 * - `0`:  Set limit to `0` (when not also overwritten, causes `TPP_HAVE_WARNING_ERROR=0`)
 * - `N`:  Limit is hard-coded to `N` and cannot be overwritten at runtime
 * - `-N`: Limit can be overwritten at runtime, with `N` being used as the default
 *
 * **Getter**: `tpp_lexer_geterrorlimit(lexer)`<br/>
 * **Setter**: `tpp_lexer_seterrorlimit(lexer, v)`
 */
#ifndef TPP_ERROR_LIMIT
#define TPP_ERROR_LIMIT (-16)
#endif /* !TPP_ERROR_LIMIT */

/* Similar to GCC's `-fmax-include-depth`: Max # of times that the same file is allowed to
 * appear on the `#include`-stack before a warning `TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED`
 * (which is default-configured to be an error) is emitted.
 *
 * - `0`:  Disable include depth checks entirely (limit becomes *infinite*)
 * - `N`:  Limit is hard-coded to `N` and cannot be overwritten at runtime
 * - `-N`: Limit can be overwritten at runtime, with `N` being used as the default
 *
 * **Getter**: `tpp_lexer_getinclusionlimit(lexer)`<br/>
 * **Setter**: `tpp_lexer_setinclusionlimit(lexer, v)`
 */
#ifndef TPP_MAX_INCLUDE_DEPTH
#define TPP_MAX_INCLUDE_DEPTH (TPP_HAVE_INCLUDE_STACK ? (TPP_HAVE_PROFILE_NOT_MINIMAL ? -64 : 64) : 0)
#endif /* !TPP_MAX_INCLUDE_DEPTH */

/* Max # of times that the same (self-recursive; see `TPP_HAVE_MACRO_RECURSION`)
 * macro may appear on the `#include`-stack (with each instance's body having a
 * different expansion) before the macro will be treated as though its body
 * didn't change, causing it to not be expanded (anymore). At the same time
 * that this limit is reached, a warning `TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED`
 * will be emitted.
 *
 * NOTE: When `TPP_HAVE_MACRO_RECURSION` can never be enabled, this limit is
 *       entirely pointless, since the C standard (which we followed whenever
 *       `TPP_HAVE_MACRO_RECURSION` isn't enabled) essentially requires that
 *       this limit be `1`.
 *
 * - `0`:  Disable depth checks entirely (limit becomes *infinite*)
 * - `N`:  Limit is hard-coded to `N` and cannot be overwritten at runtime
 * - `-N`: Limit can be overwritten at runtime, with `N` being used as the default
 *
 * **Getter**: `tpp_lexer_getrecursivemacrolimit(lexer)`<br/>
 * **Setter**: `tpp_lexer_setrecursivemacrolimit(lexer, v)`
 */
#ifndef TPP_MAX_RECURSIVE_MACRO_DEPTH
#define TPP_MAX_RECURSIVE_MACRO_DEPTH (TPP_HAVE_MACRO_RECURSION ? (TPP_HAVE_PROFILE_NOT_MINIMAL ? -4096 : 4096) : 0)
#endif /* !TPP_MAX_RECURSIVE_MACRO_DEPTH */



/************************************************************************/
/* CONFIGURATION PROFILE                                                */
/************************************************************************/
#define TPP_PROFILE_MINIMAL 0 /* Disable everything, except dependencies of explicitly enabled features */
#define TPP_PROFILE_DEFAULT 1 /* Default configuration for a pretty good compromise between "TPP_PROFILE_MINIMAL" and "TPP_PROFILE_ALL" */
#define TPP_PROFILE_ALL     2 /* Enable (almost) all features, with everything configurable at runtime */
#define TPP_PROFILE_C       3 /* Enable features needed for a C compiler (warning: subjective) */
#define TPP_PROFILE_CXX     4 /* Enable features needed for a C++ compiler (warning: subjective) */

/* General configuration to determine default configuration of preprocessor features */
#ifndef TPP_PROFILE
#define TPP_PROFILE TPP_PROFILE_DEFAULT
#endif /* !TPP_PROFILE */

#undef TPP_HAVE_PROFILE_DEFAULT
#if (TPP_PROFILE == TPP_PROFILE_ALL || \
     TPP_PROFILE == TPP_PROFILE_DEFAULT)
#define TPP_HAVE_PROFILE_DEFAULT 1
#else /* ... */
#define TPP_HAVE_PROFILE_DEFAULT 0
#endif /* !... */

#undef TPP_HAVE_PROFILE_C_LIKE
#if (TPP_PROFILE == TPP_PROFILE_C || \
     TPP_PROFILE == TPP_PROFILE_CXX)
#define TPP_HAVE_PROFILE_C_LIKE 1
#else /* ... */
#define TPP_HAVE_PROFILE_C_LIKE 0
#endif /* !... */

#undef TPP_HAVE_PROFILE_NOT_MINIMAL
#if (TPP_PROFILE != TPP_PROFILE_MINIMAL)
#define TPP_HAVE_PROFILE_NOT_MINIMAL 1
#else /* ... */
#define TPP_HAVE_PROFILE_NOT_MINIMAL 0
#endif /* !... */



/************************************************************************/
/* CORE "TPP_HAVE_*" API-FEATURES
 *  0: Disabled
 *  1: Enabled */
/************************************************************************/

/* When defined to non-zero, disable checks for invalid/nonsensical configurations.
 * Such configurations may still be able to compile, but will include definitely
 * redundant code, or other features that are meaningless in relation to some other
 * configuration.
 *
 * You should only enable this if you _need_ _TPP_ _to_ _build_ _**NOW**_ and one of
 * those internal checks stands in your way. You should not leave this enabled, as
 * every one of the errors this disables is there for a reason! */
#ifndef TPP_IGNORE_INVALID_CONFIGURATION
#define TPP_IGNORE_INVALID_CONFIGURATION 0
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */

/* API support for non-blocking I/O. Must also be enabled on a per-file basis
 * by setting the file's `TPP_FILE_FLAGS_NONBLOCK` flag. Also: calls made to
 * `tpp_lexer_yield_blocking()` & friends can be used to force calls to become
 * blocking, even when enabled for the current file (s.a. `TPP_EWOULDBLOCK`
 * and `TPP_TOK_EWOULDBLOCK`) */
#ifndef TPP_HAVE_FILE_NONBLOCK
#define TPP_HAVE_FILE_NONBLOCK (TPP_HAVE_PROFILE_NOT_MINIMAL && (TPP_OS_WINDOWS || TPP_OS_UNIX))
#endif /* !TPP_HAVE_FILE_NONBLOCK */

/* Unicode support:
 * - Use of a unicode traits database that is either user-supplied,
 *   a dummy (where all unicode character are allows in identifiers),
 *   or built-in when `TPP_HAVE_BUILTIN_CTYPE_UNICODE` is enabled.
 * - Automatic detection of `utf-8`, `utf-8-bom`, `utf-16[le/be]`, `utf-32[le/be]` in input files.<br/>
 *   NOTE: The Lexer assumes `utf-8` by default, unless it encounters an invalid `utf-8`
 *         byte sequence, at which point it will automatically downgrade to `ASCII`-only
 *         for the remainder of the relevant file */
#ifndef TPP_HAVE_UNICODE
#define TPP_HAVE_UNICODE 1
#endif /* !TPP_HAVE_UNICODE */

#if ((defined(tpp_unicode_isspace_nolf) || \
      defined(tpp_unicode_issymstrt) ||    \
      defined(tpp_unicode_issymcont) ||    \
      defined(tpp_unicode_isspace) ||      \
      defined(tpp_unicode_islf)) &&        \
     !defined(TPP_HAVE_BUILTIN_CTYPE_UNICODE))
#define TPP_HAVE_BUILTIN_CTYPE_UNICODE 0 /* There are user-supplied unicode trait functions */
#endif /* !... */

/* Supply a built-in unicode character traits database (adds ~36KiB data to final executable).
 * Some examples of stuff that is supported when this is enabled:
 * - `U+0085` (`NEL`)  will be treated like `U+000A` (`LF` `\n`)
 * - `U+00A0` (`NBSP`) will be treated like `U+0020` (`space` `\s`)
 * - `U+00DF` (`ÃŸ`)    will be treated accepted as part of an identifier
 *
 * As such, TPP3 follows C23+-specifications, in that the builtin unicode
 * database is set-up to accept identifiers made up of `XID_Start`/`XID_Cont`. */
#ifndef TPP_HAVE_BUILTIN_CTYPE_UNICODE
#define TPP_HAVE_BUILTIN_CTYPE_UNICODE (TPP_HAVE_UNICODE && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_BUILTIN_CTYPE_UNICODE */

/* Provide a function `tpp_strerror()` to get a description of a given `tpp_errno` error code */
#ifndef TPP_HAVE_STRERROR
#define TPP_HAVE_STRERROR (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_STRERROR */

/* Provide a function `tpp_strtokenid()` to get the API name of a (non-keyword) token ID */
#ifndef TPP_HAVE_STRTOKENID
#define TPP_HAVE_STRTOKENID (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_STRTOKENID */

/* Enable support for storing custom user-data in keywords */
#ifndef TPP_HAVE_KEYWORD_USERDATA
#define TPP_HAVE_KEYWORD_USERDATA (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_KEYWORD_USERDATA */

/* Provide support for `tpp_keyword_asstring()` that allows
 * keywords to be binary-compatible with `tpp_string` */
#ifndef TPP_HAVE_KEYWORD_ASSTRING
#define TPP_HAVE_KEYWORD_ASSTRING (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_KEYWORD_ASSTRING */

/* Include a counter for how often a specific I/O-file appears on the
 * `#include`-stack, with that counter being stored within its filename
 * keyword (used to speed up `TPP_MAX_INCLUDE_DEPTH` error checks, though
 * those checks also work without this feature) */
#ifndef TPP_HAVE_KEYWORD_INCLCOUNT
#define TPP_HAVE_KEYWORD_INCLCOUNT (TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_MAX_INCLUDE_DEPTH != 0)
#endif /* !TPP_HAVE_KEYWORD_INCLCOUNT */

/* Enable support for runtime-configurable extensions */
#ifndef TPP_HAVE_EXTENSIONS
#define TPP_HAVE_EXTENSIONS TPP_HAVE_PROFILE_NOT_MINIMAL
#endif /* !TPP_HAVE_EXTENSIONS */

/* Enable support to push/pop the extension state */
#ifndef TPP_HAVE_EXTENSIONS_PUSH_POP
#define TPP_HAVE_EXTENSIONS_PUSH_POP (TPP_HAVE_EXTENSIONS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_EXTENSIONS_PUSH_POP */

/* Support for: compiler warnings (else: behave as though all warnings were being suppressed) */
#ifndef TPP_HAVE_WARNINGS
#define TPP_HAVE_WARNINGS TPP_HAVE_PROFILE_NOT_MINIMAL
#endif /* !TPP_HAVE_WARNINGS */

/* Enable support to push/pop the warning state */
#ifndef TPP_HAVE_WARNINGS_PUSH_POP
#define TPP_HAVE_WARNINGS_PUSH_POP (TPP_HAVE_WARNINGS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_WARNINGS_PUSH_POP */

/* Support for: `tpp_warning_ofnumber()` and `tpp_warning_getnumbers()`
 *
 * When `TPP_HAVE_PRAGMA_WARNING` is also enabled, user-code will also
 * be able to configure warnings based on their ID. */
#ifndef TPP_HAVE_WARNING_NUMBERS
#define TPP_HAVE_WARNING_NUMBERS (TPP_HAVE_WARNINGS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_WARNING_NUMBERS */

/* Support for: `TPP_WSTATE_ERROR` (else: only `TPP_WSTATE_FATAL` is available) */
#ifndef TPP_HAVE_WARNING_ERROR
#define TPP_HAVE_WARNING_ERROR (TPP_HAVE_WARNINGS && TPP_ERROR_LIMIT != 0)
#endif /* !TPP_HAVE_WARNING_ERROR */

/* Support for: `TPP_WSTATE_SUPPRESS` */
#ifndef TPP_HAVE_WARNING_SUPPRESS
#define TPP_HAVE_WARNING_SUPPRESS (TPP_HAVE_WARNINGS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_WARNING_SUPPRESS */

/* Support for: `TPP_WSTATE_DEFAULT` */
#ifndef TPP_HAVE_WARNING_DEFAULT
#define TPP_HAVE_WARNING_DEFAULT (TPP_HAVE_WARNINGS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_WARNING_DEFAULT */

/* Enable support for `TPP_FILE_FLAGS_NOCLOSE` */
#ifndef TPP_HAVE_FILE_NOCLOSE
#define TPP_HAVE_FILE_NOCLOSE (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_FILE_NOCLOSE */

/* Enable support for `TPP_FILE_FLAGS_NOKWD` */
#ifndef TPP_HAVE_FILE_NOKWD
#define TPP_HAVE_FILE_NOKWD TPP_HAVE_PROFILE_NOT_MINIMAL
#endif /* !TPP_HAVE_FILE_NOKWD */

/* Speed up calls to `tpp_file_getlcinfo()` by caching the last-read
 * position and determining line/column information as a delta from
 * what was previously cached */
#ifndef TPP_HAVE_FILE_LC_CACHE
#define TPP_HAVE_FILE_LC_CACHE TPP_HAVE_PROFILE_NOT_MINIMAL
#endif /* !TPP_HAVE_FILE_LC_CACHE */

/* Enable support for detecting `\r\n` as a singular line-feed */
#ifndef TPP_HAVE_CR_LF_DETECTION
#define TPP_HAVE_CR_LF_DETECTION 1
#endif /* !TPP_HAVE_CR_LF_DETECTION */

/* Provide a function `tpp_lexer_copy()` that can be used to duplicate a lexer. */
#ifndef TPP_HAVE_LEXER_COPY
#define TPP_HAVE_LEXER_COPY (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_LEXER_COPY */

/* Lexers keep track of the # of warnings they've emitted over their lifetime. Not
 * actually used for anything, but can be read using `tpp_lexer_getwarningcount()` */
#ifndef TPP_HAVE_LEXER_WARNING_COUNT
#define TPP_HAVE_LEXER_WARNING_COUNT (TPP_HAVE_WARNINGS && (TPP_PROFILE == TPP_PROFILE_ALL))
#endif /* !TPP_HAVE_LEXER_WARNING_COUNT */
/************************************************************************/
/************************************************************************/
/************************************************************************/


/* All TPP_HAVE_* options (with "-f*"-style comments) can be configured as:
 * - TPP_CONF_1     : Compile-time enabled  (always on; no #pragma extension("-f...") / TPP_FEAT_* available)
 * - TPP_CONF_0     : Compile-time disabled
 * - TPP_CONF_EXT1  : Runtime-configurable (via #pragma extension("-f...") / TPP_EXT_*, default = true)
 * - TPP_CONF_EXT0  : Runtime-configurable (via #pragma extension("-f...") / TPP_EXT_*, default = false)
 * - TPP_CONF_FEAT1 : Runtime-configurable (via TPP_FEAT_*, default = true)
 * - TPP_CONF_FEAT0 : Runtime-configurable (via TPP_FEAT_*, default = false)
 *
 * In the case of "TPP_CONF_EXT1" / "TPP_CONF_EXT0", the extension's name will be the
 * "-f..." comment, but can be overwritten via #define TPP_EXTNAME_<name> "my-name":
 * ```c
 * #define TPP_HAVE_TRIGRAPHS    TPP_CONF_EXT1
 * #define TPP_EXTNAME_TRIGRAPHS "the-cool-trigraphs"
 * ```
 *
 * User-code can then control the feature using:
 * ```c
 * #pragma extension("-fthe-cool-trigraphs")
 * ```
 *
 * WARNING: Use of "TPP_CONF_EXT1" / "TPP_CONF_EXT0" requires "#define TPP_HAVE_EXTENSIONS 1"
 */

/* Possible values for configs */
#define TPP_CONF_1     1    /* Compile-time enabled  (always on; no #pragma extension("-f...") / TPP_FEAT_* available) */
#define TPP_CONF_0     0    /* Compile-time disabled */
#define TPP_CONF_EXT1  (-1) /* Runtime-configurable (via #pragma extension("-f...") / TPP_EXT_*, default = true) */
#define TPP_CONF_EXT0  (-2) /* Runtime-configurable (via #pragma extension("-f...") / TPP_EXT_*, default = false) */
#define TPP_CONF_FEAT1 (-3) /* Runtime-configurable (via TPP_FEAT_*, default = true) */
#define TPP_CONF_FEAT0 (-4) /* Runtime-configurable (via TPP_FEAT_*, default = false) */
#if !TPP_HAVE_EXTENSIONS
#undef TPP_CONF_EXT1
#undef TPP_CONF_EXT0
#define TPP_CONF_EXT1 TPP_CONF_FEAT1
#define TPP_CONF_EXT0 TPP_CONF_FEAT0
#endif /* !TPP_HAVE_EXTENSIONS */

#define TPP_CONF_MAYBE_1(cfg)      cfg                  /* Config may be enabled (guarantied to just be "cfg [!= 0]") */
#define TPP_CONF_MAYBE_0(cfg)      ((cfg) <= 0)         /* Config may be disabled */
#define TPP_CONF_IS_FEAT(cfg)      ((cfg) <= -3)        /* Should config be runtime-configurable as a feature? */
#define TPP_CONF_IS_EXT(cfg)       (((cfg) & ~1) == -2) /* Should config be runtime-configurable as an extension? */
#define TPP_CONF_IS_CONST(cfg)     ((cfg) >= 0)         /* Should config be compile-time only? */
#define TPP_CONF_IS_RT(cfg)        ((cfg) < 0)          /* Should config be runtime configurable? */
#define TPP_CONF_DEFAULT(cfg)      ((cfg) & 1)          /* Default state of config */
#define TPP_CONF_MAKEFEAT(default) (-4 + !!(default))   /* Configure as feature */
#define TPP_CONF_MAKEEXT(default)  (-2 + !!(default))   /* Configure as extension */
#define TPP_CONF_ENABLE(cfg)       ((cfg) | 1)          /* Change `TPP_CONF_*0` to `TPP_CONF_*1` */
#define TPP_CONF_DISABLE(cfg)      ((cfg) & ~1)         /* Change `TPP_CONF_*1` to `TPP_CONF_*0` */

/* Default configuration for tokens */
#ifndef TPP_COMMON_HAVE_TPP_TOK
#define TPP_COMMON_HAVE_TPP_TOK ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_COMMON_HAVE_TPP_TOK */

/* Default configuration for 1-char tokens */
#ifndef TPP_COMMON_HAVE_TPP_TOK_1CHAR
#define TPP_COMMON_HAVE_TPP_TOK_1CHAR (TPP_HAVE_PROFILE_NOT_MINIMAL ? TPP_CONF_EXT0 : 0)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_1CHAR */

/* Default configuration for `TPP_HAVE_TOK_LF`, `TPP_HAVE_TOK_SPACE`,
 * `TPP_HAVE_TOK_COMMENT`, indicating if tokens that are normally through
 * of as no-ops should be emitted by `tpp_lexer_yieldpp()` */
#ifndef TPP_COMMON_HAVE_TPP_TOK_SPACE
#define TPP_COMMON_HAVE_TPP_TOK_SPACE (TPP_HAVE_PROFILE_NOT_MINIMAL ? TPP_CONF_FEAT1 : 1)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_SPACE */

/* Default configuration describing if otherwise unconfigured comment tokens should be supported */
#ifndef TPP_COMMON_HAVE_TPP_TOK_COMMENT
#define TPP_COMMON_HAVE_TPP_TOK_COMMENT ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT0 : 0)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_COMMENT */

/* Default configuration for:
 * - `TPP_HAVE_TOK_C_INT`
 * - `TPP_HAVE_TOK_C_FLOAT`
 * - `TPP_HAVE_TOK_C_CHAR`
 * - `TPP_HAVE_TOK_C_STRING` */
#ifndef TPP_COMMON_HAVE_TPP_TOK_GENERIC
#define TPP_COMMON_HAVE_TPP_TOK_GENERIC TPP_COMMON_HAVE_TPP_TOK
#endif /* !TPP_COMMON_HAVE_TPP_TOK_GENERIC */

/* Default configuration for extended C/C++ string tokens:
 * - `TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL` */
#ifndef TPP_COMMON_HAVE_TPP_TOK_C_STRING
#define TPP_COMMON_HAVE_TPP_TOK_C_STRING (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_FEAT0 : TPP_HAVE_PROFILE_C_LIKE)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_C_STRING */

/* Default configuration for deemon-specific string tokens:
 * - `TPP_HAVE_TOK_RAW_STRING_LITERAL`
 * - `TPP_HAVE_TOK_RAW_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_BLOCK_STRING_LITERAL`
 * - `TPP_HAVE_TOK_BLOCK_CHAR_LITERAL` */
#ifndef TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING
#define TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT0 : 0)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING */

/* Default configuration for tokens needed to implement a C- or C++-compiler */
#ifndef TPP_COMMON_HAVE_TPP_TOK_C_TOKENS
#define TPP_COMMON_HAVE_TPP_TOK_C_TOKENS (TPP_HAVE_PROFILE_DEFAULT ? TPP_COMMON_HAVE_TPP_TOK : TPP_HAVE_PROFILE_C_LIKE)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_C_TOKENS */

/* Default configuration for tokens needed to implement a C++-compiler */
#ifndef TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS
#define TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT0 : (TPP_PROFILE == TPP_PROFILE_CXX))
#endif /* !TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS */

/* Default configuration for tokens not covered by any
 * of the other `TPP_COMMON_HAVE_TPP_TOK_*` configs */
#ifndef TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS
#define TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT0 : 0)
#endif /* !TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS */

/* Default configuration for constructs defined by some C/C++ standard */
#ifndef TPP_COMMON_HAVE_CPP_DIRECTIVES_STD
#define TPP_COMMON_HAVE_CPP_DIRECTIVES_STD ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : (TPP_HAVE_PROFILE_DEFAULT || TPP_HAVE_PROFILE_C_LIKE))
#endif /* !TPP_COMMON_HAVE_CPP_DIRECTIVES_STD */

/* Default configuration for constructs that should be considered extensions */
#ifndef TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT
#define TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : (TPP_HAVE_PROFILE_DEFAULT || TPP_HAVE_PROFILE_C_LIKE))
#endif /* !TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT */
/************************************************************************/
/************************************************************************/
/************************************************************************/




/************************************************************************/
/* PREPROCESSOR FEATURES                                                */
/************************************************************************/

// Support for `\`-escaped line continuation: when a line ends with a `\` character
// that is immediately (but see `TPP_HAVE_BSE_WHITESPACE`) followed by a linefeed,
// then that linefeed is never yielded, and a potential multi-character token is
// continued:
// ```c
// foo\Â 
// bar // Produces a single token "foobar"
// +\Â 
// =   // Produces a single token "+="
// ```
//
// This DOES affect the line-continuation features of `#define` macro definitions.
// When this is disabled, `\`-escaped line continuation can't be used there, either.
// @detect: #define HAVE_BSE
//          // \Â 
//          #undef HAVE_BSE
//          #ifdef HAVE_BSE
#ifndef TPP_HAVE_BSE
#define TPP_HAVE_BSE (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) /* "-fbse" */
#endif /* !TPP_HAVE_BSE */

/* Extension to `TPP_HAVE_BSE`: the `\` character is allowed to be followed by extra
 * whitespace preceding the actual linefeed:
 * ```c
 * #define multi_line line1 \â£â£â£
 *                    line2
 * ```
 *
 * @detect: #if __TPP_COUNT_TOKENS("a\\ \nb") == 1 */
#ifndef TPP_HAVE_BSE_WHITESPACE
#define TPP_HAVE_BSE_WHITESPACE (TPP_HAVE_BSE ? TPP_CONF_EXT1 : 0) /* "-fbse-whitespace" */
#endif /* !TPP_HAVE_BSE_WHITESPACE */

/* Support for `\uABCD` and `\U01234567` in identifier names (will be
 * replaced with effective UTF-8 encodings when translated to keywords)
 * ```c
 * int identifier\u0020with\u0020whitespace = 42;
 * // Same as:
 * int __TPP_IDENTIFIER("identifier with whitespace") = 42;
 * ```
 *
 * @detect: #define foo\u0062ar
 *          #ifdef foobar */
#ifndef TPP_HAVE_IDENTIFIER_ESCAPE_UNI
#define TPP_HAVE_IDENTIFIER_ESCAPE_UNI (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) /* "-fextended-identifiers" */
#endif /* !TPP_HAVE_IDENTIFIER_ESCAPE_UNI */

/* Support for `\N{...}` in identifier names (see TODO)
 * ```c
 * int identifier\N{NO-BREAK SPACE}nbsp = 42;
 * // Same as:
 * int __TPP_IDENTIFIER("identifier\N{NO-BREAK SPACE}nbsp") = 42;
 * ```
 *
 * What actually is allowed within `\N{...}` is controlled by:
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES`
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD`
 * - `TPP_HAVE_ESCAPE_NAMED_XML`
 *
 * @detect: #define foo\N{LATIN SMALL LETTER B}ar
 *          #ifdef foobar */
#ifndef TPP_HAVE_IDENTIFIER_ESCAPE_NAMED
#define TPP_HAVE_IDENTIFIER_ESCAPE_NAMED (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) /* "-fnamed-extended-identifiers" */
#endif /* !TPP_HAVE_IDENTIFIER_ESCAPE_NAMED */

/* Extension to `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED`: accept
 * multiple character names to appear within a `\N{...}`
 * block. Without this extension, trying to spell multiple
 * character will result in an unknown-character warning. */
#ifndef TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY
#define TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY (TPP_HAVE_IDENTIFIER_ESCAPE_NAMED ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_DEFAULT) : 0) /* "-fnamed-extended-identifiers-many" */
#endif /* !TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY */

/* Specifies if *any* CPP directives are supported */
#ifndef TPP_HAVE_CPP_DIRECTIVES
#define TPP_HAVE_CPP_DIRECTIVES ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL)) /* "-fcpp-directives" */
#endif /* !TPP_HAVE_CPP_DIRECTIVES */

/* Support for C-style macros */
#ifndef TPP_HAVE_CPP_MACROS
#define TPP_HAVE_CPP_MACROS (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fcpp-macros" */
#endif /* !TPP_HAVE_CPP_MACROS */

/* Enable support for magic whitespace insertions where failure
 * to do so would result in accidental token concatenation:
 * ```c
 * #define FOO() foo
 * #define BAR   bar
 * #define SCAN(x) x
 * FOO()BAR          // OK: Expands to [foo][bar] (works independent of `TPP_HAVE_MAGIC_WHITESPACE`)
 * SCAN(FOO()BAR)    // Expands to [foo][ ][bar]  (or [foobar] when `TPP_HAVE_MAGIC_WHITESPACE` is disabled)
 * ```
 *
 * The extra space (U+0020) character in `SCAN(FOO()BAR)` gets added
 * during macro argument substitution in the call to `SCAN`, and is
 * necessary because TPP is a text-based preprocessor. Trying to get
 * L/C information on the associated `TPP_TOK_SPACE` will fail.
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION* 
 *
 * @detect: #define FOO()         foo
 *          #define BAR           bar
 *          #define SCAN2(x)      pre##x##post
 *          #define SCAN(x)       SCAN2(x)
 *          #define prefoobarpost 0
 *          #define prefoo        1
 *          #define barpost       +1
 *          #if SCAN(FOO()BAR) // "0" if disabled (non-standard-conforming, like mscv);
 *                             // "1 +1" if enabled (standard-conforming, like gcc)
 */
#ifndef TPP_HAVE_MAGIC_WHITESPACE
#define TPP_HAVE_MAGIC_WHITESPACE ((TPP_HAVE_CPP_MACROS || TPP_HAVE_MACRO___TPP_EXEC) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fmagic-whitespace" */
#endif /* !TPP_HAVE_MAGIC_WHITESPACE */

/* Support for builtin C-style macros (require `TPP_HAVE_CPP_MACROS` to be enabled, too) */
#ifndef TPP_HAVE_CPP_BUILTIN_MACROS
#define TPP_HAVE_CPP_BUILTIN_MACROS (TPP_HAVE_CPP_MACROS ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fcpp-builtin-macros" */
#endif /* !TPP_HAVE_CPP_BUILTIN_MACROS */

/* Support for `#!foobar`-directives (which are treated as comments) */
#ifndef TPP_HAVE_CPP_EXCLAIM
#define TPP_HAVE_CPP_EXCLAIM (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-fshebang-directives" */
#endif /* !TPP_HAVE_CPP_EXCLAIM */

/* Support for `#`-directives (blank directives), which are ignored */
#ifndef TPP_HAVE_CPP_BLANK
#define TPP_HAVE_CPP_BLANK (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fblank-directives" */
#endif /* !TPP_HAVE_CPP_BLANK */

/* Support for `# 42 "foo.h" 1 2 3 4`-directives.
 *
 * These behave similar to `#line`-directives, except that following
 * the filename, a number of additional "flags" can be specified:
 * - `1`: Push a dummy-file containing the old file/line/column onto the `#include`-stack,
 *        before applying the new line/filename. After being pushed, said last position will
 *        be displayed as part of warning messages. This flag require `TPP_HAVE_FILE_DUMMY`
 *        to be enabled, otherwise it is ignored.
 * - `2`: Do the inverse of flag `1` and pop a dummy-file off the `#include`-stack. Like the
 *        `1` flag, this flag require `TPP_HAVE_FILE_DUMMY` to be enabled, otherwise it is
 *        ignored.
 * - `3`: Set `TPP_FILE_FLAGS_SYSHDR` for the current text-file. When this flag is not
 *        supplied, `TPP_FILE_FLAGS_SYSHDR` is instead cleared for the current text-file.
 *        This flag requires `TPP_HAVE_FILE_SYSHDR` to be enabled, otherwise it is ignored.
 * - `4`: Same as flag `3`, except for the `TPP_FILE_FLAGS_EXTERN_C` flag. Similarly, this
 *        flag requires `TPP_HAVE_FILE_EXTERN_C` to be enabled, otherwise it is ignored. */
#ifndef TPP_HAVE_CPP_DIGIT_LINE
#define TPP_HAVE_CPP_DIGIT_LINE (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fdigit-directives" */
#endif /* !TPP_HAVE_CPP_DIGIT_LINE */

/* Support for `#line 42 "foo.h"`-directives */
#ifndef TPP_HAVE_CPP_LINE
#define TPP_HAVE_CPP_LINE (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fline-directives" */
#endif /* !TPP_HAVE_CPP_LINE */

/* Support for `#include <stdio.h>`-directives */
#ifndef TPP_HAVE_CPP_INCLUDE
#define TPP_HAVE_CPP_INCLUDE (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-finclude-directives" */
#endif /* !TPP_HAVE_CPP_INCLUDE */

/* Support for `#include_next <stdio.h>`-directives */
#ifndef TPP_HAVE_CPP_INCLUDE_NEXT
#define TPP_HAVE_CPP_INCLUDE_NEXT (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-finclude-next-directives" */
#endif /* !TPP_HAVE_CPP_INCLUDE_NEXT */

/* Support for `#import <stdio.h>`-directives */
#ifndef TPP_HAVE_CPP_IMPORT
#define TPP_HAVE_CPP_IMPORT (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-fimport-directives" */
#endif /* !TPP_HAVE_CPP_IMPORT */

/* Support for: `#if`, `#ifdef`, `#ifndef`, `#elif`, `#elifdef`, `#elifndef`, `#else`, `#endif` */
#ifndef TPP_HAVE_CPP_IF_ELSE_ENDIF
#define TPP_HAVE_CPP_IF_ELSE_ENDIF ((TPP_HAVE_CPP_MACROS && TPP_HAVE_CPP_DIRECTIVES) ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fif-directives" */
#endif /* !TPP_HAVE_CPP_IF_ELSE_ENDIF */

/* Support for: `#define`, `#undef` */
#ifndef TPP_HAVE_CPP_DEFINE
#define TPP_HAVE_CPP_DEFINE ((TPP_HAVE_CPP_MACROS && TPP_HAVE_CPP_DIRECTIVES) ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fdefine-directives" */
#endif /* !TPP_HAVE_CPP_DEFINE */

/* Support for: `#assert`, `#unassert`
 *
 * see: https://gcc.gnu.org/onlinedocs/cpp/Obsolete-Features.html */
#ifndef TPP_HAVE_CPP_ASSERT
#define TPP_HAVE_CPP_ASSERT (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-fassertions" */
#endif /* !TPP_HAVE_CPP_ASSERT */

/* Support for: `#error` */
#ifndef TPP_HAVE_CPP_ERROR
#define TPP_HAVE_CPP_ERROR (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-ferror-directives" */
#endif /* !TPP_HAVE_CPP_ERROR */

/* Support for: `#warning` */
#ifndef TPP_HAVE_CPP_WARNING
#define TPP_HAVE_CPP_WARNING (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-fwarning-directives" */
#endif /* !TPP_HAVE_CPP_WARNING */

/* Support for: `#ident`, `#sccs` */
#ifndef TPP_HAVE_CPP_IDENT_SCCS
#define TPP_HAVE_CPP_IDENT_SCCS (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-fident-directives" */
#endif /* !TPP_HAVE_CPP_IDENT_SCCS */

/* Support for: `#pragma` */
#ifndef TPP_HAVE_CPP_PRAGMA
#define TPP_HAVE_CPP_PRAGMA (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fpragma-directives" */
#endif /* !TPP_HAVE_CPP_PRAGMA */

/* Support for: `#embed` */
#ifndef TPP_HAVE_CPP_EMBED
#define TPP_HAVE_CPP_EMBED (TPP_HAVE_CPP_DIRECTIVES ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-fembed-directives" */
#endif /* !TPP_HAVE_CPP_EMBED */

/* Support for: `_Pragma("foo")`
 * @detect: #ifdef _Pragma */
#ifndef TPP_HAVE_MACRO__Pragma
#define TPP_HAVE_MACRO__Pragma (TPP_HAVE_CPP_BUILTIN_MACROS ? TPP_COMMON_HAVE_CPP_DIRECTIVES_STD : 0) /* "-f_Pragma" */
#endif /* !TPP_HAVE_MACRO__Pragma */

/* Support for: `__pragma(foo)`
 * @detect: #ifdef __pragma */
#ifndef TPP_HAVE_MACRO___pragma
#define TPP_HAVE_MACRO___pragma (TPP_HAVE_CPP_BUILTIN_MACROS ? TPP_COMMON_HAVE_CPP_DIRECTIVES_EXT : 0) /* "-f__pragma" */
#endif /* !TPP_HAVE_MACRO___pragma */


/* Support for pragma directives */
#undef TPP_HAVE_PRAGMA
#if (TPP_HAVE_CPP_PRAGMA ||    \
     TPP_HAVE_MACRO__Pragma || \
     TPP_HAVE_MACRO___pragma)
#define TPP_HAVE_PRAGMA 1
#else /* ... */
#define TPP_HAVE_PRAGMA 0
#endif /* !... */


/* Support for clang `__has_attribute()`, which is conventionally
 * used to check support of `__attribute__((foo))` in C/C++ compilers.
 *
 * @detect: #ifdef __has_attribute */
#ifndef TPP_HAVE_CLANG_MACRO___has_attribute
#define TPP_HAVE_CLANG_MACRO___has_attribute (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_attribute" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_attribute */

/* Support for clang `__has_builtin()`, which is conventionally
 * used to check support of `__builtin_foo()` in C/C++ compilers.
 *
 * @detect: #ifdef __has_builtin */
#ifndef TPP_HAVE_CLANG_MACRO___has_builtin
#define TPP_HAVE_CLANG_MACRO___has_builtin (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_builtin" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_builtin */

/* Support for clang `__has_cpp_attribute()`, which is conventionally
 * used to check support of `[[foo]]` in C++ compilers.
 *
 * @detect: #ifdef __has_cpp_attribute */
#ifndef TPP_HAVE_CLANG_MACRO___has_cpp_attribute
#define TPP_HAVE_CLANG_MACRO___has_cpp_attribute (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_cpp_attribute" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_cpp_attribute */

/* Support for clang `__has_declspec_attribute()`, which is conventionally
 * used to check support of `__declspec(foo)` in C/C++ compilers.
 *
 * @detect: #ifdef __has_declspec_attribute */
#ifndef TPP_HAVE_CLANG_MACRO___has_declspec_attribute
#define TPP_HAVE_CLANG_MACRO___has_declspec_attribute (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_declspec_attribute" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_declspec_attribute */

/* Support for clang `__has_extension()`, which is conventionally
 * used to check support of compiler extensions in C/C++ compilers.
 *
 * NOTE: Another builtin macro of the same name exists and can be
 *       enabled via `TPP_HAVE_MACRO___has_extension`. The 2 macros
 *       don't conflict with each other though (both can safely be
 *       enabled at the same time), since TPP's `__has_extension()`
 *       takes a string, whilst this one takes a keyword/identifier.
 *
 * @detect: #ifdef __has_extension */
#ifndef TPP_HAVE_CLANG_MACRO___has_extension
#define TPP_HAVE_CLANG_MACRO___has_extension (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_extension" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_extension */

/* Support for clang `__has_feature()`, which is conventionally
 * used to check support of compiler features in C/C++ compilers.
 *
 * @detect: #ifdef __has_feature */
#ifndef TPP_HAVE_CLANG_MACRO___has_feature
#define TPP_HAVE_CLANG_MACRO___has_feature (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_feature" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_feature */

/* Support for clang `__has_c_attribute()`, which is conventionally
 * used to check support of `[[foo]]` in C+ compilers.
 *
 * @detect: #ifdef __has_c_attribute */
#ifndef TPP_HAVE_CLANG_MACRO___has_c_attribute
#define TPP_HAVE_CLANG_MACRO___has_c_attribute (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fclang-__has_c_attribute" */
#endif /* !TPP_HAVE_CLANG_MACRO___has_c_attribute */

/* When enabled, clang's `__has_feature()` also
 * expands to `1` when `__has_extension()` would.
 *
 * See also:
 * - `TPP_HAVE_CLANG_MACRO___has_feature`
 * - `TPP_HAVE_CLANG_MACRO___has_extension` */
#ifndef TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES
#define TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES ((TPP_HAVE_CLANG_MACRO___has_extension && TPP_HAVE_CLANG_MACRO___has_feature) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fclang-extensions-are-features" */
#endif /* !TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES */

/* Support for clang `__is_identifier()`, which can be used
 * to check if a given keyword is a builtin identifier:
 * ```c
 * #if __is_identifier(tpp_exec)
 * // "#pragma tpp_exec()" is probably supported then...
 * #endif
 * ```
 *
 * A keyword is considered to be an "identifier" if `TPP_TOK_ISBUILTINKEYWORD()`
 *
 * @detect: #ifdef __is_identifier */
#ifndef TPP_HAVE_MACRO___is_identifier
#define TPP_HAVE_MACRO___is_identifier (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__is_identifier" */
#endif /* !TPP_HAVE_MACRO___is_identifier */

/* Support for TPP's `__is_deprecated()`, which can be used to
 * check if an identifier has been `#pragma deprecated("foo")`-ed
 *
 * @detect: #ifdef __is_deprecated */
#ifndef TPP_HAVE_MACRO___is_deprecated
#define TPP_HAVE_MACRO___is_deprecated (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__is_deprecated" */
#endif /* !TPP_HAVE_MACRO___is_deprecated */

/* Support for TPP's `__is_poisoned()`, which can be used to
 * check if an identifier has been `#pragma GCC poison foo`-ed
 *
 * @detect: #ifdef __is_poisoned */
#ifndef TPP_HAVE_MACRO___is_poisoned
#define TPP_HAVE_MACRO___is_poisoned (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__is_poisoned" */
#endif /* !TPP_HAVE_MACRO___is_poisoned */

/* Support for TPP's `__has_extension()`, which can be
 * used to check if a TPP extension is known + enabled:
 * ```c
 * #if __has_extension("-ftrigraphs")
 * ...
 * #endif
 * ```
 *
 * @detect: #ifdef __has_extension */
#ifndef TPP_HAVE_MACRO___has_extension
#define TPP_HAVE_MACRO___has_extension ((TPP_HAVE_EXTENSIONS && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_extension" */
#endif /* !TPP_HAVE_MACRO___has_extension */

/* Support for TPP's `__has_known_extension()`, which
 * can be used to check if a TPP extension is known:
 * ```c
 * #if __has_known_extension("-ftrigraphs")
 * ...
 * #endif
 * ```
 *
 * @detect: #ifdef __has_known_extension */
#ifndef TPP_HAVE_MACRO___has_known_extension
#define TPP_HAVE_MACRO___has_known_extension ((TPP_HAVE_EXTENSIONS && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_known_extension" */
#endif /* !TPP_HAVE_MACRO___has_known_extension */

/* Support for TPP's `__has_warning()`, which can be
 * used to check if a TPP warning is known + enabled:
 * ```c
 * #if __has_warning("-Wmultiline-string")
 * ...
 * #endif
 * ```
 *
 * @detect: #ifdef __has_warning */
#ifndef TPP_HAVE_MACRO___has_warning
#define TPP_HAVE_MACRO___has_warning ((TPP_HAVE_WARNINGS && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_warning" */
#endif /* !TPP_HAVE_MACRO___has_warning */

/* Support for TPP's `__has_known_warning()`, which
 * can be used to check if a TPP warning is known:
 * ```c
 * #if __has_known_warning("-Wmultiline-string")
 * ...
 * #endif
 * ```
 *
 * @detect: #ifdef __has_known_warning */
#ifndef TPP_HAVE_MACRO___has_known_warning
#define TPP_HAVE_MACRO___has_known_warning ((TPP_HAVE_WARNINGS && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_known_warning" */
#endif /* !TPP_HAVE_MACRO___has_known_warning */

/* Support for clang `__has_include()`, which
 * can be used to check if `#include` exists:
 * ```c
 * #if __has_include(<stdio.h>)
 * #include <stdio.h>
 * #endif
 * ```
 *
 * @detect: #ifdef __has_include */
#ifndef TPP_HAVE_MACRO___has_include
#define TPP_HAVE_MACRO___has_include (((TPP_HAVE_CPP_INCLUDE || TPP_HAVE_CPP_IMPORT) && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_include" */
#endif /* !TPP_HAVE_MACRO___has_include */

/* Support for clang `__has_include_next()`, which
 * can be used to check if `#include_next` exists:
 * ```c
 * #if __has_include_next(<stdio.h>)
 * #include_next <stdio.h>
 * #endif
 * ```
 *
 * @detect: #ifdef __has_include_next */
#ifndef TPP_HAVE_MACRO___has_include_next
#define TPP_HAVE_MACRO___has_include_next ((TPP_HAVE_CPP_INCLUDE_NEXT && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_include_next" */
#endif /* !TPP_HAVE_MACRO___has_include_next */

/* Support for clang `__has_embed()`, which can be
 * used to check if `#embed` exists and/or is empty:
 * ```c
 * #if __has_embed("resource.dat" limit(10)) == __STDC_EMBED_FOUND__
 * #embed "resource.dat" limit(10) // Resource exists and is non-empty
 * #endif
 * ```
 *
 * The different values that `__has_embed` can expand to are configured by:
 * - `__STDC_EMBED_NOT_FOUND__` (usually `0`; `TPP_CONFIG_VALUEOF_STDC_EMBED_NOT_FOUND`)
 * - `__STDC_EMBED_FOUND__` (usually `1`; `TPP_CONFIG_VALUEOF_STDC_EMBED_FOUND`)
 * - `__STDC_EMBED_EMPTY__` (usually `2`; `TPP_CONFIG_VALUEOF_STDC_EMBED_EMPTY`)
 *
 * @detect: #ifdef __has_embed */
#ifndef TPP_HAVE_MACRO___has_embed
#define TPP_HAVE_MACRO___has_embed ((TPP_HAVE_CPP_EMBED && TPP_HAVE_CPP_BUILTIN_MACROS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__has_embed" */
#endif /* !TPP_HAVE_MACRO___has_embed */

/* Support for the builtin macro `__FILE__`,
 * which expands to the current file's name
 *
 * @detect: #ifdef __FILE__ */
#ifndef TPP_HAVE_MACRO___FILE__
#define TPP_HAVE_MACRO___FILE__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__FILE__" */
#endif /* !TPP_HAVE_MACRO___FILE__ */

/* Support for the builtin macro `__LINE__`,
 * which expands to the current line number
 *
 * @detect: #ifdef __LINE__ */
#ifndef TPP_HAVE_MACRO___LINE__
#define TPP_HAVE_MACRO___LINE__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__LINE__" */
#endif /* !TPP_HAVE_MACRO___LINE__ */

/* Support for the builtin macro `__TIME__`,
 * which expands to something like `"12:37:58"`
 *
 * @detect: #ifdef __TIME__ */
#ifndef TPP_HAVE_MACRO___TIME__
#define TPP_HAVE_MACRO___TIME__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__TIME__" */
#endif /* !TPP_HAVE_MACRO___TIME__ */

/* Support for the builtin macro `__DATE__`,
 * which expands to something like `"Jul  6 2026"`
 *
 * @detect: #ifdef __DATE__ */
#ifndef TPP_HAVE_MACRO___DATE__
#define TPP_HAVE_MACRO___DATE__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__DATE__" */
#endif /* !TPP_HAVE_MACRO___DATE__ */

/* Support for the builtin macro `__COLUMN__`,
 * which expands to current column number
 *
 * @detect: #ifdef __COLUMN__ */
#ifndef TPP_HAVE_MACRO___COLUMN__
#define TPP_HAVE_MACRO___COLUMN__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fcolumn-macro" */
#endif /* !TPP_HAVE_MACRO___COLUMN__ */

/* Support for the builtin macro `__BASE_FILE__`,
 * which expands to base file's name
 *
 * @detect: #ifdef __BASE_FILE__ */
#ifndef TPP_HAVE_MACRO___BASE_FILE__
#define TPP_HAVE_MACRO___BASE_FILE__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fbasefile-macro" */
#endif /* !TPP_HAVE_MACRO___BASE_FILE__ */

/* Support for the builtin macro `__FILE_NAME__`.
 * Similar to `__FILE__` (see `TPP_HAVE_MACRO___FILE__`), but expand to the
 * current file's name, without its leading path components (i.e. its *basename*).
 *
 * @detect: #ifdef __FILE_NAME__ */
#ifndef TPP_HAVE_MACRO___FILE_NAME__
#define TPP_HAVE_MACRO___FILE_NAME__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-f__FILE_NAME__" */
#endif /* !TPP_HAVE_MACRO___FILE_NAME__ */

/* Support for the builtin macro `__INCLUDE_LEVEL__`,
 * which expands to numerical representation of include depth.
 * Whilst inside the "base"-file, it expands to `0`
 *
 * @detect: #ifdef __INCLUDE_LEVEL__ */
#ifndef TPP_HAVE_MACRO___INCLUDE_LEVEL__
#define TPP_HAVE_MACRO___INCLUDE_LEVEL__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-finclude-level-macro" */
#endif /* !TPP_HAVE_MACRO___INCLUDE_LEVEL__ */

/* Support for the builtin macro `__INCLUDE_DEPTH__`, which is an
 * alias for `__INCLUDE_LEVEL__` (see `TPP_HAVE_MACRO___INCLUDE_LEVEL__`)
 *
 * @detect: #ifdef __INCLUDE_DEPTH__ */
#ifndef TPP_HAVE_MACRO___INCLUDE_DEPTH__
#define TPP_HAVE_MACRO___INCLUDE_DEPTH__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-finclude-depth-macro" */
#endif /* !TPP_HAVE_MACRO___INCLUDE_DEPTH__ */

/* Support for the builtin macro `__COUNTER__`, which
 * expands to`1+` its previous expansion. The first time
 * this macro is used, it expands to `0`.
 *
 * @detect: #ifdef __COUNTER__ */
#ifndef TPP_HAVE_MACRO___COUNTER__
#define TPP_HAVE_MACRO___COUNTER__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fcounter-macro" */
#endif /* !TPP_HAVE_MACRO___COUNTER__ */

/* Support for the builtin macro `__TIMESTAMP__`, which
 * expands to something like `"Mon Jul  6 12:37:58 2026"`
 *
 * @detect: #ifdef __TIMESTAMP__ */
#ifndef TPP_HAVE_MACRO___TIMESTAMP__
#define TPP_HAVE_MACRO___TIMESTAMP__ (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftimestamp-macro" */
#endif /* !TPP_HAVE_MACRO___TIMESTAMP__ */

/* Support for the builtin macros `__DATE_DAY__`, `__DATE_WDAY__`, `__DATE_YDAY__`, `__DATE_MONTH__`, `__DATE_YEAR__`.
 * These are precise date/time macros and behave like `__LINE__`, but expand to the components of `__DATE__`
 *
 * @detect: #ifdef __DATE_DAY__, ... */
#ifndef TPP_HAVE_NUMERIC_DATE_MACROS
#define TPP_HAVE_NUMERIC_DATE_MACROS (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fnumeric-date-macros" */
#endif /* !TPP_HAVE_NUMERIC_DATE_MACROS */

/* Support for the builtin macros `__TIME_SEC__`, `__TIME_MIN__`, `__TIME_HOUR__`.
 * These are precise date/time macros and behave like `__LINE__`, but expand to components of `__TIME__`
 *
 * @detect: #ifdef __TIME_SEC__, ... */
#ifndef TPP_HAVE_NUMERIC_TIME_MACROS
#define TPP_HAVE_NUMERIC_TIME_MACROS (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fnumeric-time-macros" */
#endif /* !TPP_HAVE_NUMERIC_TIME_MACROS */

/* Support for the builtin function-like macro `__TPP_EVAL()`, which can
 * be used to evaluate an expression like in `#if` and replace the macro
 * invocation with the expression's result in the form of 1-2 tokens:
 * - `[<int>]`
 * - `[-][<int>]`
 * - `[<string>]` (if `TPP_HAVE_BUILTIN_EXPR_STRINGS` is enabled)
 *
 * Example:
 * ```c
 * __TPP_EVAL(10 + 20) // Expands to a single token: 30
 * ```
 *
 * @detect: #ifdef __TPP_EVAL */
#ifndef TPP_HAVE_MACRO___TPP_EVAL
#define TPP_HAVE_MACRO___TPP_EVAL (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-eval-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_EVAL */

/* Support for the builtin function-like macro `__TPP_EXEC()`.
 *
 * Takes a string that is then re-interpreted as preprocessor input,
 * and expands to whatever that string expands to. Note that the string
 * may contain any kind of directive:
 * ```c
 * #define RESOURCE_SIZE2(...) __VA_NARGS__
 * #define RESOURCE_SIZE1(x)   RESOURCE_SIZE2(x)
 * #define RESOURCE_SIZE(name) RESOURCE_SIZE1(__TPP_EXEC("#embed " #name))
 * RESOURCE_SIZE("resource.dat") // Expands to file size in bytes
 * ```
 *
 * NOTE: If you just want to execute code but discard whatever it expands
 *       to, use `#pragma tpp_exec()` (see `TPP_HAVE_PRAGMA_TPP_EXEC`)
 *       instead, which has a lower overhead and lets you safely execute
 *       the code whilst discarding its result.
 *
 * @detect: #ifdef __TPP_EXEC */
#ifndef TPP_HAVE_MACRO___TPP_EXEC
#define TPP_HAVE_MACRO___TPP_EXEC (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-exec-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_EXEC */

/* Support for the builtin function-like macro `__TPP_UNIQUE()`.
 *
 * When called with some keyword/identifier, this macro expands a unique INT-token
 * representative of the given keyword/identifier. The value of that INT-token
 * is distinct from any other keyword/identifier and remains the same for the
 * remaining of input (though it will differ if re-run with different input;
 * this is not a hash-function)
 *
 * @detect: #ifdef __TPP_UNIQUE */
#ifndef TPP_HAVE_MACRO___TPP_UNIQUE
#define TPP_HAVE_MACRO___TPP_UNIQUE (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-unique-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_UNIQUE */

/* Support for the builtin function-like macro `__TPP_LOAD_FILE()`.
 *
 * This macro behaves similar to `#include`, but the contents of the included
 * file are not macro-expanded, but instead packaged into a string literal to
 * which this macro then expands.
 *
 * Using some other features/extensions, this macro can be implemented as:
 * ```c
 * #define __TPP_LOAD_FILE(filename) __TPP_STR_PACK(__TPP_EXEC("#embed " #filename))
 * ```
 *
 * @detect: #ifdef __TPP_LOAD_FILE */
#ifndef TPP_HAVE_MACRO___TPP_LOAD_FILE
#define TPP_HAVE_MACRO___TPP_LOAD_FILE (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-load-file-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_LOAD_FILE */

/* Support for the builtin function-like macro `__TPP_COUNTER()`.
 *
 * Called the same way as `__TPP_UNIQUE` (see `TPP_HAVE_MACRO___TPP_UNIQUE`),
 * but returns an ever-increasing value starting at `0` (same as `__COUNTER__`),
 * but that counter is specific to the given keyword. i.e.: `__TPP_COUNTER(foo)`
 * and `__TPP_COUNTER(bar)` increment different counters
 *
 * @detect: #ifdef __TPP_COUNTER */
#ifndef TPP_HAVE_MACRO___TPP_COUNTER
#define TPP_HAVE_MACRO___TPP_COUNTER (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-counter-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_COUNTER */

/* Support for the builtin function-like macro `__TPP_RANDOM()`.
 *
 * Overloaded macro taking 1 or 2 arguments, and expanding to a random number
 * that stays the same during repeated compilations, only changing if source
 * code is altered:
 * - The single-argument form `__TPP_RANDOM(hi)` expands to a pseudo-random
 *   integer token in the range `[0,hi)`
 * - The 2-argument form `__TPP_RANDOM(lo, hi)` expands to a pseudo-random
 *   integer token in the range `[lo,hi)`
 *
 * @detect: #ifdef __TPP_RANDOM */
#ifndef TPP_HAVE_MACRO___TPP_RANDOM
#define TPP_HAVE_MACRO___TPP_RANDOM (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-random-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_RANDOM */

/* Support for the builtin function-like macro `__TPP_STR_DECOMPILE()`.
 *
 * This macro is very similar to `__TPP_EXEC()` (see `TPP_HAVE_MACRO___TPP_EXEC`),
 * except that while `__TPP_EXEC()` will expand other macros and directives,
 * `__TPP_STR_DECOMPILE()` doesn't: it simply takes a string and expands to
 * its decoded form *without* expansion (however: expansion may still occur as
 * returned tokens are yielded, so this difference may not always be obvious).
 *
 * In practice this usually only means:
 * - `__TPP_EXEC()` accepts preprocessor directives
 * - `__TPP_STR_DECOMPILE()` only does basic string-to-token conversion
 *
 * @detect: #ifdef __TPP_STR_DECOMPILE */
#ifndef TPP_HAVE_MACRO___TPP_STR_DECOMPILE
#define TPP_HAVE_MACRO___TPP_STR_DECOMPILE (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-str-decompile-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_STR_DECOMPILE */

/* Support for the builtin function-like macro `__TPP_STR_PACK()`.
 *
 * Expands to a string literal that is made up of the arguments taken by
 * this macro. There can be any number of arguments (and arguments don't
 * even have to be separated by `,`), but every argument must be:
 * - Another string (that is added to the result after being decoded and re-encoded)
 * - An INT token (that must evaluate to a value in range `[0,0xFF]`)
 *
 * @detect: #ifdef __TPP_STR_PACK */
#ifndef TPP_HAVE_MACRO___TPP_STR_PACK
#define TPP_HAVE_MACRO___TPP_STR_PACK (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-str-pack-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_STR_PACK */

/* Support for the builtin function-like macro `__TPP_STR_SUBSTR()` and `__TPP_STR_AT()`.
 *
 * Stand-alone macro that takes 3 arguments and (assuming `TPP_HAVE_BUILTIN_EXPR_STRINGS`
 * and `TPP_HAVE_MACRO___TPP_EVAL` are enabled) can be implemented as follows:
 * ```c
 * #define __TPP_STR_SUBSTR_3(str, i, n) __TPP_EVAL((str)[(i):(i)+(n)])
 * #define __TPP_STR_SUBSTR_2(str, i)    __TPP_EVAL((str)[(i):(i)+1])
 * #define __TPP_STR_SUBSTR(...)         __TPP_STR_SUBSTR_##__VA_NARGS__(__VA_ARGS__)
 * ```
 *
 * The macro `__TPP_STR_AT()` behaves the same, but quotes its result using `'` instead of `"`
 *
 * @detect: #if defined(__TPP_STR_SUBSTR) || defined(__TPP_STR_AT) */
#ifndef TPP_HAVE_MACRO___TPP_STR_SUBSTR
#define TPP_HAVE_MACRO___TPP_STR_SUBSTR (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-str-substr-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_STR_SUBSTR */

/* Support for the builtin function-like macro `__TPP_STR_SIZE()`.
 *
 * Stand-alone macro that takes 1 arguments and (assuming `TPP_HAVE_BUILTIN_EXPR_STRINGS`
 * and `TPP_HAVE_MACRO___TPP_EVAL` are enabled) can be implemented as follows:
 * ```c
 * #define __TPP_STR_SIZE(str) __TPP_EVAL(#(str))
 * ```
 *
 * @detect: #ifdef __TPP_STR_SIZE */
#ifndef TPP_HAVE_MACRO___TPP_STR_SIZE
#define TPP_HAVE_MACRO___TPP_STR_SIZE (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-str-size-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_STR_SIZE */

/* Support for the builtin function-like macro `__TPP_COUNT_TOKENS()`.
 *
 * A token-feature probing macro that lets you count the number of
 * tokens that are contained within a given string. For this
 * purpose, no macro expansion or directive processing is done:
 * ```c
 * __TPP_COUNT_TOKENS("++")         // 1 if "TPP_HAVE_TOK_PLUS_PLUS" is enabled, else 2
 * #define FOO 10 20 30
 * __TPP_COUNT_TOKENS("FOO")        // 1 because macros aren't expanded
 * __TPP_COUNT_TOKENS("#undef FOO") // 3 (or 4 if TPP_HAVE_TOK_SPACE) because directives aren't parsed
 * ```
 *
 * Based on the numbers returned by this macro, it becomes possible
 * to detect the state of pretty much all configuration options that
 * affect the behavior of `tpp_lexer_yieldraw()`
 *
 * @detect: #ifdef __TPP_COUNT_TOKENS */
#ifndef TPP_HAVE_MACRO___TPP_COUNT_TOKENS
#define TPP_HAVE_MACRO___TPP_COUNT_TOKENS (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-count-tokens-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_COUNT_TOKENS */

/* Support for the builtin function-like macro `__TPP_IDENTIFIER()`.
 *
 * This builtin macro can be used to construct arbitrary keyword-like
 * tokens, including ones that aren't actually keywords. This macro
 * takes a single argument (in the form of a string), and always expands
 * to a single keyword/identifier-type token:
 * ```c
 * __TPP_IDENTIFIER("foo")   // Same "foo"
 * __TPP_IDENTIFIER("1foo")  // Still a keyword; namely: "1foo" -- there's no way
 *                           // to write this, since it'd normally be a TPP_TOK_C_INT
 * __TPP_IDENTIFIER("a\0b")  // Compilers probably won't like this: NUL-character in
 *                           // keyword name, meaning strlen() returns "1", but keyword
 *                           // is legally distinct from "a" (though lots of places
 *                           // will probably print the keyword as "a")
 * ```
 *
 * Similar functionality can also be achieved using `TPP_HAVE_IDENTIFIER_ESCAPE_UNI`
 *
 * Note that unlike `TPP_HAVE_IDENTIFIER_ESCAPE_UNI`, `__TPP_IDENTIFIER`
 * can only be used in places where macros are expanded:
 * ```c
 * #__TPP_IDENTIFIER("define") foo 42  // Won't work
 * #\u0064efine foo 42                 // This will work
 * ```
 *
 * @detect: #ifdef __TPP_IDENTIFIER */
#ifndef TPP_HAVE_MACRO___TPP_IDENTIFIER
#define TPP_HAVE_MACRO___TPP_IDENTIFIER (TPP_HAVE_CPP_BUILTIN_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-ftpp-identifier-macro" */
#endif /* !TPP_HAVE_MACRO___TPP_IDENTIFIER */


/* Support for alternative parenthesis pairs in user-defined macros:
 * ```c
 * #define normal_macro(x) you_should("know this", x)
 * #define array[index]    get_ident(ARRAY, index)
 * #define block{...}      do { __VA_ARGS__ } while (should_continue())
 * #define point<T>        struct { T x; T y; }
 *
 * normal_macro(foo) // you_should("know this", foo)
 * array[42]         // get_ident(ARRAY, 42)
 * block { body }    // do { body } while (should_continue())
 * point<int>        // struct { int x; int y; }
 * ```
 *
 * These alternate parenthesis pairs work in a hierarchy, where
 * higher-order parenthesis pairs respect unmatched parentheses
 * of lower orders, but (to not break standard compatibility),
 * not the opposite. iow: `point<foo(x > 10)>` works
 * as expected (the `T` parameter is `foo(x > 10)` rather
 * than `foo(x `), but `(normal_macro(foo < 10) > 20)` does not
 * look out of `< >`-paris (the `x` parameter is `foo < 10`
 * rather than `foo < 10) > 20`). See the following hierarchy:
 *
 * | order | l-paren | r-paren |
 * | ----- | ------- | ------- |
 * | 1     | `(`     | `)`     |
 * | 2     | `[`     | `]`     |
 * | 3     | `{`     | `}`     |
 * | 4     | `<`     | `>`     |
 *
 * Some more examples of the results produced by this hirarchy:
 *
 * ```c
 * point<{ int x = v > 20; }>   // T is `{ int x = v > 20; }`
 * point<arr[y > 10 ? 0 : 2]>   // T is `arr[y > 10 ? 0 : 2]`
 * point<foo(x > 10)>           // T is `foo(x > 10)`
 * point<point<int>>            // T is `point<int>`
 * point<x > 10>                // !!! T is `x` and expansion is followed by ` 10>`
 *
 * block { int y = < 20; } > }; // __VA_ARGS__ is `int y = v < 20;` and expansion is followed by ` > };`
 * block { int y = { 20; } };   // __VA_ARGS__ is `int y = { 20; }`
 * block { int y = [ 20; } ] }; // __VA_ARGS__ is `int y = [20; } ]`
 * block { int y = ( 20; } ) }; // __VA_ARGS__ is `int y = (20; } )`
 *
 * array[y < 20] > ]; // index is `y < 20` and expansion is followed by ` > ];`
 * array[y { 20] } ]; // index is `y < 20` and expansion is followed by ` } ];`
 * array[y [ 20] ];   // index is `y [ 20]`
 * array[y ( 20] ) ]; // index is `y ( 20] )`
 *
 * normal_macro(y < 20) > ); // x is `y < 20` and expansion is followed by ` > );`
 * normal_macro(y { 20) } ); // x is `y { 20` and expansion is followed by ` } );`
 * normal_macro(y [ 20) ] ); // x is `y [ 20` and expansion is followed by ` ] );`
 * normal_macro(y ( 20) );   // x is `y ( 20)`
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*:
 * ```c
 * #pragma extension("-falternative-macro-parenthesis")
 * #define point1<T> struct { T x; T y; }
 * #pragma extension("-fno-alternative-macro-parenthesis")
 * #define point2<T> struct { T x; T y; }
 *
 * point1<int>  // struct { int x; int y; }
 * point2<int>  // <T> struct { T x; T y; }<int>
 * ```
 *
 * @detect: #define foo<bar> +1
 *          #define bar 10
 *          #if (1 foo<1> +1) == 3
 */
#ifndef TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS
#define TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS (TPP_HAVE_CPP_MACROS ? TPP_CONF_EXT1 : 0) /* "-falternative-macro-parenthesis" */
#endif /* !TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS */

/* Retain whitespace around macro arguments:
 * ```c
 * #define STR1(x) #x
 * #pragma extension(push, "-fmacro-argument-whitespace")
 * #define STR2(x) #x
 * #pragma extension(pop)
 * STR1(  foo  ) // "foo"
 * STR2(  foo  ) // "  foo  "
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION* */
#ifndef TPP_HAVE_MACRO_ARGUMENT_WHITESPACE
#define TPP_HAVE_MACRO_ARGUMENT_WHITESPACE ((TPP_HAVE_CPP_MACROS && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT0 : 0) /* "-fmacro-argument-whitespace" */
#endif /* !TPP_HAVE_MACRO_ARGUMENT_WHITESPACE */

/* Allow self-recursion for certain macros:
 * ```c
 * #define REPEAT_0(n, x)
 * #pragma extension(push, "-fmacro-recursion")
 * #define REPEAT_1(n, x) #!x REPEAT(n, #!x)
 * #define REPEAT__(v, n, x) REPEAT_##v(n, #!x)
 * #define REPEAT_(v, n, x) REPEAT__(v, n, #!x)
 * #define REPEAT(n, x) REPEAT_(__TPP_EVAL((n) > 0), __TPP_EVAL((n)-1), #!x)
 * #pragma extension(pop)
 * REPEAT(42, HELLO_WORLD) // HELLO_WORLD HELLO_WORLD HELLO_WORLD [...] (42 times)
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION* */
#ifndef TPP_HAVE_MACRO_RECURSION
#define TPP_HAVE_MACRO_RECURSION ((TPP_HAVE_CPP_MACROS && TPP_HAVE_PROFILE_NOT_MINIMAL) ? TPP_CONF_EXT0 : 0) /* "-fmacro-recursion" */
#endif /* !TPP_HAVE_MACRO_RECURSION */

// Support for traditional macro expansion rules:
// ```c
// #define CAT(a, b) a##b
// #define STR(x)    #x
// #pragma extension(push, "-ftraditional-macro")
// #define T_CAT(a, b) a/**/b
// #define T_STR(x)    "x"
// #pragma extension(pop)
// CAT(10, 20)   // 1020
// STR(10)       // "10"
// T_CAT(10, 20) // 1020
// T_STR(10)     // "10"
// ```
//
// NOTE: affects behavior of macros at the *TIME OF DEFINITION* ")
#ifndef TPP_HAVE_TRADITIONAL_MACROS
#define TPP_HAVE_TRADITIONAL_MACROS ((TPP_HAVE_CPP_MACROS && TPP_HAVE_PROFILE_NOT_MINIMAL) ? TPP_CONF_EXT0 : 0) /* "-ftraditional-macro" */
#endif /* !TPP_HAVE_TRADITIONAL_MACROS */

/* Support for variable-argument macros with named varargs:
 * ```c
 * #define printf(format, args...) fprintf(stdout, format, args)
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION* */
#ifndef TPP_HAVE_NAMED_VARARGS_IN_MACROS
#define TPP_HAVE_NAMED_VARARGS_IN_MACROS (TPP_HAVE_CPP_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fnamed-varargs-in-macros" */
#endif /* !TPP_HAVE_NAMED_VARARGS_IN_MACROS */

/* Support for variable-argument macros:
 * ```c
 * #define printf(...) fprintf(stdout, __VA_ARGS__)
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION* */
#ifndef TPP_HAVE_VA_ARGS_IN_MACROS
#define TPP_HAVE_VA_ARGS_IN_MACROS (TPP_HAVE_CPP_MACROS ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fva-args-in-macros" */
#endif /* !TPP_HAVE_VA_ARGS_IN_MACROS */

/* Support for special keyword `__VA_COMMA__` inside of variable-argument macros.
 * When varargs are non-empty, replaced with `,`. Otherwise, replaced with nothing:
 * ```c
 * #define printf(format, ...) fprintf(stdout, format __VA_COMMA__ __VA_ARGS__)
 * printf("foo\n");         // fprintf(stdout, "foo\n");
 * printf("i = %d\n", 10);  // fprintf(stdout, "i = %d\n", 10);
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test1(a, b, ...) __VA_ARGS__+0
 *          #define test2(...) test1(__VA_COMMA__ 0, 1)
 *          #if test2(~) */
#ifndef TPP_HAVE_VA_COMMA_IN_MACROS
#define TPP_HAVE_VA_COMMA_IN_MACROS ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fva-comma-in-macros" */
#endif /* !TPP_HAVE_VA_COMMA_IN_MACROS */

/* Support for special function `__VA_OPT__()` inside of variable-argument macros.
 * When varargs are non-empty, the content within parenthesis is kept. Otherwise,
 * said content is removed alongside the `__VA_OPT__()` call itself:
 * ```c
 * #define printf(format, ...) fprintf(stdout, format __VA_OPT__(,) __VA_ARGS__)
 * printf("foo\n");         // fprintf(stdout, "foo\n");
 * printf("i = %d\n", 10);  // fprintf(stdout, "i = %d\n", 10);
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test1(a, b, ...) __VA_ARGS__+0
 *          #define test2(...) test1(__VA_OPT__(,) 0, 1)
 *          #if test2(~) */
#ifndef TPP_HAVE_VA_OPT_IN_MACROS
#define TPP_HAVE_VA_OPT_IN_MACROS ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fva-opt-in-macros" */
#endif /* !TPP_HAVE_VA_OPT_IN_MACROS */

/* Support for special keyword `__VA_NARGS__` inside of variable-argument macros.
 * Expands to the number of varargs, allowing for easy overloading of macros based
 * on the number of supplied arguments:
 * ```c
 * #define min_0()        0
 * #define min_1(a)       a
 * #define min_2(a, b)    ((a) < (b) ? (a) : (b))
 * #define min_3(a, b, c) min_2(min_2(a, b), c)
 * #define min(...)       min_##__VA_NARGS__(__VA_ARGS__)
 * min()        // Expands to: "0"
 * min(10)      // Expands to: "10"
 * min(10, 20)  // Expands to: "((10) < (20) ? (10) : (20))"
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test___VA_NARGS__ 0
 *          #define test_1            1
 *          #define test(...) test_##__VA_NARGS__
 *          #if test2(~) */
#ifndef TPP_HAVE_VA_NARGS_IN_MACROS
#define TPP_HAVE_VA_NARGS_IN_MACROS ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fva-nargs-in-macros" */
#endif /* !TPP_HAVE_VA_NARGS_IN_MACROS */

/* Support for GCC-style va-comma: when a variable-argument macro
 * contains a construct like `, ## __VA_ARGS__` (or the name of the
 * variable-length argument when `TPP_HAVE_NAMED_VARARGS_IN_MACROS`
 * is enabled), then the `,` is deleted during expansion whenever
 * the there are no variable arguments:
 *
 * ```c
 * #define printf(format, ...) fprintf(stdout, format, ## __VA_ARGS__)
 * printf("foo\n");         // fprintf(stdout, "foo\n");
 * printf("i = %d\n", 10);  // fprintf(stdout, "i = %d\n", 10);
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test1(a, b, ...) __VA_ARGS__+0
 *          #define test2(...) test1(,##__VA_ARGS__, 1)
 *          #if test2() == 0 */
#ifndef TPP_HAVE_VA_GLUE_COMMA_IN_MACROS
#define TPP_HAVE_VA_GLUE_COMMA_IN_MACROS ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fglue-comma-in-macros" */
#endif /* !TPP_HAVE_VA_GLUE_COMMA_IN_MACROS */

/* Support for the so-called "stringize" operator in macros:
 * ```c
 * #define str(x) #x
 * str(foo)    // Expands to: "foo"
 * str("foo")  // Expands to: "\"foo\""
 * ```
 *
 * Note that this operator only takes effect during modern macro
 * compilation. When `TPP_HAVE_TRADITIONAL_MACROS` is enabled,
 * then stringization works differently and must be done like so:
 * ```c
 * #define str(x) "x"
 * str(foo)    // Expands to: "foo"
 * str("foo")  // Expands to: ""foo"" -- oops; traditional macros can't do this
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define str(x) #x
 *          #if __TPP_COUNT_TOKENS(str(a b)) == 1 */
#ifndef TPP_HAVE_STRINGIZE_MACRO_ARGUMENT
#define TPP_HAVE_STRINGIZE_MACRO_ARGUMENT ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fstringize-macro-argument" */
#endif /* !TPP_HAVE_STRINGIZE_MACRO_ARGUMENT */

/* Support for the so-called "charize" operator in macros:
 * ```c
 * #define str(x) #@x
 * str(foo)    // Expands to: 'foo'
 * str('foo')  // Expands to: '\'foo\''
 * ```
 *
 * Note that this operator only takes effect during modern macro
 * compilation. When `TPP_HAVE_TRADITIONAL_MACROS` is enabled,
 * then charization works differently and must be done like so:
 * ```c
 * #define chr(x) 'x'
 * chr(foo)    // Expands to: 'foo'
 * chr('foo')  // Expands to: ''foo'' -- oops; traditional macros can't do this
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define str(x) #@x
 *          #if __TPP_COUNT_TOKENS(str(a b)) == 1 */
#ifndef TPP_HAVE_CHARIZE_MACRO_ARGUMENT
#define TPP_HAVE_CHARIZE_MACRO_ARGUMENT ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fcharize-macro-argument" */
#endif /* !TPP_HAVE_CHARIZE_MACRO_ARGUMENT */

/* Support for `#define noexpand(x) #!x`, which allows
 * you to insert macro arguments without expanding them:
 * ```c
 * #define STR1(x) #x
 * #define STR2(x) STR1(x)
 * #define STR3(x) STR1(#!x)
 * #define FOO 42
 * STR1(FOO) // "FOO"
 * STR2(FOO) // "42"
 * STR3(FOO) // "FOO"
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test1(x) #x
 *          #define test2(x) test1(#!x)
 *          #define test3    42
 *          #if __TPP_STR_SIZE(__TPP_COUNT_TOKENS(test3)) == 5 */
#ifndef TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT
#define TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fdont-expand-macro-argument" */
#endif /* !TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT */

/* Support for `##` in macros to concatenate different tokens
 * in order to form a new token:
 * ```c
 * #define cat(a, b) a##b
 * cat(+, +)  // Expands to a single token "++" (assuming that TPP_HAVE_TOK_PLUS_PLUS is enabled)
 * ```
 *
 * NOTE: affects behavior of macros at the *TIME OF DEFINITION*
 * @detect: #define test(a, b) a##b
 *          #define str2(x) #x
 *          #define str(x) str2(x)
 *          #if __TPP_COUNT_TOKENS(str(test(10, 20))) == 1 */
#ifndef TPP_HAVE_GLUE_MACRO_ARGUMENT
#define TPP_HAVE_GLUE_MACRO_ARGUMENT ((TPP_HAVE_CPP_MACROS && TPP_CONF_MAYBE_0(TPP_HAVE_TRADITIONAL_MACROS)) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fglue-macro-argument" */
#endif /* !TPP_HAVE_GLUE_MACRO_ARGUMENT */

/************************************************************************/
/************************************************************************/
/************************************************************************/




/************************************************************************/
/* #PRAGMA DIRECTIVES                                                   */
/************************************************************************/

/* Support for: `#pragma push_macro()` / `#pragma pop_macro()`
 * @detect: #define TEST 42
 *          #pragma push_macro("TEST")
 *          #undef TEST
 *          #pragma pop_macro("TEST")
 *          #ifdef TEST */
#ifndef TPP_HAVE_PRAGMA_PUSH_MACRO
#define TPP_HAVE_PRAGMA_PUSH_MACRO ((TPP_HAVE_CPP_MACROS && TPP_HAVE_PRAGMA) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-push-macro" */
#endif /* !TPP_HAVE_PRAGMA_PUSH_MACRO */

/* Support for: `#pragma once` */
#ifndef TPP_HAVE_PRAGMA_ONCE
#define TPP_HAVE_PRAGMA_ONCE (((TPP_HAVE_CPP_INCLUDE || TPP_HAVE_CPP_INCLUDE_NEXT) && TPP_HAVE_PRAGMA) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-once" */
#endif /* !TPP_HAVE_PRAGMA_ONCE */

/* Support for: `#pragma deprecated("foo")` */
#ifndef TPP_HAVE_PRAGMA_DEPRECATED
#define TPP_HAVE_PRAGMA_DEPRECATED (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-deprecated" */
#endif /* !TPP_HAVE_PRAGMA_DEPRECATED */

/* Support for: `#pragma extension(...)` */
#ifndef TPP_HAVE_PRAGMA_EXTENSION
#define TPP_HAVE_PRAGMA_EXTENSION ((TPP_HAVE_PRAGMA && TPP_HAVE_EXTENSIONS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-extension" */
#endif /* !TPP_HAVE_PRAGMA_EXTENSION */

/* Support for: `#pragma warning(...)` */
#ifndef TPP_HAVE_PRAGMA_WARNING
#define TPP_HAVE_PRAGMA_WARNING ((TPP_HAVE_PRAGMA && TPP_HAVE_WARNINGS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-warning" */
#endif /* !TPP_HAVE_PRAGMA_WARNING */

/* Support for: `#pragma message("...")` */
#ifndef TPP_HAVE_PRAGMA_MESSAGE
#define TPP_HAVE_PRAGMA_MESSAGE (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-message" */
#endif /* !TPP_HAVE_PRAGMA_MESSAGE */

/* Support for: `#pragma error("...")` */
#ifndef TPP_HAVE_PRAGMA_ERROR
#define TPP_HAVE_PRAGMA_ERROR (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-error" */
#endif /* !TPP_HAVE_PRAGMA_ERROR */

/* Support for: `#pragma region` + `#pragma endregion` */
#ifndef TPP_HAVE_PRAGMA_REGION
#define TPP_HAVE_PRAGMA_REGION (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-region" */
#endif /* !TPP_HAVE_PRAGMA_REGION */

/* Support for: `#pragma tpp_exec("...")` */
#ifndef TPP_HAVE_PRAGMA_TPP_EXEC
#define TPP_HAVE_PRAGMA_TPP_EXEC (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-tpp-exec" */
#endif /* !TPP_HAVE_PRAGMA_TPP_EXEC */

/* Support for: `#pragma tpp_set_keyword_flags("foo", 0x7f)` */
#ifndef TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS
#define TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-tpp-set-keyword-flags" */
#endif /* !TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS */

/* Support for: `#pragma GCC poison foo` */
#ifndef TPP_HAVE_PRAGMA_GCC_POISON
#define TPP_HAVE_PRAGMA_GCC_POISON (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-poison" */
#endif /* !TPP_HAVE_PRAGMA_GCC_POISON */

/* Support for: `#pragma GCC warning "message"` */
#ifndef TPP_HAVE_PRAGMA_GCC_WARNING
#define TPP_HAVE_PRAGMA_GCC_WARNING ((TPP_HAVE_PRAGMA && TPP_HAVE_WARNINGS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-warning" */
#endif /* !TPP_HAVE_PRAGMA_GCC_WARNING */

/* Support for: `#pragma GCC error "message"` */
#ifndef TPP_HAVE_PRAGMA_GCC_ERROR
#define TPP_HAVE_PRAGMA_GCC_ERROR ((TPP_HAVE_PRAGMA && TPP_HAVE_WARNINGS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-error" */
#endif /* !TPP_HAVE_PRAGMA_GCC_ERROR */

/* Support for: `#pragma GCC system_header` */
#ifndef TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER
#define TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-system-header" */
#endif /* !TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER */

/* Support for: `#pragma GCC diagnostic` */
#ifndef TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC
#define TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC ((TPP_HAVE_PRAGMA && TPP_HAVE_WARNINGS) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-diagnostic" */
#endif /* !TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC */

/* Support for: `#pragma GCC dependency` */
#ifndef TPP_HAVE_PRAGMA_GCC_DEPENDENCY
#define TPP_HAVE_PRAGMA_GCC_DEPENDENCY (TPP_HAVE_PRAGMA ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) : 0) /* "-fpragma-gcc-dependency" */
#endif /* !TPP_HAVE_PRAGMA_GCC_DEPENDENCY */

/* Support for: `#pragma TPP warning(...)`  (same as `TPP_HAVE_PRAGMA_WARNING`, but doesn't require `"-fpragma-warning"`) */
#ifndef TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_HAVE_PRAGMA_TPP_WARNING TPP_HAVE_PRAGMA_WARNING
#endif /* !TPP_HAVE_PRAGMA_TPP_WARNING */

/* Support for: `#pragma TPP extension(...)`  (same as `TPP_HAVE_PRAGMA_EXTENSION`, but doesn't require `"-fpragma-extension"`) */
#ifndef TPP_HAVE_PRAGMA_TPP_EXTENSION
#define TPP_HAVE_PRAGMA_TPP_EXTENSION TPP_HAVE_PRAGMA_EXTENSION
#endif /* !TPP_HAVE_PRAGMA_TPP_EXTENSION */

/* Support for: `#pragma TPP tpp_exec(...)`  (same as `TPP_HAVE_PRAGMA_TPP_EXEC`, but doesn't require `"-fpragma-tpp-exec"`) */
#ifndef TPP_HAVE_PRAGMA_TPP_TPP_EXEC
#define TPP_HAVE_PRAGMA_TPP_TPP_EXEC TPP_HAVE_PRAGMA_TPP_EXEC
#endif /* !TPP_HAVE_PRAGMA_TPP_TPP_EXEC */

/* Support for: `#pragma TPP tpp_set_keyword_flags("foo", 0x7f)`  (same as `TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS`, but doesn't require `"-fpragma-tpp-set-keyword-flags"`) */
#ifndef TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS
#define TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS
#endif /* !TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS */

/* Support for: `#pragma TPP include_path(...)` */
#ifndef TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH
#define TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH (TPP_HAVE_PRAGMA && TPP_HAVE_INCLUDE_PATH)
#endif /* !TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH */

#undef TPP_HAVE_PRAGMA_GCC
#if (TPP_HAVE_PRAGMA_GCC_POISON ||        \
     TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER || \
     TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC ||    \
     TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#define TPP_HAVE_PRAGMA_GCC 1
#else /* ... */
#define TPP_HAVE_PRAGMA_GCC 0
#endif /* !... */
#undef TPP_HAVE_PRAGMA_TPP
#if (TPP_HAVE_PRAGMA_TPP_WARNING ||               \
     TPP_HAVE_PRAGMA_TPP_EXTENSION ||             \
     TPP_HAVE_PRAGMA_TPP_TPP_EXEC ||              \
     TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS || \
     TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH)
#define TPP_HAVE_PRAGMA_TPP 1
#else /* ... */
#define TPP_HAVE_PRAGMA_TPP 0
#endif /* !... */

/************************************************************************/
/************************************************************************/
/************************************************************************/




/************************************************************************/
/* TOKENS                                                               */
/************************************************************************/

/* Support for trigraph character aliases:
 *
 * | Trigraph | Replacement |
 * | -------- | ----------- |
 * | `??=`    | `#`         |
 * | `??(`    | `[`         |
 * | `??/`    | `\`         |
 * | `??)`    | `]`         |
 * | `??'`    | `^`         |
 * | `??<`    | `{`         |
 * | `??!`    | `\|`        |
 * | `??>`    | `}`         |
 * | `??-`    | `~`         | */
#ifndef TPP_HAVE_TRIGRAPHS
#define TPP_HAVE_TRIGRAPHS (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) /* "-ftrigraphs" */
#endif /* !TPP_HAVE_TRIGRAPHS */

/* Support for digraph token aliases:
 * | Digraph | Replacement |
 * | ------- | ----------- |
 * | `<%`    | `{`         |
 * | `<:`    | `[`         |
 * | `%>`    | `}`         |
 * | `:>`    | `]`         |
 * | `%:`    | `#`         |
 * | `%:%:`  | `##` (requires `TPP_HAVE_TOK_POUND_POUND`) |
 * | `<::`   | `<`, `::` (requires `TPP_HAVE_TOK_COLON_COLON`) |
 *
 * @detect: #if __TPP_COUNT_TOKENS("%:") == 1 */
#ifndef TPP_HAVE_DIGRAPHS
#define TPP_HAVE_DIGRAPHS (TPP_HAVE_PROFILE_DEFAULT ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) /* "-fdigraphs" */
#endif /* !TPP_HAVE_DIGRAPHS */

/* Configures if line-feed tokens should be forwarded, or filtered by `tpp_lexer_yieldpp()`
 * @detect: #if __TPP_COUNT_TOKENS("\n") != 0 */
#ifndef TPP_HAVE_TOK_LF
#define TPP_HAVE_TOK_LF TPP_COMMON_HAVE_TPP_TOK_SPACE /* "-ftok-lf" */
#endif /* !TPP_HAVE_TOK_LF */

/* Configures if whitespace tokens should be forwarded, or filtered by `tpp_lexer_yieldpp()`
 * @detect: #if __TPP_COUNT_TOKENS(" ") != 0 */
#ifndef TPP_HAVE_TOK_SPACE
#define TPP_HAVE_TOK_SPACE TPP_COMMON_HAVE_TPP_TOK_SPACE /* "-ftok-space" */
#endif /* !TPP_HAVE_TOK_SPACE */

/* Configures if comment tokens should be forwarded, or filtered by `tpp_lexer_yieldpp()`
 * @detect: #if __TPP_COUNT_TOKENS("// a b c") == 1 */
#ifndef TPP_HAVE_TOK_COMMENT
#define TPP_HAVE_TOK_COMMENT TPP_COMMON_HAVE_TPP_TOK_SPACE /* "-ftok-comment" */
#endif /* !TPP_HAVE_TOK_COMMENT */

/* Enable support for recognizing c++-like comments: `// like this one!`
 * @detect: #if __TPP_COUNT_TOKENS("// a b c") <= 1 */
#ifndef TPP_HAVE_TOK_CXX_COMMENT
#define TPP_HAVE_TOK_CXX_COMMENT ((TPP_PROFILE == TPP_PROFILE_DEFAULT || TPP_HAVE_PROFILE_C_LIKE) ? 1 : (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_ENABLE(TPP_COMMON_HAVE_TPP_TOK_COMMENT) : TPP_COMMON_HAVE_TPP_TOK_COMMENT)) /* "-ftok-cxx-comment" */
#endif /* !TPP_HAVE_TOK_CXX_COMMENT */

// Enable support for recognizing c-like comments: `/* like this one! */`
// @detect: #if __TPP_COUNT_TOKENS("/* a b c */") <= 1
#ifndef TPP_HAVE_TOK_C_COMMENT
#define TPP_HAVE_TOK_C_COMMENT ((TPP_PROFILE == TPP_PROFILE_DEFAULT || TPP_HAVE_PROFILE_C_LIKE) ? 1 : (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_ENABLE(TPP_COMMON_HAVE_TPP_TOK_COMMENT) : TPP_COMMON_HAVE_TPP_TOK_COMMENT)) /* "-ftok-c-comment" */
#endif /* !TPP_HAVE_TOK_C_COMMENT */

/* Enable support for recognizing pascal-like comments: `(* like this one! *)`
 * @detect: #if __TPP_COUNT_TOKENS("(* a b c *)") <= 1 */
#ifndef TPP_HAVE_TOK_PASCAL_COMMENT
#define TPP_HAVE_TOK_PASCAL_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-pascal-comment" */
#endif /* !TPP_HAVE_TOK_PASCAL_COMMENT */

/* Enable support for recognizing pascal brace-like comments: `{ like this one! }`
 * @detect: #if __TPP_COUNT_TOKENS("{ a b c }") <= 1 */
#ifndef TPP_HAVE_TOK_PASCAL_BRACE_COMMENT
#define TPP_HAVE_TOK_PASCAL_BRACE_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-pascal-brace-comment" */
#endif /* !TPP_HAVE_TOK_PASCAL_BRACE_COMMENT */

/* Enable support for recognizing html-like comments: `<!-- like this one -->`
 * @detect: #if __TPP_COUNT_TOKENS("<!-- a b c -->") <= 1 */
#ifndef TPP_HAVE_TOK_HTML_COMMENT
#define TPP_HAVE_TOK_HTML_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-html-comment" */
#endif /* !TPP_HAVE_TOK_HTML_COMMENT */

/* Enable support for recognizing SQL-like comments: `-- like this one!`
 * @detect: #if __TPP_COUNT_TOKENS("-- a b c") <= 1 */
#ifndef TPP_HAVE_TOK_SQL_COMMENT
#define TPP_HAVE_TOK_SQL_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-sql-comment" */
#endif /* !TPP_HAVE_TOK_SQL_COMMENT */

/* Enable support for recognizing deemon-doc-like comments: `@@ like this one!`
 * @detect: #if __TPP_COUNT_TOKENS("@@ a b c") <= 1 */
#ifndef TPP_HAVE_TOK_AT_AT_COMMENT
#define TPP_HAVE_TOK_AT_AT_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-at-at-comment" */
#endif /* !TPP_HAVE_TOK_AT_AT_COMMENT */

/* Enable support for recognizing shell-like comments: `# like this one!`
 *
 * This still works in conjunction with "TPP_HAVE_CPP_DIRECTIVES", in
 * that unknown directives will simply be re-emit as shell comments,
 * and shell comments that don't appear at the start of lines are not
 * even processed as CPP directives.
 * @detect: #if __TPP_COUNT_TOKENS("foo# a b c") <= 2 */
#ifndef TPP_HAVE_TOK_SHELL_COMMENT
#define TPP_HAVE_TOK_SHELL_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-shell-comment" */
#endif /* !TPP_HAVE_TOK_SHELL_COMMENT */

/* Enable support for recognizing `/`-like comments anywhere: `/ like this one!`
 * @detect: #if __TPP_COUNT_TOKENS("foo/ a b c") <= 2 */
#ifndef TPP_HAVE_TOK_SLASH_COMMENT
#define TPP_HAVE_TOK_SLASH_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-slash-comment" */
#endif /* !TPP_HAVE_TOK_SLASH_COMMENT */

/* Enable support for recognizing `@`-like comments anywhere: `@ like this one!`
 * @detect: #if __TPP_COUNT_TOKENS("foo@ a b c") <= 2 */
#ifndef TPP_HAVE_TOK_AT_COMMENT
#define TPP_HAVE_TOK_AT_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-at-comment" */
#endif /* !TPP_HAVE_TOK_AT_COMMENT */

/* Same as `TPP_HAVE_TOK_SHELL_COMMENT`, but only recognized when the `#`
 * appears as the first character of the relevant line, or is preceded by
 * nothing but whitespace.
 *
 * Due to limitations related to when/how the contents of a `tpp_file` can
 * be unloaded, said preceding whitespace will be considered part of the
 * `TPP_TOK_SOL_SHELL_COMMENT` token)
 *
 * @detect: #if __TPP_COUNT_TOKENS("  # a b c") == __TPP_COUNT_TOKENS("# a b c") */
#ifndef TPP_HAVE_TOK_SOL_SHELL_COMMENT
#define TPP_HAVE_TOK_SOL_SHELL_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-sol-shell-comment" */
#endif /* !TPP_HAVE_TOK_SOL_SHELL_COMMENT */

/* Same as `TPP_HAVE_TOK_SLASH_COMMENT`, but only recognized when the `/`
 * appears as the first character of the relevant line, or is preceded by
 * nothing but whitespace (any preceding whitespace will be part of the
 * resulting `TPP_TOK_SOL_SLASH_COMMENT` token; see `TPP_HAVE_TOK_SOL_SHELL_COMMENT`)
 *
 * @detect: #if __TPP_COUNT_TOKENS("  / a b c") == __TPP_COUNT_TOKENS("/ a b c") */
#ifndef TPP_HAVE_TOK_SOL_SLASH_COMMENT
#define TPP_HAVE_TOK_SOL_SLASH_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-sol-slash-comment" */
#endif /* !TPP_HAVE_TOK_SOL_SLASH_COMMENT */

/* Same as `TPP_HAVE_TOK_SLASH_COMMENT`, but only recognized when the `@`
 * appears as the first character of the relevant line, or is preceded by
 * nothing but whitespace (any preceding whitespace will be part of the
 * resulting `TPP_TOK_SOL_AT_COMMENT` token; see `TPP_HAVE_TOK_SOL_SHELL_COMMENT`)
 *
 * @detect: #if __TPP_COUNT_TOKENS("  @ a b c") == __TPP_COUNT_TOKENS("@ a b c") */
#ifndef TPP_HAVE_TOK_SOL_AT_COMMENT
#define TPP_HAVE_TOK_SOL_AT_COMMENT TPP_COMMON_HAVE_TPP_TOK_COMMENT /* "-ftok-sol-at-comment" */
#endif /* !TPP_HAVE_TOK_SOL_AT_COMMENT */



/************************************************************************/
/* Single-char tokens                                                   */
/************************************************************************/

/* When enabled, `$` is treated as its own token, rather than as part of identifiers/keywords.
 * @detect: #if __TPP_COUNT_TOKENS("a$b") == 3 */
#ifndef TPP_HAVE_TOK_DOLLAR
#define TPP_HAVE_TOK_DOLLAR TPP_COMMON_HAVE_TPP_TOK_1CHAR /* "-ftok-dollar" */
#endif /* !TPP_HAVE_TOK_DOLLAR */

/************************************************************************/
/* Number tokens                                                        */
/************************************************************************/

/* XXX: Support for intel-assembler-style hex literals to be treated as TPP_TOK_C_INT:
 * https://en.wikipedia.org/wiki/Hexadecimal#Intel
 *  - FFh  (same as 0xFF)
 *  - ffh  (same as 0xff)
 *  - FFH  (same as 0xFF)
 *  - ffH  (same as 0xFF)
 *
 * XXX: This should get its own token ID
 */

/* Allow use of `_` as a thousands separator `123_456_789`
 * in `TPP_HAVE_TOK_C_INT` and `TPP_HAVE_TOK_C_FLOAT` */
#ifndef TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE
#define TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE (TPP_HAVE_TOK_C_INT ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_DEFAULT) : 0) /* "-fthousands-separator-underscore" */
#endif /* !TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE */

/* Allow use of `'` as a thousands separator `123'456'789`
 * in `TPP_HAVE_TOK_C_INT` and `TPP_HAVE_TOK_C_FLOAT`
 *
 * @detect: #if __TPP_COUNT_TOKENS("123'456'789") == 1 */
#ifndef TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK
#define TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK (TPP_HAVE_TOK_C_INT ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_C_LIKE) : 0) /* "-fthousands-separator-singletick" */
#endif /* !TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK */

/* C-style integer token `123`
 * @detect: #if __TPP_COUNT_TOKENS("123") == 1 */
#ifndef TPP_HAVE_TOK_C_INT
#define TPP_HAVE_TOK_C_INT TPP_COMMON_HAVE_TPP_TOK_GENERIC /* "-ftok-c-int" */
#endif /* !TPP_HAVE_TOK_C_INT */

/* Pascal-style hex token `$DEADBEEF`. When disabled, such constructs would
 * instead be treated as identifiers (depending on `TPP_HAVE_TOK_DOLLAR`) */
#ifndef TPP_HAVE_TOK_PASCAL_HEX
#define TPP_HAVE_TOK_PASCAL_HEX TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-pascal-hex" */
#endif /* !TPP_HAVE_TOK_PASCAL_HEX */

/* C-style float token `123.0`
 * @detect: #if __TPP_COUNT_TOKENS("123.0") == 1 */
#ifndef TPP_HAVE_TOK_C_FLOAT
#define TPP_HAVE_TOK_C_FLOAT TPP_COMMON_HAVE_TPP_TOK_GENERIC /* "-ftok-c-float" */
#endif /* !TPP_HAVE_TOK_C_FLOAT */

/* (Try to) be smarter regarding how float tokens are detected.
 * This tries to detect some syntax-error floating point tokens
 * and terminates them in those places where you must have wanted
 * them to terminate (even though standards say that they should
 * keep going):
 *
 * | Input       | Standard parsing                | Smart parsing                         | Comment  |
 * | ----------- | ------------------------------- | ------------------------------------- | -------- |
 * | `1E2`       | `[FLOAT:1E2]`                   | `[FLOAT:1E2]`                         | - |
 * | `1P2`       | `[INT:1P2]`                     | `[INT:1P2]`                           | - |
 * | `0x1E2`     | `[INT:0x1E2]`                   | `[INT:0x1E2]`                         | - |
 * | `0x1P2`     | `[FLOAT:0x1P2]`                 | `[FLOAT:0x1P2]`                       | - |
 * | `0xE12`     | `[INT:0xE12]`                   | `[INT:0xE12]`                         | - |
 * | `0xE+12`    | `[FLOAT:0xE+12]`                | `[INT:0xE][PLUS:+][INT:12]`           | Exponent after `x` / `X` must use `p` or `P` |
 * | `0x1E+12`   | `[FLOAT:0x1E+12]`               | `[INT:0x1E][PLUS:+][INT:12]`          | Exponent after `x` / `X` must use `p` or `P` |
 * | `0E+12`     | `[FLOAT:0E+12]`                 | `[FLOAT:0E+12]`                       | - |
 * | `0xP12`     | `[FLOAT:0xP12]`                 | `[INT:0xP12]`                         | Exponent cannot directly appear after `x` / `X` |
 * | `0xP+12`    | `[FLOAT:0xP+12]`                | `[INT:0xP][PLUS:+][INT:12]`           | Exponent cannot directly appear after `x` / `X` |
 * | `0x1P12`    | `[FLOAT:0x1P12]`                | `[FLOAT:0x1P12]`                      | - |
 * | `0x1P+12`   | `[FLOAT:0x1P+12]`               | `[FLOAT:0x1P+12]`                     | - |
 * | `0P+12`     | `[FLOAT:0P+12]`                 | `[INT:0P][PLUS:+][INT:12]`            | Without `x` / `X`, must use `e` or `E` for exponents |
 * | `0xA12`     | `[INT:0xA12]`                   | `[INT:0xA12]`                         | - |
 * | `0xA+12`    | `[INT:0xA][PLUS:+][INT:12]`     | `[INT:0xA][PLUS:+][INT:12]`           | - |
 * | `0x1A+12`   | `[INT:0x1A][PLUS:+][INT:12]`    | `[INT:0x1A][PLUS:+][INT:12]`          | - |
 * | `0A+12`     | `[INT:0A][PLUS:+][INT:12]`      | `[INT:0A][PLUS:+][INT:12]`            | - |
 * | `0x0.P12`   | `[FLOAT:0x0.P12]`               | `[FLOAT:0x0.P12]`                     | - |
 * | `0x0.P+12`  | `[FLOAT:0x0.P+12]`              | `[FLOAT:0x0.P+12]`                    | - |
 * | `0x0.1P+12` | `[FLOAT:0x0.1P+12]`             | `[FLOAT:0x0.1P+12]`                   | - |
 * | `0x.P12`    | `[FLOAT:0x.P12]`                | `[FLOAT:0x.P12]`                      | - |
 * | `0x.P+12`   | `[FLOAT:0x.P+12]`               | `[FLOAT:0x.P+12]`                     | - |
 * | `0x.1P+12`  | `[FLOAT:0x.1P+12]`              | `[FLOAT:0x.1P+12]`                    | - |
 * | `0x.E12`    | `[FLOAT:0x.E12]`                | `[FLOAT:0x.E12]`                      | - |
 * | `0x.E+12`   | `[FLOAT:0x.E+12]`               | `[FLOAT:0x.E][PLUS:+][INT:12]`        | With `x` / `X`, must use `p` or `P` for exponents |
 * | `0x.1E+12`  | `[FLOAT:0x.1E+12]`              | `[FLOAT:0x.1E][PLUS:+][INT:12]`       | With `x` / `X`, must use `p` or `P` for exponents |
 * | `0.P+12`    | `[FLOAT:0.P+12]`                | `[INT:0][DOT:.][P:P][PLUS:+][INT:12]` | Without `x` / `X`, must use `e` or `E` for exponents |
 * | `0.E+12`    | `[FLOAT:0.E+12]`                | `[FLOAT:0.E+12]`                      | - |
 * | `0x.A12`    | `[FLOAT:0x.A12]`                | `[FLOAT:0x.A12]`                      | - |
 * | `0x.A+12`   | `[FLOAT:0x.A][PLUS:+][INT:12]`  | `[FLOAT:0x.A][PLUS:+][INT:12]`        | - |
 * | `0x.1A+12`  | `[FLOAT:0x.1A][PLUS:+][INT:12]` | `[FLOAT:0x.1A][PLUS:+][INT:12]`       | - |
 * | `0.A+12`    | `[FLOAT:0.A][PLUS:+][INT:12]`   | `[INT:0][DOT:.][A:A][PLUS:+][INT:12]` | Without `x` / `X`, first character after `.` must be 0-9 |
 * | `012`       | `[INT:012]`                     | `[INT:012]`                           | - |
 * | `0.12`      | `[FLOAT:0.12]`                  | `[FLOAT:0.12]`                        | - |
 * | `0..12`     | `[FLOAT:0..12]`                 | `[INT:0][DOT_DOT:..][INT:12]`         | There can be at most 1 decimal-`.` |
 * | `0foo`      | `[INT:0foo]`                    | `[INT:0foo]`                          | - |
 * | `0.foo`     | `[FLOAT:0.foo]`                 | `[INT:0][DOT:.][foo:foo]`             | Hex-character `f` after `.` requires `x` / `X` |
 * | `0..foo`    | `[FLOAT:0..foo]`                | `[INT:0][DOT_DOT:..][foo:foo]`        | There can be at most 1 decimal-`.` |
 * | `0xfoo`     | `[INT:0xfoo]`                   | `[INT:0xfoo]`                         | - |
 * | `0x.foo`    | `[FLOAT:0x.foo]`                | `[FLOAT:0x.foo]`                      | - |
 * | `0x..foo`   | `[FLOAT:0x..foo]`               | `[INT:0x][DOT_DOT:..][foo:foo]`       | There can be at most 1 decimal-`.` |
 * | `0x1foo`    | `[INT:0x1foo]`                  | `[INT:0x1foo]`                        | - |
 * | `0x1.foo`   | `[FLOAT:0x1.foo]`               | `[FLOAT:0x1.foo]`                     | - |
 * | `0x1..foo`  | `[FLOAT:0x1..foo]`              | `[INT:0x1][DOT_DOT:..][foo:foo]`      | There can be at most 1 decimal-`.` |
 * | `0luz`      | `[INT:0luz]`                    | `[INT:0luz]`                          | - |
 * | `0.luz`     | `[FLOAT:0.luz]`                 | `[INT:0][DOT:.][luz:luz]`             | Character after `.` must be decimal |
 * | `0..luz`    | `[FLOAT:0..luz]`                | `[INT:0][DOT_DOT:..][luz:luz]`        | There can be at most 1 decimal-`.` |
 * | `0xluz`     | `[INT:0xluz]`                   | `[INT:0xluz]`                         | - |
 * | `0x.luz`    | `[FLOAT:0x.luz]`                | `[INT:0x][DOT:.][luz:luz]`            | Character after `.` must be hexadecimal |
 * | `0x..luz`   | `[FLOAT:0x..luz]`               | `[INT:0x][DOT_DOT:..][luz:luz]`       | There can be at most 1 decimal-`.` |
 * | `0x1luz`    | `[INT:0x1luz]`                  | `[INT:0x1luz]`                        | - |
 * | `0x1.luz`   | `[FLOAT:0x1.luz]`               | `[INT:0x1][DOT:.][luz:luz]`           | Character after `.` must be hexadecimal |
 * | `0x1..luz`  | `[FLOAT:0x1..luz]`              | `[INT:0x1][DOT_DOT:..][luz:luz]`      | There can be at most 1 decimal-`.` |
 * | `12`        | `[INT:12]`                      | `[INT:12]`                            | - |
 * | `.12`       | `[FLOAT:.12]`                   | `[FLOAT:.12]`                         | - |
 * | `..12`      | `[DOT_DOT:..][INT:12]`          | `[DOT_DOT:..][INT:12]`                | There can be at most 1 decimal-`.` |
 *
 * @detect: #if __TPP_COUNT_TOKENS("0x1P+12") == 1 && __TPP_COUNT_TOKENS("0xE+12") == 3 */
#ifndef TPP_HAVE_SMART_FLOAT_TOKENS
#define TPP_HAVE_SMART_FLOAT_TOKENS ((TPP_HAVE_PROFILE_DEFAULT && TPP_HAVE_TOK_C_FLOAT) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : TPP_CONF_FEAT1) : 0) /* "-fsmart-float-tokens" */
#endif /* !TPP_HAVE_SMART_FLOAT_TOKENS */

/************************************************************************/
/* String tokens                                                        */
/************************************************************************/

/* XXX: Support for sql-style '-string literals ('' is escape for ', and line-feeds are allowed) */
/* XXX: Support for sql-style "-string literals ("" is escape for ", and line-feeds are allowed) */
/* XXX: Support for sql-style E'foo'-string literals (line-feeds are allowed, and \-escape sequences are handled) */
/* XXX: Support for sql-style E"foo"-string literals (line-feeds are allowed, and \-escape sequences are handled) */
/* XXX: Support for javascript-style `foo` format string literals (use a hook for implementing `${expr}`) */
/* XXX: Support for deemon-style f"foo" / F"foo" format string literals (use a hook for implementing `{expr}`) */
/* XXX: Support for raw block-strings: r"""foo"\"""  -- same as R"(foo"\)" */
/* XXX: Support for raw block-strings: r'''foo'\'''  -- same as R'(foo'\)' */
/* XXX: Support for python bytes-string: b"foo" */
/* XXX: Support for python bytes-string: b'foo' */

/* Support for C character literals: `'foo'`
 * @detect: #if __TPP_COUNT_TOKENS("'foo'") == 1 */
#ifndef TPP_HAVE_TOK_C_CHAR
#define TPP_HAVE_TOK_C_CHAR TPP_COMMON_HAVE_TPP_TOK_GENERIC /* "-ftok-char" */
#endif /* !TPP_HAVE_TOK_C_CHAR */

/* Support for C string literals: `"foo"`
 * @detect: #if __TPP_COUNT_TOKENS('"foo"') == 1 */
#ifndef TPP_HAVE_TOK_C_STRING
#define TPP_HAVE_TOK_C_STRING TPP_COMMON_HAVE_TPP_TOK_GENERIC /* "-ftok-string" */
#endif /* !TPP_HAVE_TOK_C_STRING */

/* Support for string literals: `R"AB(foo)AB"`
 * @detect: #if __TPP_COUNT_TOKENS('R"AB(foo)AB"') == 1 && __TPP_STR_SIZE(R"AB(foo)AB") == 3 */
#ifndef TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
#define TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-raw-string-literal" */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */

/* Support for string literals: `L"foo"`
 * When `TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL` is also enabled, also support `LR"AB(foo)AB")`
 * @detect: #if __TPP_COUNT_TOKENS('L"foo"') == 1 */
#ifndef TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL
#define TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-wide-string-literal" */
#endif /* !TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL */

/* Support for string literals: `u8"foo"`
 * When `TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL` is also enabled, also support `u8R"AB(foo)AB"`
 * @detect: #if __TPP_COUNT_TOKENS('u8"foo"') == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL
#define TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf8-string-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL */

/* Support for string literals: `u"foo"`
 * When `TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL` is also enabled, also support `uR"AB(foo)AB"`
 * @detect: #if __TPP_COUNT_TOKENS('u"foo"') == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL
#define TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf16-string-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL */

/* Support for string literals: `U"foo"`
 * When `TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL` is also enabled, also support `UR"AB(foo)AB"`
 * @detect: #if __TPP_COUNT_TOKENS('U"foo"') == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL
#define TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf32-string-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL */

/* Support for string literals: `R'AB(f)AB'`
 * @detect: #if __TPP_COUNT_TOKENS("R'AB(foo)AB'") == 1 && __TPP_STR_SIZE(R'AB(foo)AB') == 3 */
#ifndef TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
#define TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-raw-char-literal" */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */

/* Support for string literals: `L'f'`
 * When `TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL` is also enabled, also support `LR'AB(f)AB'`
 * @detect: #if __TPP_COUNT_TOKENS("L'f'") == 1 */
#ifndef TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL
#define TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-wide-char-literal" */
#endif /* !TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL */

/* Support for string literals: `u8'f'`
 * When `TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL` is also enabled, also support `u8R'AB(f)AB'`
 * @detect: #if __TPP_COUNT_TOKENS("u8'f'") == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL
#define TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf8-char-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL */

/* Support for string literals: `u'f'`
 * When `TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL` is also enabled, also support `uR'AB(f)AB'`
 * @detect: #if __TPP_COUNT_TOKENS("u'f'") == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL
#define TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf16-char-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL */

/* Support for string literals: `U'f'`
 * When `TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL` is also enabled, also support `UR'AB(f)AB'`
 * @detect: #if __TPP_COUNT_TOKENS("U'f'") == 1 */
#ifndef TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL
#define TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_C_STRING /* "-ftok-cxx-utf32-char-literal" */
#endif /* !TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL */

/* Support for deemon/python-style raw string literals: `r"foo"`
 * @detect: #if __TPP_COUNT_TOKENS('R"foo"') == 1 && __TPP_STR_SIZE(R"AB(foo)AB") == 9 */
#ifndef TPP_HAVE_TOK_RAW_STRING_LITERAL
#define TPP_HAVE_TOK_RAW_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING /* "-ftok-raw-string-literal" */
#endif /* !TPP_HAVE_TOK_RAW_STRING_LITERAL */

/* Support for deemon/python-style raw string literals: `r'bar'`
 * @detect: #if __TPP_COUNT_TOKENS('R"foo"') == 1 && __TPP_STR_SIZE(R'AB(foo)AB') == 9 */
#ifndef TPP_HAVE_TOK_RAW_CHAR_LITERAL
#define TPP_HAVE_TOK_RAW_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING /* "-ftok-raw-char-literal" */
#endif /* !TPP_HAVE_TOK_RAW_CHAR_LITERAL */

/* Support for java-style block string literals: `"""foo"""`
 * @detect: #if __TPP_COUNT_TOKENS('"""\n a\n b"""') == 1 */
#ifndef TPP_HAVE_TOK_BLOCK_STRING_LITERAL
#define TPP_HAVE_TOK_BLOCK_STRING_LITERAL TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING /* "-ftok-block-string-literal" */
#endif /* !TPP_HAVE_TOK_BLOCK_STRING_LITERAL */

/* Support for java-style block string literals (but with single-ticks): `'''foo'''`
 * @detect: #if __TPP_COUNT_TOKENS("'''\n a\n b'''") == 1 */
#ifndef TPP_HAVE_TOK_BLOCK_CHAR_LITERAL
#define TPP_HAVE_TOK_BLOCK_CHAR_LITERAL TPP_COMMON_HAVE_TPP_TOK_DEEMON_STRING /* "-ftok-block-char-literal" */
#endif /* !TPP_HAVE_TOK_BLOCK_CHAR_LITERAL */

/* Support for `\e` (for `U+001B`) escape sequences:
 * ```c
 * printf("Error: \e[31m%d\e[0m", errno);
 * ``` */
#ifndef TPP_HAVE_STRING_ESCAPE_E
#define TPP_HAVE_STRING_ESCAPE_E ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-e" */
#endif /* !TPP_HAVE_STRING_ESCAPE_E */

/* Support for `\s` (for `U+0020`) escape sequences:
 * ```java
 * System.out.println("""
 *     This line has visible trailing whitespace:    \s
 *     """);
 * ```  */
#ifndef TPP_HAVE_STRING_ESCAPE_S
#define TPP_HAVE_STRING_ESCAPE_S ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT0 : 0) : 0) /* "-fstring-escape-s" */
#endif /* !TPP_HAVE_STRING_ESCAPE_S */

/* Support for `\123` octal sequences (with `1`-`3` characters in range `0-7` following the `\`) */
#ifndef TPP_HAVE_STRING_ESCAPE_OCT
#define TPP_HAVE_STRING_ESCAPE_OCT ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-oct" */
#endif /* !TPP_HAVE_STRING_ESCAPE_OCT */

/* Support for `\o{377}` as alias for `\377` */
#ifndef TPP_HAVE_STRING_ESCAPE_OCT_BRACE
#define TPP_HAVE_STRING_ESCAPE_OCT_BRACE ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-oct-brace" */
#endif /* !TPP_HAVE_STRING_ESCAPE_OCT_BRACE */

/* Support for `\o{ 0 037 , 377 }` as alias for `\0\037\377`.
 * This is an extension to `TPP_HAVE_STRING_ESCAPE_OCT_BRACE`,
 * meaning it also requires that extension to be enabled to work. */
#ifndef TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY
#define TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY ((TPP_HAVE_STRING_ESCAPE_OCT_BRACE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 0) : 0) /* "-fstring-escape-oct-brace-many" */
#endif /* !TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY */

/* Support for `\xAB` hex sequences (with `1`-`2` characters in range `0-9`, `a-f`, `A-F` following the `\`)
 * When `TPP_HAVE_STRING_ESCAPE_HEX_BIG` is also enabled, the limit of `2` characters is lifted. */
#ifndef TPP_HAVE_STRING_ESCAPE_HEX
#define TPP_HAVE_STRING_ESCAPE_HEX ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-hex" */
#endif /* !TPP_HAVE_STRING_ESCAPE_HEX */

/* Support for `\xABCDEF` hex sequences. Extension to `TPP_HAVE_STRING_ESCAPE_HEX` that allows more than `2`
 * hex nibbles to be specified. A warning `TPP_W_CHARACTER_TOO_LARGE` is emitted if the hex-sequence is too
 * large to fit into `tpp_uintmax`, or the output string format. */
#ifndef TPP_HAVE_STRING_ESCAPE_HEX_BIG
#define TPP_HAVE_STRING_ESCAPE_HEX_BIG (TPP_HAVE_STRING_ESCAPE_HEX ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT0 : TPP_HAVE_PROFILE_C_LIKE) : 0) /* "-fstring-escape-hex-big" */
#endif /* !TPP_HAVE_STRING_ESCAPE_HEX_BIG */

/* Support for `\o{377}` as alias for `\377` */
#ifndef TPP_HAVE_STRING_ESCAPE_HEX_BRACE
#define TPP_HAVE_STRING_ESCAPE_HEX_BRACE ((TPP_HAVE_STRING_ESCAPE_HEX && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-hex-brace" */
#endif /* !TPP_HAVE_STRING_ESCAPE_HEX_BRACE */

/* Support for `\o{ 0 037 , 377 }` as alias for `\0\037\377`.
 * This is an extension to `TPP_HAVE_STRING_ESCAPE_HEX_BRACE`,
 * meaning it also requires that extension to be enabled to work. */
#ifndef TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY
#define TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY ((TPP_HAVE_STRING_ESCAPE_HEX_BRACE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 0) : 0) /* "-fstring-escape-hex-brace-many" */
#endif /* !TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY */

/* Support for `\u1234` and `\U12345678` unicode ordinal escape sequences. */
#ifndef TPP_HAVE_STRING_ESCAPE_UNI
#define TPP_HAVE_STRING_ESCAPE_UNI ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-uni" */
#endif /* !TPP_HAVE_STRING_ESCAPE_UNI */

/* Support for `\u{12345678}` unicode ordinal escape sequences. */
#ifndef TPP_HAVE_STRING_ESCAPE_UNI_BRACE
#define TPP_HAVE_STRING_ESCAPE_UNI_BRACE ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-uni-brace" */
#endif /* !TPP_HAVE_STRING_ESCAPE_UNI_BRACE */

/* Support for `\u{ 1234 5678 , ABCDEF }` as alias for `\u1234\u5678\U00ABCDEF`.
 * This is an extension to `TPP_HAVE_STRING_ESCAPE_UNI_BRACE`,
 * meaning it also requires that extension to be enabled to work. */
#ifndef TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY
#define TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY ((TPP_HAVE_STRING_ESCAPE_UNI_BRACE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 0) : 0) /* "-fstring-escape-uni-brace-many" */
#endif /* !TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY */

/* Support for `\N{...}` unicode ordinal escape sequences in strings.
 * What actually is allowed within `\N{...}` is controlled by:
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES`
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD`
 * - `TPP_HAVE_ESCAPE_NAMED_XML`
 */
#ifndef TPP_HAVE_STRING_ESCAPE_NAMED
#define TPP_HAVE_STRING_ESCAPE_NAMED ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstring-escape-named" */
#endif /* !TPP_HAVE_STRING_ESCAPE_NAMED */

/* Support for `\N{FOO, BAR}` as alias for `\N{FOO}\N{BAR}`.
 * This is an extension to `TPP_HAVE_STRING_ESCAPE_NAMED` and `TPP_HAVE_STRING_ESCAPE_NAMED`,
 * meaning it takes no effect if neither of those extensions is enabled. */
#ifndef TPP_HAVE_STRING_ESCAPE_NAMED_MANY
#define TPP_HAVE_STRING_ESCAPE_NAMED_MANY (TPP_HAVE_STRING_ESCAPE_NAMED ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : TPP_HAVE_PROFILE_DEFAULT) : 0) /* "-fstring-escape-named-many" */
#endif /* !TPP_HAVE_STRING_ESCAPE_NAMED_MANY */

/* Enable support for large (> 1 byte) character constants in `tpp_lexer_decodestring()` */
#ifndef TPP_HAVE_STRING_ESCAPE_BIGCHAR
#define TPP_HAVE_STRING_ESCAPE_BIGCHAR (TPP_HAVE_PROFILE_NOT_MINIMAL && (TPP_HAVE_STRING_ESCAPE_HEX_BIG || TPP_HAVE_STRING_ESCAPE_HEX_BRACE || TPP_HAVE_STRING_ESCAPE_OCT_BRACE))
#endif /* !TPP_HAVE_STRING_ESCAPE_BIGCHAR */

/* Feature-flag: treat line-feeds like any regular character in string tokens:
 * - `TPP_HAVE_TOK_C_STRING`
 * - `TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL`
 * - `TPP_HAVE_TOK_RAW_STRING_LITERAL`
 * - `TPP_HAVE_TOK_C_CHAR`
 * - `TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL`
 * - `TPP_HAVE_TOK_RAW_CHAR_LITERAL`
 *
 * When this flag is disabled, line-feeds in such string tokens will instead
 * terminate the string, and cause a `TPP_W_STRING_TERMINATED_BY_LINEFEED`
 * warning to be emitted.
 *
 * @detect: #if __TPP_COUNT_TOKENS("\"\n\"") == 1 */
#ifndef TPP_HAVE_STRING_ALLOW_MULTILINE
#define TPP_HAVE_STRING_ALLOW_MULTILINE (TPP_HAVE_PROFILE_NOT_MINIMAL ? TPP_CONF_FEAT0 : 0) /* "-fstring-allow-multiline" */
#endif /* !TPP_HAVE_STRING_ALLOW_MULTILINE */

/* Alter behavior of `TPP_HAVE_STRING_ALLOW_MULTILINE`
 * (that only takes effect when that feature is enabled):
 * - Multi-line strings continue to be allowed (does not affect behavior)
 * - When a multi-line string is encountered, emit a
 *   warning `TPP_W_STRING_CONTINUED_AFTER_LINEFEED`
 *   (see `TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED`)
 *
 * If this warning isn't wanted, it can be disabled by `-Wno-multiline-string` */
#ifndef TPP_HAVE_STRING_WARN_MULTILINE
#define TPP_HAVE_STRING_WARN_MULTILINE \
	(TPP_HAVE_STRING_ALLOW_MULTILINE && TPP_HAVE_WARNINGS)
#endif /* !TPP_HAVE_STRING_WARN_MULTILINE */

/* Enable support for automatic concatenation of adjacent string tokens.
 * This affects the behavior of `tpp_lexer_parsestring_ex()` and its
 * companion `tpp_lexer_parsestring_cb()`, such that they will only yield
 * to the next token, but not check if that next token might be another
 * string.
 *
 * This feature should always be enabled for C/C++ (since their standards
 * mandate that adjacent string tokens be joined into a single literal),
 * but other languages might not want such behavior.
 *
 * WARNING: TPP will automatically join any type of string-like-token with any
 *          other when this feature is enabled (e.g. `"FOO" 'BAR' R"AB(BAZ)AB"`
 *          becomes a single string literal `"FOOBARBAZ"`)
 */
#ifndef TPP_HAVE_STRING_AUTO_CONCAT
#define TPP_HAVE_STRING_AUTO_CONCAT ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_NOT_MINIMAL) /* "-fstring-auto-concat" */
#endif /* !TPP_HAVE_STRING_AUTO_CONCAT */


/* Enable API support for `tpp_decode_named_escape()`, which can be used to
 * decode the contents of `\N{...}` escape sequences. Needed to implement
 * `TPP_HAVE_STRING_ESCAPE_NAMED` and `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED`,
 * whilst implementing the rules specified by:
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES`
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD`
 * - `TPP_HAVE_ESCAPE_NAMED_XML` */
#ifndef TPP_HAVE_DECODE_NAMED_ESCAPE
#define TPP_HAVE_DECODE_NAMED_ESCAPE (TPP_HAVE_STRING_ESCAPE_NAMED || TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
#endif /* !TPP_HAVE_DECODE_NAMED_ESCAPE */


/* Support for unicode names in `\N` like `\N{LATIN SMALL LETTER B}`.
 * This feature affects the behavior of:
 * - `TPP_HAVE_STRING_ESCAPE_NAMED`
 * - `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED`
 *
 * Recognized names here are as defined by:
 * - https://www.unicode.org/Public/14.0.0/ucd/NamesList.txt
 */
#ifndef TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES
#define TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES (TPP_HAVE_DECODE_NAMED_ESCAPE ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : 1) : 0) /* "-fnamed-escape-unicode" */
#endif /* !TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES */

/* Support for unicode names in `\N` (all of which are the same as `\u0100`):
 * - `\N{U+0100}`
 * - `\N{U+100}`
 * - `\N{U+000100}`
 * - `\N{0x0100}`
 * - `\N{256}`
 *
 * This feature affects the behavior of:
 * - `TPP_HAVE_STRING_ESCAPE_NAMED`
 * - `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED` */
#ifndef TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD
#define TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD (TPP_HAVE_DECODE_NAMED_ESCAPE ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : TPP_HAVE_PROFILE_DEFAULT) : 0) /* "-fnamed-escape-ord" */
#endif /* !TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD */

/* Support for XML/HTML5 names in `\N`: `\N{&tab;}`
 *
 * This feature affects the behavior of:
 * - `TPP_HAVE_STRING_ESCAPE_NAMED`
 * - `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED` */
#ifndef TPP_HAVE_ESCAPE_NAMED_XML
#define TPP_HAVE_ESCAPE_NAMED_XML (TPP_HAVE_DECODE_NAMED_ESCAPE ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_FEAT1 : 0) : 0) /* "-fnamed-escape-xml" */
#endif /* !TPP_HAVE_ESCAPE_NAMED_XML */


#undef TPP_HAVE_TOK_INT
#if TPP_HAVE_TOK_C_INT || TPP_HAVE_TOK_PASCAL_HEX
#define TPP_HAVE_TOK_INT 1
#else /* TPP_HAVE_TOK_C_INT || TPP_HAVE_TOK_PASCAL_HEX */
#define TPP_HAVE_TOK_INT 0
#endif /* !TPP_HAVE_TOK_C_INT && !TPP_HAVE_TOK_PASCAL_HEX */
#undef TPP_HAVE_TOK_FLOAT
#if TPP_HAVE_TOK_C_FLOAT
#define TPP_HAVE_TOK_FLOAT 1
#else /* TPP_HAVE_TOK_C_FLOAT */
#define TPP_HAVE_TOK_FLOAT 0
#endif /* !TPP_HAVE_TOK_C_FLOAT */
#undef TPP_HAVE_TOK_COMMENTLIKE_NOLINE
#if (TPP_HAVE_TOK_C_COMMENT ||      \
     TPP_HAVE_TOK_PASCAL_COMMENT || \
     TPP_HAVE_TOK_HTML_COMMENT)
#define TPP_HAVE_TOK_COMMENTLIKE_NOLINE 1
#else /* ... */
#define TPP_HAVE_TOK_COMMENTLIKE_NOLINE 0
#endif /* !... */
#undef TPP_HAVE_TOK_COMMENTLIKE_SOL_LINE
#if (TPP_HAVE_TOK_SOL_SHELL_COMMENT || \
     TPP_HAVE_TOK_SOL_SLASH_COMMENT || \
     TPP_HAVE_TOK_SOL_AT_COMMENT)
#define TPP_HAVE_TOK_COMMENTLIKE_SOL_LINE 1
#else /* ... */
#define TPP_HAVE_TOK_COMMENTLIKE_SOL_LINE 0
#endif /* !... */
#undef TPP_HAVE_TOK_COMMENTLIKE_LINE
#if (TPP_HAVE_TOK_CXX_COMMENT ||   \
     TPP_HAVE_TOK_SQL_COMMENT ||   \
     TPP_HAVE_TOK_SHELL_COMMENT || \
     TPP_HAVE_TOK_SLASH_COMMENT || \
     TPP_HAVE_TOK_AT_COMMENT ||    \
     TPP_HAVE_TOK_COMMENTLIKE_SOL_LINE)
#define TPP_HAVE_TOK_COMMENTLIKE_LINE 1
#else /* ... */
#define TPP_HAVE_TOK_COMMENTLIKE_LINE 0
#endif /* !... */
#undef TPP_HAVE_TOK_COMMENTLIKE
#if (TPP_HAVE_TOK_COMMENTLIKE_NOLINE || \
     TPP_HAVE_TOK_COMMENTLIKE_LINE)
#define TPP_HAVE_TOK_COMMENTLIKE 1
#else /* ... */
#define TPP_HAVE_TOK_COMMENTLIKE 0
#endif /* !... */
#undef TPP_HAVE_TOK_STRINGLIKE_SQUOTE
#if (TPP_HAVE_TOK_C_CHAR ||                 \
     TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL ||   \
     TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL || \
     TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL || \
     TPP_HAVE_TOK_RAW_CHAR_LITERAL ||       \
     TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
#define TPP_HAVE_TOK_STRINGLIKE_SQUOTE 1
#else /* ... */
#define TPP_HAVE_TOK_STRINGLIKE_SQUOTE 0
#endif /* !... */
#undef TPP_HAVE_TOK_STRINGLIKE_DQUOTE
#if (TPP_HAVE_TOK_C_STRING ||                 \
     TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL ||   \
     TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL || \
     TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL || \
     TPP_HAVE_TOK_RAW_STRING_LITERAL ||       \
     TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
#define TPP_HAVE_TOK_STRINGLIKE_DQUOTE 1
#else /* ... */
#define TPP_HAVE_TOK_STRINGLIKE_DQUOTE 0
#endif /* !... */
#undef TPP_HAVE_TOK_STRINGLIKE
#if (TPP_HAVE_TOK_STRINGLIKE_SQUOTE || \
     TPP_HAVE_TOK_STRINGLIKE_DQUOTE)
#define TPP_HAVE_TOK_STRINGLIKE 1
#else /* ... */
#define TPP_HAVE_TOK_STRINGLIKE 0
#endif /* !... */
#undef TPP_HAVE_STRING_ESCAPE
#if (TPP_HAVE_TOK_C_STRING ||                 \
     TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL || \
     TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL || \
     TPP_HAVE_TOK_BLOCK_STRING_LITERAL ||     \
     TPP_HAVE_TOK_C_CHAR ||                   \
     TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL ||    \
     TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL ||    \
     TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL ||   \
     TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL ||   \
     TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
#define TPP_HAVE_STRING_ESCAPE 1
#else /* ... */
#define TPP_HAVE_STRING_ESCAPE 0
#endif /* !... */

/************************************************************************/
/* Multi-char tokens                                                    */
/************************************************************************/

/* "!!"
 * @detect: #if __TPP_COUNT_TOKENS("!!") == 1 */
#ifndef TPP_HAVE_TOK_EXCLAIM_EXCLAIM
#define TPP_HAVE_TOK_EXCLAIM_EXCLAIM TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-exclaim_exclaim" */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EXCLAIM */

/* "!="
 * @detect: #if __TPP_COUNT_TOKENS("!=") == 1 */
#ifndef TPP_HAVE_TOK_EXCLAIM_EQUAL
#define TPP_HAVE_TOK_EXCLAIM_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-exclaim_equal" */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EQUAL */

/* "!=="
 * @detect: #if __TPP_COUNT_TOKENS("!==") == 1 */
#ifndef TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL
#define TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-exclaim_equal_equal" */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL */

/* "##"
 * @detect: #if __TPP_COUNT_TOKENS("##") == 1 */
#ifndef TPP_HAVE_TOK_POUND_POUND
#define TPP_HAVE_TOK_POUND_POUND (TPP_CONF_IS_RT(TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS) ? TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS : (TPP_HAVE_GLUE_MACRO_ARGUMENT || TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)) /* "-ftok-pound_pound" */
#endif /* !TPP_HAVE_TOK_POUND_POUND */

/* "%%"
 * @detect: #if __TPP_COUNT_TOKENS("%%") == 1 */
#ifndef TPP_HAVE_TOK_PERCENT_PERCENT
#define TPP_HAVE_TOK_PERCENT_PERCENT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-percent_percent" */
#endif /* !TPP_HAVE_TOK_PERCENT_PERCENT */

/* "%%="
 * @detect: #if __TPP_COUNT_TOKENS("%%=") == 1 */
#ifndef TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL
#define TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-percent_percent_equal" */
#endif /* !TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL */

/* "%="
 * @detect: #if __TPP_COUNT_TOKENS("%=") == 1 */
#ifndef TPP_HAVE_TOK_PERCENT_EQUAL
#define TPP_HAVE_TOK_PERCENT_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-percent_equal" */
#endif /* !TPP_HAVE_TOK_PERCENT_EQUAL */

/* "&&"
 * @detect: #if __TPP_COUNT_TOKENS("&&") == 1 */
#ifndef TPP_HAVE_TOK_AMP_AMP
#define TPP_HAVE_TOK_AMP_AMP TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-amp_amp" */
#endif /* !TPP_HAVE_TOK_AMP_AMP */

/* "&="
 * @detect: #if __TPP_COUNT_TOKENS("&=") == 1 */
#ifndef TPP_HAVE_TOK_AMP_EQUAL
#define TPP_HAVE_TOK_AMP_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-amp_equal" */
#endif /* !TPP_HAVE_TOK_AMP_EQUAL */

/* "**"
 * @detect: #if __TPP_COUNT_TOKENS("**") == 1 */
#ifndef TPP_HAVE_TOK_STAR_STAR
#define TPP_HAVE_TOK_STAR_STAR TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-star_star" */
#endif /* !TPP_HAVE_TOK_STAR_STAR */

/* "**="
 * @detect: #if __TPP_COUNT_TOKENS("**=") == 1 */
#ifndef TPP_HAVE_TOK_STAR_STAR_EQUAL
#define TPP_HAVE_TOK_STAR_STAR_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-star_star_equal" */
#endif /* !TPP_HAVE_TOK_STAR_STAR_EQUAL */

/* "*."
 * @detect: #if __TPP_COUNT_TOKENS("*.") == 1 */
#ifndef TPP_HAVE_TOK_STAR_DOT
#define TPP_HAVE_TOK_STAR_DOT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-star_dot" */
#endif /* !TPP_HAVE_TOK_STAR_DOT */

/* "*<-"
 * @detect: #if __TPP_COUNT_TOKENS("*<-") == 1 */
#ifndef TPP_HAVE_TOK_STAR_LANGLE_MINUS
#define TPP_HAVE_TOK_STAR_LANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-star_langle_minus" */
#endif /* !TPP_HAVE_TOK_STAR_LANGLE_MINUS */

/* "*="
 * @detect: #if __TPP_COUNT_TOKENS("*=") == 1 */
#ifndef TPP_HAVE_TOK_STAR_EQUAL
#define TPP_HAVE_TOK_STAR_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-star_equal" */
#endif /* !TPP_HAVE_TOK_STAR_EQUAL */

/* "++"
 * @detect: #if __TPP_COUNT_TOKENS("++") == 1 */
#ifndef TPP_HAVE_TOK_PLUS_PLUS
#define TPP_HAVE_TOK_PLUS_PLUS TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-plus_plus" */
#endif /* !TPP_HAVE_TOK_PLUS_PLUS */

/* "+="
 * @detect: #if __TPP_COUNT_TOKENS("+=") == 1 */
#ifndef TPP_HAVE_TOK_PLUS_EQUAL
#define TPP_HAVE_TOK_PLUS_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-plus_equal" */
#endif /* !TPP_HAVE_TOK_PLUS_EQUAL */

/* "--"  (WARNING: This token conflicts with TPP_HAVE_TOK_SQL_COMMENT)
 * @detect: #if __TPP_COUNT_TOKENS("--") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_MINUS
#define TPP_HAVE_TOK_MINUS_MINUS TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-minus_minus" */
#endif /* !TPP_HAVE_TOK_MINUS_MINUS */

/* "-<"
 * @detect: #if __TPP_COUNT_TOKENS("-<") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_LANGLE
#define TPP_HAVE_TOK_MINUS_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-minus_langle" */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE */

/* "-<<"
 * @detect: #if __TPP_COUNT_TOKENS("-<<") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_LANGLE_LANGLE
#define TPP_HAVE_TOK_MINUS_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-minus_langle_langle" */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE_LANGLE */

/* "-<<<"
 * @detect: #if __TPP_COUNT_TOKENS("-<<<") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE
#define TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-minus_langle_langle_langle" */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE */

/* "-="
 * @detect: #if __TPP_COUNT_TOKENS("-=") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_EQUAL
#define TPP_HAVE_TOK_MINUS_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-minus_equal" */
#endif /* !TPP_HAVE_TOK_MINUS_EQUAL */

/* "->"
 * @detect: #if __TPP_COUNT_TOKENS("->") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_RANGLE
#define TPP_HAVE_TOK_MINUS_RANGLE TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-minus_rangle" */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE */

/* "->*"
 * @detect: #if __TPP_COUNT_TOKENS("->*") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_RANGLE_STAR
#define TPP_HAVE_TOK_MINUS_RANGLE_STAR TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS /* "-ftok-minus_rangle_star" */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_STAR */

/* "->>"
 * @detect: #if __TPP_COUNT_TOKENS("->>") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_RANGLE_RANGLE
#define TPP_HAVE_TOK_MINUS_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-minus_rangle_rangle" */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_RANGLE */

/* "->>>"
 * @detect: #if __TPP_COUNT_TOKENS("->>>") == 1 */
#ifndef TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE
#define TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-minus_rangle_rangle_rangle" */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE */

/* ".*"
 * @detect: #if __TPP_COUNT_TOKENS(".*") == 1 */
#ifndef TPP_HAVE_TOK_DOT_STAR
#define TPP_HAVE_TOK_DOT_STAR TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS /* "-ftok-dot_star" */
#endif /* !TPP_HAVE_TOK_DOT_STAR */

/* ".."
 * @detect: #if __TPP_COUNT_TOKENS("..") == 1 */
#ifndef TPP_HAVE_TOK_DOT_DOT
#define TPP_HAVE_TOK_DOT_DOT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-dot_dot" */
#endif /* !TPP_HAVE_TOK_DOT_DOT */

/* "..."
 * @detect: #if __TPP_COUNT_TOKENS("...") == 1 */
#ifndef TPP_HAVE_TOK_DOT_DOT_DOT
#define TPP_HAVE_TOK_DOT_DOT_DOT (TPP_CONF_IS_RT(TPP_COMMON_HAVE_TPP_TOK_C_TOKENS) ? TPP_COMMON_HAVE_TPP_TOK_C_TOKENS : (TPP_COMMON_HAVE_TPP_TOK_C_TOKENS || TPP_HAVE_VA_ARGS_IN_MACROS || TPP_HAVE_NAMED_VARARGS_IN_MACROS)) /* "-ftok-dot_dot_dot" */
#endif /* !TPP_HAVE_TOK_DOT_DOT_DOT */

/* "//"  (WARNING: This token conflicts with TPP_HAVE_TOK_CXX_COMMENT)
 * @detect: #if __TPP_COUNT_TOKENS("//") == 1 */
#ifndef TPP_HAVE_TOK_SLASH_SLASH
#define TPP_HAVE_TOK_SLASH_SLASH TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-slash_slash" */
#endif /* !TPP_HAVE_TOK_SLASH_SLASH */

/* "//="  (WARNING: This token conflicts with TPP_HAVE_TOK_CXX_COMMENT)
 * @detect: #if __TPP_COUNT_TOKENS("//=") == 1 */
#ifndef TPP_HAVE_TOK_SLASH_SLASH_EQUAL
#define TPP_HAVE_TOK_SLASH_SLASH_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-slash_slash_equal" */
#endif /* !TPP_HAVE_TOK_SLASH_SLASH_EQUAL */

/* "/="
 * @detect: #if __TPP_COUNT_TOKENS("/=") == 1 */
#ifndef TPP_HAVE_TOK_SLASH_EQUAL
#define TPP_HAVE_TOK_SLASH_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-slash_equal" */
#endif /* !TPP_HAVE_TOK_SLASH_EQUAL */

/* "::"
 * @detect: #if __TPP_COUNT_TOKENS("::") == 1 */
#ifndef TPP_HAVE_TOK_COLON_COLON
#define TPP_HAVE_TOK_COLON_COLON TPP_COMMON_HAVE_TPP_TOK_CXX_TOKENS /* "-ftok-colon_colon" */
#endif /* !TPP_HAVE_TOK_COLON_COLON */

/* ":="
 * @detect: #if __TPP_COUNT_TOKENS(":=") == 1 */
#ifndef TPP_HAVE_TOK_COLON_EQUAL
#define TPP_HAVE_TOK_COLON_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-colon_equal" */
#endif /* !TPP_HAVE_TOK_COLON_EQUAL */

/* "<-"
 * @detect: #if __TPP_COUNT_TOKENS("<-") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_MINUS
#define TPP_HAVE_TOK_LANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_minus" */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS */

/* "<-<"
 * @detect: #if __TPP_COUNT_TOKENS("<-<") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_MINUS_LANGLE
#define TPP_HAVE_TOK_LANGLE_MINUS_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_minus_langle" */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS_LANGLE */

/* "<->"
 * @detect: #if __TPP_COUNT_TOKENS("<->") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_MINUS_RANGLE
#define TPP_HAVE_TOK_LANGLE_MINUS_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_minus_rangle" */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS_RANGLE */

/* "<<"
 * @detect: #if __TPP_COUNT_TOKENS("<<") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE
#define TPP_HAVE_TOK_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-langle_langle" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE */

/* "<<-"
 * @detect: #if __TPP_COUNT_TOKENS("<<-") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE_MINUS
#define TPP_HAVE_TOK_LANGLE_LANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_langle_minus" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_MINUS */

/* "<<<"
 * @detect: #if __TPP_COUNT_TOKENS("<<<") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE
#define TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_langle_langle" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE */

/* "<<<-"
 * @detect: #if __TPP_COUNT_TOKENS("<<<-") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS
#define TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_langle_langle_minus" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS */

/* "<<<="
 * @detect: #if __TPP_COUNT_TOKENS("<<<=") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL
#define TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_langle_langle_equal" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL */

/* "<<="
 * @detect: #if __TPP_COUNT_TOKENS("<<=") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL
#define TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-langle_langle_equal" */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL */

/* "<="
 * @detect: #if __TPP_COUNT_TOKENS("<=") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_EQUAL
#define TPP_HAVE_TOK_LANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-langle_equal" */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL */

/* "<=<"
 * @detect: #if __TPP_COUNT_TOKENS("<=<") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE
#define TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_equal_langle" */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE */

/* "<=>"
 * @detect: #if __TPP_COUNT_TOKENS("<=>") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE
#define TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_equal_rangle" */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE */

/* "<>"
 * @detect: #if __TPP_COUNT_TOKENS("<>") == 1 */
#ifndef TPP_HAVE_TOK_LANGLE_RANGLE
#define TPP_HAVE_TOK_LANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-langle_rangle" */
#endif /* !TPP_HAVE_TOK_LANGLE_RANGLE */

/* "=!"
 * @detect: #if __TPP_COUNT_TOKENS("=!") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_EXCLAIM
#define TPP_HAVE_TOK_EQUAL_EXCLAIM TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_exclaim" */
#endif /* !TPP_HAVE_TOK_EQUAL_EXCLAIM */

/* "=%"
 * @detect: #if __TPP_COUNT_TOKENS("=%") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_PERCENT
#define TPP_HAVE_TOK_EQUAL_PERCENT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_percent" */
#endif /* !TPP_HAVE_TOK_EQUAL_PERCENT */

/* "=%%"
 * @detect: #if __TPP_COUNT_TOKENS("=%%") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT
#define TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_percent_percent" */
#endif /* !TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT */

/* "=&"
 * @detect: #if __TPP_COUNT_TOKENS("=&") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_AMP
#define TPP_HAVE_TOK_EQUAL_AMP TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_amp" */
#endif /* !TPP_HAVE_TOK_EQUAL_AMP */

/* "=*"
 * @detect: #if __TPP_COUNT_TOKENS("=*") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_STAR
#define TPP_HAVE_TOK_EQUAL_STAR TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_star" */
#endif /* !TPP_HAVE_TOK_EQUAL_STAR */

/* "=**"
 * @detect: #if __TPP_COUNT_TOKENS("=**") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_STAR_STAR
#define TPP_HAVE_TOK_EQUAL_STAR_STAR TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_star_star" */
#endif /* !TPP_HAVE_TOK_EQUAL_STAR_STAR */

/* "=+"
 * @detect: #if __TPP_COUNT_TOKENS("=+") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_PLUS
#define TPP_HAVE_TOK_EQUAL_PLUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_plus" */
#endif /* !TPP_HAVE_TOK_EQUAL_PLUS */

/* "=-"
 * @detect: #if __TPP_COUNT_TOKENS("=-") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_MINUS
#define TPP_HAVE_TOK_EQUAL_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_minus" */
#endif /* !TPP_HAVE_TOK_EQUAL_MINUS */

/* "=/"
 * @detect: #if __TPP_COUNT_TOKENS("=/") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_SLASH
#define TPP_HAVE_TOK_EQUAL_SLASH TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_slash" */
#endif /* !TPP_HAVE_TOK_EQUAL_SLASH */

/* "=//"  (WARNING: This token conflicts with TPP_HAVE_TOK_CXX_COMMENT)
 * @detect: #if __TPP_COUNT_TOKENS("=//") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_SLASH_SLASH
#define TPP_HAVE_TOK_EQUAL_SLASH_SLASH TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_slash_slash" */
#endif /* !TPP_HAVE_TOK_EQUAL_SLASH_SLASH */

/* "=:"
 * @detect: #if __TPP_COUNT_TOKENS("=:") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_COLON
#define TPP_HAVE_TOK_EQUAL_COLON TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_colon" */
#endif /* !TPP_HAVE_TOK_EQUAL_COLON */

/* "=<"
 * @detect: #if __TPP_COUNT_TOKENS("=<") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_LANGLE
#define TPP_HAVE_TOK_EQUAL_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_langle" */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE */

/* "=<<"
 * @detect: #if __TPP_COUNT_TOKENS("=<<") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE
#define TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_langle_langle" */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE */

/* "=<<<"
 * @detect: #if __TPP_COUNT_TOKENS("=<<<") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE
#define TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_langle_langle_langle" */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE */

/* "=="
 * @detect: #if __TPP_COUNT_TOKENS("==") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_EQUAL
#define TPP_HAVE_TOK_EQUAL_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-equal_equal" */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL */

/* "==!"
 * @detect: #if __TPP_COUNT_TOKENS("==!") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM
#define TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_equal_exclaim" */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM */

/* "==="
 * @detect: #if __TPP_COUNT_TOKENS("===") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL
#define TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_equal_equal" */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL */

/* "=>"
 * @detect: #if __TPP_COUNT_TOKENS("=>") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_RANGLE
#define TPP_HAVE_TOK_EQUAL_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_rangle" */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE */

/* "=>>"
 * @detect: #if __TPP_COUNT_TOKENS("=>>") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE
#define TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_rangle_rangle" */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE */

/* "=>>>"
 * @detect: #if __TPP_COUNT_TOKENS("=>>>") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE
#define TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_rangle_rangle_rangle" */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE */

/* "=?"
 * @detect: #if __TPP_COUNT_TOKENS("=?") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_QMARK
#define TPP_HAVE_TOK_EQUAL_QMARK TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_qmark" */
#endif /* !TPP_HAVE_TOK_EQUAL_QMARK */

/* "=@"
 * @detect: #if __TPP_COUNT_TOKENS("=@") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_AT
#define TPP_HAVE_TOK_EQUAL_AT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_at" */
#endif /* !TPP_HAVE_TOK_EQUAL_AT */

/* "=@@"
 * @detect: #if __TPP_COUNT_TOKENS("=@@") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_AT_AT
#define TPP_HAVE_TOK_EQUAL_AT_AT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_at_at" */
#endif /* !TPP_HAVE_TOK_EQUAL_AT_AT */

/* "=^"
 * @detect: #if __TPP_COUNT_TOKENS("=^") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_HAT
#define TPP_HAVE_TOK_EQUAL_HAT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_hat" */
#endif /* !TPP_HAVE_TOK_EQUAL_HAT */

/* "=|"
 * @detect: #if __TPP_COUNT_TOKENS("=|") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_PIPE
#define TPP_HAVE_TOK_EQUAL_PIPE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_pipe" */
#endif /* !TPP_HAVE_TOK_EQUAL_PIPE */

/* "=~"
 * @detect: #if __TPP_COUNT_TOKENS("=~") == 1 */
#ifndef TPP_HAVE_TOK_EQUAL_TILDE
#define TPP_HAVE_TOK_EQUAL_TILDE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-equal_tilde" */
#endif /* !TPP_HAVE_TOK_EQUAL_TILDE */

/* ">-"
 * @detect: #if __TPP_COUNT_TOKENS(">-") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_MINUS
#define TPP_HAVE_TOK_RANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_minus" */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS */

/* ">-<"
 * @detect: #if __TPP_COUNT_TOKENS(">-<") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_MINUS_LANGLE
#define TPP_HAVE_TOK_RANGLE_MINUS_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_minus_langle" */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS_LANGLE */

/* ">->"
 * @detect: #if __TPP_COUNT_TOKENS(">->") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_MINUS_RANGLE
#define TPP_HAVE_TOK_RANGLE_MINUS_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_minus_rangle" */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS_RANGLE */

/* "><"
 * @detect: #if __TPP_COUNT_TOKENS("><") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_LANGLE
#define TPP_HAVE_TOK_RANGLE_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_langle" */
#endif /* !TPP_HAVE_TOK_RANGLE_LANGLE */

/* ">="
 * @detect: #if __TPP_COUNT_TOKENS(">=") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_EQUAL
#define TPP_HAVE_TOK_RANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-rangle_equal" */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL */

/* ">=<"
 * @detect: #if __TPP_COUNT_TOKENS(">=<") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE
#define TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_equal_langle" */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE */

/* ">=>"
 * @detect: #if __TPP_COUNT_TOKENS(">=>") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE
#define TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_equal_rangle" */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE */

/* ">>"
 * @detect: #if __TPP_COUNT_TOKENS(">>") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE
#define TPP_HAVE_TOK_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-rangle_rangle" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE */

/* ">>-"
 * @detect: #if __TPP_COUNT_TOKENS(">>-") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE_MINUS
#define TPP_HAVE_TOK_RANGLE_RANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_rangle_minus" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_MINUS */

/* ">>="
 * @detect: #if __TPP_COUNT_TOKENS(">>=") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL
#define TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-rangle_rangle_equal" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL */

/* ">>>"
 * @detect: #if __TPP_COUNT_TOKENS(">>>") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE
#define TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_rangle_rangle" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE */

/* ">>>-"
 * @detect: #if __TPP_COUNT_TOKENS(">>>-") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS
#define TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_rangle_rangle_minus" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS */

/* ">>>="
 * @detect: #if __TPP_COUNT_TOKENS(">>>=") == 1 */
#ifndef TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL
#define TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-rangle_rangle_rangle_equal" */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL */

/* "?="
 * @detect: #if __TPP_COUNT_TOKENS("?=") == 1 */
#ifndef TPP_HAVE_TOK_QMARK_EQUAL
#define TPP_HAVE_TOK_QMARK_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-qmark_equal" */
#endif /* !TPP_HAVE_TOK_QMARK_EQUAL */

/* "??"
 * @detect: #if __TPP_COUNT_TOKENS("??") == 1 */
#ifndef TPP_HAVE_TOK_QMARK_QMARK
#define TPP_HAVE_TOK_QMARK_QMARK TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-qmark_qmark" */
#endif /* !TPP_HAVE_TOK_QMARK_QMARK */

/* "@="
 * @detect: #if __TPP_COUNT_TOKENS("@=") == 1 */
#ifndef TPP_HAVE_TOK_AT_EQUAL
#define TPP_HAVE_TOK_AT_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-at_equal" */
#endif /* !TPP_HAVE_TOK_AT_EQUAL */

/* "@@"
 * @detect: #if __TPP_COUNT_TOKENS("@@") == 1 */
#ifndef TPP_HAVE_TOK_AT_AT
#define TPP_HAVE_TOK_AT_AT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-at_at" */
#endif /* !TPP_HAVE_TOK_AT_AT */

/* "@@="
 * @detect: #if __TPP_COUNT_TOKENS("@@=") == 1 */
#ifndef TPP_HAVE_TOK_AT_AT_EQUAL
#define TPP_HAVE_TOK_AT_AT_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-at_at_equal" */
#endif /* !TPP_HAVE_TOK_AT_AT_EQUAL */

/* "^="
 * @detect: #if __TPP_COUNT_TOKENS("^=") == 1 */
#ifndef TPP_HAVE_TOK_HAT_EQUAL
#define TPP_HAVE_TOK_HAT_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-hat_equal" */
#endif /* !TPP_HAVE_TOK_HAT_EQUAL */

/* "^^"
 * @detect: #if __TPP_COUNT_TOKENS("^^") == 1 */
#ifndef TPP_HAVE_TOK_HAT_HAT
#define TPP_HAVE_TOK_HAT_HAT TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-hat_hat" */
#endif /* !TPP_HAVE_TOK_HAT_HAT */

/* "|="
 * @detect: #if __TPP_COUNT_TOKENS("|=") == 1 */
#ifndef TPP_HAVE_TOK_PIPE_EQUAL
#define TPP_HAVE_TOK_PIPE_EQUAL TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-pipe_equal" */
#endif /* !TPP_HAVE_TOK_PIPE_EQUAL */

/* "||"
 * @detect: #if __TPP_COUNT_TOKENS("||") == 1 */
#ifndef TPP_HAVE_TOK_PIPE_PIPE
#define TPP_HAVE_TOK_PIPE_PIPE TPP_COMMON_HAVE_TPP_TOK_C_TOKENS /* "-ftok-pipe_pipe" */
#endif /* !TPP_HAVE_TOK_PIPE_PIPE */

/* "~="
 * @detect: #if __TPP_COUNT_TOKENS("~=") == 1 */
#ifndef TPP_HAVE_TOK_TILDE_EQUAL
#define TPP_HAVE_TOK_TILDE_EQUAL TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-tilde_equal" */
#endif /* !TPP_HAVE_TOK_TILDE_EQUAL */

/* "~~"
 * @detect: #if __TPP_COUNT_TOKENS("~~") == 1 */
#ifndef TPP_HAVE_TOK_TILDE_TILDE
#define TPP_HAVE_TOK_TILDE_TILDE TPP_COMMON_HAVE_TPP_TOK_MISC_TOKENS /* "-ftok-tilde_tilde" */
#endif /* !TPP_HAVE_TOK_TILDE_TILDE */

#undef TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM
#if TPP_HAVE_TOK_EXCLAIM_EXCLAIM || TPP_HAVE_TOK_EXCLAIM_EQUAL || TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_POUND
#if TPP_HAVE_TOK_POUND_POUND
#define TPP_HAVE_TOK_MC_STARTSWITH_POUND 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_POUND 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_PERCENT
#if TPP_HAVE_TOK_PERCENT_PERCENT || TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL || TPP_HAVE_TOK_PERCENT_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_PERCENT 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_PERCENT 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_AMP
#if TPP_HAVE_TOK_AMP_AMP || TPP_HAVE_TOK_AMP_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_AMP 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_AMP 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_STAR
#if TPP_HAVE_TOK_STAR_STAR || TPP_HAVE_TOK_STAR_STAR_EQUAL || TPP_HAVE_TOK_STAR_DOT || TPP_HAVE_TOK_STAR_LANGLE_MINUS || TPP_HAVE_TOK_STAR_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_STAR 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_STAR 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_PLUS
#if TPP_HAVE_TOK_PLUS_PLUS || TPP_HAVE_TOK_PLUS_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_PLUS 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_PLUS 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_MINUS
#if TPP_HAVE_TOK_MINUS_MINUS || TPP_HAVE_TOK_MINUS_LANGLE || TPP_HAVE_TOK_MINUS_LANGLE_LANGLE || TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE || TPP_HAVE_TOK_MINUS_EQUAL || TPP_HAVE_TOK_MINUS_RANGLE || TPP_HAVE_TOK_MINUS_RANGLE_STAR || TPP_HAVE_TOK_MINUS_RANGLE_RANGLE || TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE
#define TPP_HAVE_TOK_MC_STARTSWITH_MINUS 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_MINUS 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_DOT
#if TPP_HAVE_TOK_DOT_STAR || TPP_HAVE_TOK_DOT_DOT || TPP_HAVE_TOK_DOT_DOT_DOT
#define TPP_HAVE_TOK_MC_STARTSWITH_DOT 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_DOT 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_SLASH
#if TPP_HAVE_TOK_SLASH_SLASH || TPP_HAVE_TOK_SLASH_SLASH_EQUAL || TPP_HAVE_TOK_SLASH_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_SLASH 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_SLASH 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_COLON
#if TPP_HAVE_TOK_COLON_COLON || TPP_HAVE_TOK_COLON_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_COLON 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_COLON 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_LANGLE
#if TPP_HAVE_TOK_LANGLE_MINUS || TPP_HAVE_TOK_LANGLE_MINUS_LANGLE || TPP_HAVE_TOK_LANGLE_MINUS_RANGLE || TPP_HAVE_TOK_LANGLE_LANGLE || TPP_HAVE_TOK_LANGLE_LANGLE_MINUS || TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE || TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS || TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL || TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL || TPP_HAVE_TOK_LANGLE_EQUAL || TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE || TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE || TPP_HAVE_TOK_LANGLE_RANGLE
#define TPP_HAVE_TOK_MC_STARTSWITH_LANGLE 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_LANGLE 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_EQUAL
#if TPP_HAVE_TOK_EQUAL_EXCLAIM || TPP_HAVE_TOK_EQUAL_PERCENT || TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT || TPP_HAVE_TOK_EQUAL_AMP || TPP_HAVE_TOK_EQUAL_STAR || TPP_HAVE_TOK_EQUAL_STAR_STAR || TPP_HAVE_TOK_EQUAL_PLUS || TPP_HAVE_TOK_EQUAL_MINUS || TPP_HAVE_TOK_EQUAL_SLASH || TPP_HAVE_TOK_EQUAL_SLASH_SLASH || TPP_HAVE_TOK_EQUAL_COLON || TPP_HAVE_TOK_EQUAL_LANGLE || TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE || TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE || TPP_HAVE_TOK_EQUAL_EQUAL || TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM || TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL || TPP_HAVE_TOK_EQUAL_RANGLE || TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE || TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE || TPP_HAVE_TOK_EQUAL_QMARK || TPP_HAVE_TOK_EQUAL_AT || TPP_HAVE_TOK_EQUAL_AT_AT || TPP_HAVE_TOK_EQUAL_HAT || TPP_HAVE_TOK_EQUAL_PIPE || TPP_HAVE_TOK_EQUAL_TILDE
#define TPP_HAVE_TOK_MC_STARTSWITH_EQUAL 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_EQUAL 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_RANGLE
#if TPP_HAVE_TOK_RANGLE_MINUS || TPP_HAVE_TOK_RANGLE_MINUS_LANGLE || TPP_HAVE_TOK_RANGLE_MINUS_RANGLE || TPP_HAVE_TOK_RANGLE_LANGLE || TPP_HAVE_TOK_RANGLE_EQUAL || TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE || TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE || TPP_HAVE_TOK_RANGLE_RANGLE || TPP_HAVE_TOK_RANGLE_RANGLE_MINUS || TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL || TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE || TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS || TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_RANGLE 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_RANGLE 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_QMARK
#if TPP_HAVE_TOK_QMARK_EQUAL || TPP_HAVE_TOK_QMARK_QMARK
#define TPP_HAVE_TOK_MC_STARTSWITH_QMARK 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_QMARK 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_AT
#if TPP_HAVE_TOK_AT_EQUAL || TPP_HAVE_TOK_AT_AT || TPP_HAVE_TOK_AT_AT_EQUAL
#define TPP_HAVE_TOK_MC_STARTSWITH_AT 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_AT 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_HAT
#if TPP_HAVE_TOK_HAT_EQUAL || TPP_HAVE_TOK_HAT_HAT
#define TPP_HAVE_TOK_MC_STARTSWITH_HAT 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_HAT 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_PIPE
#if TPP_HAVE_TOK_PIPE_EQUAL || TPP_HAVE_TOK_PIPE_PIPE
#define TPP_HAVE_TOK_MC_STARTSWITH_PIPE 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_PIPE 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC_STARTSWITH_TILDE
#if TPP_HAVE_TOK_TILDE_EQUAL || TPP_HAVE_TOK_TILDE_TILDE
#define TPP_HAVE_TOK_MC_STARTSWITH_TILDE 1
#else /* ... */
#define TPP_HAVE_TOK_MC_STARTSWITH_TILDE 0
#endif /* !... */
#undef TPP_HAVE_TOK_MC
#if TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM || TPP_HAVE_TOK_MC_STARTSWITH_POUND || TPP_HAVE_TOK_MC_STARTSWITH_PERCENT || TPP_HAVE_TOK_MC_STARTSWITH_AMP || TPP_HAVE_TOK_MC_STARTSWITH_STAR || TPP_HAVE_TOK_MC_STARTSWITH_PLUS || TPP_HAVE_TOK_MC_STARTSWITH_MINUS || TPP_HAVE_TOK_MC_STARTSWITH_DOT || TPP_HAVE_TOK_MC_STARTSWITH_SLASH || TPP_HAVE_TOK_MC_STARTSWITH_COLON || TPP_HAVE_TOK_MC_STARTSWITH_LANGLE || TPP_HAVE_TOK_MC_STARTSWITH_EQUAL || TPP_HAVE_TOK_MC_STARTSWITH_RANGLE || TPP_HAVE_TOK_MC_STARTSWITH_QMARK || TPP_HAVE_TOK_MC_STARTSWITH_AT || TPP_HAVE_TOK_MC_STARTSWITH_HAT || TPP_HAVE_TOK_MC_STARTSWITH_PIPE || TPP_HAVE_TOK_MC_STARTSWITH_TILDE
#define TPP_HAVE_TOK_MC 1
#else /* ... */
#define TPP_HAVE_TOK_MC 0
#endif /* !... */

/************************************************************************/
/************************************************************************/
/************************************************************************/





/************************************************************************/
/* IMPLICIT API FEATURES (PART 1)                                       */
/************************************************************************/
/* Provide a function `tpp_lexer_open_include_string()`
 * to open the file associated with an `#include`-string. */
#ifndef TPP_HAVE_LEXER_OPEN_INCLUDE_STRING
#define TPP_HAVE_LEXER_OPEN_INCLUDE_STRING \
	(TPP_HAVE_CPP_INCLUDE ||               \
	 TPP_HAVE_CPP_INCLUDE_NEXT ||          \
	 TPP_HAVE_CPP_IMPORT ||                \
	 TPP_HAVE_CPP_EMBED ||                 \
	 TPP_HAVE_MACRO___has_include ||       \
	 TPP_HAVE_MACRO___has_include_next ||  \
	 TPP_HAVE_MACRO___has_embed ||         \
	 TPP_HAVE_MACRO___TPP_LOAD_FILE ||     \
	 TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#endif /* !TPP_HAVE_LEXER_OPEN_INCLUDE_STRING */

/* Provide a function `tpp_lexer_decode_include_string()`
 * to decode the actual contents of an `#include`-string. */
#ifndef TPP_HAVE_LEXER_DECODE_INCLUDE_STRING
#define TPP_HAVE_LEXER_DECODE_INCLUDE_STRING TPP_HAVE_LEXER_OPEN_INCLUDE_STRING
#endif /* !TPP_HAVE_LEXER_DECODE_INCLUDE_STRING */

/* Provide a function `tpp_lexer_yield_include_string()` to
 * do yield the next token with special handling if the next
 * token's first character is `<` or `"`in which case the
 * token is parsed as a #include-string */
#ifndef TPP_HAVE_LEXER_YIELD_INCLUDE_STRING
#define TPP_HAVE_LEXER_YIELD_INCLUDE_STRING TPP_HAVE_LEXER_OPEN_INCLUDE_STRING
#endif /* !TPP_HAVE_LEXER_YIELD_INCLUDE_STRING */

/* Enable support for `tpp_lexer_openfile()` */
#ifndef TPP_HAVE_LEXER_OPENFILE
#if (TPP_HAVE_LEXER_OPEN_INCLUDE_STRING || \
     TPP_HAVE_CPP_INCLUDE ||               \
     TPP_HAVE_CPP_INCLUDE_NEXT ||          \
     TPP_HAVE_CPP_IMPORT ||                \
     TPP_HAVE_CPP_EMBED ||                 \
     1) /* Always enable by default */
#define TPP_HAVE_LEXER_OPENFILE 1
#else /* ... */
#define TPP_HAVE_LEXER_OPENFILE 0
#endif /* !... */
#endif /* !TPP_HAVE_LEXER_OPENFILE */

/* Enable support for `tpp_lexer_openfile_ex()` */
#ifndef TPP_HAVE_LEXER_OPENFILE_EX
#if (TPP_HAVE_LEXER_OPENFILE &&                                           \
     (TPP_HAVE_CPP_IMPORT ||                                              \
      (TPP_HAVE_CPP_INCLUDE_NEXT || TPP_HAVE_MACRO___has_include_next) || \
      (TPP_HAVE_CPP_INCLUDE && TPP_HAVE_PRAGMA_ONCE)))
#define TPP_HAVE_LEXER_OPENFILE_EX 1
#else /* ... */
#define TPP_HAVE_LEXER_OPENFILE_EX 0
#endif /* !... */
#endif /* !TPP_HAVE_LEXER_OPENFILE_EX */

/* Provide a function `tpp_file_getrealfilenamekwd()` */
#ifndef TPP_HAVE_FILE_GETREALFILENAMEKWD
#define TPP_HAVE_FILE_GETREALFILENAMEKWD (TPP_HAVE_PRAGMA_ONCE)
#endif /* !TPP_HAVE_FILE_GETREALFILENAMEKWD */

/* Enable support for detecting `#ifndef`-style `#include`-guards
 * Has no effect on semantics/behavior, but tends to speed up
 * processing of files with many (repeated) includes:
 *
 * `foo.h`:
 * ```c
 * #ifndef FOO_H
 * #define FOO_H
 * ...
 * #endif // !FOO_H
 * ```
 *
 * `bar.h`:
 * ```c
 * #include "foo.h"
 * ```
 *
 * `bar.c`:
 * ```c
 * #include "bar.h" // Already includes "foo.h"
 * #include "foo.h" // This one's a no-op (won't even try to open("foo.h"))
 * #undef FOO_H
 * #include "foo.h" // This one once again opens "foo.h", behaving as expected
 * ```
 */
#ifndef TPP_HAVE_IFNDEF_INCLUDE_GUARDS
#if ((TPP_HAVE_CPP_IMPORT ||        \
      TPP_HAVE_CPP_INCLUDE ||       \
      TPP_HAVE_CPP_INCLUDE_NEXT) && \
     TPP_HAVE_CPP_IF_ELSE_ENDIF &&  \
     TPP_HAVE_PROFILE_NOT_MINIMAL)
#define TPP_HAVE_IFNDEF_INCLUDE_GUARDS 1
#else /* ... */
#define TPP_HAVE_IFNDEF_INCLUDE_GUARDS 0
#endif /* !... */
#endif /* !TPP_HAVE_IFNDEF_INCLUDE_GUARDS */

/* Enable support for TPP generating new `tpp_keyword` definitions
 * on-the-fly, as keywords are parsed (the first time any unique
 * keyword is parsed, `tpp_keywords_newkeyword()` is used to give
 * it a unique ID and `tpp_keyword` structure). This is also needed
 * for macros and a number of other features that need to store some
 * kind of state alongside keywords. */
#ifndef TPP_HAVE_USER_KEYWORDS
#if (TPP_HAVE_PROFILE_NOT_MINIMAL ||                  \
     TPP_HAVE_FILE_GETREALFILENAMEKWD ||              \
     TPP_HAVE_CPP_MACROS ||                           \
     TPP_HAVE_PRAGMA_ONCE ||                          \
     TPP_HAVE_CPP_IMPORT ||                           \
     TPP_HAVE_CLANG_MACRO___has_attribute ||          \
     TPP_HAVE_CLANG_MACRO___has_builtin ||            \
     TPP_HAVE_CLANG_MACRO___has_cpp_attribute ||      \
     TPP_HAVE_CLANG_MACRO___has_declspec_attribute || \
     TPP_HAVE_CLANG_MACRO___has_extension ||          \
     TPP_HAVE_CLANG_MACRO___has_feature ||            \
     TPP_HAVE_CLANG_MACRO___has_c_attribute ||        \
     TPP_HAVE_MACRO___is_deprecated ||                \
     TPP_HAVE_MACRO___is_poisoned ||                  \
     TPP_HAVE_PRAGMA_DEPRECATED ||                    \
     TPP_HAVE_PRAGMA_GCC_POISON ||                    \
     TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS ||         \
     TPP_HAVE_IFNDEF_INCLUDE_GUARDS ||                \
     TPP_HAVE_KEYWORD_INCLCOUNT ||                    \
     TPP_HAVE_PRAGMA_PUSH_MACRO ||                    \
     TPP_HAVE_MACRO___TPP_COUNTER ||                  \
     TPP_HAVE_KEYWORD_USERDATA)
#define TPP_HAVE_USER_KEYWORDS 1
#else /* ... */
#define TPP_HAVE_USER_KEYWORDS 0
#endif /* !... */
#endif /* !TPP_HAVE_USER_KEYWORDS */
/************************************************************************/
/************************************************************************/
/************************************************************************/






/************************************************************************/
/* LEXER HOOK CONFIGURATION                                             */
/************************************************************************/

/* Possible values for "TPP_HAVE_*_HOOK" feature macros */
#define TPP_HOOK_DISABLED      0    /* Hook is hard-disabled (same as a no-op implementation) */
#define TPP_HOOK_CONST_USER    1    /* Hook is hard-coded to call a user-supplied implementation "TPP_HOOK_FOO" (or no-op if "TPP_HOOK_FOO" isn't defined) */
#define TPP_HOOK_CONST_BUILTIN 2    /* Hook is hard-coded to call a builtin implementation (same as TPP_HOOK_DISABLED if there is no builtin) */
#define TPP_HOOK_RT_USER       (-1) /* Hook is per-lexer configurable; defaults to user-supplied implementation "TPP_HOOK_FOO" (or no-op if "TPP_HOOK_FOO" isn't defined) */
#define TPP_HOOK_RT_BUILTIN    (-2) /* Hook is per-lexer configurable; defaults to builtin implementation (or no-op if there is no builtin) */
#define TPP_HOOK_RT_NOOP       (-3) /* Hook is per-lexer configurable; defaults to no-op implementation */

#define TPP_HOOK_USESBUILTIN(x) ((x) == TPP_HOOK_CONST_BUILTIN || (x) == TPP_HOOK_RT_BUILTIN)
#define TPP_HOOK_USESUSER(x)    ((x) == TPP_HOOK_CONST_USER || (x) == TPP_HOOK_RT_USER)
#define TPP_HOOK_ISCONST(x)     ((x) > 0)
#define TPP_HOOK_ISRT(x)        ((x) < 0)

/* Default configuration specifying how required hooks should be linked. */
#ifndef TPP_HOOK_DEFAULT_BUILTIN
#define TPP_HOOK_DEFAULT_BUILTIN ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_RT_BUILTIN : TPP_HOOK_CONST_BUILTIN)
#endif /* !TPP_HOOK_DEFAULT_BUILTIN */
#ifndef TPP_HOOK_DEFAULT_USER
#define TPP_HOOK_DEFAULT_USER ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_RT_USER : TPP_HOOK_CONST_USER)
#endif /* !TPP_HOOK_DEFAULT_USER */
#ifndef TPP_HOOK_DEFAULT_NOOP
#define TPP_HOOK_DEFAULT_NOOP ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_RT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_DEFAULT_NOOP */


/* >> TPP_FORMATPRINTER_DEFINE(TPP_HOOK_WARNPRINTER, arg, text, num_bytes);
 * Called by `tpp_lexer_warnf()` to print warning messages
 * Potentially unused if `TPP_HAVE_WARNHANDLER_HOOK` is also overwritten
 * @param: arg: The current lexer (`tpp_lexer *`) */
#ifndef TPP_HAVE_WARNPRINTER_HOOK
#ifdef TPP_HOOK_WARNPRINTER
#define TPP_HAVE_WARNPRINTER_HOOK (TPP_HAVE_WARNINGS ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_WARNPRINTER */
#define TPP_HAVE_WARNPRINTER_HOOK (TPP_HAVE_WARNINGS ? TPP_HOOK_DEFAULT_BUILTIN : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_WARNPRINTER */
#endif /* !TPP_HAVE_WARNPRINTER_HOOK */
#if TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_WARNPRINTER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_WARNPRINTER_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_WARNPRINTER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_WARNPRINTER_HOOK
#define TPP_HAVE_WARNPRINTER_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_WARNPRINTER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_WARNPRINTER_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_WARNPRINTER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_WARNPRINTER_HOOK
#define TPP_HAVE_WARNPRINTER_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_WARNPRINTER) && !TPP_HOOK_USESUSER(TPP_HAVE_WARNPRINTER_HOOK)
#error "Invalid configuration: 'TPP_HOOK_WARNPRINTER' is defined, but 'TPP_HAVE_WARNPRINTER_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_WARNPRINTER && !TPP_HOOK_USESUSER(TPP_HAVE_WARNPRINTER_HOOK) */
#ifndef TPP_HAVE_BUILTIN_WARNPRINTER_HOOK
#define TPP_HAVE_BUILTIN_WARNPRINTER_HOOK TPP_HOOK_USESBUILTIN(TPP_HAVE_WARNPRINTER_HOOK)
#endif /* !TPP_HAVE_BUILTIN_WARNPRINTER_HOOK */

/* >> tpp_errno TPP_HOOK_WARNHANDLER(tpp_lexer *tpp_restrict self, tpp_lexer_printf_info *tpp_restrict info, tpp_warning_invokeinfo const *tpp_restrict invokeinfo, tpp_warning_id id, va_list args);
 * Called by `tpp_lexer_warnf()` to handle warning notifications. Can be
 * overwritten to implement custom behavior in regards to handling of warnings.
 * @param: info:       Warning context location
 * @param: invokeinfo: Warning invocation method
 * @param: id:         Warning ID
 * @param: arg:        Variable arguments passed to warning
 * @return: TPP_EOK:        Success (warning was emitted)
 * @return: TPP_EWARNPRINT: Error during invocation of `TPP_HOOK_WARNPRINTER`
 * @return: TPP_ENOMEM:     A `TPP_WARNING_EX` returned with this error
 * @return: TPP_EIO:        A `TPP_WARNING_EX` returned with this error
 * @return: TPP_ELEXERROR:  A `TPP_WARNING_EX` returned with this error */
#ifndef TPP_HAVE_WARNHANDLER_HOOK
#ifdef TPP_HOOK_WARNHANDLER
#define TPP_HAVE_WARNHANDLER_HOOK (TPP_HAVE_WARNINGS ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_WARNHANDLER */
#define TPP_HAVE_WARNHANDLER_HOOK (TPP_HAVE_WARNINGS ? TPP_HOOK_DEFAULT_BUILTIN : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_WARNHANDLER */
#endif /* !TPP_HAVE_WARNHANDLER_HOOK */
#if TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_WARNHANDLER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_WARNHANDLER_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_WARNHANDLER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_WARNHANDLER_HOOK
#define TPP_HAVE_WARNHANDLER_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_WARNHANDLER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_WARNHANDLER_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_WARNHANDLER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_WARNHANDLER_HOOK
#define TPP_HAVE_WARNHANDLER_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_WARNHANDLER) && !TPP_HOOK_USESUSER(TPP_HAVE_WARNHANDLER_HOOK)
#error "Invalid configuration: 'TPP_HOOK_WARNHANDLER' is defined, but 'TPP_HAVE_WARNHANDLER_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_WARNHANDLER && !TPP_HOOK_USESUSER(TPP_HAVE_WARNHANDLER_HOOK) */
#ifndef TPP_HAVE_BUILTIN_WARNHANDLER_HOOK
#define TPP_HAVE_BUILTIN_WARNHANDLER_HOOK TPP_HOOK_USESBUILTIN(TPP_HAVE_WARNHANDLER_HOOK)
#endif /* !TPP_HAVE_BUILTIN_WARNHANDLER_HOOK */

/* >> TPP_FORMATPRINTER_DEFINE(TPP_HOOK_MESGPRINTER, arg, text, num_bytes);
 * Used by `#pragma message` to print messages
 * @param: arg: The current lexer (`tpp_lexer *`) */
#ifndef TPP_HAVE_MESGPRINTER_HOOK
#ifdef TPP_HOOK_MESGPRINTER
#define TPP_HAVE_MESGPRINTER_HOOK (TPP_HAVE_PRAGMA_MESSAGE ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_MESGPRINTER */
#define TPP_HAVE_MESGPRINTER_HOOK (TPP_HAVE_PRAGMA_MESSAGE ? TPP_HOOK_DEFAULT_BUILTIN : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_MESGPRINTER */
#endif /* !TPP_HAVE_MESGPRINTER_HOOK */
#if TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_MESGPRINTER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_MESGPRINTER_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_MESGPRINTER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_MESGPRINTER_HOOK
#define TPP_HAVE_MESGPRINTER_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_MESGPRINTER)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_MESGPRINTER_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_MESGPRINTER' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_MESGPRINTER_HOOK
#define TPP_HAVE_MESGPRINTER_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_MESGPRINTER) && !TPP_HOOK_USESUSER(TPP_HAVE_MESGPRINTER_HOOK)
#error "Invalid configuration: 'TPP_HOOK_MESGPRINTER' is defined, but 'TPP_HAVE_MESGPRINTER_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_MESGPRINTER && !TPP_HOOK_USESUSER(TPP_HAVE_MESGPRINTER_HOOK) */
#ifndef TPP_HAVE_BUILTIN_MESGPRINTER_HOOK
#define TPP_HAVE_BUILTIN_MESGPRINTER_HOOK TPP_HOOK_USESBUILTIN(TPP_HAVE_MESGPRINTER_HOOK)
#endif /* !TPP_HAVE_BUILTIN_MESGPRINTER_HOOK */

/* >> tpp_errno TPP_HOOK_PARSEEXPR(tpp_lexer *tpp_restrict self, tpp_expr_value *tpp_restrict result);
 * User-defined callback for parsing `#if`-style expressions
 * - This callback is invoked in a context where `self` points
 *   before the expression's first token (meaning that this
 *   callback is responsible to do the initial yield using
 *   whatever method it wants to use).
 * - When it is known that the expression has finite length,
 *   as in: it has to end before EOF, or at the next unmatched
 *   `)`-token, the caller will have configured the lexer's
 *   current EOF accordingly (and disabled file-popping)
 * - When this function returns an error, the caller will rewind
 *   back to the start of the expression (or even further, if
 *   applicable; meaning this callback doesn't need to concern
 *   itself with rollback)
 *
 * @return: TPP_EOK:         Success (`*result` was initialized)
 * @return: TPP_ENOMEM:      Out of memory
 * @return: TPP_EIO:         Filesystem I/O operation failed
 * @return: TPP_EWOULDBLOCK: Operation would block
 * @return: TPP_ELEXERROR:   A lexer error happened
 * @return: TPP_EWARNPRINT:  Error while printing a warning */
#ifndef TPP_HAVE_PARSEEXPR_HOOK
#ifdef TPP_HOOK_PARSEEXPR
#define TPP_HAVE_PARSEEXPR_HOOK ((TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_MACRO___TPP_EVAL || TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_PARSEEXPR */
#define TPP_HAVE_PARSEEXPR_HOOK ((TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_MACRO___TPP_EVAL || TPP_HAVE_CPP_EMBED || TPP_HAVE_MACRO___has_embed) ? TPP_HOOK_DEFAULT_BUILTIN : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_PARSEEXPR */
#endif /* !TPP_HAVE_PARSEEXPR_HOOK */
#if TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_PARSEEXPR)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_PARSEEXPR_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_PARSEEXPR' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_PARSEEXPR_HOOK
#define TPP_HAVE_PARSEEXPR_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_PARSEEXPR)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_PARSEEXPR_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_PARSEEXPR' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_PARSEEXPR_HOOK
#define TPP_HAVE_PARSEEXPR_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_PARSEEXPR) && !TPP_HOOK_USESUSER(TPP_HAVE_PARSEEXPR_HOOK)
#error "Invalid configuration: 'TPP_HOOK_PARSEEXPR' is defined, but 'TPP_HAVE_PARSEEXPR_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_PARSEEXPR && !TPP_HOOK_USESUSER(TPP_HAVE_PARSEEXPR_HOOK) */
#ifndef TPP_HAVE_BUILTIN_PARSEEXPR_HOOK
#define TPP_HAVE_BUILTIN_PARSEEXPR_HOOK TPP_HOOK_USESBUILTIN(TPP_HAVE_PARSEEXPR_HOOK)
#endif /* !TPP_HAVE_BUILTIN_PARSEEXPR_HOOK */

/* >> tpp_errno TPP_HOOK_UNKNOWN_PRAGMA(tpp_lexer *tpp_restrict self);
 * Called whenever a `#pragma` is encountered that is not recognized.
 * When called, the lexer is set-up to point at the first token after the `#pragma`.
 * @return: TPP_EOK:    Pragma has been handled
 * @return: TPP_ENOENT: Pragma is still unknown, and a warning should be emitted
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#ifndef TPP_HAVE_UNKNOWN_PRAGMA_HOOK
#ifdef TPP_HOOK_UNKNOWN_PRAGMA
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK ((TPP_HAVE_PRAGMA && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_UNKNOWN_PRAGMA */
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK ((TPP_HAVE_PRAGMA && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_UNKNOWN_PRAGMA */
#endif /* !TPP_HAVE_UNKNOWN_PRAGMA_HOOK */
#if TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_UNKNOWN_PRAGMA)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_UNKNOWN_PRAGMA_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_UNKNOWN_PRAGMA' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_UNKNOWN_PRAGMA_HOOK
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_UNKNOWN_PRAGMA)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_UNKNOWN_PRAGMA_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_UNKNOWN_PRAGMA' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_UNKNOWN_PRAGMA_HOOK
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_UNKNOWN_PRAGMA_HOOK /* There is no builtin version */
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_UNKNOWN_PRAGMA_HOOK /* There is no builtin version */
#define TPP_HAVE_UNKNOWN_PRAGMA_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_UNKNOWN_PRAGMA) && !TPP_HOOK_USESUSER(TPP_HAVE_UNKNOWN_PRAGMA_HOOK)
#error "Invalid configuration: 'TPP_HOOK_UNKNOWN_PRAGMA' is defined, but 'TPP_HAVE_UNKNOWN_PRAGMA_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_UNKNOWN_PRAGMA && !TPP_HOOK_USESUSER(TPP_HAVE_UNKNOWN_PRAGMA_HOOK) */

/* >> tpp_errno TPP_HOOK_NEW_DEPENDENCY(tpp_lexer *tpp_restrict self, tpp_keyword *filename_kwd);
 * Called whenever some file is `#include`-ed for the first time
 * @param: filename_kwd: Then `tpp_keyword` used to describe the file's name. The actual
 *                       filename can be queried as `tpp_keyword_getcstr(filename_kwd)`. */
#ifndef TPP_HAVE_NEW_DEPENDENCY_HOOK
#ifdef TPP_HOOK_NEW_DEPENDENCY
#define TPP_HAVE_NEW_DEPENDENCY_HOOK ((TPP_HAVE_LEXER_OPENFILE && TPP_HAVE_USER_KEYWORDS && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_NEW_DEPENDENCY */
#define TPP_HAVE_NEW_DEPENDENCY_HOOK ((TPP_HAVE_LEXER_OPENFILE && TPP_HAVE_USER_KEYWORDS && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_NEW_DEPENDENCY */
#endif /* !TPP_HAVE_NEW_DEPENDENCY_HOOK */
#if TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_NEW_DEPENDENCY)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_NEW_DEPENDENCY_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_NEW_DEPENDENCY' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_NEW_DEPENDENCY_HOOK
#define TPP_HAVE_NEW_DEPENDENCY_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_NEW_DEPENDENCY)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_NEW_DEPENDENCY_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_NEW_DEPENDENCY' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_NEW_DEPENDENCY_HOOK
#define TPP_HAVE_NEW_DEPENDENCY_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_NEW_DEPENDENCY_HOOK /* There is no builtin version */
#define TPP_HAVE_NEW_DEPENDENCY_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_NEW_DEPENDENCY_HOOK /* There is no builtin version */
#define TPP_HAVE_NEW_DEPENDENCY_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_NEW_DEPENDENCY) && !TPP_HOOK_USESUSER(TPP_HAVE_NEW_DEPENDENCY_HOOK)
#error "Invalid configuration: 'TPP_HOOK_NEW_DEPENDENCY' is defined, but 'TPP_HAVE_NEW_DEPENDENCY_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_NEW_DEPENDENCY && !TPP_HOOK_USESUSER(TPP_HAVE_NEW_DEPENDENCY_HOOK) */

/* >> tpp_errno TPP_HOOK_IDENT_SCCS(tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_string *chunk, tpp_char const *comment_str, tpp_size comment_len);
 * Called to handle `#ident` and `#sccs` directives
 * @param: mode:        Either `TPP_KWD_ident` or `TPP_KWD_sccs`
 * @param: chunk:       If non-NULL a string that must be `tpp_string_incref()`d
 *                      if you want to keep `comment_str` alive. If NULL, then the
 *                      given `comment_str` is statically allocated and doesn't need
 *                      any chunk to stay alive
 * @param: comment_str: The source comment that should be inserted
 * @param: comment_len: Length of `comment_str` in bytes
 * @return: TPP_EOK:    Success
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#ifndef TPP_HAVE_IDENT_SCCS_HOOK
#ifdef TPP_HOOK_IDENT_SCCS
#define TPP_HAVE_IDENT_SCCS_HOOK (TPP_HAVE_CPP_IDENT_SCCS ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_IDENT_SCCS */
#define TPP_HAVE_IDENT_SCCS_HOOK (TPP_HAVE_CPP_IDENT_SCCS ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_IDENT_SCCS */
#endif /* !TPP_HAVE_IDENT_SCCS_HOOK */
#if TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_IDENT_SCCS)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_IDENT_SCCS_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_IDENT_SCCS' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_IDENT_SCCS_HOOK
#define TPP_HAVE_IDENT_SCCS_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_IDENT_SCCS)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_IDENT_SCCS_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_IDENT_SCCS' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_IDENT_SCCS_HOOK
#define TPP_HAVE_IDENT_SCCS_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_IDENT_SCCS_HOOK /* There is no builtin version */
#define TPP_HAVE_IDENT_SCCS_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_IDENT_SCCS_HOOK /* There is no builtin version */
#define TPP_HAVE_IDENT_SCCS_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_IDENT_SCCS) && !TPP_HOOK_USESUSER(TPP_HAVE_IDENT_SCCS_HOOK)
#error "Invalid configuration: 'TPP_HOOK_IDENT_SCCS' is defined, but 'TPP_HAVE_IDENT_SCCS_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_IDENT_SCCS && !TPP_HOOK_USESUSER(TPP_HAVE_IDENT_SCCS_HOOK) */

/* >> tpp_errno TPP_HOOK_SYSTEM_INCLUDE_PATH(tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_hook_system_include_path_when when, tpp_errno (TPPCALL *cb)(void *arg, char const *relative_to tpp_lexer_foreach_include_path_flags__PARAM), void *arg);
 * Extra callback invoked by `tpp_lexer_foreach_include_path()` at diffrent
 * points during the process of enumerating include paths. This callback is
 * then allowed to enumerate some additional include paths that may exist, but
 * for one reason or another (mainly: speed) aren't known to TPP via its system
 * include path APIs (`tpp_lexer_includes_add*`)
 * @param: when: One of `TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_*`: describes the
 *               caller's position in `tpp_lexer_foreach_include_path()`.
 * @return: * :         First non-TPP_ENOENT return value of `cb`
 * @return: TPP_ENOENT: File still not found
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#ifndef TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK
#ifdef TPP_HOOK_SYSTEM_INCLUDE_PATH
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK ((TPP_HAVE_LEXER_OPEN_INCLUDE_STRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_SYSTEM_INCLUDE_PATH */
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK ((TPP_HAVE_LEXER_OPEN_INCLUDE_STRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_SYSTEM_INCLUDE_PATH */
#endif /* !TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK */
#if TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_SYSTEM_INCLUDE_PATH)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_SYSTEM_INCLUDE_PATH' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_SYSTEM_INCLUDE_PATH)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_SYSTEM_INCLUDE_PATH' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK /* There is no builtin version */
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK /* There is no builtin version */
#define TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_SYSTEM_INCLUDE_PATH) && !TPP_HOOK_USESUSER(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK)
#error "Invalid configuration: 'TPP_HOOK_SYSTEM_INCLUDE_PATH' is defined, but 'TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_SYSTEM_INCLUDE_PATH && !TPP_HOOK_USESUSER(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) */

/* >> tpp_ssize TPP_HOOK_UNKNOWN_STRING_ESCAPE(tpp_lexer *tpp_restrict self, tpp_char const **p_pos, tpp_char const *end, tpp_lexer_decodestring_config const *tpp_restrict config);
 * Called by `tpp_lexer_decodestring()` when an unknown `\`-escape sequence is encountered
 * This hook can be used to define additional, user-defined escape sequences, or any other
 * arbitrary behavior to-be performed when specific escape-sequences are found.
 * On entry, `*p_pos` points at the first (unrecognized) character after the leading `\`, and
 * if the hook was able to parse said escape sequence, it should update `*p_pos` to point after
 * it before returning
 * @param: p_pos:  [in]  Pointer to start of unrecognized `\`-escape sequence
 *                 [out] First character no longer part of `\`-escape sequence (if recognized)
 *                 [out] Unchanged (if not recognized)
 * @param: end:    The of containing string sequence
 * @param: config: Identically-named argument of `tpp_lexer_decodestring()`
 * @return: * :    Sum of positive return values of `data_printer` and `utf8_printer`
 * @return: < 0:   First negative return value of `data_printer` or `utf8_printer`
 * @return: TPP_SSIZE_OFERR(TPP_ENOENT): Escape sequence still not recognized
 *                 (please leave `*p_pos` unchanged in this case). The caller will
 *                 proceed by emitting `TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE` */
#ifndef TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK
#ifdef TPP_HOOK_UNKNOWN_STRING_ESCAPE
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_LEXER_DECODESTRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_UNKNOWN_STRING_ESCAPE */
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_LEXER_DECODESTRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_UNKNOWN_STRING_ESCAPE */
#endif /* !TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK */
#if TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_UNKNOWN_STRING_ESCAPE)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_UNKNOWN_STRING_ESCAPE' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_UNKNOWN_STRING_ESCAPE)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_UNKNOWN_STRING_ESCAPE' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK /* There is no builtin version */
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK /* There is no builtin version */
#define TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_UNKNOWN_STRING_ESCAPE) && !TPP_HOOK_USESUSER(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK)
#error "Invalid configuration: 'TPP_HOOK_UNKNOWN_STRING_ESCAPE' is defined, but 'TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_UNKNOWN_STRING_ESCAPE && !TPP_HOOK_USESUSER(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK) */

/* >> tpp_errno TPP_HOOK_RAISE_LEXERROR(tpp_lexer *tpp_restrict self);
 * Called by `tpp_lexer_warnf()` just before it's about to return `TPP_ELEXERROR`
 * This hook can be used to do additional state changes that may be necessary by the
 * hosting application in order to handle the resulting `TPP_ELEXERROR`
 * @return: TPP_EOK: Have `tpp_lexer_warnf()` still return `TPP_ELEXERROR`
 * @return: * :      Make `tpp_lexer_warnf()` return this instead of `TPP_ELEXERROR` */
#ifndef TPP_HAVE_RAISE_LEXERROR_HOOK
#ifdef TPP_HOOK_RAISE_LEXERROR
#define TPP_HAVE_RAISE_LEXERROR_HOOK ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_LEXER_DECODESTRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_RAISE_LEXERROR */
#define TPP_HAVE_RAISE_LEXERROR_HOOK ((TPP_HAVE_STRING_ESCAPE && TPP_HAVE_LEXER_DECODESTRING && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_RAISE_LEXERROR */
#endif /* !TPP_HAVE_RAISE_LEXERROR_HOOK */
#if TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_RAISE_LEXERROR)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_RAISE_LEXERROR_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_RAISE_LEXERROR' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_RAISE_LEXERROR_HOOK
#define TPP_HAVE_RAISE_LEXERROR_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_RAISE_LEXERROR)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_RAISE_LEXERROR_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_RAISE_LEXERROR' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_RAISE_LEXERROR_HOOK
#define TPP_HAVE_RAISE_LEXERROR_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_RAISE_LEXERROR_HOOK /* There is no builtin version */
#define TPP_HAVE_RAISE_LEXERROR_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_RAISE_LEXERROR_HOOK /* There is no builtin version */
#define TPP_HAVE_RAISE_LEXERROR_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_RAISE_LEXERROR) && !TPP_HOOK_USESUSER(TPP_HAVE_RAISE_LEXERROR_HOOK)
#error "Invalid configuration: 'TPP_HOOK_RAISE_LEXERROR' is defined, but 'TPP_HAVE_RAISE_LEXERROR_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_RAISE_LEXERROR && !TPP_HOOK_USESUSER(TPP_HAVE_RAISE_LEXERROR_HOOK) */

/* >> tpp_errno TPP_HOOK_ISFLOATSUFFIX(tpp_lexer *tpp_restrict self, tpp_char const *pos);
 * Called by `tpp_lexer_yieldraw()` when `TPP_HAVE_SMART_FLOAT_TOKENS` is enabled and
 * a sequence like `1.f` is encountered where the lexer is unsure if the `f` should be
 * part of the float-token (in the form of a float-suffix), or if this is actually be
 * parsed as 3 tokens: `[C_INT:1][DOT:.][f:f]`. For this purpose, this hook is called
 * with `pos` pointing at the `f` (though additional characters thereafter may not be
 * loaded yet, though can be loaded using `tpp_lexer_readchar()`)
 * @return: TPP_EOK:    Pointed-to location actually *does* refer to a float suffix
 * @return: TPP_ENOENT: It's not a float suffix
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#ifndef TPP_HAVE_ISFLOATSUFFIX_HOOK
#ifdef TPP_HOOK_ISFLOATSUFFIX
#define TPP_HAVE_ISFLOATSUFFIX_HOOK ((TPP_HAVE_TOK_C_FLOAT && TPP_HAVE_SMART_FLOAT_TOKENS) ? TPP_HOOK_DEFAULT_USER : TPP_HOOK_DISABLED)
#else /* TPP_HOOK_ISFLOATSUFFIX */
#define TPP_HAVE_ISFLOATSUFFIX_HOOK ((TPP_HAVE_TOK_C_FLOAT && TPP_HAVE_SMART_FLOAT_TOKENS) ? TPP_HOOK_DEFAULT_NOOP : TPP_HOOK_DISABLED)
#endif /* !TPP_HOOK_ISFLOATSUFFIX */
#endif /* !TPP_HAVE_ISFLOATSUFFIX_HOOK */
#if TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_CONST_USER && !defined(TPP_HOOK_ISFLOATSUFFIX)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_ISFLOATSUFFIX_HOOK' is configured as 'TPP_HOOK_CONST_USER', but 'TPP_HOOK_ISFLOATSUFFIX' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_ISFLOATSUFFIX_HOOK
#define TPP_HAVE_ISFLOATSUFFIX_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_RT_USER && !defined(TPP_HOOK_ISFLOATSUFFIX)
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "Invalid configuration: 'TPP_HAVE_ISFLOATSUFFIX_HOOK' is configured as 'TPP_HOOK_RT_USER', but 'TPP_HOOK_ISFLOATSUFFIX' isn't defined. Configure the hook differently, or supply your definition"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#undef TPP_HAVE_ISFLOATSUFFIX_HOOK
#define TPP_HAVE_ISFLOATSUFFIX_HOOK TPP_HOOK_RT_NOOP
#elif TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_CONST_BUILTIN
#undef TPP_HAVE_ISFLOATSUFFIX_HOOK /* There is no builtin version */
#define TPP_HAVE_ISFLOATSUFFIX_HOOK TPP_HOOK_DISABLED
#elif TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_RT_BUILTIN
#undef TPP_HAVE_ISFLOATSUFFIX_HOOK /* There is no builtin version */
#define TPP_HAVE_ISFLOATSUFFIX_HOOK TPP_HOOK_RT_NOOP
#endif /* ... */
#if !TPP_IGNORE_INVALID_CONFIGURATION && defined(TPP_HOOK_ISFLOATSUFFIX) && !TPP_HOOK_USESUSER(TPP_HAVE_ISFLOATSUFFIX_HOOK)
#error "Invalid configuration: 'TPP_HOOK_ISFLOATSUFFIX' is defined, but 'TPP_HAVE_ISFLOATSUFFIX_HOOK' isn't using it"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HOOK_ISFLOATSUFFIX && !TPP_HOOK_USESUSER(TPP_HAVE_ISFLOATSUFFIX_HOOK) */

/************************************************************************/
/************************************************************************/
/************************************************************************/






/************************************************************************/
/* LEXER EXPRESSIONS                                                    */
/************************************************************************/

/* Enable support for `defined(MACRO)` in builtin lexer expressions */
#ifndef TPP_HAVE_BUILTIN_EXPR_DEFINED
#define TPP_HAVE_BUILTIN_EXPR_DEFINED ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_PROFILE_NOT_MINIMAL) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fdefined-in-expressions" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_DEFINED */

/* Enable special handling in `#define foo(x) defined(x)` such that `x` is not expanded.
 * Irregardless of this feature being enabled or not, a warning `TPP_W_EXPANSION_TO_DEFINED`
 * is emitted whenever a construct `defined(<param>)` or `defined <param>` is encountered
 * within the body of a function-style macro definition, where `<param>` is the name of one
 * of the macro's parameters (see `TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED`).
 *
 * @detect: #define test(x) defined(x)
 *          #define test2   NOT_DEFINED
 *          #if test(test2) */
#ifndef TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR
#define TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR ((TPP_HAVE_BUILTIN_EXPR_DEFINED && TPP_HAVE_CPP_MACROS && TPP_HAVE_PROFILE_NOT_MINIMAL) ? TPP_CONF_EXT0 : 0) /* "-fdont-expand-defined" */
#endif /* !TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR */

/* Enable support for strings in builtin lexer expressions, as well as some new operators:
 * ```c
 * #if "FOO" != "BAR"
 * ...
 * #endif
 *
 * #if "FOO"[0] == 'F'
 * ...
 * #endif
 *
 * #if "FOO"[1:] == "OO"
 * ...
 * #endif
 *
 * #if #"FOO" == 3
 * ...
 * #endif
 * ``` */
#ifndef TPP_HAVE_BUILTIN_EXPR_STRINGS
#define TPP_HAVE_BUILTIN_EXPR_STRINGS ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_TOK_STRINGLIKE && TPP_HAVE_PROFILE_NOT_MINIMAL) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fstrings-in-expressions" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_STRINGS */

/* Enable support for floats in builtin lexer expressions */
#ifndef TPP_HAVE_BUILTIN_EXPR_FLOATS
#define TPP_HAVE_BUILTIN_EXPR_FLOATS ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_TOK_C_FLOAT && TPP_HAVE_PROFILE_NOT_MINIMAL) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-ffloats-in-expressions" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_FLOATS */

/* Enable support for `foo ?: bar` in builtin lexer expressions (same as `foo ? foo : bar`) */
#ifndef TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT
#define TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_PROFILE_NOT_MINIMAL) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fif-else-optional-true" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT */

/* Enable support for `if (foo) bar else baz` in builtin
 * lexer expressions, as alias for `foo ? bar : baz`. */
#ifndef TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS
#define TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 0) /* "-fifelse-in-expressions" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS */

/* XXX: Also have an extension for python's `tt if cond else ff`
 *      syntax, though TPP won't be able to guaranty that `tt`
 *      is only evaluated when `cond` evaluates to true! */

/* Enable support for `^^` in builtin lexer expressions */
#ifndef TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR
#define TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_PROFILE_NOT_MINIMAL) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-flogical-xor-in-expressions" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR */

/* Treat `'a'` in expressions as an integer, rather than as a string (in C/C++, this is always the case) */
#ifndef TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS
#define TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS ((TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_TOK_STRINGLIKE_SQUOTE) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_FEAT1 : (TPP_HAVE_PROFILE_C_LIKE ? 1 : 0)) : 0) /* "-fcharacter-literals" */
#endif /* !TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS */
/************************************************************************/
/************************************************************************/
/************************************************************************/





/************************************************************************/
/* IMPLICIT API FEATURES (PART 2)                                       */
/************************************************************************/

/* Provide an API function `tpp_unicode_writeutf8()` */
#ifndef TPP_HAVE_TPP_UNICODE_WRITEUTF8
#if (TPP_HAVE_TOK_C_STRING ||                 \
     TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL ||  \
     TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL || \
     TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL || \
     TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL ||  \
     TPP_HAVE_TOK_BLOCK_STRING_LITERAL ||     \
     TPP_HAVE_TOK_C_CHAR ||                   \
     TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL ||    \
     TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL ||   \
     TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL ||   \
     TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL ||    \
     TPP_HAVE_TOK_BLOCK_CHAR_LITERAL ||       \
     TPP_HAVE_IDENTIFIER_ESCAPE_UNI ||        \
     TPP_HAVE_DECODE_NAMED_ESCAPE)
#define TPP_HAVE_TPP_UNICODE_WRITEUTF8 1
#else /* ... */
#define TPP_HAVE_TPP_UNICODE_WRITEUTF8 0
#endif /* !... */
#endif /* !TPP_HAVE_TPP_UNICODE_WRITEUTF8 */

/* Provide an API for loading the current date/time */
#ifndef TPP_HAVE_TIME_API
#if (TPP_HAVE_MACRO___TIME__ ||      \
     TPP_HAVE_MACRO___DATE__ ||      \
     TPP_HAVE_MACRO___TIMESTAMP__ || \
     TPP_HAVE_NUMERIC_DATE_MACROS || \
     TPP_HAVE_NUMERIC_TIME_MACROS)
#define TPP_HAVE_TIME_API 1
#else /* ... */
#define TPP_HAVE_TIME_API 0
#endif /* !... */
#endif /* !TPP_HAVE_TIME_API */

/* Enable support for `TPP_FILE_FLAGS_SYSHDR` */
#ifndef TPP_HAVE_FILE_SYSHDR
#define TPP_HAVE_FILE_SYSHDR (TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER != 0)
#endif /* !TPP_HAVE_FILE_SYSHDR */

/* Enable support for `TPP_FILE_KIND_SUBTEXT` */
#ifndef TPP_HAVE_FILE_SUBTEXT
#define TPP_HAVE_FILE_SUBTEXT                     \
	(TPP_HAVE_CPP_MACROS || TPP_HAVE_CPP_EMBED || \
	 TPP_HAVE_MACRO__Pragma ||                    \
	 TPP_HAVE_MACRO___pragma ||                   \
	 TPP_HAVE_MACRO___TPP_IDENTIFIER ||           \
	 TPP_HAVE_MACRO___TPP_STR_DECOMPILE ||        \
	 TPP_HAVE_MACRO___TPP_STR_PACK ||             \
	 TPP_HAVE_MACRO___TPP_COUNT_TOKENS ||         \
	 TPP_HAVE_PRAGMA_TPP_EXEC ||                  \
	 TPP_HAVE_PRAGMA_TPP_TPP_EXEC)
#endif /* !TPP_HAVE_FILE_SUBTEXT */

/* Enable support for `TPP_FILE_KIND_DUMMY`, which is
 * needed to support gcc's `# <linenum>` -> `1`/`2` flags
 *
 * These flags push so-called "dummy" files onto the
 * #include-stack (without altering the actual current
 * file), with those dummy files acting as additional
 * entries for #include tracebacks. */
#ifndef TPP_HAVE_FILE_DUMMY
#define TPP_HAVE_FILE_DUMMY (TPP_HAVE_CPP_DIGIT_LINE)
#endif /* !TPP_HAVE_FILE_DUMMY */

/* Enable support for `TPP_FILE_FLAGS_EXTERN_C` */
#ifndef TPP_HAVE_FILE_EXTERN_C
#define TPP_HAVE_FILE_EXTERN_C (TPP_PROFILE == TPP_PROFILE_ALL && TPP_HAVE_CPP_DIGIT_LINE)
#endif /* !TPP_HAVE_FILE_EXTERN_C */

/* When `TPP_FILE_FLAGS_SYSHDR` is set during `#include` (i.e. *NOT* via `#pragma GCC system_header`),
 * then the `TPP_FILE_FLAGS_EXTERN_C` flag should be set alongside `TPP_FILE_FLAGS_SYSHDR`. */
#ifndef TPP_HAVE_EXTERN_C_FOR_SYSHDR
#define TPP_HAVE_EXTERN_C_FOR_SYSHDR (TPP_HAVE_FILE_SYSHDR && TPP_HAVE_FILE_EXTERN_C ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT0 : TPP_CONF_FEAT0) : 0) /* "-fextern-c-for-syshdr" */
#endif /* !TPP_HAVE_EXTERN_C_FOR_SYSHDR */

/* Enable API support for having an `#include`-stack. */
#ifndef TPP_HAVE_INCLUDE_STACK
#if (TPP_HAVE_CPP_MACROS ||       \
     TPP_HAVE_CPP_INCLUDE ||      \
     TPP_HAVE_CPP_INCLUDE_NEXT || \
     TPP_HAVE_CPP_IMPORT ||       \
     TPP_HAVE_CPP_EMBED ||        \
     TPP_HAVE_FILE_SUBTEXT ||     \
     TPP_HAVE_FILE_DUMMY)
#define TPP_HAVE_INCLUDE_STACK 1
#else /* ... */
#define TPP_HAVE_INCLUDE_STACK 0
#endif /* !... */
#endif /* !TPP_HAVE_INCLUDE_STACK */

/* Support for: custom string list describing the available
 * `-I/usr/include`-style -> `#include <foo.h>`-paths */
#ifndef TPP_HAVE_INCLUDE_PATH
#define TPP_HAVE_INCLUDE_PATH (TPP_HAVE_INCLUDE_STACK)
#endif /* !TPP_HAVE_INCLUDE_PATH */

/* `tpp_include_paths` contains a 2nd path-list that is only searched during `"`-strings */
#ifndef TPP_HAVE_INCLUDE_PATH_QUOTE
#define TPP_HAVE_INCLUDE_PATH_QUOTE \
	(TPP_HAVE_INCLUDE_STACK && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_INCLUDE_PATH_QUOTE */

/* `tpp_include_paths` contains a 3rd path-list whose files are treated as `TPP_FILE_FLAGS_SYSHDR` */
#ifndef TPP_HAVE_INCLUDE_PATH_SYSHDR
#define TPP_HAVE_INCLUDE_PATH_SYSHDR \
	(TPP_HAVE_INCLUDE_STACK && TPP_HAVE_FILE_SYSHDR && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_INCLUDE_PATH_SYSHDR */

/* `tpp_include_paths` contains a 4th path-list that is searched after all other paths */
#ifndef TPP_HAVE_INCLUDE_PATH_AFTER
#define TPP_HAVE_INCLUDE_PATH_AFTER                                 \
	(TPP_HAVE_INCLUDE_STACK && ((TPP_PROFILE == TPP_PROFILE_ALL) || \
	                            (TPP_HAVE_PROFILE_NOT_MINIMAL &&    \
	                             TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)))
#endif /* !TPP_HAVE_INCLUDE_PATH_AFTER */

/* A preprocessor tuple describing the built-in, hard-coded, system-include path.
 * - The paths specified here are searched in order of specification.
 * - For information on the full `#include`-path resolution order, see `tpp_include_paths`
 * - Try not to include trailing slashes in paths hard-coded using this (if TPP3 needs
 *   trailing slashes in these strings, it will add those itself)
 *
 * Example:
 * ```c
 * #define TPP_CONFIG_SYSTEM_INCLUDE_PATH  2("/usr/local/include", "/usr/include")
 * ``` */
#ifndef TPP_CONFIG_SYSTEM_INCLUDE_PATH
#define TPP_CONFIG_SYSTEM_INCLUDE_PATH 0()
#endif /* !TPP_CONFIG_SYSTEM_INCLUDE_PATH */

/* Config option to skip searching `TPP_CONFIG_SYSTEM_INCLUDE_PATH`.
 * Can (and should) be used to implement `-nostdinc` */
#ifndef TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH
#define TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH (TPP_TUPLE_NONEMPTY(TPP_CONFIG_SYSTEM_INCLUDE_PATH) ? ((TPP_PROFILE == TPP_PROFILE_ALL) ? TPP_CONF_EXT1 : 1) : 0) /* "-fstdinc" */
#endif /* !TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH */

/* `"`-quoted `#include`-strings are searched relative to *every* I/O-file found on the
 * `#include`-stack; not just the most-recent one. Doing this for all files is what TPP2
 * always- and unconditionally did, but turns out that isn't actually something normally
 * done by preprocessors. As such, TPP3 turns this behavior into an extension, but has
 * it turned off by default. */
#ifndef TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE
#define TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE ((TPP_PROFILE == TPP_PROFILE_ALL && TPP_HAVE_INCLUDE_STACK) ? TPP_CONF_EXT0 : 0) /* "-finclude-relative-to-every-file" */
#endif /* !TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE */

/* Enable support to push/pop the `#include`-path state */
#ifndef TPP_HAVE_INCLUDE_PATH_PUSH_POP
#define TPP_HAVE_INCLUDE_PATH_PUSH_POP (TPP_HAVE_INCLUDE_PATH)
#endif /* !TPP_HAVE_INCLUDE_PATH_PUSH_POP */

/* Use `TPP_REF tpp_string *` instead of `char *` in `#include`-path lists.
 * Doing so greatly reduces the overhead when `#include`-path lists are
 * pushed/popped, since `tpp_string` can be incref'd, whereas `char`
 * must be hard-copied. */
#ifndef TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING
#define TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING (TPP_HAVE_INCLUDE_PATH_PUSH_POP)
#endif /* !TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING */

/* Enable support for `tpp_file` keeping track of the state of active `#ifdef` directives
 * via an embedded `tpp_ifdef_stack` strcture (accessible via `tpp_file_getifdef()`) */
#ifndef TPP_HAVE_IFDEF_STACK
#define TPP_HAVE_IFDEF_STACK (TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_IFDEF_STACK */

/* Enable support for `tpp_file_setfilename()` */
#ifndef TPP_HAVE_FILE_SETFILENAME
#define TPP_HAVE_FILE_SETFILENAME (TPP_HAVE_CPP_DIGIT_LINE || TPP_HAVE_CPP_LINE)
#endif /* !TPP_HAVE_FILE_SETFILENAME */

/* Enable support for `tpp_file_setline()` */
#ifndef TPP_HAVE_FILE_SETLINE
#define TPP_HAVE_FILE_SETLINE (TPP_HAVE_CPP_DIGIT_LINE || TPP_HAVE_CPP_LINE)
#endif /* !TPP_HAVE_FILE_SETLINE */

/* Enable support for setting a special pointer in files to
 * represent a lower bound of memory that must be kept loaded. */
#ifndef TPP_HAVE_FILE_KEEPPOS
#define TPP_HAVE_FILE_KEEPPOS (TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_FILE_KEEPPOS */

/* Keep track of the original `tpp_lexer_arginfo` used during macro invocation,
 * in order to improve `tpp_file_getlcinfo_ex()`'s `tlcix_proj*` return values,
 * by making them less error-prone. */
#ifndef TPP_HAVE_FILE_MACRO_TRACKARGS
#define TPP_HAVE_FILE_MACRO_TRACKARGS \
	(TPP_HAVE_CPP_MACROS && TPP_HAVE_LEXER_SEEKPP_RPAREN && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_FILE_MACRO_TRACKARGS */

/* Provide a special `TPP_FILE_ENCODING_EMBED` file encoding
 * to convert bytes into `,`-separated decimals on-the-fly.
 *
 * NOTE: Even when this is disabled, `#embed` directives work,
 *       but will have to pre-load the entire input file into
 *       memory, rather than allowing the file to be streamed
 *       by converting it on-the-fly. */
#ifndef TPP_HAVE_FILE_ENCODING_EMBED
#define TPP_HAVE_FILE_ENCODING_EMBED (TPP_HAVE_UNICODE && TPP_HAVE_CPP_EMBED && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_FILE_ENCODING_EMBED */

/* Provide an API `tpp_lexer_rand()` that can be used to random numbers
 * using the already-parsed contents of of I/O and TEXT files as seed. */
#ifndef TPP_HAVE_LEXER_RAND
#define TPP_HAVE_LEXER_RAND ((TPP_PROFILE == TPP_PROFILE_ALL) || TPP_HAVE_MACRO___TPP_RANDOM)
#endif /* !TPP_HAVE_LEXER_RAND */

/* Provide an API `tpp_file_gethash()` that can be used to calculate a hash
 * of all already-processed bytes within a file up to a given position. */
#ifndef TPP_HAVE_FILE_GETHASH
#define TPP_HAVE_FILE_GETHASH ((TPP_PROFILE == TPP_PROFILE_ALL) || TPP_HAVE_LEXER_RAND)
#endif /* !TPP_HAVE_FILE_GETHASH */

/* Provide an API `tpp_file_getfullhash()` that behaves similar to `tpp_file_gethash()`,
 * but also traverses the `#include`-stack to include the hash values of all parent files
 * found therein, such that the return values describes not only the current file leading
 * up to a given position, but also all other files that came before. */
#ifndef TPP_HAVE_FILE_GETFULLHASH
#define TPP_HAVE_FILE_GETFULLHASH (TPP_HAVE_FILE_GETHASH && TPP_HAVE_INCLUDE_STACK)
#endif /* !TPP_HAVE_FILE_GETFULLHASH */

/* Provide a secondary set of keyword APIs that include support for `\`-escape sequences.
 * Needed to implement `TPP_HAVE_BSE`, `TPP_HAVE_IDENTIFIER_ESCAPE_UNI` and `TPP_HAVE_IDENTIFIER_ESCAPE_NAMED` */
#ifndef TPP_HAVE_ESCAPED_KEYWORDS
#define TPP_HAVE_ESCAPED_KEYWORDS (TPP_HAVE_BSE || TPP_HAVE_IDENTIFIER_ESCAPE_UNI || TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
#endif /* !TPP_HAVE_ESCAPED_KEYWORDS */

/* Enable support for `tpp_io_compare_mtime()`.
 * This is the underlying system function needed for
 * `#pragma GCC dependency` (see `TPP_HAVE_PRAGMA_GCC_DEPENDENCY`) */
#ifndef TPP_HAVE_IO_COMPARE_MTIME
#define TPP_HAVE_IO_COMPARE_MTIME (TPP_PROFILE == TPP_PROFILE_ALL || TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#endif /* !TPP_HAVE_IO_COMPARE_MTIME */

/* Enable support for `tpp_io_normalize_filename()`.
 * This function is needed to detect+fix (see `TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING`)
 * incorrect casing in `#include`-paths on host platforms with case-insensitive filenames
 * (i.e.: windows).
 *
 * In particular, this function is necessary such that `#pragma once` in a header file
 * `<stdio.h>` will still prevent multiple inclusion if that file is included multiple
 * times with different path casing:
 * ```c
 * #include <stdio.h>
 * #include <STDIO.H> // `TPP_HAVE_IO_NORMALIZE_FILENAME` saves the day
 * ```
 */
#ifndef TPP_HAVE_IO_NORMALIZE_FILENAME
#define TPP_HAVE_IO_NORMALIZE_FILENAME (TPP_OS_WINDOWS && (TPP_HAVE_USER_KEYWORDS || TPP_HAVE_PROFILE_NOT_MINIMAL))
#endif /* !TPP_HAVE_IO_NORMALIZE_FILENAME */

/* Enable support for `tpp_joinpath()`, a wrapper around another internal function
 * used to implement `tpp_lexer_openfile()` (see `TPP_HAVE_LEXER_OPENFILE`) and is also
 * needed to implement `#pragma GCC dependency` (see `TPP_HAVE_PRAGMA_GCC_DEPENDENCY`)
 *
 * This function takes 2 paths, resolves `.` and `..` path references between them,
 * whilst pasting them onto each other in order to form a singular, normalized path */
#ifndef TPP_HAVE_JOINPATH
#define TPP_HAVE_JOINPATH (TPP_PROFILE == TPP_PROFILE_ALL || TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#endif /* !TPP_HAVE_JOINPATH */

/* Enable support for `tpp_lexer_initfile_io()` and `tpp_lexer_initfile_io_ex()` */
#ifndef TPP_HAVE_LEXER_INIT_IO
#define TPP_HAVE_LEXER_INIT_IO TPP_HAVE_FILE_NOKWD
#endif /* !TPP_HAVE_LEXER_INIT_IO */

/* Enable support for `tpp_lexer_initfile_open()`, a function that lets you directly
 * initialize the lexer by passing in a filename that should be opened as input.
 *
 * When `TPP_HAVE_INCLUDE_STACK` is enabled, this also enables support for `tpp_lexer_pushfile_open()` */
#ifndef TPP_HAVE_LEXER_INIT_OPEN
#define TPP_HAVE_LEXER_INIT_OPEN TPP_HAVE_LEXER_OPENFILE
#endif /* !TPP_HAVE_LEXER_INIT_OPEN */

/* Provide an API `tpp_string_builder` centered around builtin `tpp_string` */
#ifndef TPP_HAVE_STRING_BUILDER
#define TPP_HAVE_STRING_BUILDER                                                                   \
	((TPP_PROFILE == TPP_PROFILE_ALL) ||                                                          \
	 TPP_HAVE_LEXER_DECODESTRING || TPP_HAVE_LEXER_SEEKPP_RPAREN ||                               \
	 (TPP_HAVE_LEXER_DECODE_INCLUDE_STRING &&                                                     \
	  (TPP_CONF_MAYBE_1(TPP_HAVE_BSE) || TPP_CONF_MAYBE_1(TPP_HAVE_TRIGRAPHS))) ||                \
	 (TPP_HAVE_MACRO___FILE__ || TPP_HAVE_MACRO___BASE_FILE__ || TPP_HAVE_MACRO___FILE_NAME__) || \
	 TPP_HAVE_MACRO___TPP_EVAL || TPP_HAVE_MACRO___TPP_STR_PACK || TPP_HAVE_MACRO___TPP_EXEC ||   \
	 TPP_HAVE_MACRO___TPP_STR_SUBSTR || TPP_HAVE_MACRO___TPP_LOAD_FILE || TPP_HAVE_CPP_EMBED)
#endif /* !TPP_HAVE_STRING_BUILDER */

/* Provide a function `tpp_string_builder_tryalloc()` */
#ifndef TPP_HAVE_STRING_BUILDER_TRYALLOC
#define TPP_HAVE_STRING_BUILDER_TRYALLOC ((TPP_PROFILE == TPP_PROFILE_ALL) || TPP_HAVE_MACRO___TPP_LOAD_FILE)
#endif /* !TPP_HAVE_STRING_BUILDER_TRYALLOC */

/* Enable support for `tpp_lexer_skip()` and `tpp_lexer_require()` */
#ifndef TPP_HAVE_LEXER_SKIP
#if (TPP_HAVE_PROFILE_NOT_MINIMAL ||              \
     TPP_HAVE_PRAGMA_PUSH_MACRO ||                \
     TPP_HAVE_PRAGMA_DEPRECATED ||                \
     TPP_HAVE_PRAGMA_MESSAGE ||                   \
     TPP_HAVE_PRAGMA_ERROR ||                     \
     TPP_HAVE_PRAGMA_WARNING ||                   \
     TPP_HAVE_PRAGMA_EXTENSION ||                 \
     TPP_HAVE_PRAGMA_TPP_WARNING ||               \
     TPP_HAVE_PRAGMA_TPP_EXTENSION ||             \
     TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS ||     \
     TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS || \
     TPP_HAVE_PRAGMA_TPP_EXEC ||                  \
     TPP_HAVE_PRAGMA_TPP_TPP_EXEC ||              \
     TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH ||          \
     TPP_HAVE_MACRO__Pragma ||                    \
     TPP_HAVE_MACRO___TPP_EVAL ||                 \
     TPP_HAVE_MACRO___has_include ||              \
     TPP_HAVE_MACRO___has_include_next ||         \
     TPP_HAVE_MACRO___has_embed ||                \
     TPP_HAVE_MACRO___TPP_COUNT_TOKENS ||         \
     TPP_HAVE_MACRO___TPP_STR_SIZE ||             \
     TPP_HAVE_MACRO___TPP_RANDOM ||               \
     TPP_HAVE_MACRO___TPP_STR_SUBSTR ||           \
     TPP_HAVE_CPP_ASSERT ||                       \
     TPP_HAVE_CPP_EMBED ||                        \
     TPP_HAVE_BUILTIN_PARSEEXPR_HOOK)
#define TPP_HAVE_LEXER_SKIP 1
#else /* ... */
#define TPP_HAVE_LEXER_SKIP 0
#endif /* !... */
#endif /* !TPP_HAVE_LEXER_SKIP */

/* Enable support for storing a time value in `tpp_lexer` */
#ifndef TPP_HAVE_LEXER_TIME
#define TPP_HAVE_LEXER_TIME TPP_HAVE_TIME_API
#endif /* !TPP_HAVE_LEXER_TIME */

/* Enable support for `tpp_lexer_tryskip_raw()`, a function that is used-
 * and needed in order to seek- and skip-over the `(` token following a
 * macro's name (with support for searching for tokens in parent files
 * of the current one, but rolling back all changes if the next token isn't
 * as expected). It also offers a flag `TPP_LEXER_TRYSKIP_RAW_FLAG_INCLPREV`
 * that will retain the `[tpp_file_getlastpos(),*)` regions of files as
 * they are scanned, allowing it to keep the previous token (which is
 * probably the name of a macro) loaded in memory. */
#ifndef TPP_HAVE_LEXER_TRYSKIP_RAW
#define TPP_HAVE_LEXER_TRYSKIP_RAW (TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_LEXER_TRYSKIP_RAW */

/* Provide a function `tpp_lexer_reprtokenid()` to
 * return the string-representation of a given token ID */
#ifndef TPP_HAVE_LEXER_REPRTOKENID
#define TPP_HAVE_LEXER_REPRTOKENID (TPP_HAVE_LEXER_SKIP)
#endif /* !TPP_HAVE_LEXER_REPRTOKENID */

/* Provide a function `tpp_reprtokenid()` that does the
 * same as `tpp_lexer_reprtokenid()` (and is also used to
 * implement that function), but fails for user-defined
 * keyword token IDs */
#ifndef TPP_HAVE_REPRTOKENID
#define TPP_HAVE_REPRTOKENID (TPP_HAVE_LEXER_REPRTOKENID)
#endif /* !TPP_HAVE_REPRTOKENID */

/* Provide a lexer state flag `TPP_LEXER_STATE_FLAG_ALLTOKENS` that forces
 * `tpp_lexer_yieldpp()` to always re-emit *all* tokens (rather than skip
 * over space/lf/comment tokens based on `TPP_HAVE_TOK_SPACE`,
 * `TPP_HAVE_TOK_LF` and `TPP_HAVE_TOK_COMMENT`)
 *
 * This flag is also needed internally when TPP needs to expand
 * the arguments supplied to a user-defined macro */
#ifndef TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS
#if (TPP_HAVE_CPP_MACROS && (TPP_CONF_MAYBE_0(TPP_HAVE_TOK_SPACE) || \
                             TPP_CONF_MAYBE_0(TPP_HAVE_TOK_LF) ||    \
                             TPP_CONF_MAYBE_0(TPP_HAVE_TOK_COMMENT)))
#define TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS 1
#else /* ... */
#define TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS 0
#endif /* !... */
#endif /* !TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS */

/* Provide a function `tpp_lexer_getkeyworddefined()` to check
 * if a given keyword is `defined()` (meaning it can be expanded
 * as a (potentially builtin) macro) */
#ifndef TPP_HAVE_LEXER_GETKEYWORDDEFINED
#if (TPP_HAVE_CPP_IF_ELSE_ENDIF || \
     TPP_HAVE_CPP_MACROS ||        \
     TPP_HAVE_BUILTIN_EXPR_DEFINED)
#define TPP_HAVE_LEXER_GETKEYWORDDEFINED 1
#else /* ... */
#define TPP_HAVE_LEXER_GETKEYWORDDEFINED 0
#endif /* !... */
#endif /* !TPP_HAVE_LEXER_GETKEYWORDDEFINED */

/* Provide a set of macros/functions `tpp_lexer_manualpopfile_*`
 * that can be used to seek through the contents of files further
 * up the #include-stack in a way that allows for rollback.
 *
 * - `tpp_lexer_manualpopfile_start()`
 * - `tpp_lexer_manualpopfile_popfile()`
 * - `tpp_lexer_manualpopfile_canpopfile()`
 * - `tpp_lexer_manualpopfile_break_rollback()`
 * - `tpp_lexer_manualpopfile_break_commit()`
 * - `tpp_lexer_manualpopfile_break()`
 * - `tpp_lexer_manualpopfile_end_rollback()`
 * - `tpp_lexer_manualpopfile_end_commit()`
 * - `tpp_lexer_manualpopfile_end()`
 */
#ifndef TPP_HAVE_LEXER_MANUALPOPFILE
#define TPP_HAVE_LEXER_MANUALPOPFILE                          \
	(TPP_HAVE_INCLUDE_STACK && (TPP_HAVE_CPP_MACROS ||        \
	                            TPP_HAVE_LEXER_TRYSKIP_RAW || \
	                            TPP_HAVE_LEXER_SKIP))
#endif /* !TPP_HAVE_LEXER_MANUALPOPFILE */

/* Provide a function `tpp_lexer_seekpp_rparen()` that can be used
 * to find the position of a matching `)`-token for the purpose
 * of macro argument lists. */
#ifndef TPP_HAVE_LEXER_SEEKPP_RPAREN
#define TPP_HAVE_LEXER_SEEKPP_RPAREN (TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_LEXER_SEEKPP_RPAREN */

/* Provide a function `tpp_lexer_seekpp_rparen_ex()` that is pretty much
 * the same as `tpp_lexer_seekpp_rparen()`, but is also able to deal with
 * alternate parenthesis pairs: `[ ]` `{ }` `< >` in addition to `( )` */
#ifndef TPP_HAVE_LEXER_SEEKPP_RPAREN_EX
#define TPP_HAVE_LEXER_SEEKPP_RPAREN_EX (TPP_HAVE_LEXER_SEEKPP_RPAREN && TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
#endif /* !TPP_HAVE_LEXER_SEEKPP_RPAREN_EX */

/* Provide a function `tpp_macro_equals()` to compare macro definitions.
 * Because the C standard specifies that re-defining a macro should only
 * be worthy of a warning if its new definition differs from its old one,
 * this function is used to only empty `TPP_W_REDEFINE_MACRO` if exactly
 * that happened.
 *
 * ```c
 * #define foo 10
 * #define foo 10  // Don't warn here (not even because of this comment)
 * #define foo 11  // But *do* warn here!
 * ``` */
#ifndef TPP_HAVE_MACRO_EQUALS
#define TPP_HAVE_MACRO_EQUALS (TPP_HAVE_TPP_W_REDEFINE_MACRO)
#endif /* !TPP_HAVE_MACRO_EQUALS */

/* Provide a function `tpp_lexer_decodestring()` to decode the data contained within strings */
#ifndef TPP_HAVE_LEXER_DECODESTRING
#define TPP_HAVE_LEXER_DECODESTRING (TPP_HAVE_TOK_STRINGLIKE)
#endif /* !TPP_HAVE_LEXER_DECODESTRING */

/* Provide an optional performance-optimization flag `TPP_LEXER_PARSESTRING_FLAG_ALLOWTEMPS`
 * that may be passed to `tpp_lexer_parsestring_cb()` to speed up decoding of certain kinds
 * of strings (by slightly weakening what callbacks are allowed to do when this flag is set) */
#ifndef TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS
#define TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS \
	(TPP_HAVE_LEXER_DECODESTRING && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS */

/* Provide a function `tpp_expr_value_printrepr()` to construct the result
 * of `__TPP_EVAL` (see `TPP_HAVE_MACRO___TPP_EVAL`) */
#ifndef TPP_HAVE_EXPR_VALUE_PRINTREPR
#define TPP_HAVE_EXPR_VALUE_PRINTREPR (TPP_HAVE_MACRO___TPP_EVAL)
#endif /* !TPP_HAVE_EXPR_VALUE_PRINTREPR */

/* Provide a function `tpp_token_encodestring()` to perform `\`-escaping of arbitrary data */
#ifndef TPP_HAVE_TOKEN_ENCODESTRING
#define TPP_HAVE_TOKEN_ENCODESTRING                                          \
	(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT || TPP_HAVE_CHARIZE_MACRO_ARGUMENT || \
	 (TPP_HAVE_EXPR_VALUE_PRINTREPR && TPP_HAVE_BUILTIN_EXPR_STRINGS) ||     \
	 TPP_HAVE_MACRO___FILE__ || TPP_HAVE_MACRO___BASE_FILE__ ||              \
	 TPP_HAVE_MACRO___FILE_NAME__ || TPP_HAVE_MACRO___TPP_STR_PACK ||        \
	 TPP_HAVE_MACRO___TPP_STR_SUBSTR ||                                      \
	 (TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_LEXER_DUMP_DEFINITIONS))
#endif /* !TPP_HAVE_TOKEN_ENCODESTRING */

/* Provide a function `tpp_token_require_whitespace()` to check if 2 tokens,
 * when written directly adjacent to each other, *might* produce a different
 * (set of) token(s) when re-parsed.
 *
 * This function is used to implement `TPP_HAVE_MAGIC_WHITESPACE`, which in
 * turn is needed to inject additional whitespace when failure to do so could
 * result in accidental token concatenation during reparsing. */
#ifndef TPP_HAVE_TOKEN_REQUIRE_WHITESPACE
#define TPP_HAVE_TOKEN_REQUIRE_WHITESPACE TPP_HAVE_MAGIC_WHITESPACE
#endif /* !TPP_HAVE_TOKEN_REQUIRE_WHITESPACE */

/* Provide a function `tpp_lexer_decodeint_expr()` to parse an integer into a `tpp_expr_value` */
#ifndef TPP_HAVE_LEXER_DECODEINT_EXPR
#define TPP_HAVE_LEXER_DECODEINT_EXPR (TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_TOK_C_INT)
#endif /* !TPP_HAVE_LEXER_DECODEINT_EXPR */

/* Provide a function `tpp_lexer_decodeint()` to parse an integer */
#ifndef TPP_HAVE_LEXER_DECODEINT
#define TPP_HAVE_LEXER_DECODEINT                             \
	(TPP_HAVE_TOK_INT && (TPP_HAVE_LEXER_DECODEINT_EXPR ||   \
	                      TPP_HAVE_CPP_LINE ||               \
	                      TPP_HAVE_CPP_DIGIT_LINE ||         \
	                      TPP_HAVE_MACRO___TPP_STR_PACK ||   \
	                      TPP_HAVE_MACRO___TPP_RANDOM ||     \
	                      TPP_HAVE_MACRO___TPP_STR_SUBSTR || \
	                      TPP_HAVE_PRAGMA_WARNING ||         \
	                      TPP_HAVE_PRAGMA_TPP_WARNING))
#endif /* !TPP_HAVE_LEXER_DECODEINT */

/* Enable support for `0x` literals in `tpp_lexer_decodeint()` when parsing `TPP_TOK_C_INT` (see `TPP_HAVE_TOK_C_INT`) */
#ifndef TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS
#define TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS ((TPP_HAVE_LEXER_DECODEINT && TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_HAVE_TOK_C_INT) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fhex-literals" */
#endif /* !TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS */

/* Enable support for `0b` literals in `tpp_lexer_decodeint()` when parsing `TPP_TOK_C_INT` (see `TPP_HAVE_TOK_C_INT`) */
#ifndef TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS
#define TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS ((TPP_HAVE_LEXER_DECODEINT && TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_HAVE_TOK_C_INT) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-fbinary-literals" */
#endif /* !TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS */

/* Enable support for `0o` literals in `tpp_lexer_decodeint()` when parsing `TPP_TOK_C_INT` (see `TPP_HAVE_TOK_C_INT`) */
#ifndef TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS
#define TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS ((TPP_HAVE_LEXER_DECODEINT && TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_HAVE_TOK_C_INT) ? (TPP_PROFILE == TPP_PROFILE_ALL ? TPP_CONF_EXT1 : 1) : 0) /* "-foctal-literals" */
#endif /* !TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS */

/* Provide a function `tpp_lexer_decodefloat_expr()` to parse a float into a `tpp_expr_value` */
#ifndef TPP_HAVE_LEXER_DECODEFLOAT_EXPR
#define TPP_HAVE_LEXER_DECODEFLOAT_EXPR (TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_BUILTIN_EXPR_FLOATS && TPP_HAVE_TOK_FLOAT)
#endif /* !TPP_HAVE_LEXER_DECODEFLOAT_EXPR */

/* Provide a function `tpp_lexer_decodefloat()` to parse a float */
#ifndef TPP_HAVE_LEXER_DECODEFLOAT
#define TPP_HAVE_LEXER_DECODEFLOAT (TPP_HAVE_LEXER_DECODEFLOAT_EXPR)
#endif /* !TPP_HAVE_LEXER_DECODEFLOAT */

/* Provide a function `tpp_lexer_parsecharacter_literal()` to parse character literals */
#ifndef TPP_HAVE_LEXER_PARSECHARACTER_LITERAL
#define TPP_HAVE_LEXER_PARSECHARACTER_LITERAL (TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
#endif /* !TPP_HAVE_LEXER_PARSECHARACTER_LITERAL */

/* Provide a function `tpp_lexer_parsestring_expr()` to parse a string into a `tpp_expr_value` */
#ifndef TPP_HAVE_LEXER_PARSESTRING_EXPR
#define TPP_HAVE_LEXER_PARSESTRING_EXPR (TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_BUILTIN_EXPR_STRINGS && TPP_HAVE_LEXER_DECODESTRING)
#endif /* !TPP_HAVE_LEXER_PARSESTRING_EXPR */

/* Provide a function `tpp_lexer_parsecharacter_expr()` to parse a character literal into a `tpp_expr_value` */
#ifndef TPP_HAVE_LEXER_PARSECHARACTER_EXPR
#define TPP_HAVE_LEXER_PARSECHARACTER_EXPR (TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS && TPP_HAVE_LEXER_DECODESTRING)
#endif /* !TPP_HAVE_LEXER_PARSECHARACTER_EXPR */

/* Provide a builtin implementation for `tpp_expr_value` and its API */
#undef TPP_HAVE_BUILTIN_EXPR_VALUE
#if !defined(tpp_expr_value) && TPP_HAVE_PARSEEXPR_HOOK
#define TPP_HAVE_BUILTIN_EXPR_VALUE 1
#else /* !tpp_expr_value && TPP_HAVE_PARSEEXPR_HOOK */
#define TPP_HAVE_BUILTIN_EXPR_VALUE 0
#endif /* tpp_expr_value || !TPP_HAVE_PARSEEXPR_HOOK */

/* Provide a function `tpp_ftoa()` to convert a float into a string */
#ifndef TPP_HAVE_FTOA
#define TPP_HAVE_FTOA (TPP_HAVE_EXPR_VALUE_PRINTREPR)
#endif /* !TPP_HAVE_FTOA */

/* Provide a function `tpp_extension_nearest()` */
#ifndef TPP_HAVE_TPP_EXTENSION_NEAREST
#define TPP_HAVE_TPP_EXTENSION_NEAREST \
	(TPP_HAVE_TPP_W_UNKNOWN_EXTENSION && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_TPP_EXTENSION_NEAREST */

/* Provide a function `tpp_warning_group_nearest()` */
#ifndef TPP_HAVE_TPP_WARNING_GROUP_NEAREST
#define TPP_HAVE_TPP_WARNING_GROUP_NEAREST \
	(TPP_HAVE_TPP_W_UNKNOWN_WARNING && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_TPP_WARNING_GROUP_NEAREST */

/* Provide a function `tpp_fuzzy_memcmp()` to quantify the
 * *fuzziness* of how close 2 memory-blocks are to each other */
#ifndef TPP_HAVE_TPP_FUZZY_MEMCMP
#define TPP_HAVE_TPP_FUZZY_MEMCMP \
	(TPP_HAVE_TPP_EXTENSION_NEAREST || TPP_HAVE_TPP_WARNING_GROUP_NEAREST)
#endif /* !TPP_HAVE_TPP_FUZZY_MEMCMP */

/* Provide a function `tpp_lexer_define()` + `tpp_lexer_undef()`
 * that can be used to define/undef commandline-defined macros. */
#ifndef TPP_HAVE_LEXER_CLI_DEFINE
#define TPP_HAVE_LEXER_CLI_DEFINE (TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_LEXER_CLI_DEFINE */

/* Provide a function `tpp_lexer_assert()` + `tpp_lexer_unassert()` + `tpp_lexer_unassertall()`
 * that can be used to add/delete keyword assertions. */
#ifndef TPP_HAVE_LEXER_CLI_ASSERT
#define TPP_HAVE_LEXER_CLI_ASSERT (TPP_HAVE_PROFILE_NOT_MINIMAL && TPP_HAVE_CPP_ASSERT)
#endif /* !TPP_HAVE_LEXER_CLI_ASSERT */

/* Provide a function `tpp_keywords_undefall()` + `tpp_lexer_undefall()`
 * that can be used to quickly delete *all* macro definitions. */
#ifndef TPP_HAVE_KEYWORDS_UNDEFALL
#define TPP_HAVE_KEYWORDS_UNDEFALL ((TPP_PROFILE == TPP_PROFILE_ALL) && TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_KEYWORDS_UNDEFALL */

/* Provide a function `tpp_keywords_unassertall()` + `tpp_lexer_unassertall2()`
 * that can be used to quickly delete *all* keyword assertions. */
#ifndef TPP_HAVE_KEYWORDS_UNASSERTALL
#define TPP_HAVE_KEYWORDS_UNASSERTALL ((TPP_PROFILE == TPP_PROFILE_ALL) && TPP_HAVE_CPP_ASSERT)
#endif /* !TPP_HAVE_KEYWORDS_UNASSERTALL */

/* Provide a function `tpp_keywords_resetflags()` + `tpp_lexer_kwds_resetflags()`
 * that can be used to delete the flags of all keywords. */
#ifndef TPP_HAVE_KEYWORDS_RESETFLAGS
#define TPP_HAVE_KEYWORDS_RESETFLAGS                   \
	((TPP_PROFILE == TPP_PROFILE_ALL) &&               \
	 (TPP_HAVE_PRAGMA_ONCE ||                          \
	  TPP_HAVE_CPP_IMPORT ||                           \
	  TPP_HAVE_CLANG_MACRO___has_attribute ||          \
	  TPP_HAVE_CLANG_MACRO___has_builtin ||            \
	  TPP_HAVE_CLANG_MACRO___has_cpp_attribute ||      \
	  TPP_HAVE_CLANG_MACRO___has_declspec_attribute || \
	  TPP_HAVE_CLANG_MACRO___has_extension ||          \
	  TPP_HAVE_CLANG_MACRO___has_feature ||            \
	  TPP_HAVE_CLANG_MACRO___has_c_attribute ||        \
	  TPP_HAVE_MACRO___is_deprecated ||                \
	  TPP_HAVE_MACRO___is_poisoned ||                  \
	  TPP_HAVE_PRAGMA_DEPRECATED ||                    \
	  TPP_HAVE_PRAGMA_GCC_POISON ||                    \
	  TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS))
#endif /* !TPP_HAVE_KEYWORDS_RESETFLAGS */

/* Provide a function `tpp_keywords_resetcounters()` +
 * `tpp_lexer_kwds_resetcounters()` that can be used to
 * reset the state of all `__TPP_COUNTER()' macro expansions. */
#ifndef TPP_HAVE_KEYWORDS_RESETCOUNTERS
#define TPP_HAVE_KEYWORDS_RESETCOUNTERS \
	((TPP_PROFILE == TPP_PROFILE_ALL) && TPP_HAVE_MACRO___TPP_COUNTER)
#endif /* !TPP_HAVE_KEYWORDS_RESETCOUNTERS */

/* Filename of definitions file used by `tpp_lexer_define()` */
#ifndef TPP_CONFIG_CLI_FILENAME
#define TPP_CONFIG_CLI_FILENAME "<commandline>"
#endif /* !TPP_CONFIG_CLI_FILENAME */

/* Provide a function `tpp_lexer_dump_definitions()` that can be
 * used to re-print all user-defined macro definitions and asserts. */
#ifndef TPP_HAVE_LEXER_DUMP_DEFINITIONS
#define TPP_HAVE_LEXER_DUMP_DEFINITIONS (TPP_PROFILE == TPP_PROFILE_ALL)
#endif /* !TPP_HAVE_LEXER_DUMP_DEFINITIONS */

/* Extension to `TPP_HAVE_LEXER_DUMP_DEFINITIONS`: provide an
 * additional flag `TPP_LEXER_DUMP_DEFINITIONS_SORTED` that causes
 * macro (`TPP_HAVE_CPP_MACROS`) / assert (`TPP_HAVE_CPP_ASSERT`)
 * definition to be sorted based on the ID of the associated keyword
 * (which corresponds with the first time the associated keyword was
 * seen, which also usually lines up with the order in which macros
 * were defined) */
#ifndef TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED
#define TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED (TPP_HAVE_LEXER_DUMP_DEFINITIONS)
#endif /* !TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED */

/* Extension to `TPP_HAVE_LEXER_DUMP_DEFINITIONS`: provide an
 * additional flag `TPP_LEXER_DUMP_DEFINITIONS_EXTRAINFO` that causes every
 * dumped macro definition to be preceded by a comment containing (among
 * other things) the file/line/column where that definition comes from. */
#ifndef TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO
#define TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO (TPP_HAVE_LEXER_DUMP_DEFINITIONS)
#endif /* !TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO */

#if TPP_HAVE_MACRO___has_embed
/* String representations of what `__has_embed()`
 * should expand to when the file wasn't found
 *
 * Also represents the expansion of the pre-defined macro `__STDC_EMBED_NOT_FOUND__`
 *
 * @detect: #ifdef __STDC_EMBED_NOT_FOUND__ */
#ifndef TPP_CONFIG_VALUEOF_STDC_EMBED_NOT_FOUND
#define TPP_CONFIG_VALUEOF_STDC_EMBED_NOT_FOUND "0"
#endif /* !TPP_CONFIG_VALUEOF_STDC_EMBED_NOT_FOUND */

/* String representations of what `__has_embed()` should
 * expand to when the file was found and is non-empty
 *
 * Also represents the expansion of the pre-defined macro `__STDC_EMBED_FOUND__`
 *
 * @detect: #ifdef __STDC_EMBED_FOUND__ */
#ifndef TPP_CONFIG_VALUEOF_STDC_EMBED_FOUND
#define TPP_CONFIG_VALUEOF_STDC_EMBED_FOUND "1"
#endif /* !TPP_CONFIG_VALUEOF_STDC_EMBED_FOUND */

/* String representations of what `__has_embed()` should
 * expand to when the file was found, but is empty
 *
 * Also represents the expansion of the pre-defined macro `__STDC_EMBED_EMPTY__`
 *
 * @detect: #ifdef __STDC_EMBED_EMPTY__ */
#ifndef TPP_CONFIG_VALUEOF_STDC_EMBED_EMPTY
#define TPP_CONFIG_VALUEOF_STDC_EMBED_EMPTY "2"
#endif /* !TPP_CONFIG_VALUEOF_STDC_EMBED_EMPTY */
#endif /* TPP_HAVE_MACRO___has_embed */

/* Extra configuration for `#pragma message`: print a leading
 * `TPP_CONFIG_FILE_AND_LINE_FORMAT` using the values
 * that would also be printed by `__FILE__`, `__LINE__`, `__COLUMN__` */
#ifndef TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION
#define TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION (TPP_HAVE_PROFILE_NOT_MINIMAL ? TPP_CONF_EXT0 : 0) /* "-fpragma-message-prints-location" */
#endif /* !TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION */

/* Extra configuration for `#pragma message`: print a trailing `\n` */
#ifndef TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED
#define TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED (TPP_HAVE_PROFILE_NOT_MINIMAL ? TPP_CONF_EXT0 : 0) /* "-fpragma-message-omits-trailing-linefeed" */
#endif /* !TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED */

/************************************************************************/
/************************************************************************/
/************************************************************************/





/************************************************************************/
/* WARNINGS                                                             */
/************************************************************************/

/* Format to use for file+line+column log messages.
 * When `TPP_HAVE_RT_FILE_AND_LINE_FORMAT` is enabled, this is
 * only the *default*-format, with the actual format being overwritable
 * at runtime. */
#ifndef TPP_CONFIG_FILE_AND_LINE_FORMAT
#if defined(_MSC_VER)
#define TPP_CONFIG_FILE_AND_LINE_FORMAT "%Pf(%Pl, %Pc): "
#else /* _MSC_VER */
#define TPP_CONFIG_FILE_AND_LINE_FORMAT "%Pf:%Pl:%Pc: "
#endif /* !_MSC_VER */
#endif /* !TPP_CONFIG_FILE_AND_LINE_FORMAT */

/* Allow the file-and-line format used by warning to be overwritten on a per-lexer basis.
 *
 * When this is disabled, `TPP_CONFIG_FILE_AND_LINE_FORMAT` is always used instead.
 *
 * **Getter**: `tpp_lexer_getfileandlineformat(lexer)`<br/>
 * **Setter**: `tpp_lexer_setfileandlineformat(lexer, format)` */
#ifndef TPP_HAVE_RT_FILE_AND_LINE_FORMAT
#define TPP_HAVE_RT_FILE_AND_LINE_FORMAT \
	(TPP_PROFILE == TPP_PROFILE_ALL &&   \
	 (TPP_HAVE_WARNINGS ||               \
	  (TPP_HAVE_PRAGMA_MESSAGE &&        \
	   TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)))
#endif /* !TPP_HAVE_RT_FILE_AND_LINE_FORMAT */

/* General config for `-Wquality` warnings. When overwritten
 * to `0`, all `-Wquality` warnings will be disabled. */
#ifndef TPP_HAVE_QUALITY_WARNINGS
#define TPP_HAVE_QUALITY_WARNINGS (TPP_HAVE_WARNINGS && TPP_HAVE_PROFILE_NOT_MINIMAL)
#endif /* !TPP_HAVE_QUALITY_WARNINGS */

/* Configurations for individual warnings */
#ifndef TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT
#define TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT TPP_HAVE_WARNINGS
#endif /* !TPP_HAVE_TPP_W_SLASHSTAR_INSIDE_OF_COMMENT */
#ifndef TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED
#define TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED (TPP_HAVE_WARNINGS && TPP_HAVE_BSE)
#endif /* !TPP_HAVE_TPP_W_LINE_COMMENT_CONTINUED */
#ifndef TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH
#define TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH (TPP_HAVE_WARNINGS && TPP_HAVE_TRIGRAPHS)
#endif /* !TPP_HAVE_TPP_W_ENCOUNTERED_TRIGRAPH */
#ifndef TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED
#define TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED        \
	(TPP_HAVE_WARNINGS &&                                   \
	 ((TPP_CONF_MAYBE_0(TPP_HAVE_STRING_ALLOW_MULTILINE) && \
	   (TPP_HAVE_TOK_C_STRING ||                        \
	    TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL ||         \
	    TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL ||         \
	    TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL ||        \
	    TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL ||        \
	    TPP_HAVE_TOK_RAW_STRING_LITERAL ||              \
	    TPP_HAVE_TOK_C_CHAR ||                          \
	    TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL ||           \
	    TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL ||           \
	    TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL ||          \
	    TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL ||          \
	    TPP_HAVE_TOK_RAW_CHAR_LITERAL)) ||              \
	  TPP_HAVE_LEXER_YIELD_INCLUDE_STRING))
#endif /* !TPP_HAVE_TPP_W_STRING_TERMINATED_BY_LINEFEED */
#ifndef TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED
#define TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED \
	(TPP_HAVE_WARNINGS &&                              \
	 TPP_HAVE_STRING_WARN_MULTILINE &&                 \
	 (TPP_HAVE_TOK_C_STRING ||                     \
	  TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL ||      \
	  TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL ||      \
	  TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL ||     \
	  TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL ||     \
	  TPP_HAVE_TOK_RAW_STRING_LITERAL ||           \
	  TPP_HAVE_TOK_C_CHAR ||                       \
	  TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL ||        \
	  TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL ||        \
	  TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL ||       \
	  TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL ||       \
	  TPP_HAVE_TOK_RAW_CHAR_LITERAL))
#endif /* !TPP_HAVE_TPP_W_STRING_CONTINUED_AFTER_LINEFEED */
#ifndef TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF
#define TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_TOK_STRINGLIKE || TPP_HAVE_LEXER_YIELD_INCLUDE_STRING))
#endif /* !TPP_HAVE_TPP_W_STRING_TERMINATED_BY_EOF */
#ifndef TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF
#define TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF (TPP_HAVE_WARNINGS && TPP_HAVE_TOK_COMMENTLIKE_NOLINE)
#endif /* !TPP_HAVE_TPP_W_COMMENT_TERMINATED_BY_EOF */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN (TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_SKIP)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK (TPP_HAVE_WARNINGS && TPP_HAVE_MACRO___TPP_STR_PACK)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_TPP_STR_PACK */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING (TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING))
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON (TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING))
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_WARNING_AFTER_COLON */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_GCC_DIAGNOSTIC */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_PRAGMA_TPP_INCLUDE_PATH */
#ifndef TPP_HAVE_TPP_W_ERROR
#define TPP_HAVE_TPP_W_ERROR (TPP_HAVE_WARNINGS && (TPP_HAVE_CPP_ERROR || TPP_HAVE_PRAGMA_ERROR || TPP_HAVE_PRAGMA_GCC_ERROR))
#endif /* !TPP_HAVE_TPP_W_ERROR */
#ifndef TPP_HAVE_TPP_W_WARNING
#define TPP_HAVE_TPP_W_WARNING (TPP_HAVE_WARNINGS && (TPP_HAVE_CPP_WARNING || TPP_HAVE_PRAGMA_GCC_WARNING))
#endif /* !TPP_HAVE_TPP_W_WARNING */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS
#define TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA)
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_PRAGMAS */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE
#define TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE (TPP_HAVE_WARNINGS && TPP_CONF_MAYBE_0(TPP_HAVE_TOK_SHELL_COMMENT) && TPP_CONF_MAYBE_0(TPP_HAVE_TOK_SOL_SHELL_COMMENT) && TPP_HAVE_CPP_DIRECTIVES)
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE
#define TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA)
#endif /* !TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_PRAGMA_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER
#define TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_ONCE && TPP_HAVE_INCLUDE_STACK)
#endif /* !TPP_HAVE_TPP_W_PRAGMA_ONCE_OUTSIDE_HEADER */
#ifndef TPP_HAVE_TPP_W_DEPRECATED_KEYWORD
#define TPP_HAVE_TPP_W_DEPRECATED_KEYWORD (TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_DEPRECATED || TPP_HAVE_PRAGMA_GCC_POISON))
#endif /* !TPP_HAVE_TPP_W_DEPRECATED_KEYWORD */
#ifndef TPP_HAVE_TPP_W_POP_MACRO_EMPTY_STACK
#define TPP_HAVE_TPP_W_POP_MACRO_EMPTY_STACK (TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_PUSH_MACRO)
#endif /* !TPP_HAVE_TPP_W_POP_MACRO_EMPTY_STACK */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE
#define TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_STRING_ESCAPE)
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE
#define TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_IDENTIFIER_ESCAPE_NAMED || TPP_HAVE_STRING_ESCAPE_NAMED))
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_NAMED_ESCAPE_SEQUENCE */
#ifndef TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST
#define TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST (TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_SEEKPP_RPAREN)
#endif /* !TPP_HAVE_TPP_W_EOF_IN_ARGUMENT_LIST */
#ifndef TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS
#define TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS (TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_SEEKPP_RPAREN)
#endif /* !TPP_HAVE_TPP_W_TOO_MANY_ARGUMENTS */
#ifndef TPP_HAVE_TPP_W_TOO_FEW_ARGUMENTS
#define TPP_HAVE_TPP_W_TOO_FEW_ARGUMENTS (TPP_HAVE_WARNINGS && TPP_HAVE_CPP_MACROS)
#endif /* !TPP_HAVE_TPP_W_TOO_FEW_ARGUMENTS */
#ifndef TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE
#define TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_CPP_IF_ELSE_ENDIF || TPP_HAVE_CPP_DEFINE))
#endif /* !TPP_HAVE_TPP_W_EXPECTED_MACRO_NAME_IN_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE
#define TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_ASSERT)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_ASSERTION_KEY_IN_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE
#define TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_ASSERT)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_ASSERTION_VALUE_IN_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE
#define TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE      \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_CPP_IF_ELSE_ENDIF || \
	                       TPP_HAVE_CPP_DEFINE ||        \
	                       TPP_HAVE_CPP_INCLUDE ||       \
	                       TPP_HAVE_CPP_INCLUDE_NEXT ||  \
	                       TPP_HAVE_CPP_IMPORT ||        \
	                       TPP_HAVE_CPP_EMBED ||         \
	                       TPP_HAVE_CPP_ASSERT ||        \
	                       TPP_HAVE_CPP_DIGIT_LINE ||    \
	                       TPP_HAVE_CPP_LINE ||          \
	                       TPP_HAVE_CPP_IDENT_SCCS))
#endif /* !TPP_HAVE_TPP_W_EXTRA_TOKENS_AFTER_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_CANNOT_UNDEF_BUILTIN_MACRO
#define TPP_HAVE_TPP_W_CANNOT_UNDEF_BUILTIN_MACRO \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_DEFINE)
#endif /* !TPP_HAVE_TPP_W_CANNOT_UNDEF_BUILTIN_MACRO */
#ifndef TPP_HAVE_TPP_W_DEFINE_BUILTIN_MACRO
#define TPP_HAVE_TPP_W_DEFINE_BUILTIN_MACRO \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_DEFINE)
#endif /* !TPP_HAVE_TPP_W_DEFINE_BUILTIN_MACRO */
#ifndef TPP_HAVE_TPP_W_REDEFINE_MACRO
#define TPP_HAVE_TPP_W_REDEFINE_MACRO \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_DEFINE)
#endif /* !TPP_HAVE_TPP_W_REDEFINE_MACRO */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_DEFINE)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_MACRO_PARAMETER_LIST */
#ifndef TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME
#define TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_DEFINE)
#endif /* !TPP_HAVE_TPP_W_DUPLICATE_MACRO_PARAMETER_NAME */
#ifndef TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT
#define TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT \
	(TPP_HAVE_WARNINGS && TPP_HAVE_VA_OPT_IN_MACROS)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_LPAREN_AFTER_VA_OPT */
#ifndef TPP_HAVE_TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT
#define TPP_HAVE_TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT \
	(TPP_HAVE_WARNINGS && TPP_HAVE_VA_OPT_IN_MACROS)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_RPAREN_AFTER_VA_OPT */
#ifndef TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED
#define TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED                  \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_EXPR_DEFINED && \
	 TPP_CONF_MAYBE_0(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR))
#endif /* !TPP_HAVE_TPP_W_EXPANSION_TO_DEFINED */
#ifndef TPP_HAVE_TPP_W_EXPECTED_STRING
#if (TPP_HAVE_WARNINGS && TPP_HAVE_TOK_STRINGLIKE && \
     (TPP_HAVE_PROFILE_NOT_MINIMAL ||                    \
      TPP_HAVE_PRAGMA_PUSH_MACRO ||                      \
      TPP_HAVE_PRAGMA_DEPRECATED ||                      \
      TPP_HAVE_PRAGMA_EXTENSION ||                       \
      TPP_HAVE_PRAGMA_TPP_EXTENSION ||                   \
      TPP_HAVE_PRAGMA_MESSAGE ||                         \
      TPP_HAVE_PRAGMA_ERROR ||                           \
      TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC ||                  \
      TPP_HAVE_PRAGMA_GCC_WARNING ||                     \
      TPP_HAVE_PRAGMA_GCC_ERROR ||                       \
      TPP_HAVE_PRAGMA_TPP_EXEC ||                        \
      TPP_HAVE_PRAGMA_TPP_TPP_EXEC ||                    \
      TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS ||           \
      TPP_HAVE_PRAGMA_TPP_TPP_SET_KEYWORD_FLAGS ||       \
      TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH ||                \
      TPP_HAVE_MACRO__Pragma ||                          \
      TPP_HAVE_MACRO___TPP_IDENTIFIER ||                 \
      TPP_HAVE_MACRO___TPP_STR_DECOMPILE ||              \
      TPP_HAVE_MACRO___TPP_COUNT_TOKENS ||               \
      TPP_HAVE_MACRO___TPP_STR_SIZE ||                   \
      TPP_HAVE_MACRO___TPP_EXEC ||                       \
      TPP_HAVE_CPP_IDENT_SCCS))
#define TPP_HAVE_TPP_W_EXPECTED_STRING 1
#else /* ... */
#define TPP_HAVE_TPP_W_EXPECTED_STRING 0
#endif /* !... */
#endif /* !TPP_HAVE_TPP_W_EXPECTED_STRING */
#ifndef TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING
#define TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING \
	(TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_YIELD_INCLUDE_STRING)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_INCLUDE_STRING */
#ifndef TPP_HAVE_TPP_W_NO_SUCH_FILE
#define TPP_HAVE_TPP_W_NO_SUCH_FILE                     \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_CPP_INCLUDE ||      \
	                       TPP_HAVE_CPP_INCLUDE_NEXT || \
	                       TPP_HAVE_CPP_IMPORT ||       \
	                       TPP_HAVE_CPP_EMBED ||        \
	                       TPP_HAVE_MACRO___TPP_LOAD_FILE))
#endif /* !TPP_HAVE_TPP_W_NO_SUCH_FILE */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER
#define TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_EMBED)
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_EMBED_PARAMETER */
#ifndef TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF
#define TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF \
	(TPP_HAVE_WARNINGS && TPP_HAVE_IFDEF_STACK)
#endif /* !TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF */
#ifndef TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF
#define TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_TPP_W_ELIF_OR_ELSE_WITHOUT_IF */
#ifndef TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE
#define TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_TPP_W_ELIF_OR_ELSE_AFTER_ELSE */
#ifndef TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF
#define TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_TPP_W_ENDIF_WITHOUT_IF */
#ifndef TPP_HAVE_TPP_W_ENDIF_LABELS
#define TPP_HAVE_TPP_W_ENDIF_LABELS \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_TPP_W_ENDIF_LABELS */
#ifndef TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF
#define TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_IFDEF */
#ifndef TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION
#define TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_PARSEEXPR_HOOK)
#endif /* !TPP_HAVE_TPP_W_UNEXPECTED_TOKEN_IN_EXPRESSION */
#ifndef TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION
#define TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_PARSEEXPR_HOOK)
#endif /* !TPP_HAVE_TPP_W_UNDEFINED_KEYWORD_IN_EXPRESSION */
#ifndef TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED
#define TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_EXPR_DEFINED)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_DEFINED */
#ifndef TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION
#define TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_CPP_ASSERT))
#endif /* !TPP_HAVE_TPP_W_EXPECTED_IDENTIFIER_AFTER_ASSERTION */
#ifndef TPP_HAVE_TPP_W_BAD_EXPRESSION_OPERANDS
#define TPP_HAVE_TPP_W_BAD_EXPRESSION_OPERANDS \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && TPP_HAVE_BUILTIN_EXPR_STRINGS)
#endif /* !TPP_HAVE_TPP_W_BAD_EXPRESSION_OPERANDS */
#ifndef TPP_HAVE_TPP_W_DIVIDE_BY_ZERO
#define TPP_HAVE_TPP_W_DIVIDE_BY_ZERO \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_EXPR_VALUE)
#endif /* !TPP_HAVE_TPP_W_DIVIDE_BY_ZERO */
#ifndef TPP_HAVE_TPP_W_INVALID_INTEGER
#define TPP_HAVE_TPP_W_INVALID_INTEGER \
	(TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_DECODEINT)
#endif /* !TPP_HAVE_TPP_W_INVALID_INTEGER */
#ifndef TPP_HAVE_TPP_W_INVALID_FLOAT
#define TPP_HAVE_TPP_W_INVALID_FLOAT \
	(TPP_HAVE_WARNINGS && TPP_HAVE_LEXER_DECODEFLOAT)
#endif /* !TPP_HAVE_TPP_W_INVALID_FLOAT */
#ifndef TPP_HAVE_TPP_W_MULTICHAR_LITERAL
#define TPP_HAVE_TPP_W_MULTICHAR_LITERAL \
	(TPP_HAVE_WARNINGS && TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
#endif /* !TPP_HAVE_TPP_W_MULTICHAR_LITERAL */
#ifndef TPP_HAVE_TPP_W_DATE_TIME
#define TPP_HAVE_TPP_W_DATE_TIME                           \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_MACRO___TIME__ ||      \
	                       TPP_HAVE_MACRO___DATE__ ||      \
	                       TPP_HAVE_MACRO___TIMESTAMP__ || \
	                       TPP_HAVE_NUMERIC_DATE_MACROS || \
	                       TPP_HAVE_NUMERIC_TIME_MACROS))
#endif /* !TPP_HAVE_TPP_W_DATE_TIME */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_EXTENSION
#define TPP_HAVE_TPP_W_UNKNOWN_EXTENSION \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION))
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_EXTENSION */
#ifndef TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS
#define TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION) && TPP_HAVE_EXTENSIONS_PUSH_POP)
#endif /* !TPP_HAVE_TPP_W_CANNOT_POP_EXTENSIONS */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_WARNING
#define TPP_HAVE_TPP_W_UNKNOWN_WARNING \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING))
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_WARNING */
#ifndef TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER
#define TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNING_NUMBERS)
#endif /* !TPP_HAVE_TPP_W_UNKNOWN_WARNING_NUMBER */
#ifndef TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS
#define TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS \
	(TPP_HAVE_WARNINGS && (TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING) && TPP_HAVE_WARNINGS_PUSH_POP)
#endif /* !TPP_HAVE_TPP_W_CANNOT_POP_WARNINGS */
#ifndef TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE
#define TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_CPP_LINE)
#endif /* !TPP_HAVE_TPP_W_EXPECTED_INT_AFTER_LINE_DIRECTIVE */
#ifndef TPP_HAVE_TPP_W_DEPENDENCY_CHANGED
#define TPP_HAVE_TPP_W_DEPENDENCY_CHANGED \
	(TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#endif /* !TPP_HAVE_TPP_W_DEPENDENCY_CHANGED */
#ifndef TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED
#define TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED \
	(TPP_HAVE_WARNINGS && TPP_MAX_INCLUDE_DEPTH != 0)
#endif /* !TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED */
#ifndef TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED
#define TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED \
	(TPP_HAVE_WARNINGS && TPP_MAX_RECURSIVE_MACRO_DEPTH != 0)
#endif /* !TPP_HAVE_TPP_W_MACRO_RECURSION_LIMIT_EXCEEDED */
#ifndef TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING
#define TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING \
	(TPP_HAVE_WARNINGS && TPP_HAVE_IO_NORMALIZE_FILENAME)
#endif /* !TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING */
#ifndef TPP_HAVE_TPP_W_PAREN_AROUND_LAND
#define TPP_HAVE_TPP_W_PAREN_AROUND_LAND                                                  \
	(TPP_HAVE_WARNINGS && TPP_HAVE_QUALITY_WARNINGS && TPP_HAVE_BUILTIN_PARSEEXPR_HOOK && \
	 TPP_HAVE_TOK_PIPE_PIPE && TPP_HAVE_TOK_AMP_AMP)
#endif /* !TPP_HAVE_TPP_W_PAREN_AROUND_LAND */
#ifndef TPP_HAVE_TPP_W_CANNOT_POP_INCLUDE_PATHS
#define TPP_HAVE_TPP_W_CANNOT_POP_INCLUDE_PATHS \
	(TPP_HAVE_WARNINGS && TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_PUSH_POP)
#endif /* !TPP_HAVE_TPP_W_CANNOT_POP_INCLUDE_PATHS */
#ifndef TPP_HAVE_TPP_W_CHARACTER_TOO_LARGE
#define TPP_HAVE_TPP_W_CHARACTER_TOO_LARGE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_STRING_ESCAPE_BIGCHAR)
#endif /* !TPP_HAVE_TPP_W_CHARACTER_TOO_LARGE */
#ifndef TPP_HAVE_TPP_W_ILLEGAL_UTF8_SEQUENCE
#define TPP_HAVE_TPP_W_ILLEGAL_UTF8_SEQUENCE \
	(TPP_HAVE_WARNINGS && TPP_HAVE_UNICODE)
#endif /* !TPP_HAVE_TPP_W_ILLEGAL_UTF8_SEQUENCE */
/************************************************************************/
/************************************************************************/
/************************************************************************/

/************************************************************************/
/* File: parts/error.h                                                  */
/************************************************************************/
TPP_DECL_BEGIN

enum {
	_TPP_ERRCODE_OK,
	_TPP_ERRCODE_NOMEM,
	_TPP_ERRCODE_IO,
	_TPP_ERRCODE_NOENT,
#if TPP_HAVE_FILE_NONBLOCK
	_TPP_ERRCODE_WOULDBLOCK,
#endif /* TPP_HAVE_FILE_NONBLOCK */
#if TPP_HAVE_LEXER_OPENFILE_EX
	_TPP_ERRCODE_MASKED,
#endif /* TPP_HAVE_LEXER_OPENFILE_EX */
#if TPP_HAVE_WARNINGS
	_TPP_ERRCODE_LEXERROR,
	_TPP_ERRCODE_WARNPRINT,
#endif /* TPP_HAVE_WARNINGS */
	_TPP_ERRCODE_COUNT,
};


/* NOTE: "[SOFT_ERROR]" are "temporary" errors that are intended to-be recovered from.
 *       These errors should be caught & dealt with at appropriate points in the code. */
typedef enum tpp_errno {
#define TPP_ISERR(error) tpp_unlikely((error) != TPP_EOK)

	/* --------------------------------------------------------------------
	 * NO_ERROR: TPP_EOK
	 * --------------------------------------------------------------------
	 *
	 * Success (operation completed without errors) */
	TPP_EOK = -_TPP_ERRCODE_OK,



	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_ENOMEM
	 * --------------------------------------------------------------------
	 *
	 * Out of memory
	 *
	 * A call to `tpp_malloc()' or `tpp_realloc()' returned NULL, indicating
	 * that the system is out of heap memory. */
	TPP_ENOMEM = -_TPP_ERRCODE_NOMEM,



	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_EIO
	 * --------------------------------------------------------------------
	 *
	 * Filesystem I/O operation failed */
	TPP_EIO = -_TPP_ERRCODE_IO,



	/* --------------------------------------------------------------------
	 * SOFT_ERROR: TPP_ENOENT
	 * --------------------------------------------------------------------
	 *
	 * No such file or directory
	 *
	 * WARNING: This error is _NOT_ returned when a #include-directive fails!
	 *          As a matter of fact, this error is _NEVER_ returned by APIs
	 *          such as `tpp_lexer_yield()' (there is no TPP_TOK_ENOENT).
	 * Instead, this error is used internally to indicate that a file could
	 * not be opened, however TPP may inherently handle this by trying to
	 * use some other filename in order to open a file. e.g.: when you have
	 * specified multiple system include paths, and TPP is parsing a line
	 * such as:
	 * >> #include <stdio.h>
	 *
	 * When it will try to open the following files (in order) and stop the
	 * first time one of these open calls succeeds:
	 * - tpp_io_open("/home/me/projects/tpp/stdio.h")
	 * - tpp_io_open("/usr/local/include/stdio.h")
	 * - tpp_io_open("/usr/include/stdio.h")
	 *
	 * Even if all of those calls fail, you will NOT see this error escape
	 * out of the handler for #include-directives. At that point, TPP will
	 * instead trigger the appropriate tpp_lexer_warnf() warning, which
	 * might then return "TPP_ELEXERROR". And it will be **that** error
	 * that will be propagated out of `tpp_lexer_yield()'; not TPP_ENOENT */
	TPP_ENOENT = -_TPP_ERRCODE_NOENT,



#if TPP_HAVE_FILE_NONBLOCK
	/* --------------------------------------------------------------------
	 * SOFT_ERROR: TPP_EWOULDBLOCK
	 * --------------------------------------------------------------------
	 *
	 * Operation would block, but non-blocking was requested
	 *
	 * You will only see this error if you made use of "TPP_HAVE_FILE_NONBLOCK"
	 * This is a temporary error that means that the next token cannot be read
	 * *right now* because reading from the underlying I/O file would block.
	 *
	 * -> You will not see this error when building with "-DTPP_HAVE_FILE_NONBLOCK=0"
	 * -> You will not see this error when not using the "TPP_FILE_FLAGS_NONBLOCK" flag */
	TPP_EWOULDBLOCK = -_TPP_ERRCODE_WOULDBLOCK,
#endif /* TPP_HAVE_FILE_NONBLOCK */



#if TPP_HAVE_LEXER_OPENFILE_EX
	/* --------------------------------------------------------------------
	 * SOFT_ERROR: TPP_EMASKED
	 * --------------------------------------------------------------------
	 *
	 * File cannot be opened because it has been masked. Used internally to
	 * describe a file that exists, but should not be included (again) due
	 * to a `#pragma once', or because `#import' is being used (and had
	 * already been used once before) */
	TPP_EMASKED = -_TPP_ERRCODE_MASKED,
#endif /* TPP_HAVE_LEXER_OPENFILE_EX */



#if TPP_HAVE_WARNINGS
	/* --------------------------------------------------------------------
	 * SOFT_ERROR / HARD_ERROR: TPP_ELEXERROR
	 * --------------------------------------------------------------------
	 *
	 * Hard lexer error (usually when too many -Werror were emitted)
	 *
	 * This error should be treated as a HARD_ERROR in most cases, in that
	 * it should be propagated. However, since it is always generated by
	 * TPP itself, you *could* in theory also change lexer configuration
	 * and re-try the failing operation (though if you do that, you will
	 * probably run into the same error again) */
	TPP_ELEXERROR = -_TPP_ERRCODE_LEXERROR,

	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_EWARNPRINT
	 * --------------------------------------------------------------------
	 *
	 * Printer registered for "tpp_lexer_warnf" returned an error.
	 * Since this error is not related to TPP itself, this error should
	 * be propagated. */
	TPP_EWARNPRINT = -_TPP_ERRCODE_WARNPRINT,
#endif /* TPP_HAVE_WARNINGS */


	TPP_ELAST = (-_TPP_ERRCODE_COUNT) + 1, /* Last defined error number */
} tpp_errno;


/* Helper macros for embedding error codes in "tpp_ssize" values. */
#define /*tpp_ssize*/ TPP_SSIZE_OFERR(/*tpp_errno*/ e) ((tpp_ssize)(int)(e))
#define /*tpp_errno*/ TPP_SSIZE_ASERR(/*tpp_ssize*/ v) ((tpp_errno)(int)(v))
#if 1
#define /*tpp_errno*/ TPP_SSIZE_ASERR_OR_EOK(/*tpp_ssize*/ v) ((tpp_errno)(int)(v))
#else
#define /*tpp_errno*/ TPP_SSIZE_ASERR_OR_EOK(/*tpp_ssize*/ v) ((v) == 0 ? TPP_EOK : (tpp_errno)(int)(v))
#endif
#if TPP_DEBUG
#define /*bool*/ TPP_SSIZE_ISERR(/*tpp_ssize*/ v) \
	(((v) < 0) ? (tpp_assert((tpp_size)(v) >= (tpp_size)TPP_SSIZE_OFERR(TPP_ELAST)), 1) : 0)
#define /*bool*/ TPP_SSIZE_ISERR_OR_EOK(/*tpp_ssize*/ v) \
	((v) <= 0 ? (tpp_assert((v) >= TPP_SSIZE_OFERR(TPP_ELAST)), 1) : 0)
#else /* TPP_DEBUG */
#define /*bool*/ TPP_SSIZE_ISERR(/*tpp_ssize*/ v) ((v) < 0)
#define /*bool*/ TPP_SSIZE_ISERR_OR_EOK(/*tpp_ssize*/ v) ((v) <= 0)
#endif /* !TPP_DEBUG */



#if TPP_HAVE_STRERROR
/* Return a human-readable descriptor of "error" */
TPP_DECL TPP_CONSTCALL TPP_RETNONNULL TPP_WUNUSED
char const *TPPCALL tpp_strerror(tpp_errno error);
#endif /* TPP_HAVE_STRERROR */

/************************************************************************/
/* File: parts/ctype.h                                                  */
/************************************************************************/

/* You can override the builtin ctype matrix if you already have your own.
 * however yours should match ASCII expectations, especially when it comes
 * to control characters. If this is not the case */
#undef TPP_HAVE_BUILTIN_CTYPE
#if (!defined(tpp_ascii_issymstrt) ||    \
     !defined(tpp_ascii_issymcont) ||    \
     !defined(tpp_ascii_isdigit) ||      \
     !defined(tpp_ascii_isspace) ||      \
     !defined(tpp_ascii_islf) ||         \
     !defined(tpp_ascii_islf_or_mblf) || \
     !defined(tpp_ascii_isspace_nolf))
#define TPP_HAVE_BUILTIN_CTYPE 1
#else /* ... */
#define TPP_HAVE_BUILTIN_CTYPE 0
#endif /* !... */

/* Assume that all "tpp_ascii_is*" macros are ascii-compatible
 * This allows for some additional optimizations when it comes
 * to routing character bytes to token decoders.
 *
 * iow: When this is enabled, "tpp_ascii_islf()" in a switch can
 *      be replaced with "case TPP_ASCII_LF: case TPP_ASCII_CR:"
 */
#ifndef TPP_HAVE_ASSUME_ASCII_CTYPE
#define TPP_HAVE_ASSUME_ASCII_CTYPE (TPP_HAVE_BUILTIN_CTYPE || 1)
#endif /* !TPP_HAVE_ASSUME_ASCII_CTYPE */


/* Ordinals for special character with special meaning */
#define TPP_ASCII_TAB 9  /* \t */
#define TPP_ASCII_LF  10 /* \n */
#define TPP_ASCII_CR  13 /* \r */


#if TPP_HAVE_BUILTIN_CTYPE
#define _TPP_CTYPE_ISSYMSTRT  0x01 /* Symbol start character */
#define _TPP_CTYPE_ISSYMCONT  0x02 /* Symbol continuation character */
#define _TPP_CTYPE_ISSPACE    0x04 /* Space character (excluding \r and \n) */
#define _TPP_CTYPE_ISLF       0x08 /* Linefeed character (\r and \n) */
#define _TPP_CTYPE_ISDIGIT    0x10 /* 0-9 */
#define _TPP_CTYPE_ISMBLF     0x20 /* First byte of utf8-encoded unicode linefeed character sequence (0xc2 + 0xe2 right now) */

#if UINT_LEAST8_MAX == 0xff
#define _tpp_ascii_mask(ch) ((uint_least8_t)(ch))
#else /* UINT_LEAST8_MAX == 0xff */
#define _tpp_ascii_mask(ch) ((ch) & 0xff)
#endif /* UINT_LEAST8_MAX != 0xff */
TPP_CONST_DECL uint_least8_t const _tpp_ctype[256]; /* Don't access directly! (considered TPP_INTERNAL) */
#define tpp_ascii_issymstrt(ch)    (_tpp_ctype[_tpp_ascii_mask(ch)] & _TPP_CTYPE_ISSYMSTRT)
#define tpp_ascii_issymcont(ch)    (_tpp_ctype[_tpp_ascii_mask(ch)] & _TPP_CTYPE_ISSYMCONT)
#define tpp_ascii_isdigit(ch)      (_tpp_ctype[_tpp_ascii_mask(ch)] & _TPP_CTYPE_ISDIGIT)
#define tpp_ascii_isspace(ch)      (_tpp_ctype[_tpp_ascii_mask(ch)] & (_TPP_CTYPE_ISSPACE | _TPP_CTYPE_ISLF))
#define tpp_ascii_islf(ch)         (_tpp_ctype[_tpp_ascii_mask(ch)] & _TPP_CTYPE_ISLF)
#define tpp_ascii_islf_or_mblf(ch) (_tpp_ctype[_tpp_ascii_mask(ch)] & (_TPP_CTYPE_ISLF | _TPP_CTYPE_ISMBLF))
#define tpp_ascii_isspace_nolf(ch) (_tpp_ctype[_tpp_ascii_mask(ch)] & _TPP_CTYPE_ISSPACE)
#endif /* TPP_HAVE_BUILTIN_CTYPE */

/* Check if "ch" is the first byte of a multi-byte UTF-8 sequence */
#ifndef tpp_ascii_ismb
#if 0 /* Setting "1" here reduces the chances of unicode encoding errors being detected */
#define tpp_ascii_ismb(ch) ((ch) >= 0xc0)
#else
#define tpp_ascii_ismb(ch) ((ch) >= 0x80)
#endif
#endif /* !tpp_ascii_ismb */

#ifndef tpp_ascii_isspace_nolf
#define tpp_ascii_isspace_nolf(ch) (tpp_ascii_isspace(ch) && !tpp_ascii_islf(ch))
#endif /* !tpp_ascii_isspace_nolf */
#ifndef tpp_ascii_islf_or_mblf
#define tpp_ascii_islf_or_mblf(ch) (tpp_ascii_islf(ch) || (ch) == 0xc2 || (ch) == 0xe2)
#endif /* !tpp_ascii_islf_or_mblf */


/* Macros used to implement integer conversion */
#ifndef tpp_ascii_asdigit
#define tpp_ascii_asdigit(ch) ((ch) - '0') /* tpp_ascii_isdigit-ch => value */
#define tpp_ascii_ofdigit(v)  ('0' + (v))  /* value => tpp_ascii_isdigit-ch */
#endif /* !tpp_ascii_ofdigit */
#ifndef tpp_ascii_isoctdigit
#define tpp_ascii_isoctdigit(ch) ((ch) >= '0' && (ch) <= '7')
#define tpp_ascii_asoctdigit(ch) tpp_ascii_asdigit(ch)
#define tpp_ascii_ofoctdigit(v)  tpp_ascii_ofdigit(v)
#endif /* !tpp_ascii_isoctdigit */
#ifndef tpp_ascii_islwrxdigit
#define tpp_ascii_islwrxdigit(ch) ((ch) >= 'a' && (ch) <= 'f')
#define tpp_ascii_aslwrxdigit(ch) (10 + ((ch) - 'a')) /* tpp_ascii_islwrxdigit-ch => value */
#define tpp_ascii_oflwrxdigit(v)  ('a' + ((v) - 10))  /* value => tpp_ascii_islwrxdigit-ch */
#endif /* !tpp_ascii_islwrxdigit */
#ifndef tpp_ascii_isuprxdigit
#define tpp_ascii_isuprxdigit(ch) ((ch) >= 'A' && (ch) <= 'F')
#define tpp_ascii_asuprxdigit(ch) (10 + ((ch) - 'A')) /* tpp_ascii_isuprxdigit-ch => value */
#define tpp_ascii_ofuprxdigit(v)  ('A' + ((v) - 10))  /* value => tpp_ascii_isuprxdigit-ch */
#endif /* !tpp_ascii_isuprxdigit */

#ifndef tpp_ascii_isxdigit
#define tpp_ascii_isxdigit(ch) \
	(tpp_ascii_isdigit(ch) || tpp_ascii_islwrxdigit(ch) || tpp_ascii_isuprxdigit(ch))
#define tpp_ascii_asxdigit(ch) \
	(tpp_ascii_isdigit(ch) ? tpp_ascii_asdigit(ch) : tpp_ascii_islwrxdigit(ch) ? tpp_ascii_aslwrxdigit(ch) : tpp_ascii_asuprxdigit(ch))
#endif /* !tpp_ascii_isxdigit */

#if TPP_HAVE_UNICODE

/* Built-in unicode character traits database */
#if TPP_HAVE_BUILTIN_CTYPE_UNICODE
#if (defined(tpp_unicode_isspace_nolf) || \
     defined(tpp_unicode_issymstrt) ||    \
     defined(tpp_unicode_issymcont) ||    \
     defined(tpp_unicode_isspace) ||      \
     defined(tpp_unicode_islf))
#define TPP_HAVE_BUILTIN_CTYPE_UNICODE 0 /* So your compiler shows you where the definition comes from */
#if !TPP_IGNORE_INVALID_CONFIGURATION
#error "User-supplied unicode trait functions defined, but 'TPP_HAVE_BUILTIN_CTYPE_UNICODE=1'. Please use 'TPP_HAVE_BUILTIN_CTYPE_UNICODE=0' when providing your own traits"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */
#endif /* ... */

#ifndef _TPP_CTYPE_ISSYMSTRT
#define _TPP_CTYPE_ISSYMSTRT  0x01 /* Symbol start character */
#define _TPP_CTYPE_ISSYMCONT  0x02 /* Symbol continuation character */
#define _TPP_CTYPE_ISSPACE    0x04 /* Space character (excluding \r and \n) */
#define _TPP_CTYPE_ISLF       0x08 /* Linefeed character (\r and \n) */
#endif /* !_TPP_CTYPE_ISSYMSTRT */

TPP_DECL TPP_CONSTCALL TPP_WUNUSED uint_least8_t TPPCALL _tpp_unicode_traits(tpp_unichar uch); /* Don't access directly! (considered TPP_INTERNAL) */
#define tpp_unicode_isspace_nolf(ord) (_tpp_unicode_traits(ord) & _TPP_CTYPE_ISSPACE)
#define tpp_unicode_issymstrt(ord)    (_tpp_unicode_traits(ord) & _TPP_CTYPE_ISSYMSTRT)
#define tpp_unicode_issymcont(ord)    (_tpp_unicode_traits(ord) & _TPP_CTYPE_ISSYMCONT)
#define tpp_unicode_isspace(ord)      (_tpp_unicode_traits(ord) & (_TPP_CTYPE_ISSPACE | _TPP_CTYPE_ISLF))
#define tpp_unicode_islf(ord)         (_tpp_unicode_traits(ord) & _TPP_CTYPE_ISLF)
#endif /* TPP_HAVE_BUILTIN_CTYPE_UNICODE */



/* Unicode character traits (all of these take "tpp_unichar ord")
 *
 * If you want TPP to understand character traits across the full
 * unicode character range, you must define (at least) the following
 * macros prior to including any TPP header/source:
 * >> #define tpp_unicode_isspace(ord)    <"ord" is a unicode SPACE or LF character>
 * >> #define tpp_unicode_islf(ord)       <"ord" is a unicode LF character>
 * >> #define tpp_unicode_issymstrt(ord)  <"ord" may be the first character of a keyword>
 * >> #define tpp_unicode_issymcont(ord)  <"ord" may be the 2nd+ character of a keyword>
 *
 * These macros are then used by "tpp_lexer_yieldraw_at()" to determine
 * the meaning of unicode characters encountered as part of input text,
 * with any character not satisfying at least one of the above traits
 * being yielded as a "TPP_TOK_UNICHAR" token. */
#ifndef tpp_unicode_isspace_nolf
#if defined(tpp_unicode_isspace) && defined(tpp_unicode_islf)
#define tpp_unicode_isspace_nolf(ord) (tpp_unicode_isspace(ord) && !tpp_unicode_islf(ord))
#else /* tpp_unicode_isspace && tpp_unicode_islf */
#define tpp_unicode_isspace_nolf(ord) ((ord) <= 0xff && tpp_ascii_isspace_nolf(ord))
#endif /* !tpp_unicode_isspace || !tpp_unicode_islf */
#endif /* !tpp_unicode_isspace_nolf */
#ifndef tpp_unicode_issymstrt
#define tpp_unicode_issymstrt(ord) ((ord) >= 0x80 || tpp_ascii_issymstrt(ord))
#endif /* !tpp_unicode_issymstrt */
#ifndef tpp_unicode_issymcont
#define tpp_unicode_issymcont(ord) ((ord) >= 0x80 || tpp_ascii_issymcont(ord))
#endif /* !tpp_unicode_issymcont */
#ifndef tpp_unicode_isspace
#define tpp_unicode_isspace(ord) ((ord) <= 0xff && tpp_ascii_isspace(ord))
#endif /* !tpp_unicode_isspace */
#ifndef tpp_unicode_islf
#define tpp_unicode_islf(ord) ((ord) <= 0xff && tpp_ascii_islf(ord))
#endif /* !tpp_unicode_islf */

/* Read a single unicode character from a given utf-8 blob.
 * WARNING: This function doesn't do any validity checking,
 *          allowing over-long utf-8 sequences, as well as
 *          incorrectly positioned UTF-8 continuation bytes. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_unichar TPPCALL
tpp_unicode_readutf8(tpp_char const **p_pos, tpp_char const *end);

/* Same as `tpp_unicode_readutf8()', but read in reverse */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_unichar TPPCALL
tpp_unicode_readutf8_rev(tpp_char const **p_end, tpp_char const *base);
#endif /* TPP_HAVE_UNICODE */


#ifndef TPP_UTOA_MAXLEN
#if TPP_UINTMAX_MAX <= TPP_UINTMAX_C(255)
#define TPP_UTOA_MAXLEN 3  /* "255" */
#elif TPP_UINTMAX_MAX <= TPP_UINTMAX_C(65535)
#define TPP_UTOA_MAXLEN 5  /* "65535" */
#elif TPP_UINTMAX_MAX <= TPP_UINTMAX_C(4294967295)
#define TPP_UTOA_MAXLEN 10 /* "4294967295" */
#elif TPP_UINTMAX_MAX <= TPP_UINTMAX_C(18446744073709551615)
#define TPP_UTOA_MAXLEN 20 /* "18446744073709551615" */
#elif TPP_UINTMAX_MAX <= TPP_UINTMAX_C(340282366920938463463374607431768211455)
#define TPP_UTOA_MAXLEN 39 /* "340282366920938463463374607431768211455" */
#else /* TPP_UINTMAX_MAX <= ... */
#error "Unsupported 'TPP_UINTMAX_MAX'"
#endif /* TPP_UINTMAX_MAX > ... */
#endif /* !TPP_UTOA_MAXLEN */
#ifndef TPP_ITOA_MAXLEN
#define TPP_ITOA_MAXLEN (TPP_UTOA_MAXLEN + 1) /* +1 for leading "-" */
#endif /* !TPP_ITOA_MAXLEN */


/* Convert an integer into a string */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) char *TPPCALL tpp_utoa(char buf[TPP_UTOA_MAXLEN], tpp_uintmax value);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) char *TPPCALL tpp_itoa(char buf[TPP_ITOA_MAXLEN], tpp_intmax value);


/* Convert a float into a string */
#if TPP_HAVE_FTOA
#define TPP_FTOA_MAXLEN ((TPP_ITOA_MAXLEN * 2) + 1)
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_size TPPCALL tpp_ftoa(char buf[TPP_FTOA_MAXLEN], tpp_float value);
#endif /* TPP_HAVE_FTOA */


#define TPP_UTF8_1BYTE_MAX ((UINT32_C(1) << 7) - 1)
#define TPP_UTF8_2BYTE_MAX ((UINT32_C(1) << 11) - 1)
#define TPP_UTF8_3BYTE_MAX ((UINT32_C(1) << 16) - 1)
#define TPP_UTF8_4BYTE_MAX ((UINT32_C(1) << 21) - 1)
#define TPP_UTF8_5BYTE_MAX ((UINT32_C(1) << 26) - 1)
#define TPP_UTF8_6BYTE_MAX ((UINT32_C(1) << 31) - 1)

#define TPP_UTF8_MAXLEN 7 /* Enough to write *any* 32-bit unicode ordinal as utf-8 (including invalid ones) */

#if TPP_HAVE_TPP_UNICODE_WRITEUTF8
/* Encode "uch" as utf-8 into "buf" and return the pointer after the last-written byte. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_char *TPPCALL
tpp_unicode_writeutf8(tpp_char buf[TPP_UTF8_MAXLEN], tpp_unichar uc);
#endif /* TPP_HAVE_TPP_UNICODE_WRITEUTF8 */


#if TPP_HAVE_TPP_FUZZY_MEMCMP
/* Quantify the "fuzziness" of how close 2 memory-blocks are to each
 * other (less means closer to each other, and "0" means identical)
 *
 * #ifndef tpp_alloca
 * @return: TPP_SIZE_MAX: Cannot compare strings (insufficient memory,
 *                        and no tpp_alloca() function available to
 *                        supplement).
 *                        The implementation uses "tpp_trymalloc", so
 *                        this shouldn't be considered a fatal error
 * #endif // !tpp_alloca */
TPP_DECL TPP_WUNUSED tpp_size TPPCALL
tpp_fuzzy_memcmp(tpp_char const *lhs, tpp_size lhs_len,
                 tpp_char const *rhs, tpp_size rhs_len);
#endif /* TPP_HAVE_TPP_FUZZY_MEMCMP */


/* Specifies that `tpp_decode_named_escape()` requires an extra `lexer`-parameter */
#undef TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM
#if (TPP_HAVE_DECODE_NAMED_ESCAPE &&                         \
     (TPP_CONF_IS_RT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) || \
      TPP_CONF_IS_RT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) ||   \
      TPP_CONF_IS_RT(TPP_HAVE_ESCAPE_NAMED_XML) ||           \
      (TPP_HAVE_BSE && TPP_HAVE_UNICODE)))
#define TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM 1
#else /* ... */
#define TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM 0
#endif /* !... */

#if TPP_HAVE_DECODE_NAMED_ESCAPE

/* Max # of unicode UTF-32 characters returned by `tpp_decode_named_escape()` */
#define TPP_DECODE_NAMED_ESCAPE_MAXLEN 2

/* Decode a named \N{...} sequence and update `*p_iter` to point to
 * its end. This function implement the routing between the different
 * (currently enabled) named escape decoders, as configured by:
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES`
 * - `TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD`
 * - `TPP_HAVE_ESCAPE_NAMED_XML`
 *
 * @return: 0 : Unknown named sequence (`*p_iter` is unchanged) 
 * @return: * : The # of characters written to `result` (always `<= TPP_DECODE_NAMED_ESCAPE_MAXLEN`)*/
#if TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM
struct tpp_lexer;
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_size TPPCALL
tpp_decode_named_escape(tpp_char const **p_iter, tpp_char const *end,
                        tpp_unichar result[TPP_DECODE_NAMED_ESCAPE_MAXLEN],
                        struct tpp_lexer const *tpp_restrict lexer);
#else /* TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_size TPPCALL
_tpp_decode_named_escape(tpp_char const **p_iter, tpp_char const *end,
                         tpp_unichar result[TPP_DECODE_NAMED_ESCAPE_MAXLEN]);
#define tpp_decode_named_escape(p_iter, end, result, lexer) \
	_tpp_decode_named_escape(p_iter, end, result)
#endif /* !TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM */
#else /* TPP_HAVE_DECODE_NAMED_ESCAPE */
#define TPP_DECODE_NAMED_ESCAPE_MAXLEN 0
#define tpp_decode_named_escape(p_iter, end, result, lexer) \
	TPP_SSIZE_OFERR(TPP_ENOENT)
#endif /* !TPP_HAVE_DECODE_NAMED_ESCAPE */

/************************************************************************/
/* File: parts/string.h                                                 */
/************************************************************************/

typedef struct tpp_string {
	tpp_refcnt_atomic TPP_INTERNAL(ts_refcnt);              /* Reference counter (must be atomic because of "_tpp_string_empty") */
	tpp_size          TPP_INTERNAL(ts_len);                 /* [const] Length of the string */
	tpp_char          TPP_INTERNAL(ts_str)[TPP_FLEX_ARRAY]; /* [const][ts_len] String content */
/*	tpp_char          TPP_INTERNAL(ts_nul);                  * [const][== 0] Trailing \0-character */
} tpp_string;

/* Public API */
#define tpp_string_len(self)  ((self)->TPP_INTERNAL(ts_len))
#define tpp_string_str(self)  ((self)->TPP_INTERNAL(ts_str))
#define tpp_string_end(self)  (tpp_string_str(self) + tpp_string_len(self))
#define tpp_string_cstr(self) ((char const *)tpp_string_str(self))
#define tpp_string_equals(lhs, rhs)                       \
	(tpp_string_len(lhs) == tpp_string_len(rhs) &&        \
	 tpp_memcmp(tpp_string_str(lhs), tpp_string_str(rhs), \
	            tpp_string_len(lhs) * sizeof(tpp_char)) == 0)
#define tpp_string_equals_cstr(lhs, rhs_cstr)                    \
	(tpp_string_len(lhs) == (sizeof(rhs_cstr) - sizeof(char)) && \
	 tpp_memcmp(tpp_string_str(lhs), rhs_cstr,                   \
	            (sizeof(rhs_cstr) - sizeof(char)) * sizeof(tpp_char)) == 0)

#define tpp_string_sizeof(len)         (tpp_offsetof(tpp_string, ts_str) + ((len) + 1) * sizeof(tpp_char))
#define _tpp_string_trymalloc(len)     ((tpp_string *)tpp_trymalloc(tpp_string_sizeof(len)))
#define _tpp_string_malloc(len)        ((tpp_string *)tpp_malloc(tpp_string_sizeof(len)))
#define _tpp_string_tryrealloc(p, len) ((tpp_string *)tpp_tryrealloc(p, tpp_string_sizeof(len)))
#define _tpp_string_realloc(p, len)    ((tpp_string *)tpp_realloc(p, tpp_string_sizeof(len)))
#define _tpp_string_free(p)            tpp_free(p)

/* Helpers for interacting with TPP strings */
#define tpp_string_destroy(self)  _tpp_string_free(self)
#define tpp_string_incref(self)   tpp_refcnt_atomic_inc(&(self)->TPP_INTERNAL(ts_refcnt))
#define tpp_string_isshared(self) tpp_refcnt_atomic_isshared(&(self)->TPP_INTERNAL(ts_refcnt))
#define tpp_string_decref(self) \
	(void)(tpp_refcnt_atomic_decfetch(&(self)->TPP_INTERNAL(ts_refcnt)) || (tpp_string_destroy(self), 0))
#define tpp_string_decref_nokill(self) tpp_refcnt_atomic_dec(&(self)->TPP_INTERNAL(ts_refcnt))

/* Allocate new (uninitialized) string buffers
 * @return: NULL: Propagate TPP_ENOMEM */
TPP_DECL TPP_WUNUSED tpp_string *TPPCALL tpp_string_trymalloc(tpp_size len);
TPP_DECL TPP_WUNUSED tpp_string *TPPCALL tpp_string_malloc(tpp_size len);


TPP_DECL struct tpp_string_empty_struct {
	tpp_refcnt_atomic TPP_INTERNAL(ts_refcnt); /* Reference counter */
	tpp_size          TPP_INTERNAL(ts_len);    /* [const] Length of the string */
	tpp_char          TPP_INTERNAL(ts_nul);    /* [const][== 0] Trailing \0-character */
} _tpp_string_empty;

#define tpp_string_newempty()               \
	(tpp_string_incref(&_tpp_string_empty), \
	 (TPP_REF tpp_string *)&_tpp_string_empty)



/************************************************************************/
/* STRING BUILDER                                                       */
/************************************************************************/
#if TPP_HAVE_STRING_BUILDER
typedef struct tpp_string_builder {
	tpp_string *TPP_INTERNAL(tsb_buf); /* [0..1][owned] Allocated string buffer ("ts_len" in here is then *allocated* buffer size) */
	tpp_size    TPP_INTERNAL(tsb_len); /* [<= tsb_buf->ts_len] Used buffer size */
} tpp_string_builder;

/* Initialize / finalize a given "tpp_string_builder *self" */
#define tpp_string_builder_init(self)            \
	(void)((self)->TPP_INTERNAL(tsb_buf) = NULL, \
	       (self)->TPP_INTERNAL(tsb_len) = 0)
#define tpp_string_builder_fini(self) \
	_tpp_string_free((self)->TPP_INTERNAL(tsb_buf))

/* Return the # of used bytes */
#define tpp_string_builder_getlen(self) (self)->TPP_INTERNAL(tsb_len)

/* Package "self" into a tpp string and return said string.
 * This function never fails, but it *DOES* finalize "self"
 * iow: DO NOT CALL `tpp_string_builder_fini()' AFTER THIS FUNCTION!
 *
 * @return: * : The string that was written to this builder */
TPP_DECL TPP_RETNONNULL TPP_WUNUSED TPP_NONNULL((1)) TPP_REF tpp_string *TPPCALL
tpp_string_builder_pack(/*inherit(always)*/ tpp_string_builder *tpp_restrict self);

/* Allocate (and return) an additional buffer of at least "num_bytes" characters,
 * to-be initialized by the caller at the end of all string data that has already
 * been allocated to the given builder.
 *
 * @return: * :   Pointer to the base of a "num_bytes"-bytes
 *                long buffer (to-be initialized by the caller)
 *                This pointer ONLY remains valid until the next
 *                call to this function with the same "self".
 * @return: NULL: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_char *TPPCALL
tpp_string_builder_alloc(tpp_string_builder *tpp_restrict self, tpp_size num_bytes);
#if TPP_HAVE_STRING_BUILDER_TRYALLOC
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_char *TPPCALL
tpp_string_builder_tryalloc(tpp_string_builder *tpp_restrict self, tpp_size num_bytes);
#endif /* TPP_HAVE_STRING_BUILDER_TRYALLOC */

/* After a call to `tpp_string_builder_tryalloc()' that didn't actually end up
 * needing  */
#define tpp_string_builder_release(self, num_unused_trailing_bytes)                  \
	(void)(tpp_assert((self)->TPP_INTERNAL(tsb_len) >= (num_unused_trailing_bytes)), \
	       (self)->TPP_INTERNAL(tsb_len) -= (num_unused_trailing_bytes))

/* Print "text" into "tpp_string_builder *self"
 * @return: num_bytes:                   Success
 * @return: TPP_SSIZE_OFERR(TPP_ENOMEM): Out of memory */
TPP_DECL TPP_WUNUSED TPP_FORMATPRINTER_DEFINE(tpp_string_builder_print, arg, text, num_bytes);
#endif /* TPP_HAVE_STRING_BUILDER */

TPP_DECL_END

/************************************************************************/
/* File: parts/file-io.h                                                */
/************************************************************************/
#ifndef TPP_FS_HAVE_DRIVES
#define TPP_FS_HAVE_DRIVES TPP_OS_WINDOWS
#endif /* !TPP_FS_HAVE_DRIVES */

#ifndef TPP_FS_HAVE_ICASE
#define TPP_FS_HAVE_ICASE TPP_OS_WINDOWS
#endif /* !TPP_FS_HAVE_ICASE */

#ifndef TPP_FS_SEP
#define TPP_FS_SEP   '/'
#define TPP_FS_SEP_S "/"
#endif /* !TPP_FS_SEP */

#ifndef TPP_FS_ALTSEP
#if TPP_OS_WINDOWS || defined(__CYGWIN__)
#define TPP_FS_ALTSEP '\\'
#else /* TPP_OS_WINDOWS */
#define TPP_FS_ALTSEP '/'
#endif /* !TPP_OS_WINDOWS */
#endif /* !TPP_FS_ALTSEP */

#ifndef TPP_FS_ISSEP
#if TPP_FS_SEP == TPP_FS_ALTSEP
#define TPP_FS_ISSEP(x) ((x) == TPP_FS_SEP)
#else /* TPP_FS_SEP == TPP_FS_ALTSEP */
#define TPP_FS_ISSEP(x) ((x) == TPP_FS_SEP || (x) == TPP_FS_ALTSEP)
#endif /* TPP_FS_SEP != TPP_FS_ALTSEP */
#endif /* !TPP_FS_ISSEP */

#ifndef TPP_FS_ISABS
#if TPP_FS_HAVE_DRIVES
#define TPP_FS_ISABS(filename, filename_len) ((filename_len) >= 2 && /*(filename)[0] &&*/ (filename)[1] == ':')
#else /* TPP_FS_HAVE_DRIVES */
#define TPP_FS_ISABS(filename, filename_len) ((filename_len) >= 1 && TPP_FS_ISSEP((filename)[0]))
#endif /* !TPP_FS_HAVE_DRIVES */
#endif /* !TPP_FS_ISABS */

#undef tpp_io_handle_IS_BUILTIN
#ifndef tpp_io_handle
#define tpp_io_handle_IS_BUILTIN
#if TPP_OS_WINDOWS
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <Windows.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_io_handle HANDLE
#define tpp_io_handle_IS_HANDLE
#elif TPP_OS_UNIX
#define tpp_io_handle int
#define tpp_io_handle_IS_int
#else /* ... */
#if !TPP_HOST_NO_SYSTEM_INCLUDES
#include <stdio.h>
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */
#define tpp_io_handle FILE *
#define tpp_io_handle_IS_FILE
#if !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HAVE_FILE_NONBLOCK
#error "Invalid configuration: No way to implement 'TPP_HAVE_FILE_NONBLOCK' on this OS. Supply your own 'tpp_io_handle', or build with '-DTPP_HAVE_FILE_NONBLOCK=0'"
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION && TPP_HAVE_FILE_NONBLOCK */
#endif /* !... */
#endif /* !tpp_io_handle */


/* Support for non-blocking I/O */
#if TPP_HAVE_FILE_NONBLOCK
#define tpp_io_nonblock__PARAM , int nonblock
#define tpp_io_nonblock__ARG   , nonblock
#else /* TPP_HAVE_FILE_NONBLOCK */
#define tpp_io_nonblock__PARAM /* nothing */
#define tpp_io_nonblock__ARG   /* nothing */
#endif /* !TPP_HAVE_FILE_NONBLOCK */


TPP_DECL_BEGIN

#ifdef tpp_io_handle_IS_BUILTIN
/* Open a file for reading
 * @return: TPP_EOK:    Success (*p_result was populated and must eventually be closed by caller)
 * @return: TPP_ENOENT: No such file or directory
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_io_open(/*utf-8*/ char const *tpp_restrict filename,
            tpp_io_handle *tpp_restrict p_result);

/* Close a file previously opened by `tpp_io_open()' */
TPP_DECL void TPPCALL tpp_io_close(tpp_io_handle file);

/* Read data from a given `file' into `buf'
 * @return: * : The # of bytes read into `buf' (at most `bufsize')
 *              NOTE: Use "TPP_SSIZE_ISERR()" to detect error conditions!
 * @return: TPP_SSIZE_OFERR(TPP_EIO):         I/O error
 * @return: TPP_SSIZE_OFERR(TPP_ENOMEM):      Out of memory
 * #if TPP_HAVE_FILE_NONBLOCK
 * @return: TPP_SSIZE_OFERR(TPP_EWOULDBLOCK): `nonblock' was given, but operation would block
 * #endif // TPP_HAVE_FILE_NONBLOCK */
TPP_DECL TPP_WUNUSED TPP_NONNULL((2)) tpp_ssize TPPCALL
tpp_io_read(tpp_io_handle file, void *buf, tpp_size bufsize tpp_io_nonblock__PARAM);

#if TPP_HAVE_IO_COMPARE_MTIME
/* Compare the last-modified timestamp of "lhs_handle" with the last-
 * modified timestamp of "rhs_filename". If available, "lhs_filename"
 * specifies the filename linked to "lhs_handle", though this may be
 * "NULL" if unknown.
 *
 * This function is used to implement "#pragma GCC dependency"
 *
 * @param: lhs_filename: Filename of "lhs_handle" (or "NULL" if unknown)
 * @param: lhs_handle:   File handle for left file (only valid if "lhs_handle_valid")
 * @param: rhs_filename: Filename of right file (always non-NULL)
 * @param: p_cmp_result: Set according to compare result on TPP_EOK:
 *                        *p_cmp_result <  0  <=>  fstat(lhs_handle).st_mtime <  stat(rhs_filename).st_mtime
 *                        *p_cmp_result == 0  <=>  fstat(lhs_handle).st_mtime == stat(rhs_filename).st_mtime
 *                        *p_cmp_result >  0  <=>  fstat(lhs_handle).st_mtime >  stat(rhs_filename).st_mtime
 * @return: TPP_EOK:     Success
 * @return: TPP_ENOENT:  No such file "rhs_filename" (SOFT_ERROR)
 * @return: TPP_EIO:     I/O error (HARD_ERROR)
 * @return: TPP_ENOMEM:  Out of memory (HARD_ERROR)
 * @return: TPP_ELAST:   Unable to fstat(lhs_handle) / stat(lhs_filename)
 *                       [os-specific: or "lhs_filename == NULL" or doesn't exist], or unable
 *                       to implement function and "TPP_IGNORE_INVALID_CONFIGURATION" is enabled. */
#ifndef tpp_io_compare_mtime
TPP_DECL TPP_WUNUSED TPP_NONNULL((4, 5)) tpp_errno TPPCALL
tpp_io_compare_mtime(char const *lhs_filename, tpp_io_handle lhs_handle, bool lhs_handle_valid,
                     char const *rhs_filename, int *tpp_restrict p_cmp_result);
#endif /* !tpp_io_compare_mtime */
#endif /* TPP_HAVE_IO_COMPARE_MTIME */
#endif /* tpp_io_handle_IS_BUILTIN */

#if TPP_HAVE_IO_NORMALIZE_FILENAME
#ifndef tpp_io_normalize_filename
/* Given pointers to a string like this:
 * >> r"C:\Users\me\Desktop\0[unused-buffer-space]"
 *      ^           ^                             ^
 *      filename    after_last_sep                after_last_sep+after_last_sep_bufsize
 *
 * Check that the casing of the last part of the filename (here: "Desktop")
 * is correct. If it is, do nothing and return "0". If it isn't, check the
 * length of the correctly cased filename. If it's "<= after_last_sep_bufsize",
 * copy it to "after_last_sep" (without a trailing \0-character) and return
 * the number of copied bytes (here: return <= after_last_sep_bufsize). If
 * it's "> after_last_sep_bufsize", don't copy anything to "after_last_sep"
 * and return the required buffer size (here: return > after_last_sep_bufsize)
 *
 * @return: 0 :                          Casing is correct
 * @return: <= after_last_sep_bufsize:   Casing was fixed by copying "return" bytes to "after_last_sep"
 * @return: > after_last_sep_bufsize:    Casing is incorrect, and you must supply a larger buffer
 * @return: TPP_SSIZE_OFERR(TPP_ENOENT): [SOFT_ERROR] No such file or directory (you can stop checking casing)
 * @return: TPP_SSIZE_OFERR(TPP_ENOMEM): [HARD_ERROR] Out of memory
 * @return: TPP_SSIZE_OFERR(TPP_ENOIO):  [HARD_ERROR] I/O error */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_io_normalize_filename(char *filename, char *after_last_sep,
                          tpp_size after_last_sep_bufsize);
#endif /* !tpp_io_normalize_filename */
#endif /* TPP_HAVE_IO_NORMALIZE_FILENAME */

/************************************************************************/
/* File: parts/time.h                                                   */
/************************************************************************/

#if TPP_HAVE_TIME_API
#ifndef tpp_time
#if !TPP_HOST_NO_SYSTEM_INCLUDES
TPP_DECL_END
#include <time.h>
TPP_DECL_BEGIN
#endif /* !TPP_HOST_NO_SYSTEM_INCLUDES */

/* Time API */
#define tpp_time                      time_t
#define tpp_time_now(p_time)          (time(p_time), TPP_EOK)
#define tpp_time_empty(p_time)        (*(p_time) = 0)
#define tpp_time_isempty(p_time)      (*(p_time) == 0)
#if TPP_HAVE_LEXER_COPY
#define tpp_time_copy(p_self, p_from) (*(p_self) = *(p_from), TPP_EOK)
#endif /* TPP_HAVE_LEXER_COPY */

/* Time -> tm conversion (splitting time into its individual components) */
typedef struct tm tpp_tm;
#ifdef _MSC_VER
#define tpp_tm_fromtime(self, p_time) (localtime_s(self, p_time) == 0 ? TPP_EOK : TPP_EIO)
#else /* _MSC_VER */
#ifndef TPP_CONFIG_HAVE_LOCALTIME_R
#define TPP_CONFIG_HAVE_LOCALTIME_R 1 /* Override if your platform doesn't have this... */
#endif /* !TPP_CONFIG_HAVE_LOCALTIME_R */

#if TPP_CONFIG_HAVE_LOCALTIME_R
#define tpp_tm_fromtime(self, p_time) (localtime_r(p_time, self) ? TPP_EOK : TPP_EIO)
#else /* TPP_CONFIG_HAVE_LOCALTIME_R */
#define tpp_tm_fromtime tpp_tm_fromtime
TPP_INLINE tpp_errno TPPCALL tpp_tm_fromtime(tpp_tm *self, tpp_time *p_time) {
	struct tm *tmp = localtime(p_time);
	if (!tmp)
		return TPP_EIO;
	*self = *tmp;
	return TPP_EOK;
}
#endif /* !TPP_CONFIG_HAVE_LOCALTIME_R */
#endif /* !_MSC_VER */

#define tpp_tm_getsec(self)  ((self)->tm_sec)         /* [0, 60] */
#define tpp_tm_getmin(self)  ((self)->tm_min)         /* [0, 59] */
#define tpp_tm_gethour(self) ((self)->tm_hour)        /* [0, 23] */
#define tpp_tm_getmday(self) ((self)->tm_mday)        /* [1, 31] */
#define tpp_tm_getmon(self)  ((self)->tm_mon + 1)     /* [1, 12] */
#define tpp_tm_getyear(self) ((self)->tm_year + 1900) /* ... */
#define tpp_tm_getwday(self) ((self)->tm_wday)        /* [0, 6] */
#define tpp_tm_getyday(self) ((self)->tm_yday)        /* [0, 365] */

#endif /* !tpp_time */
#endif /* TPP_HAVE_TIME_API */

/************************************************************************/
/* File: parts/expr.h                                                   */
/************************************************************************/

#if TPP_HAVE_BUILTIN_EXPR_VALUE
#undef _TPP_EXPR_VALUE_KIND_MULTIPLE
typedef enum _tpp_expr_value_kind {
	_TPP_EXPR_VALUE_KIND_INT,
#if TPP_HAVE_BUILTIN_EXPR_FLOATS
	_TPP_EXPR_VALUE_KIND_FLOAT,
#define _TPP_EXPR_VALUE_KIND_MULTIPLE 1
#endif /* TPP_HAVE_BUILTIN_EXPR_FLOATS */
#if TPP_HAVE_BUILTIN_EXPR_STRINGS
	_TPP_EXPR_VALUE_KIND_STRING,
#define _TPP_EXPR_VALUE_KIND_MULTIPLE 1
#endif /* TPP_HAVE_BUILTIN_EXPR_STRINGS */
} _tpp_expr_value_kind;

#ifndef _TPP_EXPR_VALUE_KIND_MULTIPLE
#define _TPP_EXPR_VALUE_KIND_MULTIPLE 0
#endif /* !_TPP_EXPR_VALUE_KIND_MULTIPLE */

#define tpp_expr_value tpp_expr_value
typedef struct tpp_expr_value {
#if _TPP_EXPR_VALUE_KIND_MULTIPLE
	_tpp_expr_value_kind TPP_INTERNAL(xv_kind); /* Expression value kind */
#define _tpp_expr_value_getkind(self)    (self)->TPP_INTERNAL(xv_kind)
#define _tpp_expr_value_setkind(self, v) , (self)->TPP_INTERNAL(xv_kind) = (v)
#else /* _TPP_EXPR_VALUE_KIND_MULTIPLE */
#define _tpp_expr_value_getkind(self)    _TPP_EXPR_VALUE_KIND_INT
#define _tpp_expr_value_setkind(self, v) /* nothing */
#endif /* !_TPP_EXPR_VALUE_KIND_MULTIPLE */

	/* Expression value union */
	union {
		tpp_intmax          TPP_INTERNAL(xd_int);    /* [valid_if(_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_INT)] */
#define _tpp_expr_value_getint(self) (self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_int)
#if TPP_HAVE_BUILTIN_EXPR_FLOATS
		tpp_float           TPP_INTERNAL(xd_float);  /* [valid_if(_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_FLOAT)] */
#define _tpp_expr_value_getfloat(self) (self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_float)
#endif /* TPP_HAVE_BUILTIN_EXPR_FLOATS */
#if TPP_HAVE_BUILTIN_EXPR_STRINGS
		TPP_REF tpp_string *TPP_INTERNAL(xd_string); /* [1..1][valid_if(_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_STRING)] */
#define _tpp_expr_value_getstring(self) (self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string)
#endif /* TPP_HAVE_BUILTIN_EXPR_STRINGS */
	} TPP_INTERNAL(xv_data);
} tpp_expr_value;


#if TPP_HAVE_BUILTIN_EXPR_STRINGS
#define _tpp_expr_value_incref(self)                                   \
	, (_tpp_expr_value_getkind(self) != _TPP_EXPR_VALUE_KIND_STRING || \
	   (tpp_string_incref((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string)), 0))
#define _tpp_expr_value_decref(self)                                   \
	, (_tpp_expr_value_getkind(self) != _TPP_EXPR_VALUE_KIND_STRING || \
	   (tpp_string_decref((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string)), 0))
#else /* TPP_HAVE_BUILTIN_EXPR_STRINGS */
#define _tpp_expr_value_incref(self) /* noting */
#define _tpp_expr_value_decref(self) /* noting */
#endif /* !TPP_HAVE_BUILTIN_EXPR_STRINGS */


/* Move "src" into "dst", invalidating "src" along the way and initializing "dst"
 * @return: TPP_EOK: Success */
#define tpp_expr_value_move(dst, src) (void)(*(dst) = *(src))

/* Copy-construct "src" into "dst"
 * @return: TPP_EOK: Success */
#define tpp_expr_value_copy(dst, src) \
	(*(dst) = *(src)_tpp_expr_value_incref(dst), TPP_EOK)

/* Finalize "self" (never fails) */
#define tpp_expr_value_fini(self) \
	((void)0 _tpp_expr_value_decref(self), tpp_dbg_memset(self, sizeof(*(self))))

/* Check which native representation is used by "self" (never fails) */
#if _TPP_EXPR_VALUE_KIND_MULTIPLE
#define tpp_expr_value_isint(self) (_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_INT)
#else /* _TPP_EXPR_VALUE_KIND_MULTIPLE */
#define tpp_expr_value_isint(self) 1
#endif /* !_TPP_EXPR_VALUE_KIND_MULTIPLE */
#if TPP_HAVE_BUILTIN_EXPR_FLOATS
#define tpp_expr_value_isfloat(self) (_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_FLOAT)
#else /* TPP_HAVE_BUILTIN_EXPR_FLOATS */
#define tpp_expr_value_isfloat(self) 0
#endif /* !TPP_HAVE_BUILTIN_EXPR_FLOATS */
#if TPP_HAVE_BUILTIN_EXPR_STRINGS
#define tpp_expr_value_isstring(self) (_tpp_expr_value_getkind(self) == _TPP_EXPR_VALUE_KIND_STRING)
#else /* TPP_HAVE_BUILTIN_EXPR_STRINGS */
#define tpp_expr_value_isstring(self) 0
#endif /* !TPP_HAVE_BUILTIN_EXPR_STRINGS */

/* Extract a specifically-typed value from "self"
 * Caller must ensure that "tpp_expr_value_is*" returned true.
 * @return: TPP_EOK: Success */
#define tpp_expr_value_asint(self, p_result) (*(p_result) = _tpp_expr_value_getint(self), TPP_EOK)
#if TPP_HAVE_BUILTIN_EXPR_FLOATS
#define tpp_expr_value_asfloat(self, p_result) (*(p_result) = _tpp_expr_value_getfloat(self), TPP_EOK)
#endif /* !TPP_HAVE_BUILTIN_EXPR_FLOATS */
#if TPP_HAVE_BUILTIN_EXPR_STRINGS
#define tpp_expr_value_asstringref(self, p_result)  \
	(*(p_result) = _tpp_expr_value_getstring(self), \
	 tpp_string_incref(*(p_result)), TPP_EOK)
#endif /* !TPP_HAVE_BUILTIN_EXPR_STRINGS */


/* Initialize "self" as int-typed, with "v" as value
 * @return: TPP_EOK: Success */
#define tpp_expr_value_init_int(self, /*tpp_intmax*/ v)       \
	((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_int) = (v) \
	 _tpp_expr_value_setkind(self, _TPP_EXPR_VALUE_KIND_INT), \
	 TPP_EOK)

/* Initialize "self" as float-typed, with "v" as value
 * @return: TPP_EOK: Success */
#if TPP_HAVE_BUILTIN_EXPR_FLOATS
#define tpp_expr_value_init_float(self, /*tpp_float*/ v)        \
	((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_float) = (v) \
	 _tpp_expr_value_setkind(self, _TPP_EXPR_VALUE_KIND_FLOAT), \
	 TPP_EOK)
#endif /* TPP_HAVE_BUILTIN_EXPR_FLOATS */

/* Initialize "self" as string-typed, with "v" as value
 * @param: str: [1..1] The string value to assign
 * @return: TPP_EOK: Success */
#if TPP_HAVE_BUILTIN_EXPR_STRINGS
#define tpp_expr_value_init_string(self, /*tpp_string **/ str)                 \
	((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string) = (str)             \
	 _tpp_expr_value_setkind(self, _TPP_EXPR_VALUE_KIND_STRING),               \
	 tpp_string_incref((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string)), \
	 TPP_EOK)
#define tpp_expr_value_init_string_inherited(self, /*inherit(always)*/ /*TPP_REF tpp_string **/ str) \
	((self)->TPP_INTERNAL(xv_data).TPP_INTERNAL(xd_string) = (str)                                   \
	 _tpp_expr_value_setkind(self, _TPP_EXPR_VALUE_KIND_STRING),                                     \
	 TPP_EOK)
#endif /* TPP_HAVE_BUILTIN_EXPR_STRINGS */

struct tpp_lexer;

/* Invoke operators on expression values. */
#if _TPP_EXPR_VALUE_KIND_MULTIPLE
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL tpp_expr_value_pos(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict self, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL tpp_expr_value_neg(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict self, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL tpp_expr_value_inv(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict self, /*out*/ tpp_expr_value *tpp_restrict result);
#define tpp_expr_value_pos tpp_expr_value_pos
#define tpp_expr_value_neg tpp_expr_value_neg
#define tpp_expr_value_inv tpp_expr_value_inv

TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_add(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_sub(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_mul(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_shl(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_shr(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_and(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_xor(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_or(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
#define tpp_expr_value_add tpp_expr_value_add
#define tpp_expr_value_sub tpp_expr_value_sub
#define tpp_expr_value_mul tpp_expr_value_mul
#define tpp_expr_value_shl tpp_expr_value_shl
#define tpp_expr_value_shr tpp_expr_value_shr
#define tpp_expr_value_and tpp_expr_value_and
#define tpp_expr_value_xor tpp_expr_value_xor
#define tpp_expr_value_or  tpp_expr_value_or

TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_eq(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_ne(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_lo(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_le(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_gr(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_cmp_ge(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ bool *tpp_restrict p_bool_result);
#define tpp_expr_value_cmp_eq tpp_expr_value_cmp_eq
#define tpp_expr_value_cmp_ne tpp_expr_value_cmp_ne
#define tpp_expr_value_cmp_lo tpp_expr_value_cmp_lo
#define tpp_expr_value_cmp_le tpp_expr_value_cmp_le
#define tpp_expr_value_cmp_gr tpp_expr_value_cmp_gr
#define tpp_expr_value_cmp_ge tpp_expr_value_cmp_ge

#if TPP_HAVE_BUILTIN_EXPR_STRINGS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL tpp_expr_value_lengthof(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict self, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_getindex(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict index, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 5)) tpp_errno TPPCALL tpp_expr_value_getrange(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *lo, /*in*/ tpp_expr_value *hi, /*out*/ tpp_expr_value *tpp_restrict result);
#define tpp_expr_value_lengthof tpp_expr_value_lengthof
#define tpp_expr_value_getindex tpp_expr_value_getindex
#define tpp_expr_value_getrange tpp_expr_value_getrange
#endif /* TPP_HAVE_BUILTIN_EXPR_STRINGS */

/* Determine the boolean-style value of "self"
 * Works for any kind of expression value.
 * @return: TPP_EOK: Success */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL tpp_expr_value_asbool(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict self, bool *tpp_restrict p_bool_result);
#define tpp_expr_value_asbool tpp_expr_value_asbool

#else /* _TPP_EXPR_VALUE_KIND_MULTIPLE */
#define tpp_expr_value_pos(lexer, self, result)               tpp_expr_value_init_int(result, +_tpp_expr_value_getint(self))
#define tpp_expr_value_neg(lexer, self, result)               tpp_expr_value_init_int(result, -_tpp_expr_value_getint(self))
#define tpp_expr_value_inv(lexer, self, result)               tpp_expr_value_init_int(result, ~_tpp_expr_value_getint(self))
#define tpp_expr_value_add(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) + _tpp_expr_value_getint(rhs))
#define tpp_expr_value_sub(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) - _tpp_expr_value_getint(rhs))
#define tpp_expr_value_mul(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) * _tpp_expr_value_getint(rhs))
#define tpp_expr_value_shl(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) << _tpp_expr_value_getint(rhs))
#define tpp_expr_value_shr(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) >> _tpp_expr_value_getint(rhs))
#define tpp_expr_value_and(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) & _tpp_expr_value_getint(rhs))
#define tpp_expr_value_xor(lexer, lhs, rhs, result)           tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) | _tpp_expr_value_getint(rhs))
#define tpp_expr_value_or(lexer, lhs, rhs, result)            tpp_expr_value_init_int(result, _tpp_expr_value_getint(lhs) ^ _tpp_expr_value_getint(rhs))
#define tpp_expr_value_cmp_eq(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) == _tpp_expr_value_getint(rhs)), TPP_EOK)
#define tpp_expr_value_cmp_ne(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) != _tpp_expr_value_getint(rhs)), TPP_EOK)
#define tpp_expr_value_cmp_lo(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) < _tpp_expr_value_getint(rhs)), TPP_EOK)
#define tpp_expr_value_cmp_le(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) <= _tpp_expr_value_getint(rhs)), TPP_EOK)
#define tpp_expr_value_cmp_gr(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) > _tpp_expr_value_getint(rhs)), TPP_EOK)
#define tpp_expr_value_cmp_ge(lexer, lhs, rhs, p_bool_result) (*(p_bool_result) = (_tpp_expr_value_getint(lhs) >= _tpp_expr_value_getint(rhs)), TPP_EOK)

/* Determine the boolean-style value of "self"
 * Works for any kind of expression value.
 * @return: TPP_EOK: Success */
#define tpp_expr_value_asbool(lexer, self, p_bool_result) \
	(*(p_bool_result) = (_tpp_expr_value_getint(self) != 0), TPP_EOK)
#endif /* !_TPP_EXPR_VALUE_KIND_MULTIPLE */

#define tpp_expr_value_div tpp_expr_value_div
#define tpp_expr_value_mod tpp_expr_value_mod
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_div(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_errno TPPCALL tpp_expr_value_mod(struct tpp_lexer *tpp_restrict lexer, /*in*/ tpp_expr_value *tpp_restrict lhs, /*in*/ tpp_expr_value *tpp_restrict rhs, /*out*/ tpp_expr_value *tpp_restrict result);

/* Print the representation of "self" to "printer" (in target encoding; used to implement __TPP_EVAL)
 * @return: *  : Sum of positive return value of `printer'
 * @return: < 0: An error was thrown (TPP_SSIZE_ISERR), or `printer' returned this value */
#if TPP_HAVE_EXPR_VALUE_PRINTREPR
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_expr_value_printrepr(tpp_expr_value *tpp_restrict self,
                         tpp_formatprinter printer, void *arg);
#endif /* TPP_HAVE_EXPR_VALUE_PRINTREPR */
#endif /* TPP_HAVE_BUILTIN_EXPR_VALUE */

/* Initialize to int=0 */
#ifndef tpp_expr_value_init_zero
#ifdef tpp_expr_value_init_bool
#define tpp_expr_value_init_zero(self) tpp_expr_value_init_bool(self, 0)
#else /* tpp_expr_value_init_bool */
#define tpp_expr_value_init_zero(self) tpp_expr_value_init_int(self, 0)
#endif /* !tpp_expr_value_init_bool */
#endif /* !tpp_expr_value_init_zero */

/* Initialize to int=1 */
#ifndef tpp_expr_value_init_one
#ifdef tpp_expr_value_init_bool
#define tpp_expr_value_init_one(self) tpp_expr_value_init_bool(self, 1)
#else /* tpp_expr_value_init_bool */
#define tpp_expr_value_init_one(self) tpp_expr_value_init_int(self, 1)
#endif /* !tpp_expr_value_init_bool */
#endif /* !tpp_expr_value_init_one */

/* Initialize to int=0/1 */
#ifndef tpp_expr_value_init_bool
#define tpp_expr_value_init_bool(self, v) tpp_expr_value_init_int(self, (v) ? 1 : 0)
#endif /* !tpp_expr_value_init_bool */

#ifndef tpp_expr_value_pos
#define tpp_expr_value_pos(lexer, self, result) tpp_expr_value_copy(result, self)
#endif /* !tpp_expr_value_pos */


/************************************************************************/
/* File: parts/token.h                                                  */
/************************************************************************/


typedef enum tpp_token_id {
	/* Token IDs can also represent (certain) error */



	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_ENOMEM
	 * --------------------------------------------------------------------
	 *
	 * Out of memory
	 *
	 * A call to `tpp_malloc()' or `tpp_realloc()' returned NULL, indicating
	 * that the system is out of heap memory. */
	TPP_TOK_ENOMEM = (int)TPP_ENOMEM,



	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_EIO
	 * --------------------------------------------------------------------
	 *
	 * Filesystem I/O operation failed */
	TPP_TOK_EIO = (int)TPP_EIO,



#if TPP_HAVE_FILE_NONBLOCK
	/* --------------------------------------------------------------------
	 * SOFT_ERROR: TPP_EWOULDBLOCK
	 * --------------------------------------------------------------------
	 *
	 * Operation would block, but non-blocking was requested
	 *
	 * You will only see this error if you made use of "TPP_HAVE_FILE_NONBLOCK"
	 * This is a temporary error that means that the next token cannot be read
	 * *right now* because reading from the underlying I/O file would block.
	 *
	 * -> You will not see this error when building with "-DTPP_HAVE_FILE_NONBLOCK=0"
	 * -> You will not see this error when not using the "TPP_FILE_FLAGS_NONBLOCK" flag */
	TPP_TOK_EWOULDBLOCK = (int)TPP_EWOULDBLOCK, /* [SOFT_ERROR] */
#define _TPP_CASE_TPP_TOK_EWOULDBLOCK case TPP_TOK_EWOULDBLOCK:
#else /* TPP_HAVE_FILE_NONBLOCK */
#define _TPP_CASE_TPP_TOK_EWOULDBLOCK /* nothing */
#endif /* !TPP_HAVE_FILE_NONBLOCK */



#if TPP_HAVE_WARNINGS
	/* --------------------------------------------------------------------
	 * SOFT_ERROR / HARD_ERROR: TPP_ELEXERROR
	 * --------------------------------------------------------------------
	 *
	 * Hard lexer error (usually when too many -Werror were emitted)
	 *
	 * This error should be treated as a HARD_ERROR in most cases, in that
	 * it should be propagated. However, since it is always generated by
	 * TPP itself, you *could* in theory also change lexer configuration
	 * and re-try the failing operation (though if you do that, you will
	 * probably run into the same error again) */
	TPP_TOK_ELEXERROR = (int)TPP_ELEXERROR,

	/* --------------------------------------------------------------------
	 * HARD_ERROR: TPP_EWARNPRINT
	 * --------------------------------------------------------------------
	 *
	 * Printer registered for "tpp_lexer_warnf" returned an error.
	 * Since this error is not related to TPP itself, this error should
	 * be propagated. */
	TPP_TOK_EWARNPRINT = (int)TPP_EWARNPRINT,
#define _TPP_CASE_TPP_TOK_ELEXERROR  case TPP_TOK_ELEXERROR:
#define _TPP_CASE_TPP_TOK_EWARNPRINT case TPP_TOK_EWARNPRINT:
#else /* TPP_HAVE_WARNINGS */
#define _TPP_CASE_TPP_TOK_ELEXERROR  /* nothing */
#define _TPP_CASE_TPP_TOK_EWARNPRINT /* nothing */
#endif /* !TPP_HAVE_WARNINGS */

/* Check if a given "tpp_token_id id" describes an error (rather than a token) */
#define TPP_TOK_ISERR(id) tpp_unlikely((int)(id) < 0)

/* Check if a given "tpp_token_id id" describes an error, or TPP_TOK_EOF */
#if 1
#define TPP_TOK_ISERR_OR_EOF(id) ((int)(id) <= 0)
#else
#define TPP_TOK_ISERR_OR_EOF(id) (TPP_TOK_ISERR(id) || (id) == TPP_TOK_EOF)
#endif

/* Return the "tpp_token_id" representation of "err".
 * The caller must ensure that "err" has an associated "TPP_TOK_E*" entry. */
#define TPP_TOK_OFERR(err) ((tpp_token_id)(int)(err))

/* Same as "TPP_TOK_OFERR()", but returns "TPP_TOK_EOF" for "TPP_EOK" */
#if 1
#define TPP_TOK_OFERR_OR_EOF(err) ((tpp_token_id)(int)(err))
#else
#define TPP_TOK_OFERR_OR_EOF(err) ((err) == TPP_EOK ? TPP_TOK_EOF : TPP_TOK_OFERR(err))
#endif

/* Convert a given "tpp_token_id id" into the associated error code "TPP_E*"
 * The caller must ensure that "TPP_TOK_ISERR(id) == true" */
#define TPP_TOK_ASERR(id)        ((tpp_errno)(int)(id))
#define TPP_TOK_ASERR_OR_EOK(id) (TPP_TOK_ISERR(id) ? TPP_TOK_ASERR(id) : TPP_EOK)

/* Convenience macro to list the case-labels for all "TPP_TOK_E*" errors. */
#define TPP_CASE_TPP_TOK_ERR      \
	case TPP_TOK_ENOMEM:          \
	case TPP_TOK_EIO:             \
	_TPP_CASE_TPP_TOK_EWOULDBLOCK \
	_TPP_CASE_TPP_TOK_ELEXERROR   \
	_TPP_CASE_TPP_TOK_EWARNPRINT

/* Return the token ID used to describe the single-character token of "ch" */
#define TPP_TOK_OFCHAR(ch) ((tpp_token_id)(unsigned int)(tpp_char)(ch))
#define TPP_TOK_ISCHAR(id) ((unsigned int)(id) <= 0xff)



	TPP_TOK_EOF   = '\0', /* "<eof>" END-OF-FILE (will always be ZERO; an actual \0-byte in input is treated as `TPP_TOK_SPACE') */
	TPP_TOK_LF    = '\n', /* "<linefeed>" Line-feed (always generated by `tpp_lexer_yieldraw()', filtered later if disabled) */
	TPP_TOK_SPACE = ' ',  /* "<space>" Whitespace (always generated by `tpp_lexer_yieldraw()', filtered later if disabled) */

	/* Single-character tokens (always equal to that character's ordinal). */
	TPP_TOK_EXCLAIM   = '!',
	TPP_TOK_POUND     = '#',
#if TPP_HAVE_TOK_DOLLAR
	TPP_TOK_DOLLAR    = '$',
#endif /* TPP_HAVE_TOK_DOLLAR */
	TPP_TOK_PERCENT   = '%',
	TPP_TOK_AMP       = '&',
	TPP_TOK_LPAREN    = '(',
	TPP_TOK_RPAREN    = ')',
	TPP_TOK_STAR      = '*',
	TPP_TOK_PLUS      = '+',
	TPP_TOK_COMMA     = ',',
	TPP_TOK_MINUS     = '-',
	TPP_TOK_DOT       = '.',
	TPP_TOK_SLASH     = '/',
	TPP_TOK_COLON     = ':',
	TPP_TOK_SEMICOLON = ';',
	TPP_TOK_LANGLE    = '<',
	TPP_TOK_EQUAL     = '=',
	TPP_TOK_RANGLE    = '>',
	TPP_TOK_QMARK     = '?',
	TPP_TOK_AT        = '@',
	TPP_TOK_LBRACKET  = '[',
	TPP_TOK_BACKSLASH = '\\',
	TPP_TOK_RBRACKET  = ']',
	TPP_TOK_HAT       = '^',
	TPP_TOK_BACKTICK  = '`',
	TPP_TOK_LBRACE    = '{',
	TPP_TOK_PIPE      = '|',
	TPP_TOK_RBRACE    = '}',
	TPP_TOK_TILDE     = '~',
#if !TPP_HAVE_TOK_C_INT && !TPP_HAVE_TOK_C_FLOAT
	TPP_TOK_0         = '0',
	TPP_TOK_1         = '1',
	TPP_TOK_2         = '2',
	TPP_TOK_3         = '3',
	TPP_TOK_4         = '4',
	TPP_TOK_5         = '5',
	TPP_TOK_6         = '6',
	TPP_TOK_7         = '7',
	TPP_TOK_8         = '8',
	TPP_TOK_9         = '9',
#endif /* !TPP_HAVE_TOK_C_INT && !TPP_HAVE_TOK_C_FLOAT */

	/* Double(or more)-character tokens. */
	TPP_INTERNAL(TPP_TOK_MULTICHAR_BEGIN) = 255, /* KEEP THIS THE FIRST MULTICHAR TOKEN! */
#if TPP_HAVE_UNICODE
	TPP_TOK_UNICHAR, /* "<unicode character>" Misc unicode character that could not be classified */
#endif /* TPP_HAVE_UNICODE */


#if TPP_HAVE_TOK_INT
	TPP_TOK_INTLIKE_MIN,
	TPP_INTERNAL(_TPP_TOK_INTLIKE_MIN) = TPP_TOK_INTLIKE_MIN - 1,
#if TPP_HAVE_TOK_C_INT
	TPP_TOK_C_INT, /* "<integer>" 42 */
#define _TPP_CASE_TPP_TOK_C_INT case TPP_TOK_C_INT:
#else /* TPP_HAVE_TOK_C_INT */
#define _TPP_CASE_TPP_TOK_C_INT /* nothing */
#endif /* !TPP_HAVE_TOK_C_INT */
#if TPP_HAVE_TOK_PASCAL_HEX
	TPP_TOK_PASCAL_HEX, /* "<integer>" $DEADBEEF */
#define _TPP_CASE_TPP_TOK_PASCAL_HEX case TPP_TOK_PASCAL_HEX:
#else /* TPP_HAVE_TOK_PASCAL_HEX */
#define _TPP_CASE_TPP_TOK_PASCAL_HEX /* nothing */
#endif /* !TPP_HAVE_TOK_PASCAL_HEX */
	TPP_INTERNAL(_TPP_TOK_INTLIKE_MAX),
	TPP_TOK_INTLIKE_MAX = TPP_INTERNAL(_TPP_TOK_INTLIKE_MAX) - 1,
#define TPP_CASE_TPP_TOK_INT \
	_TPP_CASE_TPP_TOK_C_INT  \
	_TPP_CASE_TPP_TOK_PASCAL_HEX
#define TPP_TOK_ISINT(x)           \
	((x) >= TPP_TOK_INTLIKE_MIN && \
	 (x) <= TPP_TOK_INTLIKE_MAX)
#else /* TPP_HAVE_TOK_INT */
#define TPP_CASE_TPP_TOK_INT /* nothing */
#define TPP_TOK_ISINT(x)     0
#endif /* !TPP_HAVE_TOK_INT */


#if TPP_HAVE_TOK_FLOAT
	TPP_TOK_FLOATLIKE_MIN,
	TPP_INTERNAL(_TPP_TOK_FLOATLIKE_MIN) = TPP_TOK_FLOATLIKE_MIN - 1,
#if TPP_HAVE_TOK_C_FLOAT
	TPP_TOK_C_FLOAT, /* "<float>" 42.0 */
#define _TPP_CASE_TPP_TOK_C_FLOAT case TPP_TOK_C_FLOAT:
#else /* TPP_HAVE_TOK_C_FLOAT */
#define _TPP_CASE_TPP_TOK_C_FLOAT /* nothing */
#endif /* !TPP_HAVE_TOK_C_FLOAT */
	TPP_INTERNAL(_TPP_TOK_FLOATLIKE_MAX),
	TPP_TOK_FLOATLIKE_MAX = TPP_INTERNAL(_TPP_TOK_FLOATLIKE_MAX) - 1,
#define TPP_CASE_TPP_TOK_FLOAT \
	_TPP_CASE_TPP_TOK_C_FLOAT
#define TPP_TOK_ISFLOAT(x)           \
	((x) >= TPP_TOK_FLOATLIKE_MIN && \
	 (x) <= TPP_TOK_FLOATLIKE_MAX)
#else /* TPP_HAVE_TOK_FLOAT */
#define TPP_CASE_TPP_TOK_FLOAT /* nothing */
#define TPP_TOK_ISFLOAT(x)     0
#endif /* !TPP_HAVE_TOK_FLOAT */

	/* Any kind of number-like token */
#define TPP_CASE_TPP_TOK_NUMBER \
	TPP_CASE_TPP_TOK_INT        \
	TPP_CASE_TPP_TOK_FLOAT
#if TPP_HAVE_TOK_INT && TPP_HAVE_TOK_FLOAT
#define TPP_TOK_ISNUMBER(x) ((x) >= TPP_TOK_INTLIKE_MIN && (x) <= TPP_TOK_FLOATLIKE_MAX)
#elif TPP_HAVE_TOK_INT
#define TPP_TOK_ISNUMBER(x) TPP_TOK_ISINT(x)
#else /* ... */
#define TPP_TOK_ISNUMBER(x) TPP_TOK_ISFLOAT(x)
#endif /* !... */


#if TPP_HAVE_TOK_COMMENTLIKE
	TPP_TOK_COMMENTLIKE_MIN,
	TPP_INTERNAL(_TPP_TOK_COMMENTLIKE_MIN) = TPP_TOK_COMMENTLIKE_MIN - 1,
#if TPP_HAVE_TOK_C_COMMENT
	TPP_TOK_C_COMMENT, /* "<comment>" like this one! */
#define _TPP_CASE_TPP_TOK_C_COMMENT case TPP_TOK_C_COMMENT:
#else /* TPP_HAVE_TOK_C_COMMENT */
#define _TPP_CASE_TPP_TOK_C_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_C_COMMENT */
#if TPP_HAVE_TOK_PASCAL_COMMENT
	TPP_TOK_PASCAL_COMMENT, // "<comment>" "(*like this one!*)"
#define _TPP_CASE_TPP_TOK_PASCAL_COMMENT case TPP_TOK_PASCAL_COMMENT:
#else /* TPP_HAVE_TOK_PASCAL_COMMENT */
#define _TPP_CASE_TPP_TOK_PASCAL_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_PASCAL_COMMENT */
#if TPP_HAVE_TOK_PASCAL_BRACE_COMMENT
	TPP_TOK_PASCAL_BRACE_COMMENT, // "<comment>" "{like this one!}"
#define _TPP_CASE_TPP_TOK_PASCAL_BRACE_COMMENT case TPP_TOK_PASCAL_BRACE_COMMENT:
#else /* TPP_HAVE_TOK_PASCAL_BRACE_COMMENT */
#define _TPP_CASE_TPP_TOK_PASCAL_BRACE_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_PASCAL_BRACE_COMMENT */
#if TPP_HAVE_TOK_HTML_COMMENT
	TPP_TOK_HTML_COMMENT, // "<comment>" "<!-- like this one! -->"
#define _TPP_CASE_TPP_TOK_HTML_COMMENT case TPP_TOK_HTML_COMMENT:
#else /* TPP_HAVE_TOK_HTML_COMMENT */
#define _TPP_CASE_TPP_TOK_HTML_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_HTML_COMMENT */
	TPP_INTERNAL(_TPP_TOK_COMMENTLIKE_NOLINE_MAX),
	TPP_TOK_COMMENTLIKE_NOLINE_MAX = TPP_INTERNAL(_TPP_TOK_COMMENTLIKE_NOLINE_MAX) - 1,
#if TPP_HAVE_TOK_CXX_COMMENT
	TPP_TOK_CXX_COMMENT, // "<comment>" like this one!
#define _TPP_CASE_TPP_TOK_CXX_COMMENT case TPP_TOK_CXX_COMMENT:
#else /* TPP_HAVE_TOK_CXX_COMMENT */
#define _TPP_CASE_TPP_TOK_CXX_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_COMMENT */
#if TPP_HAVE_TOK_SQL_COMMENT
	TPP_TOK_SQL_COMMENT, // "<comment>" "-- like this one!"
#define _TPP_CASE_TPP_TOK_SQL_COMMENT case TPP_TOK_SQL_COMMENT:
#else /* TPP_HAVE_TOK_SQL_COMMENT */
#define _TPP_CASE_TPP_TOK_SQL_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SQL_COMMENT */
#if TPP_HAVE_TOK_AT_AT_COMMENT
	TPP_TOK_AT_AT_COMMENT, // "<comment>" "@@ like this one!"
#define _TPP_CASE_TPP_TOK_AT_AT_COMMENT case TPP_TOK_AT_AT_COMMENT:
#else /* TPP_HAVE_TOK_AT_AT_COMMENT */
#define _TPP_CASE_TPP_TOK_AT_AT_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_AT_AT_COMMENT */
#if TPP_HAVE_TOK_SHELL_COMMENT
	TPP_TOK_SHELL_COMMENT, // "<comment>" "# like this one!"
#define _TPP_CASE_TPP_TOK_SHELL_COMMENT case TPP_TOK_SHELL_COMMENT:
#else /* TPP_HAVE_TOK_SHELL_COMMENT */
#define _TPP_CASE_TPP_TOK_SHELL_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SHELL_COMMENT */
#if TPP_HAVE_TOK_SLASH_COMMENT
	TPP_TOK_SLASH_COMMENT, // "<comment>" "/ like this one!"
#define _TPP_CASE_TPP_TOK_SLASH_COMMENT case TPP_TOK_SLASH_COMMENT:
#else /* TPP_HAVE_TOK_SLASH_COMMENT */
#define _TPP_CASE_TPP_TOK_SLASH_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SLASH_COMMENT */
#if TPP_HAVE_TOK_AT_COMMENT
	TPP_TOK_AT_COMMENT, // "<comment>" "@ like this one!"
#define _TPP_CASE_TPP_TOK_AT_COMMENT case TPP_TOK_AT_COMMENT:
#else /* TPP_HAVE_TOK_AT_COMMENT */
#define _TPP_CASE_TPP_TOK_AT_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_AT_COMMENT */
#if TPP_HAVE_TOK_SOL_SHELL_COMMENT
	TPP_TOK_SOL_SHELL_COMMENT, // "<comment>" "# like this one!"
#define _TPP_CASE_TPP_TOK_SOL_SHELL_COMMENT case TPP_TOK_SOL_SHELL_COMMENT:
#else /* TPP_HAVE_TOK_SOL_SHELL_COMMENT */
#define _TPP_CASE_TPP_TOK_SOL_SHELL_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SOL_SHELL_COMMENT */
#if TPP_HAVE_TOK_SOL_SLASH_COMMENT
	TPP_TOK_SOL_SLASH_COMMENT, // "<comment>" "/ like this one!"
#define _TPP_CASE_TPP_TOK_SOL_SLASH_COMMENT case TPP_TOK_SOL_SLASH_COMMENT:
#else /* TPP_HAVE_TOK_SOL_SLASH_COMMENT */
#define _TPP_CASE_TPP_TOK_SOL_SLASH_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SOL_SLASH_COMMENT */
#if TPP_HAVE_TOK_SOL_AT_COMMENT
	TPP_TOK_SOL_AT_COMMENT, // "<comment>" "@ like this one!"
#define _TPP_CASE_TPP_TOK_SOL_AT_COMMENT case TPP_TOK_SOL_AT_COMMENT:
#else /* TPP_HAVE_TOK_SOL_AT_COMMENT */
#define _TPP_CASE_TPP_TOK_SOL_AT_COMMENT /* nothing */
#endif /* !TPP_HAVE_TOK_SOL_AT_COMMENT */
	TPP_INTERNAL(_TPP_TOK_COMMENTLIKE_MAX),
	TPP_TOK_COMMENTLIKE_MAX = TPP_INTERNAL(_TPP_TOK_COMMENTLIKE_MAX) - 1,
#define TPP_CASE_TPP_TOK_COMMENT_NOLINE    \
	_TPP_CASE_TPP_TOK_C_COMMENT            \
	_TPP_CASE_TPP_TOK_PASCAL_COMMENT       \
	_TPP_CASE_TPP_TOK_PASCAL_BRACE_COMMENT \
	_TPP_CASE_TPP_TOK_HTML_COMMENT
#define TPP_CASE_TPP_TOK_COMMENT_LINE   \
	_TPP_CASE_TPP_TOK_CXX_COMMENT       \
	_TPP_CASE_TPP_TOK_SQL_COMMENT       \
	_TPP_CASE_TPP_TOK_AT_AT_COMMENT     \
	_TPP_CASE_TPP_TOK_SHELL_COMMENT     \
	_TPP_CASE_TPP_TOK_SLASH_COMMENT     \
	_TPP_CASE_TPP_TOK_AT_COMMENT        \
	_TPP_CASE_TPP_TOK_SOL_SHELL_COMMENT \
	_TPP_CASE_TPP_TOK_SOL_SLASH_COMMENT \
	_TPP_CASE_TPP_TOK_SOL_AT_COMMENT
#define TPP_TOK_ISCOMMENT(id)                     \
	((int)(id) >= (int)TPP_TOK_COMMENTLIKE_MIN && \
	 (int)(id) <= (int)TPP_TOK_COMMENTLIKE_MAX)
#define TPP_CASE_TPP_TOK_COMMENT    \
	TPP_CASE_TPP_TOK_COMMENT_NOLINE \
	TPP_CASE_TPP_TOK_COMMENT_LINE
#define TPP_CASE_TPP_TOK_SHELL_COMMENT \
	_TPP_CASE_TPP_TOK_SHELL_COMMENT    \
	_TPP_CASE_TPP_TOK_SOL_SHELL_COMMENT
#else /* TPP_HAVE_TOK_COMMENTLIKE */
#define TPP_TOK_ISCOMMENT(id)           0
#define TPP_CASE_TPP_TOK_COMMENT_NOLINE /* nothing */
#define TPP_CASE_TPP_TOK_COMMENT_LINE   /* nothing */
#define TPP_CASE_TPP_TOK_COMMENT        /* nothing */
#define TPP_CASE_TPP_TOK_SHELL_COMMENT  /* nothing */
#endif /* !TPP_HAVE_TOK_COMMENTLIKE */
#if TPP_HAVE_TOK_SHELL_COMMENT && TPP_HAVE_TOK_SOL_SHELL_COMMENT
#define TPP_TOK_ISSHELLCOMMENT(id) ((id) == TPP_TOK_SHELL_COMMENT || (id) == TPP_TOK_SOL_SHELL_COMMENT)
#elif TPP_HAVE_TOK_SHELL_COMMENT
#define TPP_TOK_ISSHELLCOMMENT(id) ((id) == TPP_TOK_SHELL_COMMENT)
#elif TPP_HAVE_TOK_SOL_SHELL_COMMENT
#define TPP_TOK_ISSHELLCOMMENT(id) ((id) == TPP_TOK_SOL_SHELL_COMMENT)
#else /* ... */
#define TPP_TOK_ISSHELLCOMMENT(id) 0
#endif /* !... */
#if TPP_HAVE_TOK_COMMENTLIKE_NOLINE
#define TPP_TOK_ISCOMMENT_NOLINE(id)              \
	((int)(id) >= (int)TPP_TOK_COMMENTLIKE_MIN && \
	 (int)(id) <= (int)TPP_TOK_COMMENTLIKE_NOLINE_MAX)
#else /* TPP_HAVE_TOK_COMMENTLIKE_NOLINE */
#define TPP_TOK_ISCOMMENT_NOLINE(id) 0
#endif /* !TPP_HAVE_TOK_COMMENTLIKE_NOLINE */
#if TPP_HAVE_TOK_COMMENTLIKE_LINE
#define TPP_TOK_ISCOMMENT_LINE(id)                      \
	((int)(id) > (int)TPP_TOK_COMMENTLIKE_NOLINE_MAX && \
	 (int)(id) <= (int)TPP_TOK_COMMENTLIKE_MAX)
#else /* TPP_HAVE_TOK_COMMENTLIKE_LINE */
#define TPP_TOK_ISCOMMENT_LINE(id) 0
#endif /* !TPP_HAVE_TOK_COMMENTLIKE_LINE */


#if TPP_HAVE_TOK_STRINGLIKE
	TPP_TOK_STRINGLIKE_MIN,
	TPP_INTERNAL(_TPP_TOK_STRINGLIKE_MIN) = TPP_TOK_STRINGLIKE_MIN - 1,
#if TPP_HAVE_TOK_C_STRING
	TPP_TOK_C_STRING, /* "<string>" "foo" */
#define _TPP_CASE_TPP_TOK_C_STRING case TPP_TOK_C_STRING:
#else /* TPP_HAVE_TOK_C_STRING */
#define _TPP_CASE_TPP_TOK_C_STRING /* nothing */
#endif /* !TPP_HAVE_TOK_C_STRING */
#if TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
	TPP_TOK_CXX_RAW_STRING_LITERAL, /* "<string>" R"AB(foo)AB" */
#define _TPP_CASE_TPP_TOK_CXX_RAW_STRING_LITERAL case TPP_TOK_CXX_RAW_STRING_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#if TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL
	TPP_TOK_CXX_WIDE_STRING_LITERAL, /* "<string>" L"foo" */
#define _TPP_CASE_TPP_TOK_CXX_WIDE_STRING_LITERAL case TPP_TOK_CXX_WIDE_STRING_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
	TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL, /* "<string>" LR"AB(foo)AB" */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL case TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#else /* TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_WIDE_STRING_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL
	TPP_TOK_CXX_UTF8_STRING_LITERAL, /* "<string>" u8"foo" */
#define _TPP_CASE_TPP_TOK_CXX_UTF8_STRING_LITERAL case TPP_TOK_CXX_UTF8_STRING_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
	TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL, /* "<string>" u8R"AB(foo)AB" */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL case TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF8_STRING_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL
	TPP_TOK_CXX_UTF16_STRING_LITERAL, /* "<string>" u"foo" */
#define _TPP_CASE_TPP_TOK_CXX_UTF16_STRING_LITERAL case TPP_TOK_CXX_UTF16_STRING_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
	TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL, /* "<string>" uR"AB(foo)AB" */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL case TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF16_STRING_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL
	TPP_TOK_CXX_UTF32_STRING_LITERAL, /* "<string>" U"foo" */
#define _TPP_CASE_TPP_TOK_CXX_UTF32_STRING_LITERAL case TPP_TOK_CXX_UTF32_STRING_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL
	TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL, /* "<string>" UR"AB(foo)AB" */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL case TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF32_STRING_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL */
#if TPP_HAVE_TOK_RAW_STRING_LITERAL
	TPP_TOK_RAW_STRING_LITERAL, /* "<string>" R"foo"  r"foo"  */
#define _TPP_CASE_TPP_TOK_RAW_STRING_LITERAL case TPP_TOK_RAW_STRING_LITERAL:
#else /* TPP_HAVE_TOK_RAW_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_RAW_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_RAW_STRING_LITERAL */
#if TPP_HAVE_TOK_BLOCK_STRING_LITERAL
	TPP_TOK_BLOCK_STRING_LITERAL, /* "<string>" """foo""" */
#define _TPP_CASE_TPP_TOK_BLOCK_STRING_LITERAL case TPP_TOK_BLOCK_STRING_LITERAL:
#else /* TPP_HAVE_TOK_BLOCK_STRING_LITERAL */
#define _TPP_CASE_TPP_TOK_BLOCK_STRING_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_BLOCK_STRING_LITERAL */
	TPP_TOK_CHARLIKE_MIN,
	TPP_INTERNAL(_TPP_TOK_C_CHARLIKE_MIN) = TPP_TOK_CHARLIKE_MIN - 1,
#if TPP_HAVE_TOK_C_CHAR
	TPP_TOK_C_CHAR, /* "<char>" 'f' */
#define _TPP_CASE_TPP_TOK_C_CHAR case TPP_TOK_C_CHAR:
#else /* TPP_HAVE_TOK_C_CHAR */
#define _TPP_CASE_TPP_TOK_C_CHAR /* nothing */
#endif /* !TPP_HAVE_TOK_C_CHAR */
#if TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
	TPP_TOK_CXX_RAW_CHAR_LITERAL, /* "<char>" R'AB(f)AB' */
#define _TPP_CASE_TPP_TOK_CXX_RAW_CHAR_LITERAL case TPP_TOK_CXX_RAW_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#if TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL
	TPP_TOK_CXX_WIDE_CHAR_LITERAL, /* "<char>" L'f' */
#define _TPP_CASE_TPP_TOK_CXX_WIDE_CHAR_LITERAL case TPP_TOK_CXX_WIDE_CHAR_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
	TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL, /* "<char>" LR'AB(f)AB' */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL case TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#else /* TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_WIDE_CHAR_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL
	TPP_TOK_CXX_UTF8_CHAR_LITERAL, /* "<char>" u8'f' */
#define _TPP_CASE_TPP_TOK_CXX_UTF8_CHAR_LITERAL case TPP_TOK_CXX_UTF8_CHAR_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
	TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL, /* "<char>" u8R'AB(f)AB' */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL case TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF8_CHAR_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL
	TPP_TOK_CXX_UTF16_CHAR_LITERAL, /* "<char>" u'f' */
#define _TPP_CASE_TPP_TOK_CXX_UTF16_CHAR_LITERAL case TPP_TOK_CXX_UTF16_CHAR_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
	TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL, /* "<char>" uR'AB(f)AB' */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL case TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF16_CHAR_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL */
#if TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL
	TPP_TOK_CXX_UTF32_CHAR_LITERAL, /* "<char>" U'f' */
#define _TPP_CASE_TPP_TOK_CXX_UTF32_CHAR_LITERAL case TPP_TOK_CXX_UTF32_CHAR_LITERAL:
#if TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL
	TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL, /* "<char>" UR'AB(f)AB' */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL case TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL */
#else /* TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_CXX_UTF32_CHAR_LITERAL     /* nothing */
#define _TPP_CASE_TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL */
#if TPP_HAVE_TOK_RAW_CHAR_LITERAL
	TPP_TOK_RAW_CHAR_LITERAL, /* "<char>" R'f'  r'f'  */
#define _TPP_CASE_TPP_TOK_RAW_CHAR_LITERAL case TPP_TOK_RAW_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_RAW_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_RAW_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_RAW_CHAR_LITERAL */
#if TPP_HAVE_TOK_BLOCK_CHAR_LITERAL
	TPP_TOK_BLOCK_CHAR_LITERAL, /* "<string>" '''foo''' */
#define _TPP_CASE_TPP_TOK_BLOCK_CHAR_LITERAL case TPP_TOK_BLOCK_CHAR_LITERAL:
#else /* TPP_HAVE_TOK_BLOCK_CHAR_LITERAL */
#define _TPP_CASE_TPP_TOK_BLOCK_CHAR_LITERAL /* nothing */
#endif /* !TPP_HAVE_TOK_BLOCK_CHAR_LITERAL */

	TPP_INTERNAL(_TPP_TOK_STRINGLIKE_MAX),
	TPP_TOK_STRINGLIKE_MAX = TPP_INTERNAL(_TPP_TOK_STRINGLIKE_MAX) - 1,
#if TPP_HAVE_TOK_STRINGLIKE_SQUOTE
#define TPP_TOK_ISSTRING_SQUOTE(id)            \
	((int)(id) >= (int)TPP_TOK_CHARLIKE_MIN && \
	 (int)(id) <= (int)TPP_TOK_STRINGLIKE_MAX)
#else /* TPP_HAVE_TOK_STRINGLIKE_SQUOTE */
#define TPP_TOK_ISSTRING_SQUOTE(id) 0
#endif /* !TPP_HAVE_TOK_STRINGLIKE_SQUOTE */
#define TPP_CASE_TPP_TOK_STRING_SQUOTE           \
	_TPP_CASE_TPP_TOK_C_CHAR                     \
	_TPP_CASE_TPP_TOK_CXX_RAW_CHAR_LITERAL       \
	_TPP_CASE_TPP_TOK_CXX_WIDE_CHAR_LITERAL      \
	_TPP_CASE_TPP_TOK_CXX_RAW_WIDE_CHAR_LITERAL  \
	_TPP_CASE_TPP_TOK_CXX_UTF8_CHAR_LITERAL      \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF8_CHAR_LITERAL  \
	_TPP_CASE_TPP_TOK_CXX_UTF16_CHAR_LITERAL     \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF16_CHAR_LITERAL \
	_TPP_CASE_TPP_TOK_CXX_UTF32_CHAR_LITERAL     \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF32_CHAR_LITERAL \
	_TPP_CASE_TPP_TOK_RAW_CHAR_LITERAL           \
	_TPP_CASE_TPP_TOK_BLOCK_CHAR_LITERAL

#if TPP_HAVE_TOK_STRINGLIKE_DQUOTE
#define TPP_TOK_ISSTRING_DQUOTE(id)              \
	((int)(id) >= (int)TPP_TOK_STRINGLIKE_MIN && \
	 (int)(id) < (int)TPP_TOK_CHARLIKE_MIN)
#else /* TPP_HAVE_TOK_STRINGLIKE_DQUOTE */
#define TPP_TOK_ISSTRING_DQUOTE(id) 0
#endif /* !TPP_HAVE_TOK_STRINGLIKE_DQUOTE */
#define TPP_CASE_TPP_TOK_STRING_DQUOTE             \
	_TPP_CASE_TPP_TOK_C_STRING                     \
	_TPP_CASE_TPP_TOK_CXX_RAW_STRING_LITERAL       \
	_TPP_CASE_TPP_TOK_CXX_WIDE_STRING_LITERAL      \
	_TPP_CASE_TPP_TOK_CXX_RAW_WIDE_STRING_LITERAL  \
	_TPP_CASE_TPP_TOK_CXX_UTF8_STRING_LITERAL      \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF8_STRING_LITERAL  \
	_TPP_CASE_TPP_TOK_CXX_UTF16_STRING_LITERAL     \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF16_STRING_LITERAL \
	_TPP_CASE_TPP_TOK_CXX_UTF32_STRING_LITERAL     \
	_TPP_CASE_TPP_TOK_CXX_RAW_UTF32_STRING_LITERAL \
	_TPP_CASE_TPP_TOK_RAW_STRING_LITERAL           \
	_TPP_CASE_TPP_TOK_BLOCK_STRING_LITERAL

#define TPP_TOK_ISSTRING(id)                     \
	((int)(id) >= (int)TPP_TOK_STRINGLIKE_MIN && \
	 (int)(id) <= (int)TPP_TOK_STRINGLIKE_MAX)
#define TPP_CASE_TPP_TOK_STRING    \
	TPP_CASE_TPP_TOK_STRING_DQUOTE \
	TPP_CASE_TPP_TOK_STRING_SQUOTE
#else /* TPP_HAVE_TOK_STRINGLIKE */
#define TPP_TOK_ISSTRING(id)           0
#define TPP_TOK_ISSTRING_DQUOTE(id)    0
#define TPP_TOK_ISSTRING_SQUOTE(id)    0
#define TPP_CASE_TPP_TOK_STRING        /* nothing */
#define TPP_CASE_TPP_TOK_STRING_DQUOTE /* nothing */
#define TPP_CASE_TPP_TOK_STRING_SQUOTE /* nothing */
#endif /* !TPP_HAVE_TOK_STRINGLIKE */

	/* Sort multi-char tokens by their first character (to make it possible to
	 * define "tok >= X && tok <= Y"-style checks for multi-char-starts-with-z)
	 *
	 * As a matter of fact: multi-char tokens are sorted lexicographically! */
#if TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM
	TPP_TOK_MC_STARTSWITH_EXCLAIM_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EXCLAIM_MIN) = TPP_TOK_MC_STARTSWITH_EXCLAIM_MIN - 1,
#if TPP_HAVE_TOK_EXCLAIM_EXCLAIM
	TPP_TOK_EXCLAIM_EXCLAIM, /* "!!" */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EXCLAIM case TPP_TOK_EXCLAIM_EXCLAIM:
#else /* TPP_HAVE_TOK_EXCLAIM_EXCLAIM */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EXCLAIM /* nothing */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EXCLAIM */
#if TPP_HAVE_TOK_EXCLAIM_EQUAL
	TPP_TOK_EXCLAIM_EQUAL, /* "!=" */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EQUAL case TPP_TOK_EXCLAIM_EQUAL:
#else /* TPP_HAVE_TOK_EXCLAIM_EQUAL */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EQUAL */
#if TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL
	TPP_TOK_EXCLAIM_EQUAL_EQUAL, /* "!==" */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EQUAL_EQUAL case TPP_TOK_EXCLAIM_EQUAL_EQUAL:
#else /* TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL */
#define _TPP_CASE_TPP_TOK_EXCLAIM_EQUAL_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EXCLAIM_MAX),
	TPP_TOK_MC_STARTSWITH_EXCLAIM_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EXCLAIM_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_EXCLAIM(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_EXCLAIM_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_EXCLAIM_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_EXCLAIM \
	_TPP_CASE_TPP_TOK_EXCLAIM_EXCLAIM \
	_TPP_CASE_TPP_TOK_EXCLAIM_EQUAL \
	_TPP_CASE_TPP_TOK_EXCLAIM_EQUAL_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM */
#define TPP_TOK_MC_STARTSWITH_EXCLAIM(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_EXCLAIM /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_EXCLAIM */

#if TPP_HAVE_TOK_MC_STARTSWITH_POUND
	TPP_TOK_MC_STARTSWITH_POUND_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_POUND_MIN) = TPP_TOK_MC_STARTSWITH_POUND_MIN - 1,
#if TPP_HAVE_TOK_POUND_POUND
	TPP_TOK_POUND_POUND, /* "##" */
#define _TPP_CASE_TPP_TOK_POUND_POUND case TPP_TOK_POUND_POUND:
#else /* TPP_HAVE_TOK_POUND_POUND */
#define _TPP_CASE_TPP_TOK_POUND_POUND /* nothing */
#endif /* !TPP_HAVE_TOK_POUND_POUND */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_POUND_MAX),
	TPP_TOK_MC_STARTSWITH_POUND_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_POUND_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_POUND(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_POUND_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_POUND_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_POUND \
	_TPP_CASE_TPP_TOK_POUND_POUND
#else /* TPP_HAVE_TOK_MC_STARTSWITH_POUND */
#define TPP_TOK_MC_STARTSWITH_POUND(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_POUND /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_POUND */

#if TPP_HAVE_TOK_MC_STARTSWITH_PERCENT
	TPP_TOK_MC_STARTSWITH_PERCENT_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PERCENT_MIN) = TPP_TOK_MC_STARTSWITH_PERCENT_MIN - 1,
#if TPP_HAVE_TOK_PERCENT_PERCENT
	TPP_TOK_PERCENT_PERCENT, /* "%%" */
#define _TPP_CASE_TPP_TOK_PERCENT_PERCENT case TPP_TOK_PERCENT_PERCENT:
#else /* TPP_HAVE_TOK_PERCENT_PERCENT */
#define _TPP_CASE_TPP_TOK_PERCENT_PERCENT /* nothing */
#endif /* !TPP_HAVE_TOK_PERCENT_PERCENT */
#if TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL
	TPP_TOK_PERCENT_PERCENT_EQUAL, /* "%%=" */
#define _TPP_CASE_TPP_TOK_PERCENT_PERCENT_EQUAL case TPP_TOK_PERCENT_PERCENT_EQUAL:
#else /* TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL */
#define _TPP_CASE_TPP_TOK_PERCENT_PERCENT_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL */
#if TPP_HAVE_TOK_PERCENT_EQUAL
	TPP_TOK_PERCENT_EQUAL, /* "%=" */
#define _TPP_CASE_TPP_TOK_PERCENT_EQUAL case TPP_TOK_PERCENT_EQUAL:
#else /* TPP_HAVE_TOK_PERCENT_EQUAL */
#define _TPP_CASE_TPP_TOK_PERCENT_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_PERCENT_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PERCENT_MAX),
	TPP_TOK_MC_STARTSWITH_PERCENT_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PERCENT_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_PERCENT(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_PERCENT_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_PERCENT_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PERCENT \
	_TPP_CASE_TPP_TOK_PERCENT_PERCENT \
	_TPP_CASE_TPP_TOK_PERCENT_PERCENT_EQUAL \
	_TPP_CASE_TPP_TOK_PERCENT_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_PERCENT */
#define TPP_TOK_MC_STARTSWITH_PERCENT(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PERCENT /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_PERCENT */

#if TPP_HAVE_TOK_MC_STARTSWITH_AMP
	TPP_TOK_MC_STARTSWITH_AMP_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AMP_MIN) = TPP_TOK_MC_STARTSWITH_AMP_MIN - 1,
#if TPP_HAVE_TOK_AMP_AMP
	TPP_TOK_AMP_AMP, /* "&&" */
#define _TPP_CASE_TPP_TOK_AMP_AMP case TPP_TOK_AMP_AMP:
#else /* TPP_HAVE_TOK_AMP_AMP */
#define _TPP_CASE_TPP_TOK_AMP_AMP /* nothing */
#endif /* !TPP_HAVE_TOK_AMP_AMP */
#if TPP_HAVE_TOK_AMP_EQUAL
	TPP_TOK_AMP_EQUAL, /* "&=" */
#define _TPP_CASE_TPP_TOK_AMP_EQUAL case TPP_TOK_AMP_EQUAL:
#else /* TPP_HAVE_TOK_AMP_EQUAL */
#define _TPP_CASE_TPP_TOK_AMP_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_AMP_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AMP_MAX),
	TPP_TOK_MC_STARTSWITH_AMP_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AMP_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_AMP(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_AMP_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_AMP_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_AMP \
	_TPP_CASE_TPP_TOK_AMP_AMP \
	_TPP_CASE_TPP_TOK_AMP_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_AMP */
#define TPP_TOK_MC_STARTSWITH_AMP(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_AMP /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_AMP */

#if TPP_HAVE_TOK_MC_STARTSWITH_STAR
	TPP_TOK_MC_STARTSWITH_STAR_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_STAR_MIN) = TPP_TOK_MC_STARTSWITH_STAR_MIN - 1,
#if TPP_HAVE_TOK_STAR_STAR
	TPP_TOK_STAR_STAR, /* "**" */
#define _TPP_CASE_TPP_TOK_STAR_STAR case TPP_TOK_STAR_STAR:
#else /* TPP_HAVE_TOK_STAR_STAR */
#define _TPP_CASE_TPP_TOK_STAR_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_STAR_STAR */
#if TPP_HAVE_TOK_STAR_STAR_EQUAL
	TPP_TOK_STAR_STAR_EQUAL, /* "**=" */
#define _TPP_CASE_TPP_TOK_STAR_STAR_EQUAL case TPP_TOK_STAR_STAR_EQUAL:
#else /* TPP_HAVE_TOK_STAR_STAR_EQUAL */
#define _TPP_CASE_TPP_TOK_STAR_STAR_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_STAR_STAR_EQUAL */
#if TPP_HAVE_TOK_STAR_DOT
	TPP_TOK_STAR_DOT, /* "*." */
#define _TPP_CASE_TPP_TOK_STAR_DOT case TPP_TOK_STAR_DOT:
#else /* TPP_HAVE_TOK_STAR_DOT */
#define _TPP_CASE_TPP_TOK_STAR_DOT /* nothing */
#endif /* !TPP_HAVE_TOK_STAR_DOT */
#if TPP_HAVE_TOK_STAR_LANGLE_MINUS
	TPP_TOK_STAR_LANGLE_MINUS, /* "*<-" */
#define _TPP_CASE_TPP_TOK_STAR_LANGLE_MINUS case TPP_TOK_STAR_LANGLE_MINUS:
#else /* TPP_HAVE_TOK_STAR_LANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_STAR_LANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_STAR_LANGLE_MINUS */
#if TPP_HAVE_TOK_STAR_EQUAL
	TPP_TOK_STAR_EQUAL, /* "*=" */
#define _TPP_CASE_TPP_TOK_STAR_EQUAL case TPP_TOK_STAR_EQUAL:
#else /* TPP_HAVE_TOK_STAR_EQUAL */
#define _TPP_CASE_TPP_TOK_STAR_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_STAR_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_STAR_MAX),
	TPP_TOK_MC_STARTSWITH_STAR_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_STAR_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_STAR(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_STAR_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_STAR_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_STAR \
	_TPP_CASE_TPP_TOK_STAR_STAR \
	_TPP_CASE_TPP_TOK_STAR_STAR_EQUAL \
	_TPP_CASE_TPP_TOK_STAR_DOT \
	_TPP_CASE_TPP_TOK_STAR_LANGLE_MINUS \
	_TPP_CASE_TPP_TOK_STAR_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_STAR */
#define TPP_TOK_MC_STARTSWITH_STAR(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_STAR */

#if TPP_HAVE_TOK_MC_STARTSWITH_PLUS
	TPP_TOK_MC_STARTSWITH_PLUS_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PLUS_MIN) = TPP_TOK_MC_STARTSWITH_PLUS_MIN - 1,
#if TPP_HAVE_TOK_PLUS_PLUS
	TPP_TOK_PLUS_PLUS, /* "++" */
#define _TPP_CASE_TPP_TOK_PLUS_PLUS case TPP_TOK_PLUS_PLUS:
#else /* TPP_HAVE_TOK_PLUS_PLUS */
#define _TPP_CASE_TPP_TOK_PLUS_PLUS /* nothing */
#endif /* !TPP_HAVE_TOK_PLUS_PLUS */
#if TPP_HAVE_TOK_PLUS_EQUAL
	TPP_TOK_PLUS_EQUAL, /* "+=" */
#define _TPP_CASE_TPP_TOK_PLUS_EQUAL case TPP_TOK_PLUS_EQUAL:
#else /* TPP_HAVE_TOK_PLUS_EQUAL */
#define _TPP_CASE_TPP_TOK_PLUS_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_PLUS_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PLUS_MAX),
	TPP_TOK_MC_STARTSWITH_PLUS_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PLUS_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_PLUS(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_PLUS_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_PLUS_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PLUS \
	_TPP_CASE_TPP_TOK_PLUS_PLUS \
	_TPP_CASE_TPP_TOK_PLUS_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_PLUS */
#define TPP_TOK_MC_STARTSWITH_PLUS(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PLUS /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_PLUS */

#if TPP_HAVE_TOK_MC_STARTSWITH_MINUS
	TPP_TOK_MC_STARTSWITH_MINUS_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_MINUS_MIN) = TPP_TOK_MC_STARTSWITH_MINUS_MIN - 1,
#if TPP_HAVE_TOK_MINUS_MINUS
	TPP_TOK_MINUS_MINUS, /* "--" */
#define _TPP_CASE_TPP_TOK_MINUS_MINUS case TPP_TOK_MINUS_MINUS:
#else /* TPP_HAVE_TOK_MINUS_MINUS */
#define _TPP_CASE_TPP_TOK_MINUS_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_MINUS */
#if TPP_HAVE_TOK_MINUS_LANGLE
	TPP_TOK_MINUS_LANGLE, /* "-<" */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE case TPP_TOK_MINUS_LANGLE:
#else /* TPP_HAVE_TOK_MINUS_LANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE */
#if TPP_HAVE_TOK_MINUS_LANGLE_LANGLE
	TPP_TOK_MINUS_LANGLE_LANGLE, /* "-<<" */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE case TPP_TOK_MINUS_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_MINUS_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE_LANGLE */
#if TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE
	TPP_TOK_MINUS_LANGLE_LANGLE_LANGLE, /* "-<<<" */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE_LANGLE case TPP_TOK_MINUS_LANGLE_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE */
#if TPP_HAVE_TOK_MINUS_EQUAL
	TPP_TOK_MINUS_EQUAL, /* "-=" */
#define _TPP_CASE_TPP_TOK_MINUS_EQUAL case TPP_TOK_MINUS_EQUAL:
#else /* TPP_HAVE_TOK_MINUS_EQUAL */
#define _TPP_CASE_TPP_TOK_MINUS_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_EQUAL */
#if TPP_HAVE_TOK_MINUS_RANGLE
	TPP_TOK_MINUS_RANGLE, /* "->" */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE case TPP_TOK_MINUS_RANGLE:
#else /* TPP_HAVE_TOK_MINUS_RANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE */
#if TPP_HAVE_TOK_MINUS_RANGLE_STAR
	TPP_TOK_MINUS_RANGLE_STAR, /* "->*" */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_STAR case TPP_TOK_MINUS_RANGLE_STAR:
#else /* TPP_HAVE_TOK_MINUS_RANGLE_STAR */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_STAR */
#if TPP_HAVE_TOK_MINUS_RANGLE_RANGLE
	TPP_TOK_MINUS_RANGLE_RANGLE, /* "->>" */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE case TPP_TOK_MINUS_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_MINUS_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_RANGLE */
#if TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE
	TPP_TOK_MINUS_RANGLE_RANGLE_RANGLE, /* "->>>" */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE_RANGLE case TPP_TOK_MINUS_RANGLE_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_MINUS_MAX),
	TPP_TOK_MC_STARTSWITH_MINUS_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_MINUS_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_MINUS(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_MINUS_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_MINUS_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_MINUS \
	_TPP_CASE_TPP_TOK_MINUS_MINUS \
	_TPP_CASE_TPP_TOK_MINUS_LANGLE \
	_TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_MINUS_LANGLE_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_MINUS_EQUAL \
	_TPP_CASE_TPP_TOK_MINUS_RANGLE \
	_TPP_CASE_TPP_TOK_MINUS_RANGLE_STAR \
	_TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE \
	_TPP_CASE_TPP_TOK_MINUS_RANGLE_RANGLE_RANGLE
#else /* TPP_HAVE_TOK_MC_STARTSWITH_MINUS */
#define TPP_TOK_MC_STARTSWITH_MINUS(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_MINUS */

#if TPP_HAVE_TOK_MC_STARTSWITH_DOT
	TPP_TOK_MC_STARTSWITH_DOT_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_DOT_MIN) = TPP_TOK_MC_STARTSWITH_DOT_MIN - 1,
#if TPP_HAVE_TOK_DOT_STAR
	TPP_TOK_DOT_STAR, /* ".*" */
#define _TPP_CASE_TPP_TOK_DOT_STAR case TPP_TOK_DOT_STAR:
#else /* TPP_HAVE_TOK_DOT_STAR */
#define _TPP_CASE_TPP_TOK_DOT_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_DOT_STAR */
#if TPP_HAVE_TOK_DOT_DOT
	TPP_TOK_DOT_DOT, /* ".." */
#define _TPP_CASE_TPP_TOK_DOT_DOT case TPP_TOK_DOT_DOT:
#else /* TPP_HAVE_TOK_DOT_DOT */
#define _TPP_CASE_TPP_TOK_DOT_DOT /* nothing */
#endif /* !TPP_HAVE_TOK_DOT_DOT */
#if TPP_HAVE_TOK_DOT_DOT_DOT
	TPP_TOK_DOT_DOT_DOT, /* "..." */
#define _TPP_CASE_TPP_TOK_DOT_DOT_DOT case TPP_TOK_DOT_DOT_DOT:
#else /* TPP_HAVE_TOK_DOT_DOT_DOT */
#define _TPP_CASE_TPP_TOK_DOT_DOT_DOT /* nothing */
#endif /* !TPP_HAVE_TOK_DOT_DOT_DOT */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_DOT_MAX),
	TPP_TOK_MC_STARTSWITH_DOT_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_DOT_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_DOT(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_DOT_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_DOT_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_DOT \
	_TPP_CASE_TPP_TOK_DOT_STAR \
	_TPP_CASE_TPP_TOK_DOT_DOT \
	_TPP_CASE_TPP_TOK_DOT_DOT_DOT
#else /* TPP_HAVE_TOK_MC_STARTSWITH_DOT */
#define TPP_TOK_MC_STARTSWITH_DOT(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_DOT /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_DOT */

#if TPP_HAVE_TOK_MC_STARTSWITH_SLASH
	TPP_TOK_MC_STARTSWITH_SLASH_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_SLASH_MIN) = TPP_TOK_MC_STARTSWITH_SLASH_MIN - 1,
#if TPP_HAVE_TOK_SLASH_SLASH
	TPP_TOK_SLASH_SLASH, /* "//" */
#define _TPP_CASE_TPP_TOK_SLASH_SLASH case TPP_TOK_SLASH_SLASH:
#else /* TPP_HAVE_TOK_SLASH_SLASH */
#define _TPP_CASE_TPP_TOK_SLASH_SLASH /* nothing */
#endif /* !TPP_HAVE_TOK_SLASH_SLASH */
#if TPP_HAVE_TOK_SLASH_SLASH_EQUAL
	TPP_TOK_SLASH_SLASH_EQUAL, /* "//=" */
#define _TPP_CASE_TPP_TOK_SLASH_SLASH_EQUAL case TPP_TOK_SLASH_SLASH_EQUAL:
#else /* TPP_HAVE_TOK_SLASH_SLASH_EQUAL */
#define _TPP_CASE_TPP_TOK_SLASH_SLASH_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_SLASH_SLASH_EQUAL */
#if TPP_HAVE_TOK_SLASH_EQUAL
	TPP_TOK_SLASH_EQUAL, /* "/=" */
#define _TPP_CASE_TPP_TOK_SLASH_EQUAL case TPP_TOK_SLASH_EQUAL:
#else /* TPP_HAVE_TOK_SLASH_EQUAL */
#define _TPP_CASE_TPP_TOK_SLASH_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_SLASH_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_SLASH_MAX),
	TPP_TOK_MC_STARTSWITH_SLASH_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_SLASH_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_SLASH(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_SLASH_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_SLASH_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_SLASH \
	_TPP_CASE_TPP_TOK_SLASH_SLASH \
	_TPP_CASE_TPP_TOK_SLASH_SLASH_EQUAL \
	_TPP_CASE_TPP_TOK_SLASH_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_SLASH */
#define TPP_TOK_MC_STARTSWITH_SLASH(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_SLASH /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_SLASH */

#if TPP_HAVE_TOK_MC_STARTSWITH_COLON
	TPP_TOK_MC_STARTSWITH_COLON_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_COLON_MIN) = TPP_TOK_MC_STARTSWITH_COLON_MIN - 1,
#if TPP_HAVE_TOK_COLON_COLON
	TPP_TOK_COLON_COLON, /* "::" */
#define _TPP_CASE_TPP_TOK_COLON_COLON case TPP_TOK_COLON_COLON:
#else /* TPP_HAVE_TOK_COLON_COLON */
#define _TPP_CASE_TPP_TOK_COLON_COLON /* nothing */
#endif /* !TPP_HAVE_TOK_COLON_COLON */
#if TPP_HAVE_TOK_COLON_EQUAL
	TPP_TOK_COLON_EQUAL, /* ":=" */
#define _TPP_CASE_TPP_TOK_COLON_EQUAL case TPP_TOK_COLON_EQUAL:
#else /* TPP_HAVE_TOK_COLON_EQUAL */
#define _TPP_CASE_TPP_TOK_COLON_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_COLON_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_COLON_MAX),
	TPP_TOK_MC_STARTSWITH_COLON_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_COLON_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_COLON(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_COLON_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_COLON_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_COLON \
	_TPP_CASE_TPP_TOK_COLON_COLON \
	_TPP_CASE_TPP_TOK_COLON_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_COLON */
#define TPP_TOK_MC_STARTSWITH_COLON(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_COLON /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_COLON */

#if TPP_HAVE_TOK_MC_STARTSWITH_LANGLE
	TPP_TOK_MC_STARTSWITH_LANGLE_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_LANGLE_MIN) = TPP_TOK_MC_STARTSWITH_LANGLE_MIN - 1,
#if TPP_HAVE_TOK_LANGLE_MINUS
	TPP_TOK_LANGLE_MINUS, /* "<-" */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS case TPP_TOK_LANGLE_MINUS:
#else /* TPP_HAVE_TOK_LANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS */
#if TPP_HAVE_TOK_LANGLE_MINUS_LANGLE
	TPP_TOK_LANGLE_MINUS_LANGLE, /* "<-<" */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS_LANGLE case TPP_TOK_LANGLE_MINUS_LANGLE:
#else /* TPP_HAVE_TOK_LANGLE_MINUS_LANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS_LANGLE */
#if TPP_HAVE_TOK_LANGLE_MINUS_RANGLE
	TPP_TOK_LANGLE_MINUS_RANGLE, /* "<->" */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS_RANGLE case TPP_TOK_LANGLE_MINUS_RANGLE:
#else /* TPP_HAVE_TOK_LANGLE_MINUS_RANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_MINUS_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_MINUS_RANGLE */
#if TPP_HAVE_TOK_LANGLE_LANGLE
	TPP_TOK_LANGLE_LANGLE, /* "<<" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE case TPP_TOK_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE */
#if TPP_HAVE_TOK_LANGLE_LANGLE_MINUS
	TPP_TOK_LANGLE_LANGLE_MINUS, /* "<<-" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_MINUS case TPP_TOK_LANGLE_LANGLE_MINUS:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_MINUS */
#if TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE
	TPP_TOK_LANGLE_LANGLE_LANGLE, /* "<<<" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE case TPP_TOK_LANGLE_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE */
#if TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS
	TPP_TOK_LANGLE_LANGLE_LANGLE_MINUS, /* "<<<-" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_MINUS case TPP_TOK_LANGLE_LANGLE_LANGLE_MINUS:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS */
#if TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL
	TPP_TOK_LANGLE_LANGLE_LANGLE_EQUAL, /* "<<<=" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_EQUAL case TPP_TOK_LANGLE_LANGLE_LANGLE_EQUAL:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL */
#if TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL
	TPP_TOK_LANGLE_LANGLE_EQUAL, /* "<<=" */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_EQUAL case TPP_TOK_LANGLE_LANGLE_EQUAL:
#else /* TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_LANGLE_LANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL */
#if TPP_HAVE_TOK_LANGLE_EQUAL
	TPP_TOK_LANGLE_EQUAL, /* "<=" */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL case TPP_TOK_LANGLE_EQUAL:
#else /* TPP_HAVE_TOK_LANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL */
#if TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE
	TPP_TOK_LANGLE_EQUAL_LANGLE, /* "<=<" */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL_LANGLE case TPP_TOK_LANGLE_EQUAL_LANGLE:
#else /* TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE */
#if TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE
	TPP_TOK_LANGLE_EQUAL_RANGLE, /* "<=>" */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL_RANGLE case TPP_TOK_LANGLE_EQUAL_RANGLE:
#else /* TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_EQUAL_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE */
#if TPP_HAVE_TOK_LANGLE_RANGLE
	TPP_TOK_LANGLE_RANGLE, /* "<>" */
#define _TPP_CASE_TPP_TOK_LANGLE_RANGLE case TPP_TOK_LANGLE_RANGLE:
#else /* TPP_HAVE_TOK_LANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_LANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_LANGLE_RANGLE */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_LANGLE_MAX),
	TPP_TOK_MC_STARTSWITH_LANGLE_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_LANGLE_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_LANGLE(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_LANGLE_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_LANGLE_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_LANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_MINUS \
	_TPP_CASE_TPP_TOK_LANGLE_MINUS_LANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_MINUS_RANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE_MINUS \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_MINUS \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE_LANGLE_EQUAL \
	_TPP_CASE_TPP_TOK_LANGLE_LANGLE_EQUAL \
	_TPP_CASE_TPP_TOK_LANGLE_EQUAL \
	_TPP_CASE_TPP_TOK_LANGLE_EQUAL_LANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_EQUAL_RANGLE \
	_TPP_CASE_TPP_TOK_LANGLE_RANGLE
#else /* TPP_HAVE_TOK_MC_STARTSWITH_LANGLE */
#define TPP_TOK_MC_STARTSWITH_LANGLE(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_LANGLE */

#if TPP_HAVE_TOK_MC_STARTSWITH_EQUAL
	TPP_TOK_MC_STARTSWITH_EQUAL_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EQUAL_MIN) = TPP_TOK_MC_STARTSWITH_EQUAL_MIN - 1,
#if TPP_HAVE_TOK_EQUAL_EXCLAIM
	TPP_TOK_EQUAL_EXCLAIM, /* "=!" */
#define _TPP_CASE_TPP_TOK_EQUAL_EXCLAIM case TPP_TOK_EQUAL_EXCLAIM:
#else /* TPP_HAVE_TOK_EQUAL_EXCLAIM */
#define _TPP_CASE_TPP_TOK_EQUAL_EXCLAIM /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_EXCLAIM */
#if TPP_HAVE_TOK_EQUAL_PERCENT
	TPP_TOK_EQUAL_PERCENT, /* "=%" */
#define _TPP_CASE_TPP_TOK_EQUAL_PERCENT case TPP_TOK_EQUAL_PERCENT:
#else /* TPP_HAVE_TOK_EQUAL_PERCENT */
#define _TPP_CASE_TPP_TOK_EQUAL_PERCENT /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_PERCENT */
#if TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT
	TPP_TOK_EQUAL_PERCENT_PERCENT, /* "=%%" */
#define _TPP_CASE_TPP_TOK_EQUAL_PERCENT_PERCENT case TPP_TOK_EQUAL_PERCENT_PERCENT:
#else /* TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT */
#define _TPP_CASE_TPP_TOK_EQUAL_PERCENT_PERCENT /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT */
#if TPP_HAVE_TOK_EQUAL_AMP
	TPP_TOK_EQUAL_AMP, /* "=&" */
#define _TPP_CASE_TPP_TOK_EQUAL_AMP case TPP_TOK_EQUAL_AMP:
#else /* TPP_HAVE_TOK_EQUAL_AMP */
#define _TPP_CASE_TPP_TOK_EQUAL_AMP /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_AMP */
#if TPP_HAVE_TOK_EQUAL_STAR
	TPP_TOK_EQUAL_STAR, /* "=*" */
#define _TPP_CASE_TPP_TOK_EQUAL_STAR case TPP_TOK_EQUAL_STAR:
#else /* TPP_HAVE_TOK_EQUAL_STAR */
#define _TPP_CASE_TPP_TOK_EQUAL_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_STAR */
#if TPP_HAVE_TOK_EQUAL_STAR_STAR
	TPP_TOK_EQUAL_STAR_STAR, /* "=**" */
#define _TPP_CASE_TPP_TOK_EQUAL_STAR_STAR case TPP_TOK_EQUAL_STAR_STAR:
#else /* TPP_HAVE_TOK_EQUAL_STAR_STAR */
#define _TPP_CASE_TPP_TOK_EQUAL_STAR_STAR /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_STAR_STAR */
#if TPP_HAVE_TOK_EQUAL_PLUS
	TPP_TOK_EQUAL_PLUS, /* "=+" */
#define _TPP_CASE_TPP_TOK_EQUAL_PLUS case TPP_TOK_EQUAL_PLUS:
#else /* TPP_HAVE_TOK_EQUAL_PLUS */
#define _TPP_CASE_TPP_TOK_EQUAL_PLUS /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_PLUS */
#if TPP_HAVE_TOK_EQUAL_MINUS
	TPP_TOK_EQUAL_MINUS, /* "=-" */
#define _TPP_CASE_TPP_TOK_EQUAL_MINUS case TPP_TOK_EQUAL_MINUS:
#else /* TPP_HAVE_TOK_EQUAL_MINUS */
#define _TPP_CASE_TPP_TOK_EQUAL_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_MINUS */
#if TPP_HAVE_TOK_EQUAL_SLASH
	TPP_TOK_EQUAL_SLASH, /* "=/" */
#define _TPP_CASE_TPP_TOK_EQUAL_SLASH case TPP_TOK_EQUAL_SLASH:
#else /* TPP_HAVE_TOK_EQUAL_SLASH */
#define _TPP_CASE_TPP_TOK_EQUAL_SLASH /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_SLASH */
#if TPP_HAVE_TOK_EQUAL_SLASH_SLASH
	TPP_TOK_EQUAL_SLASH_SLASH, /* "=//" */
#define _TPP_CASE_TPP_TOK_EQUAL_SLASH_SLASH case TPP_TOK_EQUAL_SLASH_SLASH:
#else /* TPP_HAVE_TOK_EQUAL_SLASH_SLASH */
#define _TPP_CASE_TPP_TOK_EQUAL_SLASH_SLASH /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_SLASH_SLASH */
#if TPP_HAVE_TOK_EQUAL_COLON
	TPP_TOK_EQUAL_COLON, /* "=:" */
#define _TPP_CASE_TPP_TOK_EQUAL_COLON case TPP_TOK_EQUAL_COLON:
#else /* TPP_HAVE_TOK_EQUAL_COLON */
#define _TPP_CASE_TPP_TOK_EQUAL_COLON /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_COLON */
#if TPP_HAVE_TOK_EQUAL_LANGLE
	TPP_TOK_EQUAL_LANGLE, /* "=<" */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE case TPP_TOK_EQUAL_LANGLE:
#else /* TPP_HAVE_TOK_EQUAL_LANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE */
#if TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE
	TPP_TOK_EQUAL_LANGLE_LANGLE, /* "=<<" */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE case TPP_TOK_EQUAL_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE */
#if TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE
	TPP_TOK_EQUAL_LANGLE_LANGLE_LANGLE, /* "=<<<" */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE_LANGLE case TPP_TOK_EQUAL_LANGLE_LANGLE_LANGLE:
#else /* TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE */
#if TPP_HAVE_TOK_EQUAL_EQUAL
	TPP_TOK_EQUAL_EQUAL, /* "==" */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL case TPP_TOK_EQUAL_EQUAL:
#else /* TPP_HAVE_TOK_EQUAL_EQUAL */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL */
#if TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM
	TPP_TOK_EQUAL_EQUAL_EXCLAIM, /* "==!" */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL_EXCLAIM case TPP_TOK_EQUAL_EQUAL_EXCLAIM:
#else /* TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL_EXCLAIM /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM */
#if TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL
	TPP_TOK_EQUAL_EQUAL_EQUAL, /* "===" */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL_EQUAL case TPP_TOK_EQUAL_EQUAL_EQUAL:
#else /* TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL */
#define _TPP_CASE_TPP_TOK_EQUAL_EQUAL_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL */
#if TPP_HAVE_TOK_EQUAL_RANGLE
	TPP_TOK_EQUAL_RANGLE, /* "=>" */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE case TPP_TOK_EQUAL_RANGLE:
#else /* TPP_HAVE_TOK_EQUAL_RANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE */
#if TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE
	TPP_TOK_EQUAL_RANGLE_RANGLE, /* "=>>" */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE case TPP_TOK_EQUAL_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE */
#if TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE
	TPP_TOK_EQUAL_RANGLE_RANGLE_RANGLE, /* "=>>>" */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE_RANGLE case TPP_TOK_EQUAL_RANGLE_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE */
#if TPP_HAVE_TOK_EQUAL_QMARK
	TPP_TOK_EQUAL_QMARK, /* "=?" */
#define _TPP_CASE_TPP_TOK_EQUAL_QMARK case TPP_TOK_EQUAL_QMARK:
#else /* TPP_HAVE_TOK_EQUAL_QMARK */
#define _TPP_CASE_TPP_TOK_EQUAL_QMARK /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_QMARK */
#if TPP_HAVE_TOK_EQUAL_AT
	TPP_TOK_EQUAL_AT, /* "=@" */
#define _TPP_CASE_TPP_TOK_EQUAL_AT case TPP_TOK_EQUAL_AT:
#else /* TPP_HAVE_TOK_EQUAL_AT */
#define _TPP_CASE_TPP_TOK_EQUAL_AT /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_AT */
#if TPP_HAVE_TOK_EQUAL_AT_AT
	TPP_TOK_EQUAL_AT_AT, /* "=@@" */
#define _TPP_CASE_TPP_TOK_EQUAL_AT_AT case TPP_TOK_EQUAL_AT_AT:
#else /* TPP_HAVE_TOK_EQUAL_AT_AT */
#define _TPP_CASE_TPP_TOK_EQUAL_AT_AT /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_AT_AT */
#if TPP_HAVE_TOK_EQUAL_HAT
	TPP_TOK_EQUAL_HAT, /* "=^" */
#define _TPP_CASE_TPP_TOK_EQUAL_HAT case TPP_TOK_EQUAL_HAT:
#else /* TPP_HAVE_TOK_EQUAL_HAT */
#define _TPP_CASE_TPP_TOK_EQUAL_HAT /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_HAT */
#if TPP_HAVE_TOK_EQUAL_PIPE
	TPP_TOK_EQUAL_PIPE, /* "=|" */
#define _TPP_CASE_TPP_TOK_EQUAL_PIPE case TPP_TOK_EQUAL_PIPE:
#else /* TPP_HAVE_TOK_EQUAL_PIPE */
#define _TPP_CASE_TPP_TOK_EQUAL_PIPE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_PIPE */
#if TPP_HAVE_TOK_EQUAL_TILDE
	TPP_TOK_EQUAL_TILDE, /* "=~" */
#define _TPP_CASE_TPP_TOK_EQUAL_TILDE case TPP_TOK_EQUAL_TILDE:
#else /* TPP_HAVE_TOK_EQUAL_TILDE */
#define _TPP_CASE_TPP_TOK_EQUAL_TILDE /* nothing */
#endif /* !TPP_HAVE_TOK_EQUAL_TILDE */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EQUAL_MAX),
	TPP_TOK_MC_STARTSWITH_EQUAL_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_EQUAL_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_EQUAL(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_EQUAL_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_EQUAL_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_EQUAL \
	_TPP_CASE_TPP_TOK_EQUAL_EXCLAIM \
	_TPP_CASE_TPP_TOK_EQUAL_PERCENT \
	_TPP_CASE_TPP_TOK_EQUAL_PERCENT_PERCENT \
	_TPP_CASE_TPP_TOK_EQUAL_AMP \
	_TPP_CASE_TPP_TOK_EQUAL_STAR \
	_TPP_CASE_TPP_TOK_EQUAL_STAR_STAR \
	_TPP_CASE_TPP_TOK_EQUAL_PLUS \
	_TPP_CASE_TPP_TOK_EQUAL_MINUS \
	_TPP_CASE_TPP_TOK_EQUAL_SLASH \
	_TPP_CASE_TPP_TOK_EQUAL_SLASH_SLASH \
	_TPP_CASE_TPP_TOK_EQUAL_COLON \
	_TPP_CASE_TPP_TOK_EQUAL_LANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_LANGLE_LANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_EQUAL \
	_TPP_CASE_TPP_TOK_EQUAL_EQUAL_EXCLAIM \
	_TPP_CASE_TPP_TOK_EQUAL_EQUAL_EQUAL \
	_TPP_CASE_TPP_TOK_EQUAL_RANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_RANGLE_RANGLE_RANGLE \
	_TPP_CASE_TPP_TOK_EQUAL_QMARK \
	_TPP_CASE_TPP_TOK_EQUAL_AT \
	_TPP_CASE_TPP_TOK_EQUAL_AT_AT \
	_TPP_CASE_TPP_TOK_EQUAL_HAT \
	_TPP_CASE_TPP_TOK_EQUAL_PIPE \
	_TPP_CASE_TPP_TOK_EQUAL_TILDE
#else /* TPP_HAVE_TOK_MC_STARTSWITH_EQUAL */
#define TPP_TOK_MC_STARTSWITH_EQUAL(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_EQUAL */

#if TPP_HAVE_TOK_MC_STARTSWITH_RANGLE
	TPP_TOK_MC_STARTSWITH_RANGLE_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_RANGLE_MIN) = TPP_TOK_MC_STARTSWITH_RANGLE_MIN - 1,
#if TPP_HAVE_TOK_RANGLE_MINUS
	TPP_TOK_RANGLE_MINUS, /* ">-" */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS case TPP_TOK_RANGLE_MINUS:
#else /* TPP_HAVE_TOK_RANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS */
#if TPP_HAVE_TOK_RANGLE_MINUS_LANGLE
	TPP_TOK_RANGLE_MINUS_LANGLE, /* ">-<" */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS_LANGLE case TPP_TOK_RANGLE_MINUS_LANGLE:
#else /* TPP_HAVE_TOK_RANGLE_MINUS_LANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS_LANGLE */
#if TPP_HAVE_TOK_RANGLE_MINUS_RANGLE
	TPP_TOK_RANGLE_MINUS_RANGLE, /* ">->" */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS_RANGLE case TPP_TOK_RANGLE_MINUS_RANGLE:
#else /* TPP_HAVE_TOK_RANGLE_MINUS_RANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_MINUS_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_MINUS_RANGLE */
#if TPP_HAVE_TOK_RANGLE_LANGLE
	TPP_TOK_RANGLE_LANGLE, /* "><" */
#define _TPP_CASE_TPP_TOK_RANGLE_LANGLE case TPP_TOK_RANGLE_LANGLE:
#else /* TPP_HAVE_TOK_RANGLE_LANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_LANGLE */
#if TPP_HAVE_TOK_RANGLE_EQUAL
	TPP_TOK_RANGLE_EQUAL, /* ">=" */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL case TPP_TOK_RANGLE_EQUAL:
#else /* TPP_HAVE_TOK_RANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL */
#if TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE
	TPP_TOK_RANGLE_EQUAL_LANGLE, /* ">=<" */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL_LANGLE case TPP_TOK_RANGLE_EQUAL_LANGLE:
#else /* TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL_LANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE */
#if TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE
	TPP_TOK_RANGLE_EQUAL_RANGLE, /* ">=>" */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL_RANGLE case TPP_TOK_RANGLE_EQUAL_RANGLE:
#else /* TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_EQUAL_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE */
#if TPP_HAVE_TOK_RANGLE_RANGLE
	TPP_TOK_RANGLE_RANGLE, /* ">>" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE case TPP_TOK_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE */
#if TPP_HAVE_TOK_RANGLE_RANGLE_MINUS
	TPP_TOK_RANGLE_RANGLE_MINUS, /* ">>-" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_MINUS case TPP_TOK_RANGLE_RANGLE_MINUS:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_MINUS */
#if TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL
	TPP_TOK_RANGLE_RANGLE_EQUAL, /* ">>=" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_EQUAL case TPP_TOK_RANGLE_RANGLE_EQUAL:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL */
#if TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE
	TPP_TOK_RANGLE_RANGLE_RANGLE, /* ">>>" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE case TPP_TOK_RANGLE_RANGLE_RANGLE:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE */
#if TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS
	TPP_TOK_RANGLE_RANGLE_RANGLE_MINUS, /* ">>>-" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_MINUS case TPP_TOK_RANGLE_RANGLE_RANGLE_MINUS:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_MINUS /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS */
#if TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL
	TPP_TOK_RANGLE_RANGLE_RANGLE_EQUAL, /* ">>>=" */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_EQUAL case TPP_TOK_RANGLE_RANGLE_RANGLE_EQUAL:
#else /* TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL */
#define _TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_RANGLE_MAX),
	TPP_TOK_MC_STARTSWITH_RANGLE_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_RANGLE_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_RANGLE(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_RANGLE_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_RANGLE_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_RANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_MINUS \
	_TPP_CASE_TPP_TOK_RANGLE_MINUS_LANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_MINUS_RANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_LANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_EQUAL \
	_TPP_CASE_TPP_TOK_RANGLE_EQUAL_LANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_EQUAL_RANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE_MINUS \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE_EQUAL \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_MINUS \
	_TPP_CASE_TPP_TOK_RANGLE_RANGLE_RANGLE_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_RANGLE */
#define TPP_TOK_MC_STARTSWITH_RANGLE(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_RANGLE /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_RANGLE */

#if TPP_HAVE_TOK_MC_STARTSWITH_QMARK
	TPP_TOK_MC_STARTSWITH_QMARK_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_QMARK_MIN) = TPP_TOK_MC_STARTSWITH_QMARK_MIN - 1,
#if TPP_HAVE_TOK_QMARK_EQUAL
	TPP_TOK_QMARK_EQUAL, /* "?=" */
#define _TPP_CASE_TPP_TOK_QMARK_EQUAL case TPP_TOK_QMARK_EQUAL:
#else /* TPP_HAVE_TOK_QMARK_EQUAL */
#define _TPP_CASE_TPP_TOK_QMARK_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_QMARK_EQUAL */
#if TPP_HAVE_TOK_QMARK_QMARK
	TPP_TOK_QMARK_QMARK, /* "??" */
#define _TPP_CASE_TPP_TOK_QMARK_QMARK case TPP_TOK_QMARK_QMARK:
#else /* TPP_HAVE_TOK_QMARK_QMARK */
#define _TPP_CASE_TPP_TOK_QMARK_QMARK /* nothing */
#endif /* !TPP_HAVE_TOK_QMARK_QMARK */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_QMARK_MAX),
	TPP_TOK_MC_STARTSWITH_QMARK_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_QMARK_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_QMARK(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_QMARK_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_QMARK_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_QMARK \
	_TPP_CASE_TPP_TOK_QMARK_EQUAL \
	_TPP_CASE_TPP_TOK_QMARK_QMARK
#else /* TPP_HAVE_TOK_MC_STARTSWITH_QMARK */
#define TPP_TOK_MC_STARTSWITH_QMARK(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_QMARK /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_QMARK */

#if TPP_HAVE_TOK_MC_STARTSWITH_AT
	TPP_TOK_MC_STARTSWITH_AT_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AT_MIN) = TPP_TOK_MC_STARTSWITH_AT_MIN - 1,
#if TPP_HAVE_TOK_AT_EQUAL
	TPP_TOK_AT_EQUAL, /* "@=" */
#define _TPP_CASE_TPP_TOK_AT_EQUAL case TPP_TOK_AT_EQUAL:
#else /* TPP_HAVE_TOK_AT_EQUAL */
#define _TPP_CASE_TPP_TOK_AT_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_AT_EQUAL */
#if TPP_HAVE_TOK_AT_AT
	TPP_TOK_AT_AT, /* "@@" */
#define _TPP_CASE_TPP_TOK_AT_AT case TPP_TOK_AT_AT:
#else /* TPP_HAVE_TOK_AT_AT */
#define _TPP_CASE_TPP_TOK_AT_AT /* nothing */
#endif /* !TPP_HAVE_TOK_AT_AT */
#if TPP_HAVE_TOK_AT_AT_EQUAL
	TPP_TOK_AT_AT_EQUAL, /* "@@=" */
#define _TPP_CASE_TPP_TOK_AT_AT_EQUAL case TPP_TOK_AT_AT_EQUAL:
#else /* TPP_HAVE_TOK_AT_AT_EQUAL */
#define _TPP_CASE_TPP_TOK_AT_AT_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_AT_AT_EQUAL */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AT_MAX),
	TPP_TOK_MC_STARTSWITH_AT_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_AT_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_AT(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_AT_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_AT_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_AT \
	_TPP_CASE_TPP_TOK_AT_EQUAL \
	_TPP_CASE_TPP_TOK_AT_AT \
	_TPP_CASE_TPP_TOK_AT_AT_EQUAL
#else /* TPP_HAVE_TOK_MC_STARTSWITH_AT */
#define TPP_TOK_MC_STARTSWITH_AT(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_AT /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_AT */

#if TPP_HAVE_TOK_MC_STARTSWITH_HAT
	TPP_TOK_MC_STARTSWITH_HAT_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_HAT_MIN) = TPP_TOK_MC_STARTSWITH_HAT_MIN - 1,
#if TPP_HAVE_TOK_HAT_EQUAL
	TPP_TOK_HAT_EQUAL, /* "^=" */
#define _TPP_CASE_TPP_TOK_HAT_EQUAL case TPP_TOK_HAT_EQUAL:
#else /* TPP_HAVE_TOK_HAT_EQUAL */
#define _TPP_CASE_TPP_TOK_HAT_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_HAT_EQUAL */
#if TPP_HAVE_TOK_HAT_HAT
	TPP_TOK_HAT_HAT, /* "^^" */
#define _TPP_CASE_TPP_TOK_HAT_HAT case TPP_TOK_HAT_HAT:
#else /* TPP_HAVE_TOK_HAT_HAT */
#define _TPP_CASE_TPP_TOK_HAT_HAT /* nothing */
#endif /* !TPP_HAVE_TOK_HAT_HAT */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_HAT_MAX),
	TPP_TOK_MC_STARTSWITH_HAT_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_HAT_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_HAT(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_HAT_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_HAT_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_HAT \
	_TPP_CASE_TPP_TOK_HAT_EQUAL \
	_TPP_CASE_TPP_TOK_HAT_HAT
#else /* TPP_HAVE_TOK_MC_STARTSWITH_HAT */
#define TPP_TOK_MC_STARTSWITH_HAT(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_HAT /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_HAT */

#if TPP_HAVE_TOK_MC_STARTSWITH_PIPE
	TPP_TOK_MC_STARTSWITH_PIPE_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PIPE_MIN) = TPP_TOK_MC_STARTSWITH_PIPE_MIN - 1,
#if TPP_HAVE_TOK_PIPE_EQUAL
	TPP_TOK_PIPE_EQUAL, /* "|=" */
#define _TPP_CASE_TPP_TOK_PIPE_EQUAL case TPP_TOK_PIPE_EQUAL:
#else /* TPP_HAVE_TOK_PIPE_EQUAL */
#define _TPP_CASE_TPP_TOK_PIPE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_PIPE_EQUAL */
#if TPP_HAVE_TOK_PIPE_PIPE
	TPP_TOK_PIPE_PIPE, /* "||" */
#define _TPP_CASE_TPP_TOK_PIPE_PIPE case TPP_TOK_PIPE_PIPE:
#else /* TPP_HAVE_TOK_PIPE_PIPE */
#define _TPP_CASE_TPP_TOK_PIPE_PIPE /* nothing */
#endif /* !TPP_HAVE_TOK_PIPE_PIPE */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PIPE_MAX),
	TPP_TOK_MC_STARTSWITH_PIPE_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_PIPE_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_PIPE(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_PIPE_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_PIPE_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PIPE \
	_TPP_CASE_TPP_TOK_PIPE_EQUAL \
	_TPP_CASE_TPP_TOK_PIPE_PIPE
#else /* TPP_HAVE_TOK_MC_STARTSWITH_PIPE */
#define TPP_TOK_MC_STARTSWITH_PIPE(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_PIPE /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_PIPE */

#if TPP_HAVE_TOK_MC_STARTSWITH_TILDE
	TPP_TOK_MC_STARTSWITH_TILDE_MIN,
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_TILDE_MIN) = TPP_TOK_MC_STARTSWITH_TILDE_MIN - 1,
#if TPP_HAVE_TOK_TILDE_EQUAL
	TPP_TOK_TILDE_EQUAL, /* "~=" */
#define _TPP_CASE_TPP_TOK_TILDE_EQUAL case TPP_TOK_TILDE_EQUAL:
#else /* TPP_HAVE_TOK_TILDE_EQUAL */
#define _TPP_CASE_TPP_TOK_TILDE_EQUAL /* nothing */
#endif /* !TPP_HAVE_TOK_TILDE_EQUAL */
#if TPP_HAVE_TOK_TILDE_TILDE
	TPP_TOK_TILDE_TILDE, /* "~~" */
#define _TPP_CASE_TPP_TOK_TILDE_TILDE case TPP_TOK_TILDE_TILDE:
#else /* TPP_HAVE_TOK_TILDE_TILDE */
#define _TPP_CASE_TPP_TOK_TILDE_TILDE /* nothing */
#endif /* !TPP_HAVE_TOK_TILDE_TILDE */
	TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_TILDE_MAX),
	TPP_TOK_MC_STARTSWITH_TILDE_MAX = TPP_INTERNAL(_TPP_TOK_MC_STARTSWITH_TILDE_MAX) - 1,
#define TPP_TOK_MC_STARTSWITH_TILDE(id)                   \
	((int)(id) >= (int)TPP_TOK_MC_STARTSWITH_TILDE_MIN && \
	 (int)(id) <= (int)TPP_TOK_MC_STARTSWITH_TILDE_MAX)
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_TILDE \
	_TPP_CASE_TPP_TOK_TILDE_EQUAL \
	_TPP_CASE_TPP_TOK_TILDE_TILDE
#else /* TPP_HAVE_TOK_MC_STARTSWITH_TILDE */
#define TPP_TOK_MC_STARTSWITH_TILDE(id)      0
#define TPP_CASE_TPP_TOK_MC_STARTSWITH_TILDE /* nothing */
#endif /* !TPP_HAVE_TOK_MC_STARTSWITH_TILDE */

	TPP_TOK_MULTICHAR_END, /* KEEP THIS THE LAST MULTICHAR TOKEN! */
	TPP_TOK_KEYWORD_BEGIN = TPP_TOK_MULTICHAR_END, /* First builtin keyword */
	TPP_INTERNAL(_TPP_TOK_KEYWORD_BEGIN) = TPP_TOK_KEYWORD_BEGIN - 1,
#define TPP_DEFS
#define TPP_KWD(id, string) id,
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DEFS
#if TPP_HAVE_USER_KEYWORDS
	TPP_TOK_USERKEYWORD_BEGIN, /* First user-defined (non-builtin) keyword */
#else /* TPP_HAVE_USER_KEYWORDS */
	TPP_TOK_USERKEYWORD, /* Some user-defined (non-builtin) keyword */
#endif /* !TPP_HAVE_USER_KEYWORDS */
} tpp_token_id;

/* Helper macros to easily detect certain types of whitespace. */
#define TPP_TOK_ISSPACE_OR_COMMENT(id)              ((id) == TPP_TOK_SPACE || TPP_TOK_ISCOMMENT_NOLINE(id))
#define TPP_TOK_ISLF_OR_COMMENT(id)                 ((id) == TPP_TOK_LF || TPP_TOK_ISCOMMENT_LINE(id))
#define TPP_TOK_ISSPACE_OR_LF_OR_COMMENT(id)        ((id) == TPP_TOK_SPACE || (id) == TPP_TOK_LF || TPP_TOK_ISCOMMENT(id))
#define TPP_TOK_ISLF_OR_COMMENT_OR_EOF(id)          ((id) == TPP_TOK_LF || TPP_TOK_ISCOMMENT_LINE(id) || (id) == TPP_TOK_EOF)
#define TPP_TOK_ISSPACE_OR_LF_OR_COMMENT_OR_EOF(id) ((id) == TPP_TOK_SPACE || (id) == TPP_TOK_LF || TPP_TOK_ISCOMMENT(id) || (id) == TPP_TOK_EOF)


/* Helper macros to determine which (and what kind of) keyword is described by a given `id' */
#define TPP_TOK_ISKEYWORD(id)        ((int)(id) >= (int)TPP_TOK_KEYWORD_BEGIN)
#if TPP_HAVE_USER_KEYWORDS
#define TPP_TOK_ISUSERKEYWORD(id)    ((int)(id) >= (int)TPP_TOK_USERKEYWORD_BEGIN)
#else /* TPP_HAVE_USER_KEYWORDS */
#define TPP_TOK_ISUSERKEYWORD(id)    ((id) == TPP_TOK_USERKEYWORD)
#endif /* !TPP_HAVE_USER_KEYWORDS */
#define TPP_TOK_ISBUILTINKEYWORD(id) (TPP_TOK_ISKEYWORD(id) && !TPP_TOK_ISUSERKEYWORD(id))

#if TPP_HAVE_STRTOKENID
/* Returns the "*" in "TPP_TOK_*" of "id", which must be a (non-keyword and non-error) token ID
 * >> printf("%s\n", tpp_strtokenid(TPP_TOK_EQUAL_EQUAL));  // "EQUAL_EQUAL"
 * >> printf("%s\n", tpp_reprtokenid(TPP_TOK_EQUAL_EQUAL)); // "==" */
TPP_DECL TPP_WUNUSED char const *TPPCALL tpp_strtokenid(tpp_token_id id);
#else /* TPP_HAVE_STRTOKENID */
#define tpp_strtokenid(id) ((char const *)NULL)
#endif /* !TPP_HAVE_STRTOKENID */

#if TPP_HAVE_REPRTOKENID
/* Similar to `tpp_strtokenid()', but returns a (canonical) representation of "id":
 * >> printf("%s\n", tpp_strtokenid(TPP_TOK_EQUAL_EQUAL));  // "EQUAL_EQUAL"
 * >> printf("%s\n", tpp_reprtokenid(TPP_TOK_EQUAL_EQUAL)); // "==" */
TPP_DECL TPP_WUNUSED char const *TPPCALL tpp_reprtokenid(tpp_token_id id);
#else /* TPP_HAVE_STRTOKENID */
#define tpp_reprtokenid(id) ((char const *)NULL)
#endif /* !TPP_HAVE_REPRTOKENID */

struct tpp_keyword;
typedef struct tpp_token {
	tpp_token_id              TPP_INTERNAL(tt_id);    /* Token ID (never set to one of `TPP_TOK_E*'; iow: always positive or TPP_TOK_EOF) */
	struct tpp_keyword const *TPP_INTERNAL(tt_kwd);   /* [1..1][valid_if(tpp_token_haskwd(self))] Keyword identified by `tt_id' */
	tpp_char const           *TPP_INTERNAL(tt_start); /* [1..1][>= tt_chunk->ts_str && <= tt_end] Token start pointer */
	tpp_char const           *TPP_INTERNAL(tt_end);   /* [1..1][>= tt_start && <= tt_chunk->ts_str+tt_chunk->ts_len] Token end pointer */
	TPP_REF tpp_string       *TPP_INTERNAL(tt_chunk); /* [0..1] Text chunk containing "tt_start" and "tt_end" (or "NULL" if not needed) */
} tpp_token;

/* Public API */
#define tpp_token_move(self, from) \
	(void)(*(self) = *(from), tpp_dbg_memset(from, sizeof(tpp_token)))
#define tpp_token_copy(self, from)              \
	(void)(*(self) = *(from),                   \
	       !((self)->TPP_INTERNAL(tt_chunk)) || \
	       (tpp_string_incref((self)->TPP_INTERNAL(tt_chunk)), 1))
#define tpp_token_fini(self)                                       \
	(void)(!((self)->TPP_INTERNAL(tt_chunk)) ||                    \
	       (tpp_string_decref((self)->TPP_INTERNAL(tt_chunk)), 1), \
	       tpp_dbg_memset(self, sizeof(tpp_token)))
#if TPP_HAVE_USER_KEYWORDS
#define tpp_token_haskwd(self)     TPP_TOK_ISKEYWORD(tpp_token_getid(self))
#else /* TPP_HAVE_USER_KEYWORDS */
#define tpp_token_haskwd(self)     TPP_TOK_ISBUILTINKEYWORD(tpp_token_getid(self))
#endif /* !TPP_HAVE_USER_KEYWORDS */
#define tpp_token_getid(self)      ((self)->TPP_INTERNAL(tt_id))
#define tpp_token_getkwd(self)     ((self)->TPP_INTERNAL(tt_kwd)) /* Only valid when "tpp_token_haskwd(self)" */
#define tpp_token_getstart(self)   ((self)->TPP_INTERNAL(tt_start))
#define tpp_token_getend(self)     ((self)->TPP_INTERNAL(tt_end)) /* WARNING: Don't dereference -- pointed-to memory may not have been loaded! */
#define tpp_token_getlen(self)     ((tpp_size)(tpp_token_getend(self) - tpp_token_getstart(self)))
#define tpp_token_getkwdcstr(self) tpp_keyword_getcstr(tpp_token_getkwd(self))

/* Helpers to set the data-fields of "self" */
#define tpp_token_setid(self, id) \
	(void)((self)->TPP_INTERNAL(tt_id) = (id))
#define tpp_token_setkwd(self, kwd) \
	(void)((self)->TPP_INTERNAL(tt_id) = ((self)->TPP_INTERNAL(tt_kwd) = (kwd))->TPP_INTERNAL(tk_id))

/* Set the text-range of the token.
 * WARNING: When used on tpp_lexer_gettoken(), the given "end" pointer
 *          also specifies where the next call to tpp_lexer_yield() will
 *          start scanning for tokens! */
#define tpp_token_setrange(self, start, end)         \
	(void)((self)->TPP_INTERNAL(tt_start) = (start), \
	       (self)->TPP_INTERNAL(tt_end)   = (end))

/* Convenience aliases */
#define tpp_token_iseof(self)                    (tpp_token_getid(self) == TPP_TOK_EOF)
#define tpp_token_isspace_or_comment(self)       TPP_TOK_ISSPACE_OR_COMMENT(tpp_token_getid(self))
#define tpp_token_islf_or_comment(self)          TPP_TOK_ISLF_OR_COMMENT(tpp_token_getid(self))
#define tpp_token_isspace_or_lf_or_comment(self) TPP_TOK_ISSPACE_OR_LF_OR_COMMENT(tpp_token_getid(self))
#define tpp_token_iskeyword(self)                TPP_TOK_ISKEYWORD(tpp_token_getid(self))
#define tpp_token_isuserkeyword(self)            TPP_TOK_ISUSERKEYWORD(tpp_token_getid(self))
#define tpp_token_isbuiltinkeyword(self)         TPP_TOK_ISBUILTINKEYWORD(tpp_token_getid(self))
#define tpp_token_iscomment(self)                TPP_TOK_ISCOMMENT(tpp_token_getid(self))
#define tpp_token_iscomment_line(self)           TPP_TOK_ISCOMMENT_LINE(tpp_token_getid(self))
#define tpp_token_iscomment_noline(self)         TPP_TOK_ISCOMMENT_NOLINE(tpp_token_getid(self))
#define tpp_token_isstring(self)                 TPP_TOK_ISSTRING(tpp_token_getid(self))


#if TPP_HAVE_TOKEN_ENCODESTRING
/* \-encode "data...+=num_bytes" by passing it to "printer"
 * NOTE: Leading/trailing " (or ')-characters are *NOT* printed!
 *
 * @return: >= 0: Sum of positive return values of "printer"
 * @return: < 0:  First negative return value of "printer".
 *                Note that this function never causes errors
 *                on its own, meaning that the meaning of
 *                *all* negative values is entirely up to the
 *                given "printer"! */
TPP_DECL /*TPP_WUNUSED*/ TPP_NONNULL((1)) tpp_ssize TPPCALL
tpp_token_encodestring(tpp_formatprinter printer, void *arg,
                       void const *data, tpp_size num_bytes);
#endif /* TPP_HAVE_TOKEN_ENCODESTRING */

#if TPP_HAVE_TOKEN_REQUIRE_WHITESPACE
/* Check if 2 tokens, when written directly adjacent to each other,
 * *might* (though not necessarily) result in a different set of
 * tokens when re-parsed. */
TPP_DECL TPP_CONSTCALL TPP_WUNUSED bool TPPCALL
tpp_token_require_whitespace(tpp_token_id lhs, tpp_token_id rhs);
#endif /* TPP_HAVE_TOKEN_REQUIRE_WHITESPACE */

/************************************************************************/
/* File: parts/features.h                                               */
/************************************************************************/

#undef TPP_HAVE_FEATURES
#if (TPP_CONF_IS_FEAT(TPP_HAVE_BSE) ||                                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_BSE_WHITESPACE) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIRECTIVES) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_MACROS) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_MAGIC_WHITESPACE) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BUILTIN_MACROS) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EXCLAIM) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BLANK) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIGIT_LINE) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_LINE) ||                               \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE_NEXT) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IMPORT) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IF_ELSE_ENDIF) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DEFINE) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ASSERT) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ERROR) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_WARNING) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IDENT_SCCS) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_PRAGMA) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EMBED) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO__Pragma) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___pragma) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_attribute) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_builtin) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute) ||        \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute) ||   \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_extension) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_feature) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_c_attribute) ||          \
     TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES) ||          \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_identifier) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_deprecated) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_poisoned) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_extension) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_extension) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_warning) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_warning) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include_next) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_embed) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE__) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___LINE__) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIME__) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___DATE__) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COLUMN__) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___BASE_FILE__) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE_NAME__) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_LEVEL__) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_DEPTH__) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COUNTER__) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIMESTAMP__) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_DATE_MACROS) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_TIME_MACROS) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EVAL) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EXEC) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_UNIQUE) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_LOAD_FILE) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNTER) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_RANDOM) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_PACK) ||                   \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SUBSTR) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SIZE) ||                   \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_IDENTIFIER) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS) ||          \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_RECURSION) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TRADITIONAL_MACROS) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_NAMED_VARARGS_IN_MACROS) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_VA_ARGS_IN_MACROS) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_VA_COMMA_IN_MACROS) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_VA_OPT_IN_MACROS) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_VA_NARGS_IN_MACROS) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_GLUE_MACRO_ARGUMENT) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_PUSH_MACRO) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ONCE) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_DEPRECATED) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_EXTENSION) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_WARNING) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ERROR) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_REGION) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_EXEC) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_POISON) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_WARNING) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_ERROR) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TRIGRAPHS) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_DIGRAPHS) ||                               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LF) ||                                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SPACE) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COMMENT) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_COMMENT) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_COMMENT) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_COMMENT) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HTML_COMMENT) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SQL_COMMENT) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_COMMENT) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SHELL_COMMENT) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_COMMENT) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_COMMENT) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SHELL_COMMENT) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SLASH_COMMENT) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_AT_COMMENT) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOLLAR) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_INT) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_HEX) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_FLOAT) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_SMART_FLOAT_TOKENS) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_CHAR) ||                             \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_STRING) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_STRING_LITERAL) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_CHAR_LITERAL) ||                   \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_E) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_S) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BIG) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ALLOW_MULTILINE) ||                 \
     TPP_CONF_IS_FEAT(TPP_HAVE_STRING_AUTO_CONCAT) ||                     \
     TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_XML) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_POUND_POUND) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_EQUAL) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_AMP) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_EQUAL) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR_EQUAL) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_DOT) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_LANGLE_MINUS) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_EQUAL) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_PLUS) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_EQUAL) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_MINUS) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_STAR) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_STAR) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT_DOT) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_COLON) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_RANGLE) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EXCLAIM) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT) ||              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AMP) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR_STAR) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PLUS) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_MINUS) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_COLON) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL) ||                  \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_QMARK) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT_AT) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_HAT) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PIPE) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_TILDE) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_LANGLE) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL) ||                       \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE) ||                      \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL) ||                \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_QMARK) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_EQUAL) ||                           \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT) ||                              \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_EQUAL) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_HAT) ||                            \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_EQUAL) ||                         \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_PIPE) ||                          \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_EQUAL) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_TILDE) ||                        \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_DEFINED) ||                   \
     TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) ||            \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_STRINGS) ||                   \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_FLOATS) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT) ||       \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS) ||    \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR) ||               \
     TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS) ||        \
     TPP_CONF_IS_FEAT(TPP_HAVE_EXTERN_C_FOR_SYSHDR) ||                    \
     TPP_CONF_IS_FEAT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH) ||             \
     TPP_CONF_IS_FEAT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS) ||           \
     TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS) ||        \
     TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION) ||         \
     TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED))
#define TPP_HAVE_FEATURES 1
#else /* ... */
#define TPP_HAVE_FEATURES 0
#endif/* !... */

#if TPP_HAVE_FEATURES
typedef enum tpp_feature_id {
#if TPP_CONF_IS_FEAT(TPP_HAVE_BSE)
	TPP_FEAT_BSE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BSE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BSE_WHITESPACE)
	TPP_FEAT_BSE_WHITESPACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BSE_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI)
	TPP_FEAT_IDENTIFIER_ESCAPE_UNI,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
	TPP_FEAT_IDENTIFIER_ESCAPE_NAMED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY)
	TPP_FEAT_IDENTIFIER_ESCAPE_NAMED_MANY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIRECTIVES)
	TPP_FEAT_CPP_DIRECTIVES,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIRECTIVES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_MACROS)
	TPP_FEAT_CPP_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MAGIC_WHITESPACE)
	TPP_FEAT_MAGIC_WHITESPACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MAGIC_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BUILTIN_MACROS)
	TPP_FEAT_CPP_BUILTIN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BUILTIN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EXCLAIM)
	TPP_FEAT_CPP_EXCLAIM,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BLANK)
	TPP_FEAT_CPP_BLANK,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BLANK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIGIT_LINE)
	TPP_FEAT_CPP_DIGIT_LINE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIGIT_LINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_LINE)
	TPP_FEAT_CPP_LINE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_LINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE)
	TPP_FEAT_CPP_INCLUDE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE_NEXT)
	TPP_FEAT_CPP_INCLUDE_NEXT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE_NEXT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IMPORT)
	TPP_FEAT_CPP_IMPORT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IMPORT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IF_ELSE_ENDIF)
	TPP_FEAT_CPP_IF_ELSE_ENDIF,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IF_ELSE_ENDIF) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DEFINE)
	TPP_FEAT_CPP_DEFINE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DEFINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ASSERT)
	TPP_FEAT_CPP_ASSERT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ASSERT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ERROR)
	TPP_FEAT_CPP_ERROR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_WARNING)
	TPP_FEAT_CPP_WARNING,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IDENT_SCCS)
	TPP_FEAT_CPP_IDENT_SCCS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IDENT_SCCS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_PRAGMA)
	TPP_FEAT_CPP_PRAGMA,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_PRAGMA) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EMBED)
	TPP_FEAT_CPP_EMBED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EMBED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO__Pragma)
	TPP_FEAT_MACRO__Pragma,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO__Pragma) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___pragma)
	TPP_FEAT_MACRO___pragma,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___pragma) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_attribute)
	TPP_FEAT_CLANG_MACRO___has_attribute,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_builtin)
	TPP_FEAT_CLANG_MACRO___has_builtin,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_builtin) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute)
	TPP_FEAT_CLANG_MACRO___has_cpp_attribute,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute)
	TPP_FEAT_CLANG_MACRO___has_declspec_attribute,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_extension)
	TPP_FEAT_CLANG_MACRO___has_extension,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_feature)
	TPP_FEAT_CLANG_MACRO___has_feature,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_feature) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_c_attribute)
	TPP_FEAT_CLANG_MACRO___has_c_attribute,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_c_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES)
	TPP_FEAT_CLANG_EXTENSIONS_ARE_FEATURES,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_identifier)
	TPP_FEAT_MACRO___is_identifier,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_identifier) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_deprecated)
	TPP_FEAT_MACRO___is_deprecated,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_deprecated) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_poisoned)
	TPP_FEAT_MACRO___is_poisoned,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_poisoned) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_extension)
	TPP_FEAT_MACRO___has_extension,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_extension)
	TPP_FEAT_MACRO___has_known_extension,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_warning)
	TPP_FEAT_MACRO___has_warning,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_warning) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_warning)
	TPP_FEAT_MACRO___has_known_warning,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_warning) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include)
	TPP_FEAT_MACRO___has_include,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include_next)
	TPP_FEAT_MACRO___has_include_next,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include_next) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_embed)
	TPP_FEAT_MACRO___has_embed,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_embed) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE__)
	TPP_FEAT_MACRO___FILE__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___LINE__)
	TPP_FEAT_MACRO___LINE__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___LINE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIME__)
	TPP_FEAT_MACRO___TIME__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIME__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___DATE__)
	TPP_FEAT_MACRO___DATE__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___DATE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COLUMN__)
	TPP_FEAT_MACRO___COLUMN__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COLUMN__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___BASE_FILE__)
	TPP_FEAT_MACRO___BASE_FILE__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___BASE_FILE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE_NAME__)
	TPP_FEAT_MACRO___FILE_NAME__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE_NAME__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_LEVEL__)
	TPP_FEAT_MACRO___INCLUDE_LEVEL__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_LEVEL__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_DEPTH__)
	TPP_FEAT_MACRO___INCLUDE_DEPTH__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_DEPTH__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COUNTER__)
	TPP_FEAT_MACRO___COUNTER__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COUNTER__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIMESTAMP__)
	TPP_FEAT_MACRO___TIMESTAMP__,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIMESTAMP__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_DATE_MACROS)
	TPP_FEAT_NUMERIC_DATE_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_DATE_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_TIME_MACROS)
	TPP_FEAT_NUMERIC_TIME_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_TIME_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EVAL)
	TPP_FEAT_MACRO___TPP_EVAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EVAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EXEC)
	TPP_FEAT_MACRO___TPP_EXEC,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EXEC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_UNIQUE)
	TPP_FEAT_MACRO___TPP_UNIQUE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_UNIQUE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_LOAD_FILE)
	TPP_FEAT_MACRO___TPP_LOAD_FILE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_LOAD_FILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNTER)
	TPP_FEAT_MACRO___TPP_COUNTER,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNTER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_RANDOM)
	TPP_FEAT_MACRO___TPP_RANDOM,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_RANDOM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE)
	TPP_FEAT_MACRO___TPP_STR_DECOMPILE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_PACK)
	TPP_FEAT_MACRO___TPP_STR_PACK,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_PACK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SUBSTR)
	TPP_FEAT_MACRO___TPP_STR_SUBSTR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SUBSTR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SIZE)
	TPP_FEAT_MACRO___TPP_STR_SIZE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SIZE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS)
	TPP_FEAT_MACRO___TPP_COUNT_TOKENS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_IDENTIFIER)
	TPP_FEAT_MACRO___TPP_IDENTIFIER,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_IDENTIFIER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
	TPP_FEAT_ALTERNATIVE_MACRO_PARENTHESIS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
	TPP_FEAT_MACRO_ARGUMENT_WHITESPACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_RECURSION)
	TPP_FEAT_MACRO_RECURSION,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TRADITIONAL_MACROS)
	TPP_FEAT_TRADITIONAL_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TRADITIONAL_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NAMED_VARARGS_IN_MACROS)
	TPP_FEAT_NAMED_VARARGS_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NAMED_VARARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_ARGS_IN_MACROS)
	TPP_FEAT_VA_ARGS_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_ARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_COMMA_IN_MACROS)
	TPP_FEAT_VA_COMMA_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_COMMA_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_OPT_IN_MACROS)
	TPP_FEAT_VA_OPT_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_OPT_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_NARGS_IN_MACROS)
	TPP_FEAT_VA_NARGS_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_NARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)
	TPP_FEAT_VA_GLUE_COMMA_IN_MACROS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT)
	TPP_FEAT_STRINGIZE_MACRO_ARGUMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT)
	TPP_FEAT_CHARIZE_MACRO_ARGUMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT)
	TPP_FEAT_DONT_EXPAND_MACRO_ARGUMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_GLUE_MACRO_ARGUMENT)
	TPP_FEAT_GLUE_MACRO_ARGUMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_GLUE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_PUSH_MACRO)
	TPP_FEAT_PRAGMA_PUSH_MACRO,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_PUSH_MACRO) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ONCE)
	TPP_FEAT_PRAGMA_ONCE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ONCE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_DEPRECATED)
	TPP_FEAT_PRAGMA_DEPRECATED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_DEPRECATED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_EXTENSION)
	TPP_FEAT_PRAGMA_EXTENSION,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_EXTENSION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_WARNING)
	TPP_FEAT_PRAGMA_WARNING,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE)
	TPP_FEAT_PRAGMA_MESSAGE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ERROR)
	TPP_FEAT_PRAGMA_ERROR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_REGION)
	TPP_FEAT_PRAGMA_REGION,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_REGION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_EXEC)
	TPP_FEAT_PRAGMA_TPP_EXEC,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_EXEC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
	TPP_FEAT_PRAGMA_TPP_SET_KEYWORD_FLAGS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_POISON)
	TPP_FEAT_PRAGMA_GCC_POISON,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_POISON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_WARNING)
	TPP_FEAT_PRAGMA_GCC_WARNING,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_ERROR)
	TPP_FEAT_PRAGMA_GCC_ERROR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER)
	TPP_FEAT_PRAGMA_GCC_SYSTEM_HEADER,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
	TPP_FEAT_PRAGMA_GCC_DIAGNOSTIC,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
	TPP_FEAT_PRAGMA_GCC_DEPENDENCY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TRIGRAPHS)
	TPP_FEAT_TRIGRAPHS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TRIGRAPHS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DIGRAPHS)
	TPP_FEAT_DIGRAPHS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DIGRAPHS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LF)
	TPP_FEAT_TOK_LF,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LF) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SPACE)
	TPP_FEAT_TOK_SPACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COMMENT)
	TPP_FEAT_TOK_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_COMMENT)
	TPP_FEAT_TOK_CXX_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_COMMENT)
	TPP_FEAT_TOK_C_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_COMMENT)
	TPP_FEAT_TOK_PASCAL_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT)
	TPP_FEAT_TOK_PASCAL_BRACE_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HTML_COMMENT)
	TPP_FEAT_TOK_HTML_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HTML_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SQL_COMMENT)
	TPP_FEAT_TOK_SQL_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SQL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_COMMENT)
	TPP_FEAT_TOK_AT_AT_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SHELL_COMMENT)
	TPP_FEAT_TOK_SHELL_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SHELL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_COMMENT)
	TPP_FEAT_TOK_SLASH_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_COMMENT)
	TPP_FEAT_TOK_AT_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SHELL_COMMENT)
	TPP_FEAT_TOK_SOL_SHELL_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SHELL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SLASH_COMMENT)
	TPP_FEAT_TOK_SOL_SLASH_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SLASH_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_AT_COMMENT)
	TPP_FEAT_TOK_SOL_AT_COMMENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOLLAR)
	TPP_FEAT_TOK_DOLLAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOLLAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE)
	TPP_FEAT_THOUSANDS_SEPARATOR_UNDERSCORE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK)
	TPP_FEAT_THOUSANDS_SEPARATOR_SINGLETICK,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_INT)
	TPP_FEAT_TOK_C_INT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_INT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_HEX)
	TPP_FEAT_TOK_PASCAL_HEX,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_HEX) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_FLOAT)
	TPP_FEAT_TOK_C_FLOAT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_FLOAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_SMART_FLOAT_TOKENS)
	TPP_FEAT_SMART_FLOAT_TOKENS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_SMART_FLOAT_TOKENS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_CHAR)
	TPP_FEAT_TOK_C_CHAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_CHAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_STRING)
	TPP_FEAT_TOK_C_STRING,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_STRING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL)
	TPP_FEAT_TOK_CXX_RAW_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL)
	TPP_FEAT_TOK_CXX_WIDE_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL)
	TPP_FEAT_TOK_CXX_UTF8_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL)
	TPP_FEAT_TOK_CXX_UTF16_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL)
	TPP_FEAT_TOK_CXX_UTF32_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL)
	TPP_FEAT_TOK_CXX_RAW_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL)
	TPP_FEAT_TOK_CXX_WIDE_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL)
	TPP_FEAT_TOK_CXX_UTF8_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL)
	TPP_FEAT_TOK_CXX_UTF16_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL)
	TPP_FEAT_TOK_CXX_UTF32_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_STRING_LITERAL)
	TPP_FEAT_TOK_RAW_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_CHAR_LITERAL)
	TPP_FEAT_TOK_RAW_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
	TPP_FEAT_TOK_BLOCK_STRING_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
	TPP_FEAT_TOK_BLOCK_CHAR_LITERAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_E)
	TPP_FEAT_STRING_ESCAPE_E,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_E) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_S)
	TPP_FEAT_STRING_ESCAPE_S,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_S) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT)
	TPP_FEAT_STRING_ESCAPE_OCT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE)
	TPP_FEAT_STRING_ESCAPE_OCT_BRACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY)
	TPP_FEAT_STRING_ESCAPE_OCT_BRACE_MANY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX)
	TPP_FEAT_STRING_ESCAPE_HEX,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BIG)
	TPP_FEAT_STRING_ESCAPE_HEX_BIG,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BIG) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE)
	TPP_FEAT_STRING_ESCAPE_HEX_BRACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY)
	TPP_FEAT_STRING_ESCAPE_HEX_BRACE_MANY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI)
	TPP_FEAT_STRING_ESCAPE_UNI,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE)
	TPP_FEAT_STRING_ESCAPE_UNI_BRACE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY)
	TPP_FEAT_STRING_ESCAPE_UNI_BRACE_MANY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED)
	TPP_FEAT_STRING_ESCAPE_NAMED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY)
	TPP_FEAT_STRING_ESCAPE_NAMED_MANY,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ALLOW_MULTILINE)
	TPP_FEAT_STRING_ALLOW_MULTILINE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ALLOW_MULTILINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_AUTO_CONCAT)
	TPP_FEAT_STRING_AUTO_CONCAT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_AUTO_CONCAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES)
	TPP_FEAT_ESCAPE_NAMED_UNICODE_NAMES,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD)
	TPP_FEAT_ESCAPE_NAMED_UNICODE_ORD,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_XML)
	TPP_FEAT_ESCAPE_NAMED_XML,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_XML) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM)
	TPP_FEAT_TOK_EXCLAIM_EXCLAIM,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL)
	TPP_FEAT_TOK_EXCLAIM_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL)
	TPP_FEAT_TOK_EXCLAIM_EQUAL_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_POUND_POUND)
	TPP_FEAT_TOK_POUND_POUND,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_POUND_POUND) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT)
	TPP_FEAT_TOK_PERCENT_PERCENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL)
	TPP_FEAT_TOK_PERCENT_PERCENT_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_EQUAL)
	TPP_FEAT_TOK_PERCENT_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_AMP)
	TPP_FEAT_TOK_AMP_AMP,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_AMP) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_EQUAL)
	TPP_FEAT_TOK_AMP_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR)
	TPP_FEAT_TOK_STAR_STAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR_EQUAL)
	TPP_FEAT_TOK_STAR_STAR_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_DOT)
	TPP_FEAT_TOK_STAR_DOT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_LANGLE_MINUS)
	TPP_FEAT_TOK_STAR_LANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_EQUAL)
	TPP_FEAT_TOK_STAR_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_PLUS)
	TPP_FEAT_TOK_PLUS_PLUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_PLUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_EQUAL)
	TPP_FEAT_TOK_PLUS_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_MINUS)
	TPP_FEAT_TOK_MINUS_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE)
	TPP_FEAT_TOK_MINUS_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE)
	TPP_FEAT_TOK_MINUS_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE)
	TPP_FEAT_TOK_MINUS_LANGLE_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_EQUAL)
	TPP_FEAT_TOK_MINUS_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE)
	TPP_FEAT_TOK_MINUS_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_STAR)
	TPP_FEAT_TOK_MINUS_RANGLE_STAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE)
	TPP_FEAT_TOK_MINUS_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE)
	TPP_FEAT_TOK_MINUS_RANGLE_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_STAR)
	TPP_FEAT_TOK_DOT_STAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT)
	TPP_FEAT_TOK_DOT_DOT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT_DOT)
	TPP_FEAT_TOK_DOT_DOT_DOT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH)
	TPP_FEAT_TOK_SLASH_SLASH,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL)
	TPP_FEAT_TOK_SLASH_SLASH_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_EQUAL)
	TPP_FEAT_TOK_SLASH_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_COLON)
	TPP_FEAT_TOK_COLON_COLON,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_COLON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_EQUAL)
	TPP_FEAT_TOK_COLON_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS)
	TPP_FEAT_TOK_LANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE)
	TPP_FEAT_TOK_LANGLE_MINUS_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE)
	TPP_FEAT_TOK_LANGLE_MINUS_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE)
	TPP_FEAT_TOK_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS)
	TPP_FEAT_TOK_LANGLE_LANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE)
	TPP_FEAT_TOK_LANGLE_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS)
	TPP_FEAT_TOK_LANGLE_LANGLE_LANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
	TPP_FEAT_TOK_LANGLE_LANGLE_LANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL)
	TPP_FEAT_TOK_LANGLE_LANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL)
	TPP_FEAT_TOK_LANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE)
	TPP_FEAT_TOK_LANGLE_EQUAL_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE)
	TPP_FEAT_TOK_LANGLE_EQUAL_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_RANGLE)
	TPP_FEAT_TOK_LANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EXCLAIM)
	TPP_FEAT_TOK_EQUAL_EXCLAIM,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT)
	TPP_FEAT_TOK_EQUAL_PERCENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT)
	TPP_FEAT_TOK_EQUAL_PERCENT_PERCENT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AMP)
	TPP_FEAT_TOK_EQUAL_AMP,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AMP) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR)
	TPP_FEAT_TOK_EQUAL_STAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR_STAR)
	TPP_FEAT_TOK_EQUAL_STAR_STAR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PLUS)
	TPP_FEAT_TOK_EQUAL_PLUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PLUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_MINUS)
	TPP_FEAT_TOK_EQUAL_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH)
	TPP_FEAT_TOK_EQUAL_SLASH,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH)
	TPP_FEAT_TOK_EQUAL_SLASH_SLASH,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_COLON)
	TPP_FEAT_TOK_EQUAL_COLON,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_COLON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE)
	TPP_FEAT_TOK_EQUAL_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE)
	TPP_FEAT_TOK_EQUAL_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
	TPP_FEAT_TOK_EQUAL_LANGLE_LANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL)
	TPP_FEAT_TOK_EQUAL_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM)
	TPP_FEAT_TOK_EQUAL_EQUAL_EXCLAIM,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL)
	TPP_FEAT_TOK_EQUAL_EQUAL_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE)
	TPP_FEAT_TOK_EQUAL_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE)
	TPP_FEAT_TOK_EQUAL_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
	TPP_FEAT_TOK_EQUAL_RANGLE_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_QMARK)
	TPP_FEAT_TOK_EQUAL_QMARK,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_QMARK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT)
	TPP_FEAT_TOK_EQUAL_AT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT_AT)
	TPP_FEAT_TOK_EQUAL_AT_AT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_HAT)
	TPP_FEAT_TOK_EQUAL_HAT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_HAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PIPE)
	TPP_FEAT_TOK_EQUAL_PIPE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PIPE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_TILDE)
	TPP_FEAT_TOK_EQUAL_TILDE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_TILDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS)
	TPP_FEAT_TOK_RANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE)
	TPP_FEAT_TOK_RANGLE_MINUS_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE)
	TPP_FEAT_TOK_RANGLE_MINUS_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_LANGLE)
	TPP_FEAT_TOK_RANGLE_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL)
	TPP_FEAT_TOK_RANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE)
	TPP_FEAT_TOK_RANGLE_EQUAL_LANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE)
	TPP_FEAT_TOK_RANGLE_EQUAL_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE)
	TPP_FEAT_TOK_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS)
	TPP_FEAT_TOK_RANGLE_RANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL)
	TPP_FEAT_TOK_RANGLE_RANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE)
	TPP_FEAT_TOK_RANGLE_RANGLE_RANGLE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS)
	TPP_FEAT_TOK_RANGLE_RANGLE_RANGLE_MINUS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
	TPP_FEAT_TOK_RANGLE_RANGLE_RANGLE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_EQUAL)
	TPP_FEAT_TOK_QMARK_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_QMARK)
	TPP_FEAT_TOK_QMARK_QMARK,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_QMARK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_EQUAL)
	TPP_FEAT_TOK_AT_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT)
	TPP_FEAT_TOK_AT_AT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_EQUAL)
	TPP_FEAT_TOK_AT_AT_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_EQUAL)
	TPP_FEAT_TOK_HAT_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_HAT)
	TPP_FEAT_TOK_HAT_HAT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_HAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_EQUAL)
	TPP_FEAT_TOK_PIPE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_PIPE)
	TPP_FEAT_TOK_PIPE_PIPE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_PIPE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_EQUAL)
	TPP_FEAT_TOK_TILDE_EQUAL,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_TILDE)
	TPP_FEAT_TOK_TILDE_TILDE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_TILDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_DEFINED)
	TPP_FEAT_BUILTIN_EXPR_DEFINED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_DEFINED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
	TPP_FEAT_DONT_EXPAND_DEFINED_IN_EXPR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_STRINGS)
	TPP_FEAT_BUILTIN_EXPR_STRINGS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_STRINGS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_FLOATS)
	TPP_FEAT_BUILTIN_EXPR_FLOATS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_FLOATS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
	TPP_FEAT_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
	TPP_FEAT_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR)
	TPP_FEAT_BUILTIN_EXPR_LOGICAL_XOR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
	TPP_FEAT_BUILTIN_EXPR_CHARACTER_LITERALS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_EXTERN_C_FOR_SYSHDR)
	TPP_FEAT_EXTERN_C_FOR_SYSHDR,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_EXTERN_C_FOR_SYSHDR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)
	TPP_FEAT_SEARCH_SYSTEM_INCLUDE_PATH,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE)
	TPP_FEAT_INCLUDE_RELATIVE_TO_EVERY_FILE,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS)
	TPP_FEAT_LEXER_DECODEINT_HEX_LITERALS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS)
	TPP_FEAT_LEXER_DECODEINT_BINARY_LITERALS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS)
	TPP_FEAT_LEXER_DECODEINT_OCTAL_LITERALS,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)
	TPP_FEAT_PRAGMA_MESSAGE_PRINTS_LOCATION,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
	TPP_FEAT_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED,
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED) */
	TPP_FEAT_COUNT
} tpp_feature_id;

typedef union tpp_features {
	struct {
#if TPP_CONF_IS_FEAT(TPP_HAVE_BSE)
		unsigned int TPP_INTERNAL(tff_BSE): 1;
#define _tpp_lexer_has_BSE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BSE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BSE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BSE_WHITESPACE)
		unsigned int TPP_INTERNAL(tff_BSE_WHITESPACE): 1;
#define _tpp_lexer_has_BSE_WHITESPACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BSE_WHITESPACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BSE_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI)
		unsigned int TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_UNI): 1;
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_UNI(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_UNI)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
		unsigned int TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_NAMED): 1;
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY)
		unsigned int TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_NAMED_MANY): 1;
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED_MANY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_IDENTIFIER_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIRECTIVES)
		unsigned int TPP_INTERNAL(tff_CPP_DIRECTIVES): 1;
#define _tpp_lexer_has_CPP_DIRECTIVES(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_DIRECTIVES)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIRECTIVES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_MACROS)
		unsigned int TPP_INTERNAL(tff_CPP_MACROS): 1;
#define _tpp_lexer_has_CPP_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MAGIC_WHITESPACE)
		unsigned int TPP_INTERNAL(tff_MAGIC_WHITESPACE): 1;
#define _tpp_lexer_has_MAGIC_WHITESPACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MAGIC_WHITESPACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MAGIC_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BUILTIN_MACROS)
		unsigned int TPP_INTERNAL(tff_CPP_BUILTIN_MACROS): 1;
#define _tpp_lexer_has_CPP_BUILTIN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_BUILTIN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BUILTIN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EXCLAIM)
		unsigned int TPP_INTERNAL(tff_CPP_EXCLAIM): 1;
#define _tpp_lexer_has_CPP_EXCLAIM(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_EXCLAIM)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BLANK)
		unsigned int TPP_INTERNAL(tff_CPP_BLANK): 1;
#define _tpp_lexer_has_CPP_BLANK(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_BLANK)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_BLANK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIGIT_LINE)
		unsigned int TPP_INTERNAL(tff_CPP_DIGIT_LINE): 1;
#define _tpp_lexer_has_CPP_DIGIT_LINE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_DIGIT_LINE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DIGIT_LINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_LINE)
		unsigned int TPP_INTERNAL(tff_CPP_LINE): 1;
#define _tpp_lexer_has_CPP_LINE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_LINE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_LINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE)
		unsigned int TPP_INTERNAL(tff_CPP_INCLUDE): 1;
#define _tpp_lexer_has_CPP_INCLUDE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_INCLUDE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE_NEXT)
		unsigned int TPP_INTERNAL(tff_CPP_INCLUDE_NEXT): 1;
#define _tpp_lexer_has_CPP_INCLUDE_NEXT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_INCLUDE_NEXT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_INCLUDE_NEXT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IMPORT)
		unsigned int TPP_INTERNAL(tff_CPP_IMPORT): 1;
#define _tpp_lexer_has_CPP_IMPORT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_IMPORT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IMPORT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IF_ELSE_ENDIF)
		unsigned int TPP_INTERNAL(tff_CPP_IF_ELSE_ENDIF): 1;
#define _tpp_lexer_has_CPP_IF_ELSE_ENDIF(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_IF_ELSE_ENDIF)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IF_ELSE_ENDIF) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DEFINE)
		unsigned int TPP_INTERNAL(tff_CPP_DEFINE): 1;
#define _tpp_lexer_has_CPP_DEFINE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_DEFINE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_DEFINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ASSERT)
		unsigned int TPP_INTERNAL(tff_CPP_ASSERT): 1;
#define _tpp_lexer_has_CPP_ASSERT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_ASSERT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ASSERT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ERROR)
		unsigned int TPP_INTERNAL(tff_CPP_ERROR): 1;
#define _tpp_lexer_has_CPP_ERROR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_ERROR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_WARNING)
		unsigned int TPP_INTERNAL(tff_CPP_WARNING): 1;
#define _tpp_lexer_has_CPP_WARNING(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_WARNING)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IDENT_SCCS)
		unsigned int TPP_INTERNAL(tff_CPP_IDENT_SCCS): 1;
#define _tpp_lexer_has_CPP_IDENT_SCCS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_IDENT_SCCS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_IDENT_SCCS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_PRAGMA)
		unsigned int TPP_INTERNAL(tff_CPP_PRAGMA): 1;
#define _tpp_lexer_has_CPP_PRAGMA(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_PRAGMA)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_PRAGMA) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EMBED)
		unsigned int TPP_INTERNAL(tff_CPP_EMBED): 1;
#define _tpp_lexer_has_CPP_EMBED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CPP_EMBED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CPP_EMBED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO__Pragma)
		unsigned int TPP_INTERNAL(tff_MACRO__Pragma): 1;
#define _tpp_lexer_has_MACRO__Pragma(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO__Pragma)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO__Pragma) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___pragma)
		unsigned int TPP_INTERNAL(tff_MACRO___pragma): 1;
#define _tpp_lexer_has_MACRO___pragma(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___pragma)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___pragma) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_attribute)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_attribute): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_attribute(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_attribute)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_builtin)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_builtin): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_builtin(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_builtin)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_builtin) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_cpp_attribute): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_cpp_attribute(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_cpp_attribute)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_declspec_attribute): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_declspec_attribute(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_declspec_attribute)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_extension)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_extension): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_extension(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_extension)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_feature)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_feature): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_feature(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_feature)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_feature) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_c_attribute)
		unsigned int TPP_INTERNAL(tff_CLANG_MACRO___has_c_attribute): 1;
#define _tpp_lexer_has_CLANG_MACRO___has_c_attribute(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_MACRO___has_c_attribute)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_MACRO___has_c_attribute) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES)
		unsigned int TPP_INTERNAL(tff_CLANG_EXTENSIONS_ARE_FEATURES): 1;
#define _tpp_lexer_has_CLANG_EXTENSIONS_ARE_FEATURES(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CLANG_EXTENSIONS_ARE_FEATURES)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_identifier)
		unsigned int TPP_INTERNAL(tff_MACRO___is_identifier): 1;
#define _tpp_lexer_has_MACRO___is_identifier(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___is_identifier)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_identifier) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_deprecated)
		unsigned int TPP_INTERNAL(tff_MACRO___is_deprecated): 1;
#define _tpp_lexer_has_MACRO___is_deprecated(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___is_deprecated)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_deprecated) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_poisoned)
		unsigned int TPP_INTERNAL(tff_MACRO___is_poisoned): 1;
#define _tpp_lexer_has_MACRO___is_poisoned(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___is_poisoned)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___is_poisoned) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_extension)
		unsigned int TPP_INTERNAL(tff_MACRO___has_extension): 1;
#define _tpp_lexer_has_MACRO___has_extension(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_extension)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_extension)
		unsigned int TPP_INTERNAL(tff_MACRO___has_known_extension): 1;
#define _tpp_lexer_has_MACRO___has_known_extension(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_known_extension)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_extension) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_warning)
		unsigned int TPP_INTERNAL(tff_MACRO___has_warning): 1;
#define _tpp_lexer_has_MACRO___has_warning(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_warning)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_warning) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_warning)
		unsigned int TPP_INTERNAL(tff_MACRO___has_known_warning): 1;
#define _tpp_lexer_has_MACRO___has_known_warning(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_known_warning)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_known_warning) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include)
		unsigned int TPP_INTERNAL(tff_MACRO___has_include): 1;
#define _tpp_lexer_has_MACRO___has_include(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_include)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include_next)
		unsigned int TPP_INTERNAL(tff_MACRO___has_include_next): 1;
#define _tpp_lexer_has_MACRO___has_include_next(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_include_next)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_include_next) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_embed)
		unsigned int TPP_INTERNAL(tff_MACRO___has_embed): 1;
#define _tpp_lexer_has_MACRO___has_embed(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___has_embed)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___has_embed) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE__)
		unsigned int TPP_INTERNAL(tff_MACRO___FILE__): 1;
#define _tpp_lexer_has_MACRO___FILE__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___FILE__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___LINE__)
		unsigned int TPP_INTERNAL(tff_MACRO___LINE__): 1;
#define _tpp_lexer_has_MACRO___LINE__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___LINE__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___LINE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIME__)
		unsigned int TPP_INTERNAL(tff_MACRO___TIME__): 1;
#define _tpp_lexer_has_MACRO___TIME__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TIME__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIME__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___DATE__)
		unsigned int TPP_INTERNAL(tff_MACRO___DATE__): 1;
#define _tpp_lexer_has_MACRO___DATE__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___DATE__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___DATE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COLUMN__)
		unsigned int TPP_INTERNAL(tff_MACRO___COLUMN__): 1;
#define _tpp_lexer_has_MACRO___COLUMN__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___COLUMN__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COLUMN__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___BASE_FILE__)
		unsigned int TPP_INTERNAL(tff_MACRO___BASE_FILE__): 1;
#define _tpp_lexer_has_MACRO___BASE_FILE__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___BASE_FILE__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___BASE_FILE__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE_NAME__)
		unsigned int TPP_INTERNAL(tff_MACRO___FILE_NAME__): 1;
#define _tpp_lexer_has_MACRO___FILE_NAME__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___FILE_NAME__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___FILE_NAME__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_LEVEL__)
		unsigned int TPP_INTERNAL(tff_MACRO___INCLUDE_LEVEL__): 1;
#define _tpp_lexer_has_MACRO___INCLUDE_LEVEL__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___INCLUDE_LEVEL__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_LEVEL__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_DEPTH__)
		unsigned int TPP_INTERNAL(tff_MACRO___INCLUDE_DEPTH__): 1;
#define _tpp_lexer_has_MACRO___INCLUDE_DEPTH__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___INCLUDE_DEPTH__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___INCLUDE_DEPTH__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COUNTER__)
		unsigned int TPP_INTERNAL(tff_MACRO___COUNTER__): 1;
#define _tpp_lexer_has_MACRO___COUNTER__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___COUNTER__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___COUNTER__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIMESTAMP__)
		unsigned int TPP_INTERNAL(tff_MACRO___TIMESTAMP__): 1;
#define _tpp_lexer_has_MACRO___TIMESTAMP__(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TIMESTAMP__)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TIMESTAMP__) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_DATE_MACROS)
		unsigned int TPP_INTERNAL(tff_NUMERIC_DATE_MACROS): 1;
#define _tpp_lexer_has_NUMERIC_DATE_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_NUMERIC_DATE_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_DATE_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_TIME_MACROS)
		unsigned int TPP_INTERNAL(tff_NUMERIC_TIME_MACROS): 1;
#define _tpp_lexer_has_NUMERIC_TIME_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_NUMERIC_TIME_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NUMERIC_TIME_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EVAL)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_EVAL): 1;
#define _tpp_lexer_has_MACRO___TPP_EVAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_EVAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EVAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EXEC)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_EXEC): 1;
#define _tpp_lexer_has_MACRO___TPP_EXEC(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_EXEC)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_EXEC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_UNIQUE)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_UNIQUE): 1;
#define _tpp_lexer_has_MACRO___TPP_UNIQUE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_UNIQUE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_UNIQUE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_LOAD_FILE)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_LOAD_FILE): 1;
#define _tpp_lexer_has_MACRO___TPP_LOAD_FILE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_LOAD_FILE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_LOAD_FILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNTER)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_COUNTER): 1;
#define _tpp_lexer_has_MACRO___TPP_COUNTER(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_COUNTER)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNTER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_RANDOM)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_RANDOM): 1;
#define _tpp_lexer_has_MACRO___TPP_RANDOM(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_RANDOM)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_RANDOM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_STR_DECOMPILE): 1;
#define _tpp_lexer_has_MACRO___TPP_STR_DECOMPILE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_STR_DECOMPILE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_PACK)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_STR_PACK): 1;
#define _tpp_lexer_has_MACRO___TPP_STR_PACK(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_STR_PACK)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_PACK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SUBSTR)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_STR_SUBSTR): 1;
#define _tpp_lexer_has_MACRO___TPP_STR_SUBSTR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_STR_SUBSTR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SUBSTR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SIZE)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_STR_SIZE): 1;
#define _tpp_lexer_has_MACRO___TPP_STR_SIZE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_STR_SIZE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_STR_SIZE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_COUNT_TOKENS): 1;
#define _tpp_lexer_has_MACRO___TPP_COUNT_TOKENS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_COUNT_TOKENS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_IDENTIFIER)
		unsigned int TPP_INTERNAL(tff_MACRO___TPP_IDENTIFIER): 1;
#define _tpp_lexer_has_MACRO___TPP_IDENTIFIER(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO___TPP_IDENTIFIER)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO___TPP_IDENTIFIER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
		unsigned int TPP_INTERNAL(tff_ALTERNATIVE_MACRO_PARENTHESIS): 1;
#define _tpp_lexer_has_ALTERNATIVE_MACRO_PARENTHESIS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_ALTERNATIVE_MACRO_PARENTHESIS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
		unsigned int TPP_INTERNAL(tff_MACRO_ARGUMENT_WHITESPACE): 1;
#define _tpp_lexer_has_MACRO_ARGUMENT_WHITESPACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO_ARGUMENT_WHITESPACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_RECURSION)
		unsigned int TPP_INTERNAL(tff_MACRO_RECURSION): 1;
#define _tpp_lexer_has_MACRO_RECURSION(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_MACRO_RECURSION)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TRADITIONAL_MACROS)
		unsigned int TPP_INTERNAL(tff_TRADITIONAL_MACROS): 1;
#define _tpp_lexer_has_TRADITIONAL_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TRADITIONAL_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TRADITIONAL_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_NAMED_VARARGS_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_NAMED_VARARGS_IN_MACROS): 1;
#define _tpp_lexer_has_NAMED_VARARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_NAMED_VARARGS_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_NAMED_VARARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_ARGS_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_VA_ARGS_IN_MACROS): 1;
#define _tpp_lexer_has_VA_ARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_VA_ARGS_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_ARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_COMMA_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_VA_COMMA_IN_MACROS): 1;
#define _tpp_lexer_has_VA_COMMA_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_VA_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_COMMA_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_OPT_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_VA_OPT_IN_MACROS): 1;
#define _tpp_lexer_has_VA_OPT_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_VA_OPT_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_OPT_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_NARGS_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_VA_NARGS_IN_MACROS): 1;
#define _tpp_lexer_has_VA_NARGS_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_VA_NARGS_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_NARGS_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)
		unsigned int TPP_INTERNAL(tff_VA_GLUE_COMMA_IN_MACROS): 1;
#define _tpp_lexer_has_VA_GLUE_COMMA_IN_MACROS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_VA_GLUE_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT)
		unsigned int TPP_INTERNAL(tff_STRINGIZE_MACRO_ARGUMENT): 1;
#define _tpp_lexer_has_STRINGIZE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRINGIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT)
		unsigned int TPP_INTERNAL(tff_CHARIZE_MACRO_ARGUMENT): 1;
#define _tpp_lexer_has_CHARIZE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_CHARIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT)
		unsigned int TPP_INTERNAL(tff_DONT_EXPAND_MACRO_ARGUMENT): 1;
#define _tpp_lexer_has_DONT_EXPAND_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_DONT_EXPAND_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_GLUE_MACRO_ARGUMENT)
		unsigned int TPP_INTERNAL(tff_GLUE_MACRO_ARGUMENT): 1;
#define _tpp_lexer_has_GLUE_MACRO_ARGUMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_GLUE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_GLUE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_PUSH_MACRO)
		unsigned int TPP_INTERNAL(tff_PRAGMA_PUSH_MACRO): 1;
#define _tpp_lexer_has_PRAGMA_PUSH_MACRO(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_PUSH_MACRO)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_PUSH_MACRO) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ONCE)
		unsigned int TPP_INTERNAL(tff_PRAGMA_ONCE): 1;
#define _tpp_lexer_has_PRAGMA_ONCE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_ONCE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ONCE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_DEPRECATED)
		unsigned int TPP_INTERNAL(tff_PRAGMA_DEPRECATED): 1;
#define _tpp_lexer_has_PRAGMA_DEPRECATED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_DEPRECATED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_DEPRECATED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_EXTENSION)
		unsigned int TPP_INTERNAL(tff_PRAGMA_EXTENSION): 1;
#define _tpp_lexer_has_PRAGMA_EXTENSION(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_EXTENSION)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_EXTENSION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_WARNING)
		unsigned int TPP_INTERNAL(tff_PRAGMA_WARNING): 1;
#define _tpp_lexer_has_PRAGMA_WARNING(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_WARNING)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE)
		unsigned int TPP_INTERNAL(tff_PRAGMA_MESSAGE): 1;
#define _tpp_lexer_has_PRAGMA_MESSAGE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_MESSAGE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ERROR)
		unsigned int TPP_INTERNAL(tff_PRAGMA_ERROR): 1;
#define _tpp_lexer_has_PRAGMA_ERROR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_ERROR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_REGION)
		unsigned int TPP_INTERNAL(tff_PRAGMA_REGION): 1;
#define _tpp_lexer_has_PRAGMA_REGION(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_REGION)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_REGION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_EXEC)
		unsigned int TPP_INTERNAL(tff_PRAGMA_TPP_EXEC): 1;
#define _tpp_lexer_has_PRAGMA_TPP_EXEC(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_TPP_EXEC)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_EXEC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
		unsigned int TPP_INTERNAL(tff_PRAGMA_TPP_SET_KEYWORD_FLAGS): 1;
#define _tpp_lexer_has_PRAGMA_TPP_SET_KEYWORD_FLAGS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_POISON)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_POISON): 1;
#define _tpp_lexer_has_PRAGMA_GCC_POISON(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_POISON)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_POISON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_WARNING)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_WARNING): 1;
#define _tpp_lexer_has_PRAGMA_GCC_WARNING(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_WARNING)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_WARNING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_ERROR)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_ERROR): 1;
#define _tpp_lexer_has_PRAGMA_GCC_ERROR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_ERROR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_ERROR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_SYSTEM_HEADER): 1;
#define _tpp_lexer_has_PRAGMA_GCC_SYSTEM_HEADER(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_SYSTEM_HEADER)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_DIAGNOSTIC): 1;
#define _tpp_lexer_has_PRAGMA_GCC_DIAGNOSTIC(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_DIAGNOSTIC)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
		unsigned int TPP_INTERNAL(tff_PRAGMA_GCC_DEPENDENCY): 1;
#define _tpp_lexer_has_PRAGMA_GCC_DEPENDENCY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_GCC_DEPENDENCY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TRIGRAPHS)
		unsigned int TPP_INTERNAL(tff_TRIGRAPHS): 1;
#define _tpp_lexer_has_TRIGRAPHS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TRIGRAPHS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TRIGRAPHS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DIGRAPHS)
		unsigned int TPP_INTERNAL(tff_DIGRAPHS): 1;
#define _tpp_lexer_has_DIGRAPHS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_DIGRAPHS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DIGRAPHS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LF)
		unsigned int TPP_INTERNAL(tff_TOK_LF): 1;
#define _tpp_lexer_has_TOK_LF(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LF)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LF) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SPACE)
		unsigned int TPP_INTERNAL(tff_TOK_SPACE): 1;
#define _tpp_lexer_has_TOK_SPACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SPACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SPACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_COMMENT): 1;
#define _tpp_lexer_has_TOK_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_COMMENT): 1;
#define _tpp_lexer_has_TOK_CXX_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_C_COMMENT): 1;
#define _tpp_lexer_has_TOK_C_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_C_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_PASCAL_COMMENT): 1;
#define _tpp_lexer_has_TOK_PASCAL_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PASCAL_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_PASCAL_BRACE_COMMENT): 1;
#define _tpp_lexer_has_TOK_PASCAL_BRACE_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PASCAL_BRACE_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HTML_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_HTML_COMMENT): 1;
#define _tpp_lexer_has_TOK_HTML_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_HTML_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HTML_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SQL_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SQL_COMMENT): 1;
#define _tpp_lexer_has_TOK_SQL_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SQL_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SQL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_AT_AT_COMMENT): 1;
#define _tpp_lexer_has_TOK_AT_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AT_AT_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SHELL_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SHELL_COMMENT): 1;
#define _tpp_lexer_has_TOK_SHELL_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SHELL_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SHELL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SLASH_COMMENT): 1;
#define _tpp_lexer_has_TOK_SLASH_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SLASH_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_AT_COMMENT): 1;
#define _tpp_lexer_has_TOK_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AT_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SHELL_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SOL_SHELL_COMMENT): 1;
#define _tpp_lexer_has_TOK_SOL_SHELL_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SOL_SHELL_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SHELL_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SLASH_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SOL_SLASH_COMMENT): 1;
#define _tpp_lexer_has_TOK_SOL_SLASH_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SOL_SLASH_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_SLASH_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_AT_COMMENT)
		unsigned int TPP_INTERNAL(tff_TOK_SOL_AT_COMMENT): 1;
#define _tpp_lexer_has_TOK_SOL_AT_COMMENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SOL_AT_COMMENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SOL_AT_COMMENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOLLAR)
		unsigned int TPP_INTERNAL(tff_TOK_DOLLAR): 1;
#define _tpp_lexer_has_TOK_DOLLAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_DOLLAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOLLAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE)
		unsigned int TPP_INTERNAL(tff_THOUSANDS_SEPARATOR_UNDERSCORE): 1;
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_UNDERSCORE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_THOUSANDS_SEPARATOR_UNDERSCORE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK)
		unsigned int TPP_INTERNAL(tff_THOUSANDS_SEPARATOR_SINGLETICK): 1;
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_SINGLETICK(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_THOUSANDS_SEPARATOR_SINGLETICK)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_INT)
		unsigned int TPP_INTERNAL(tff_TOK_C_INT): 1;
#define _tpp_lexer_has_TOK_C_INT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_C_INT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_INT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_HEX)
		unsigned int TPP_INTERNAL(tff_TOK_PASCAL_HEX): 1;
#define _tpp_lexer_has_TOK_PASCAL_HEX(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PASCAL_HEX)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PASCAL_HEX) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_FLOAT)
		unsigned int TPP_INTERNAL(tff_TOK_C_FLOAT): 1;
#define _tpp_lexer_has_TOK_C_FLOAT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_C_FLOAT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_FLOAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_SMART_FLOAT_TOKENS)
		unsigned int TPP_INTERNAL(tff_SMART_FLOAT_TOKENS): 1;
#define _tpp_lexer_has_SMART_FLOAT_TOKENS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_SMART_FLOAT_TOKENS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_SMART_FLOAT_TOKENS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_CHAR)
		unsigned int TPP_INTERNAL(tff_TOK_C_CHAR): 1;
#define _tpp_lexer_has_TOK_C_CHAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_C_CHAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_CHAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_STRING)
		unsigned int TPP_INTERNAL(tff_TOK_C_STRING): 1;
#define _tpp_lexer_has_TOK_C_STRING(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_C_STRING)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_C_STRING) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_RAW_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_RAW_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_WIDE_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_WIDE_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_WIDE_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF8_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF8_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF8_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF16_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF16_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF16_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF32_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF32_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF32_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_RAW_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_RAW_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_WIDE_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_WIDE_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_WIDE_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF8_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF8_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF8_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF16_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF16_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF16_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_CXX_UTF32_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_CXX_UTF32_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_CXX_UTF32_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_RAW_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_RAW_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_RAW_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_RAW_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_BLOCK_STRING_LITERAL): 1;
#define _tpp_lexer_has_TOK_BLOCK_STRING_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_BLOCK_STRING_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
		unsigned int TPP_INTERNAL(tff_TOK_BLOCK_CHAR_LITERAL): 1;
#define _tpp_lexer_has_TOK_BLOCK_CHAR_LITERAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_BLOCK_CHAR_LITERAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_E)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_E): 1;
#define _tpp_lexer_has_STRING_ESCAPE_E(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_E)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_E) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_S)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_S): 1;
#define _tpp_lexer_has_STRING_ESCAPE_S(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_S)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_S) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_OCT): 1;
#define _tpp_lexer_has_STRING_ESCAPE_OCT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_OCT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_OCT_BRACE): 1;
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_OCT_BRACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_OCT_BRACE_MANY): 1;
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_OCT_BRACE_MANY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_HEX): 1;
#define _tpp_lexer_has_STRING_ESCAPE_HEX(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_HEX)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BIG)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BIG): 1;
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BIG(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BIG)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BIG) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BRACE): 1;
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BRACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BRACE_MANY): 1;
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_HEX_BRACE_MANY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_UNI): 1;
#define _tpp_lexer_has_STRING_ESCAPE_UNI(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_UNI)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_UNI_BRACE): 1;
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_UNI_BRACE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_UNI_BRACE_MANY): 1;
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE_MANY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_UNI_BRACE_MANY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_NAMED): 1;
#define _tpp_lexer_has_STRING_ESCAPE_NAMED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY)
		unsigned int TPP_INTERNAL(tff_STRING_ESCAPE_NAMED_MANY): 1;
#define _tpp_lexer_has_STRING_ESCAPE_NAMED_MANY(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ALLOW_MULTILINE)
		unsigned int TPP_INTERNAL(tff_STRING_ALLOW_MULTILINE): 1;
#define _tpp_lexer_has_STRING_ALLOW_MULTILINE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_ALLOW_MULTILINE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_ALLOW_MULTILINE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_STRING_AUTO_CONCAT)
		unsigned int TPP_INTERNAL(tff_STRING_AUTO_CONCAT): 1;
#define _tpp_lexer_has_STRING_AUTO_CONCAT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_STRING_AUTO_CONCAT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_STRING_AUTO_CONCAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES)
		unsigned int TPP_INTERNAL(tff_ESCAPE_NAMED_UNICODE_NAMES): 1;
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_NAMES(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_ESCAPE_NAMED_UNICODE_NAMES)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD)
		unsigned int TPP_INTERNAL(tff_ESCAPE_NAMED_UNICODE_ORD): 1;
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_ORD(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_ESCAPE_NAMED_UNICODE_ORD)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_XML)
		unsigned int TPP_INTERNAL(tff_ESCAPE_NAMED_XML): 1;
#define _tpp_lexer_has_ESCAPE_NAMED_XML(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_ESCAPE_NAMED_XML)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_ESCAPE_NAMED_XML) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM)
		unsigned int TPP_INTERNAL(tff_TOK_EXCLAIM_EXCLAIM): 1;
#define _tpp_lexer_has_TOK_EXCLAIM_EXCLAIM(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EXCLAIM_EXCLAIM)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_EXCLAIM_EQUAL): 1;
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EXCLAIM_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_EXCLAIM_EQUAL_EQUAL): 1;
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EXCLAIM_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_POUND_POUND)
		unsigned int TPP_INTERNAL(tff_TOK_POUND_POUND): 1;
#define _tpp_lexer_has_TOK_POUND_POUND(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_POUND_POUND)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_POUND_POUND) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT)
		unsigned int TPP_INTERNAL(tff_TOK_PERCENT_PERCENT): 1;
#define _tpp_lexer_has_TOK_PERCENT_PERCENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_PERCENT_PERCENT_EQUAL): 1;
#define _tpp_lexer_has_TOK_PERCENT_PERCENT_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PERCENT_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_PERCENT_EQUAL): 1;
#define _tpp_lexer_has_TOK_PERCENT_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PERCENT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_AMP)
		unsigned int TPP_INTERNAL(tff_TOK_AMP_AMP): 1;
#define _tpp_lexer_has_TOK_AMP_AMP(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AMP_AMP)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_AMP) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_AMP_EQUAL): 1;
#define _tpp_lexer_has_TOK_AMP_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AMP_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AMP_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR)
		unsigned int TPP_INTERNAL(tff_TOK_STAR_STAR): 1;
#define _tpp_lexer_has_TOK_STAR_STAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_STAR_STAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_STAR_STAR_EQUAL): 1;
#define _tpp_lexer_has_TOK_STAR_STAR_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_STAR_STAR_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_STAR_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_DOT)
		unsigned int TPP_INTERNAL(tff_TOK_STAR_DOT): 1;
#define _tpp_lexer_has_TOK_STAR_DOT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_STAR_DOT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_LANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_STAR_LANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_STAR_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_STAR_LANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_STAR_EQUAL): 1;
#define _tpp_lexer_has_TOK_STAR_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_STAR_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_STAR_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_PLUS)
		unsigned int TPP_INTERNAL(tff_TOK_PLUS_PLUS): 1;
#define _tpp_lexer_has_TOK_PLUS_PLUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PLUS_PLUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_PLUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_PLUS_EQUAL): 1;
#define _tpp_lexer_has_TOK_PLUS_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PLUS_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PLUS_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_MINUS): 1;
#define _tpp_lexer_has_TOK_MINUS_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_LANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_LANGLE_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_EQUAL): 1;
#define _tpp_lexer_has_TOK_MINUS_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_RANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_STAR)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_RANGLE_STAR): 1;
#define _tpp_lexer_has_TOK_MINUS_RANGLE_STAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_RANGLE_STAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_MINUS_RANGLE_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_MINUS_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_STAR)
		unsigned int TPP_INTERNAL(tff_TOK_DOT_STAR): 1;
#define _tpp_lexer_has_TOK_DOT_STAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_DOT_STAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT)
		unsigned int TPP_INTERNAL(tff_TOK_DOT_DOT): 1;
#define _tpp_lexer_has_TOK_DOT_DOT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_DOT_DOT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT_DOT)
		unsigned int TPP_INTERNAL(tff_TOK_DOT_DOT_DOT): 1;
#define _tpp_lexer_has_TOK_DOT_DOT_DOT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_DOT_DOT_DOT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_DOT_DOT_DOT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH)
		unsigned int TPP_INTERNAL(tff_TOK_SLASH_SLASH): 1;
#define _tpp_lexer_has_TOK_SLASH_SLASH(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SLASH_SLASH)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_SLASH_SLASH_EQUAL): 1;
#define _tpp_lexer_has_TOK_SLASH_SLASH_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SLASH_SLASH_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_SLASH_EQUAL): 1;
#define _tpp_lexer_has_TOK_SLASH_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_SLASH_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_SLASH_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_COLON)
		unsigned int TPP_INTERNAL(tff_TOK_COLON_COLON): 1;
#define _tpp_lexer_has_TOK_COLON_COLON(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_COLON_COLON)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_COLON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_COLON_EQUAL): 1;
#define _tpp_lexer_has_TOK_COLON_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_COLON_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_COLON_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_MINUS_LANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_MINUS_RANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_LANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_EQUAL_LANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_EQUAL_RANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_LANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_LANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_LANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_LANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EXCLAIM)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_EXCLAIM): 1;
#define _tpp_lexer_has_TOK_EQUAL_EXCLAIM(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_PERCENT): 1;
#define _tpp_lexer_has_TOK_EQUAL_PERCENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_PERCENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_PERCENT_PERCENT): 1;
#define _tpp_lexer_has_TOK_EQUAL_PERCENT_PERCENT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AMP)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_AMP): 1;
#define _tpp_lexer_has_TOK_EQUAL_AMP(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_AMP)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AMP) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_STAR): 1;
#define _tpp_lexer_has_TOK_EQUAL_STAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_STAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR_STAR)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_STAR_STAR): 1;
#define _tpp_lexer_has_TOK_EQUAL_STAR_STAR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_STAR_STAR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_STAR_STAR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PLUS)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_PLUS): 1;
#define _tpp_lexer_has_TOK_EQUAL_PLUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_PLUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PLUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_MINUS): 1;
#define _tpp_lexer_has_TOK_EQUAL_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_SLASH): 1;
#define _tpp_lexer_has_TOK_EQUAL_SLASH(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_SLASH)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_SLASH_SLASH): 1;
#define _tpp_lexer_has_TOK_EQUAL_SLASH_SLASH(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_SLASH_SLASH)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_COLON)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_COLON): 1;
#define _tpp_lexer_has_TOK_EQUAL_COLON(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_COLON)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_COLON) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_LANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_LANGLE_LANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_EQUAL): 1;
#define _tpp_lexer_has_TOK_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_EQUAL_EXCLAIM): 1;
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EXCLAIM(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_EQUAL_EQUAL): 1;
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_RANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_RANGLE_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_QMARK)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_QMARK): 1;
#define _tpp_lexer_has_TOK_EQUAL_QMARK(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_QMARK)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_QMARK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_AT): 1;
#define _tpp_lexer_has_TOK_EQUAL_AT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_AT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT_AT)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_AT_AT): 1;
#define _tpp_lexer_has_TOK_EQUAL_AT_AT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_AT_AT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_AT_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_HAT)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_HAT): 1;
#define _tpp_lexer_has_TOK_EQUAL_HAT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_HAT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_HAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PIPE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_PIPE): 1;
#define _tpp_lexer_has_TOK_EQUAL_PIPE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_PIPE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_PIPE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_TILDE)
		unsigned int TPP_INTERNAL(tff_TOK_EQUAL_TILDE): 1;
#define _tpp_lexer_has_TOK_EQUAL_TILDE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_EQUAL_TILDE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_EQUAL_TILDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_MINUS_LANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_MINUS_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_MINUS_RANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_MINUS_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_LANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_EQUAL_LANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_LANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_EQUAL_RANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE_MINUS): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_MINUS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE_EQUAL): 1;
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_QMARK_EQUAL): 1;
#define _tpp_lexer_has_TOK_QMARK_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_QMARK_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_QMARK)
		unsigned int TPP_INTERNAL(tff_TOK_QMARK_QMARK): 1;
#define _tpp_lexer_has_TOK_QMARK_QMARK(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_QMARK_QMARK)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_QMARK_QMARK) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_AT_EQUAL): 1;
#define _tpp_lexer_has_TOK_AT_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AT_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT)
		unsigned int TPP_INTERNAL(tff_TOK_AT_AT): 1;
#define _tpp_lexer_has_TOK_AT_AT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AT_AT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_AT_AT_EQUAL): 1;
#define _tpp_lexer_has_TOK_AT_AT_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_AT_AT_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_AT_AT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_HAT_EQUAL): 1;
#define _tpp_lexer_has_TOK_HAT_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_HAT_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_HAT)
		unsigned int TPP_INTERNAL(tff_TOK_HAT_HAT): 1;
#define _tpp_lexer_has_TOK_HAT_HAT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_HAT_HAT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_HAT_HAT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_PIPE_EQUAL): 1;
#define _tpp_lexer_has_TOK_PIPE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PIPE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_PIPE)
		unsigned int TPP_INTERNAL(tff_TOK_PIPE_PIPE): 1;
#define _tpp_lexer_has_TOK_PIPE_PIPE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_PIPE_PIPE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_PIPE_PIPE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_EQUAL)
		unsigned int TPP_INTERNAL(tff_TOK_TILDE_EQUAL): 1;
#define _tpp_lexer_has_TOK_TILDE_EQUAL(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_TILDE_EQUAL)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_EQUAL) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_TILDE)
		unsigned int TPP_INTERNAL(tff_TOK_TILDE_TILDE): 1;
#define _tpp_lexer_has_TOK_TILDE_TILDE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_TOK_TILDE_TILDE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_TOK_TILDE_TILDE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_DEFINED)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_DEFINED): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_DEFINED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_DEFINED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_DEFINED) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
		unsigned int TPP_INTERNAL(tff_DONT_EXPAND_DEFINED_IN_EXPR): 1;
#define _tpp_lexer_has_DONT_EXPAND_DEFINED_IN_EXPR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_DONT_EXPAND_DEFINED_IN_EXPR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_STRINGS)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_STRINGS): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_STRINGS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_STRINGS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_STRINGS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_FLOATS)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_FLOATS): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_FLOATS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_FLOATS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_FLOATS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_LOGICAL_XOR): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_LOGICAL_XOR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_LOGICAL_XOR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
		unsigned int TPP_INTERNAL(tff_BUILTIN_EXPR_CHARACTER_LITERALS): 1;
#define _tpp_lexer_has_BUILTIN_EXPR_CHARACTER_LITERALS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_BUILTIN_EXPR_CHARACTER_LITERALS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_EXTERN_C_FOR_SYSHDR)
		unsigned int TPP_INTERNAL(tff_EXTERN_C_FOR_SYSHDR): 1;
#define _tpp_lexer_has_EXTERN_C_FOR_SYSHDR(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_EXTERN_C_FOR_SYSHDR)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_EXTERN_C_FOR_SYSHDR) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)
		unsigned int TPP_INTERNAL(tff_SEARCH_SYSTEM_INCLUDE_PATH): 1;
#define _tpp_lexer_has_SEARCH_SYSTEM_INCLUDE_PATH(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_SEARCH_SYSTEM_INCLUDE_PATH)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE)
		unsigned int TPP_INTERNAL(tff_INCLUDE_RELATIVE_TO_EVERY_FILE): 1;
#define _tpp_lexer_has_INCLUDE_RELATIVE_TO_EVERY_FILE(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_INCLUDE_RELATIVE_TO_EVERY_FILE)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS)
		unsigned int TPP_INTERNAL(tff_LEXER_DECODEINT_HEX_LITERALS): 1;
#define _tpp_lexer_has_LEXER_DECODEINT_HEX_LITERALS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_LEXER_DECODEINT_HEX_LITERALS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS)
		unsigned int TPP_INTERNAL(tff_LEXER_DECODEINT_BINARY_LITERALS): 1;
#define _tpp_lexer_has_LEXER_DECODEINT_BINARY_LITERALS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_LEXER_DECODEINT_BINARY_LITERALS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS)
		unsigned int TPP_INTERNAL(tff_LEXER_DECODEINT_OCTAL_LITERALS): 1;
#define _tpp_lexer_has_LEXER_DECODEINT_OCTAL_LITERALS(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_LEXER_DECODEINT_OCTAL_LITERALS)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)
		unsigned int TPP_INTERNAL(tff_PRAGMA_MESSAGE_PRINTS_LOCATION): 1;
#define _tpp_lexer_has_PRAGMA_MESSAGE_PRINTS_LOCATION(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_MESSAGE_PRINTS_LOCATION)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION) */
#if TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
		unsigned int TPP_INTERNAL(tff_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED): 1;
#define _tpp_lexer_has_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED(self) (self)->TPP_INTERNAL(tl_feat).TPP_INTERNAL(tf_flags).TPP_INTERNAL(tff_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
#endif /* TPP_CONF_IS_FEAT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED) */
	} TPP_INTERNAL(tf_flags);
	unsigned char TPP_INTERNAL(ttf_bitset)[TPP_FEAT_COUNT ? ((TPP_FEAT_COUNT + TPP_CHAR_BIT - 1) / TPP_CHAR_BIT) : 1];
} tpp_features;

TPP_CONST_DECL tpp_features const tpp_features_default;

#define tpp_features_getid(self, id) \
	((self)->TPP_INTERNAL(ttf_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] & (1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_features_enable(self, id) \
	(void)((self)->TPP_INTERNAL(ttf_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] |= (1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_features_disable(self, id) \
	(void)((self)->TPP_INTERNAL(ttf_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] &= ~(1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_features_setid(self, id, enabled) \
	((enabled) ? tpp_features_enable(self, id) : tpp_features_disable(self, id))
#define tpp_features_init(self)            (void)(*(self) = tpp_features_default)
#define tpp_features_reset(self)           (void)(*(self) = tpp_features_default)
#define tpp_features_fini(self)            tpp_dbg_memset(self, sizeof(tpp_features))
#endif /* TPP_HAVE_FEATURES */

#if TPP_CONF_IS_CONST(TPP_HAVE_BSE)
#define _tpp_lexer_has_BSE(self) TPP_CONF_DEFAULT(TPP_HAVE_BSE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BSE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BSE_WHITESPACE)
#define _tpp_lexer_has_BSE_WHITESPACE(self) TPP_CONF_DEFAULT(TPP_HAVE_BSE_WHITESPACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BSE_WHITESPACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_UNI)
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_UNI(self) TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_UNI)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_UNI) */
#if TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED(self) TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED) */
#if TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY)
#define _tpp_lexer_has_IDENTIFIER_ESCAPE_NAMED_MANY(self) TPP_CONF_DEFAULT(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_IDENTIFIER_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_DIRECTIVES)
#define _tpp_lexer_has_CPP_DIRECTIVES(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_DIRECTIVES)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_DIRECTIVES) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_MACROS)
#define _tpp_lexer_has_CPP_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MAGIC_WHITESPACE)
#define _tpp_lexer_has_MAGIC_WHITESPACE(self) TPP_CONF_DEFAULT(TPP_HAVE_MAGIC_WHITESPACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MAGIC_WHITESPACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_BUILTIN_MACROS)
#define _tpp_lexer_has_CPP_BUILTIN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_BUILTIN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_BUILTIN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_EXCLAIM)
#define _tpp_lexer_has_CPP_EXCLAIM(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_EXCLAIM)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_EXCLAIM) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_BLANK)
#define _tpp_lexer_has_CPP_BLANK(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_BLANK)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_BLANK) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_DIGIT_LINE)
#define _tpp_lexer_has_CPP_DIGIT_LINE(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_DIGIT_LINE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_DIGIT_LINE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_LINE)
#define _tpp_lexer_has_CPP_LINE(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_LINE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_LINE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_INCLUDE)
#define _tpp_lexer_has_CPP_INCLUDE(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_INCLUDE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_INCLUDE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_INCLUDE_NEXT)
#define _tpp_lexer_has_CPP_INCLUDE_NEXT(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_INCLUDE_NEXT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_INCLUDE_NEXT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_IMPORT)
#define _tpp_lexer_has_CPP_IMPORT(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_IMPORT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_IMPORT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_IF_ELSE_ENDIF)
#define _tpp_lexer_has_CPP_IF_ELSE_ENDIF(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_IF_ELSE_ENDIF)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_IF_ELSE_ENDIF) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_DEFINE)
#define _tpp_lexer_has_CPP_DEFINE(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_DEFINE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_DEFINE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_ASSERT)
#define _tpp_lexer_has_CPP_ASSERT(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_ASSERT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_ASSERT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_ERROR)
#define _tpp_lexer_has_CPP_ERROR(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_ERROR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_ERROR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_WARNING)
#define _tpp_lexer_has_CPP_WARNING(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_WARNING)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_WARNING) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_IDENT_SCCS)
#define _tpp_lexer_has_CPP_IDENT_SCCS(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_IDENT_SCCS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_IDENT_SCCS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_PRAGMA)
#define _tpp_lexer_has_CPP_PRAGMA(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_PRAGMA)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_PRAGMA) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CPP_EMBED)
#define _tpp_lexer_has_CPP_EMBED(self) TPP_CONF_DEFAULT(TPP_HAVE_CPP_EMBED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CPP_EMBED) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO__Pragma)
#define _tpp_lexer_has_MACRO__Pragma(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO__Pragma)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO__Pragma) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___pragma)
#define _tpp_lexer_has_MACRO___pragma(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___pragma)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___pragma) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_attribute)
#define _tpp_lexer_has_CLANG_MACRO___has_attribute(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_attribute)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_attribute) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_builtin)
#define _tpp_lexer_has_CLANG_MACRO___has_builtin(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_builtin)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_builtin) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_cpp_attribute)
#define _tpp_lexer_has_CLANG_MACRO___has_cpp_attribute(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_cpp_attribute)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_cpp_attribute) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_declspec_attribute)
#define _tpp_lexer_has_CLANG_MACRO___has_declspec_attribute(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_declspec_attribute)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_declspec_attribute) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_extension)
#define _tpp_lexer_has_CLANG_MACRO___has_extension(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_extension)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_extension) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_feature)
#define _tpp_lexer_has_CLANG_MACRO___has_feature(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_feature)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_feature) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_c_attribute)
#define _tpp_lexer_has_CLANG_MACRO___has_c_attribute(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_MACRO___has_c_attribute)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_MACRO___has_c_attribute) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES)
#define _tpp_lexer_has_CLANG_EXTENSIONS_ARE_FEATURES(self) TPP_CONF_DEFAULT(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CLANG_EXTENSIONS_ARE_FEATURES) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_identifier)
#define _tpp_lexer_has_MACRO___is_identifier(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_identifier)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_identifier) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_deprecated)
#define _tpp_lexer_has_MACRO___is_deprecated(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_deprecated)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_deprecated) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_poisoned)
#define _tpp_lexer_has_MACRO___is_poisoned(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___is_poisoned)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___is_poisoned) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_extension)
#define _tpp_lexer_has_MACRO___has_extension(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_extension)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_extension) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_known_extension)
#define _tpp_lexer_has_MACRO___has_known_extension(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_known_extension)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_known_extension) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_warning)
#define _tpp_lexer_has_MACRO___has_warning(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_warning)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_warning) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_known_warning)
#define _tpp_lexer_has_MACRO___has_known_warning(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_known_warning)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_known_warning) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_include)
#define _tpp_lexer_has_MACRO___has_include(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_include)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_include) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_include_next)
#define _tpp_lexer_has_MACRO___has_include_next(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_include_next)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_include_next) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_embed)
#define _tpp_lexer_has_MACRO___has_embed(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___has_embed)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___has_embed) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___FILE__)
#define _tpp_lexer_has_MACRO___FILE__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___FILE__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___FILE__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___LINE__)
#define _tpp_lexer_has_MACRO___LINE__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___LINE__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___LINE__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TIME__)
#define _tpp_lexer_has_MACRO___TIME__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TIME__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TIME__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___DATE__)
#define _tpp_lexer_has_MACRO___DATE__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___DATE__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___DATE__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___COLUMN__)
#define _tpp_lexer_has_MACRO___COLUMN__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___COLUMN__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___COLUMN__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___BASE_FILE__)
#define _tpp_lexer_has_MACRO___BASE_FILE__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___BASE_FILE__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___BASE_FILE__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___FILE_NAME__)
#define _tpp_lexer_has_MACRO___FILE_NAME__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___FILE_NAME__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___FILE_NAME__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___INCLUDE_LEVEL__)
#define _tpp_lexer_has_MACRO___INCLUDE_LEVEL__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___INCLUDE_LEVEL__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___INCLUDE_LEVEL__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___INCLUDE_DEPTH__)
#define _tpp_lexer_has_MACRO___INCLUDE_DEPTH__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___INCLUDE_DEPTH__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___INCLUDE_DEPTH__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___COUNTER__)
#define _tpp_lexer_has_MACRO___COUNTER__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___COUNTER__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___COUNTER__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TIMESTAMP__)
#define _tpp_lexer_has_MACRO___TIMESTAMP__(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TIMESTAMP__)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TIMESTAMP__) */
#if TPP_CONF_IS_CONST(TPP_HAVE_NUMERIC_DATE_MACROS)
#define _tpp_lexer_has_NUMERIC_DATE_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_NUMERIC_DATE_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_NUMERIC_DATE_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_NUMERIC_TIME_MACROS)
#define _tpp_lexer_has_NUMERIC_TIME_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_NUMERIC_TIME_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_NUMERIC_TIME_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_EVAL)
#define _tpp_lexer_has_MACRO___TPP_EVAL(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_EVAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_EVAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_EXEC)
#define _tpp_lexer_has_MACRO___TPP_EXEC(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_EXEC)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_EXEC) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_UNIQUE)
#define _tpp_lexer_has_MACRO___TPP_UNIQUE(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_UNIQUE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_UNIQUE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_LOAD_FILE)
#define _tpp_lexer_has_MACRO___TPP_LOAD_FILE(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_LOAD_FILE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_LOAD_FILE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_COUNTER)
#define _tpp_lexer_has_MACRO___TPP_COUNTER(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_COUNTER)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_COUNTER) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_RANDOM)
#define _tpp_lexer_has_MACRO___TPP_RANDOM(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_RANDOM)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_RANDOM) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_DECOMPILE)
#define _tpp_lexer_has_MACRO___TPP_STR_DECOMPILE(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_DECOMPILE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_DECOMPILE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_PACK)
#define _tpp_lexer_has_MACRO___TPP_STR_PACK(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_PACK)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_PACK) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_SUBSTR)
#define _tpp_lexer_has_MACRO___TPP_STR_SUBSTR(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_SUBSTR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_SUBSTR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_SIZE)
#define _tpp_lexer_has_MACRO___TPP_STR_SIZE(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_STR_SIZE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_STR_SIZE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_COUNT_TOKENS)
#define _tpp_lexer_has_MACRO___TPP_COUNT_TOKENS(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_COUNT_TOKENS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_COUNT_TOKENS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_IDENTIFIER)
#define _tpp_lexer_has_MACRO___TPP_IDENTIFIER(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO___TPP_IDENTIFIER)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO___TPP_IDENTIFIER) */
#if TPP_CONF_IS_CONST(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
#define _tpp_lexer_has_ALTERNATIVE_MACRO_PARENTHESIS(self) TPP_CONF_DEFAULT(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#define _tpp_lexer_has_MACRO_ARGUMENT_WHITESPACE(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_MACRO_RECURSION)
#define _tpp_lexer_has_MACRO_RECURSION(self) TPP_CONF_DEFAULT(TPP_HAVE_MACRO_RECURSION)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TRADITIONAL_MACROS)
#define _tpp_lexer_has_TRADITIONAL_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_TRADITIONAL_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TRADITIONAL_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_NAMED_VARARGS_IN_MACROS)
#define _tpp_lexer_has_NAMED_VARARGS_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_NAMED_VARARGS_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_NAMED_VARARGS_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_VA_ARGS_IN_MACROS)
#define _tpp_lexer_has_VA_ARGS_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_VA_ARGS_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_VA_ARGS_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_VA_COMMA_IN_MACROS)
#define _tpp_lexer_has_VA_COMMA_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_VA_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_VA_COMMA_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_VA_OPT_IN_MACROS)
#define _tpp_lexer_has_VA_OPT_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_VA_OPT_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_VA_OPT_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_VA_NARGS_IN_MACROS)
#define _tpp_lexer_has_VA_NARGS_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_VA_NARGS_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_VA_NARGS_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)
#define _tpp_lexer_has_VA_GLUE_COMMA_IN_MACROS(self) TPP_CONF_DEFAULT(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_VA_GLUE_COMMA_IN_MACROS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT)
#define _tpp_lexer_has_STRINGIZE_MACRO_ARGUMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRINGIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_CHARIZE_MACRO_ARGUMENT)
#define _tpp_lexer_has_CHARIZE_MACRO_ARGUMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_CHARIZE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_CHARIZE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT)
#define _tpp_lexer_has_DONT_EXPAND_MACRO_ARGUMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_GLUE_MACRO_ARGUMENT)
#define _tpp_lexer_has_GLUE_MACRO_ARGUMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_GLUE_MACRO_ARGUMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_GLUE_MACRO_ARGUMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_PUSH_MACRO)
#define _tpp_lexer_has_PRAGMA_PUSH_MACRO(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_PUSH_MACRO)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_PUSH_MACRO) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_ONCE)
#define _tpp_lexer_has_PRAGMA_ONCE(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_ONCE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_ONCE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_DEPRECATED)
#define _tpp_lexer_has_PRAGMA_DEPRECATED(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_DEPRECATED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_DEPRECATED) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_EXTENSION)
#define _tpp_lexer_has_PRAGMA_EXTENSION(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_EXTENSION)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_EXTENSION) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_WARNING)
#define _tpp_lexer_has_PRAGMA_WARNING(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_WARNING)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_WARNING) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE)
#define _tpp_lexer_has_PRAGMA_MESSAGE(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_ERROR)
#define _tpp_lexer_has_PRAGMA_ERROR(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_ERROR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_ERROR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_REGION)
#define _tpp_lexer_has_PRAGMA_REGION(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_REGION)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_REGION) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_TPP_EXEC)
#define _tpp_lexer_has_PRAGMA_TPP_EXEC(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_TPP_EXEC)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_TPP_EXEC) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#define _tpp_lexer_has_PRAGMA_TPP_SET_KEYWORD_FLAGS(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_POISON)
#define _tpp_lexer_has_PRAGMA_GCC_POISON(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_POISON)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_POISON) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_WARNING)
#define _tpp_lexer_has_PRAGMA_GCC_WARNING(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_WARNING)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_WARNING) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_ERROR)
#define _tpp_lexer_has_PRAGMA_GCC_ERROR(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_ERROR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_ERROR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER)
#define _tpp_lexer_has_PRAGMA_GCC_SYSTEM_HEADER(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_SYSTEM_HEADER) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
#define _tpp_lexer_has_PRAGMA_GCC_DIAGNOSTIC(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_DIAGNOSTIC) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#define _tpp_lexer_has_PRAGMA_GCC_DEPENDENCY(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_GCC_DEPENDENCY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_GCC_DEPENDENCY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TRIGRAPHS)
#define _tpp_lexer_has_TRIGRAPHS(self) TPP_CONF_DEFAULT(TPP_HAVE_TRIGRAPHS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TRIGRAPHS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_DIGRAPHS)
#define _tpp_lexer_has_DIGRAPHS(self) TPP_CONF_DEFAULT(TPP_HAVE_DIGRAPHS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_DIGRAPHS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LF)
#define _tpp_lexer_has_TOK_LF(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LF)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LF) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SPACE)
#define _tpp_lexer_has_TOK_SPACE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SPACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SPACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_COMMENT)
#define _tpp_lexer_has_TOK_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_COMMENT)
#define _tpp_lexer_has_TOK_CXX_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_COMMENT)
#define _tpp_lexer_has_TOK_C_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_COMMENT)
#define _tpp_lexer_has_TOK_PASCAL_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT)
#define _tpp_lexer_has_TOK_PASCAL_BRACE_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_BRACE_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_HTML_COMMENT)
#define _tpp_lexer_has_TOK_HTML_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_HTML_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_HTML_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SQL_COMMENT)
#define _tpp_lexer_has_TOK_SQL_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SQL_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SQL_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT_COMMENT)
#define _tpp_lexer_has_TOK_AT_AT_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SHELL_COMMENT)
#define _tpp_lexer_has_TOK_SHELL_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SHELL_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SHELL_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_COMMENT)
#define _tpp_lexer_has_TOK_SLASH_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_COMMENT)
#define _tpp_lexer_has_TOK_AT_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_SHELL_COMMENT)
#define _tpp_lexer_has_TOK_SOL_SHELL_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_SHELL_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_SHELL_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_SLASH_COMMENT)
#define _tpp_lexer_has_TOK_SOL_SLASH_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_SLASH_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_SLASH_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_AT_COMMENT)
#define _tpp_lexer_has_TOK_SOL_AT_COMMENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SOL_AT_COMMENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SOL_AT_COMMENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOLLAR)
#define _tpp_lexer_has_TOK_DOLLAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOLLAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOLLAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE)
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_UNDERSCORE(self) TPP_CONF_DEFAULT(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_THOUSANDS_SEPARATOR_UNDERSCORE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK)
#define _tpp_lexer_has_THOUSANDS_SEPARATOR_SINGLETICK(self) TPP_CONF_DEFAULT(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_THOUSANDS_SEPARATOR_SINGLETICK) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_INT)
#define _tpp_lexer_has_TOK_C_INT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_INT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_INT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_HEX)
#define _tpp_lexer_has_TOK_PASCAL_HEX(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PASCAL_HEX)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PASCAL_HEX) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_FLOAT)
#define _tpp_lexer_has_TOK_C_FLOAT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_FLOAT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_FLOAT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_SMART_FLOAT_TOKENS)
#define _tpp_lexer_has_SMART_FLOAT_TOKENS(self) TPP_CONF_DEFAULT(TPP_HAVE_SMART_FLOAT_TOKENS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_SMART_FLOAT_TOKENS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_CHAR)
#define _tpp_lexer_has_TOK_C_CHAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_CHAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_CHAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_STRING)
#define _tpp_lexer_has_TOK_C_STRING(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_C_STRING)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_C_STRING) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL)
#define _tpp_lexer_has_TOK_CXX_RAW_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL)
#define _tpp_lexer_has_TOK_CXX_WIDE_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_WIDE_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF8_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF8_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF16_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF16_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF32_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF32_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_CXX_RAW_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_CXX_WIDE_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_WIDE_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF8_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF8_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF16_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF16_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_CXX_UTF32_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_CXX_UTF32_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RAW_STRING_LITERAL)
#define _tpp_lexer_has_TOK_RAW_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RAW_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RAW_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RAW_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_RAW_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RAW_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RAW_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
#define _tpp_lexer_has_TOK_BLOCK_STRING_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_BLOCK_STRING_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_BLOCK_STRING_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
#define _tpp_lexer_has_TOK_BLOCK_CHAR_LITERAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_BLOCK_CHAR_LITERAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_E)
#define _tpp_lexer_has_STRING_ESCAPE_E(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_E)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_E) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_S)
#define _tpp_lexer_has_STRING_ESCAPE_S(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_S)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_S) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT)
#define _tpp_lexer_has_STRING_ESCAPE_OCT(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT_BRACE)
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT_BRACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY)
#define _tpp_lexer_has_STRING_ESCAPE_OCT_BRACE_MANY(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_OCT_BRACE_MANY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX)
#define _tpp_lexer_has_STRING_ESCAPE_HEX(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BIG)
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BIG(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BIG)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BIG) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BRACE)
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BRACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY)
#define _tpp_lexer_has_STRING_ESCAPE_HEX_BRACE_MANY(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_HEX_BRACE_MANY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI)
#define _tpp_lexer_has_STRING_ESCAPE_UNI(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI_BRACE)
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI_BRACE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY)
#define _tpp_lexer_has_STRING_ESCAPE_UNI_BRACE_MANY(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_UNI_BRACE_MANY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_NAMED)
#define _tpp_lexer_has_STRING_ESCAPE_NAMED(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_NAMED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_NAMED) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_NAMED_MANY)
#define _tpp_lexer_has_STRING_ESCAPE_NAMED_MANY(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ESCAPE_NAMED_MANY)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ESCAPE_NAMED_MANY) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_ALLOW_MULTILINE)
#define _tpp_lexer_has_STRING_ALLOW_MULTILINE(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_ALLOW_MULTILINE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_ALLOW_MULTILINE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_STRING_AUTO_CONCAT)
#define _tpp_lexer_has_STRING_AUTO_CONCAT(self) TPP_CONF_DEFAULT(TPP_HAVE_STRING_AUTO_CONCAT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_STRING_AUTO_CONCAT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES)
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_NAMES(self) TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_UNICODE_NAMES) */
#if TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD)
#define _tpp_lexer_has_ESCAPE_NAMED_UNICODE_ORD(self) TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_UNICODE_ORD) */
#if TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_XML)
#define _tpp_lexer_has_ESCAPE_NAMED_XML(self) TPP_CONF_DEFAULT(TPP_HAVE_ESCAPE_NAMED_XML)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_ESCAPE_NAMED_XML) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EXCLAIM)
#define _tpp_lexer_has_TOK_EXCLAIM_EXCLAIM(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EXCLAIM)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EXCLAIM) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EQUAL)
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL)
#define _tpp_lexer_has_TOK_EXCLAIM_EQUAL_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EXCLAIM_EQUAL_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_POUND_POUND)
#define _tpp_lexer_has_TOK_POUND_POUND(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_POUND_POUND)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_POUND_POUND) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_PERCENT)
#define _tpp_lexer_has_TOK_PERCENT_PERCENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_PERCENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL)
#define _tpp_lexer_has_TOK_PERCENT_PERCENT_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_PERCENT_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_EQUAL)
#define _tpp_lexer_has_TOK_PERCENT_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PERCENT_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PERCENT_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AMP_AMP)
#define _tpp_lexer_has_TOK_AMP_AMP(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AMP_AMP)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AMP_AMP) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AMP_EQUAL)
#define _tpp_lexer_has_TOK_AMP_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AMP_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AMP_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_STAR)
#define _tpp_lexer_has_TOK_STAR_STAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_STAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_STAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_STAR_EQUAL)
#define _tpp_lexer_has_TOK_STAR_STAR_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_STAR_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_STAR_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_DOT)
#define _tpp_lexer_has_TOK_STAR_DOT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_DOT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_DOT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_LANGLE_MINUS)
#define _tpp_lexer_has_TOK_STAR_LANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_LANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_LANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_EQUAL)
#define _tpp_lexer_has_TOK_STAR_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_STAR_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_STAR_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PLUS_PLUS)
#define _tpp_lexer_has_TOK_PLUS_PLUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PLUS_PLUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PLUS_PLUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PLUS_EQUAL)
#define _tpp_lexer_has_TOK_PLUS_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PLUS_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PLUS_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_MINUS)
#define _tpp_lexer_has_TOK_MINUS_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE)
#define _tpp_lexer_has_TOK_MINUS_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_MINUS_LANGLE_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_EQUAL)
#define _tpp_lexer_has_TOK_MINUS_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE)
#define _tpp_lexer_has_TOK_MINUS_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_STAR)
#define _tpp_lexer_has_TOK_MINUS_RANGLE_STAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_STAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_STAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_MINUS_RANGLE_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_MINUS_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_STAR)
#define _tpp_lexer_has_TOK_DOT_STAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_STAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_STAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_DOT)
#define _tpp_lexer_has_TOK_DOT_DOT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_DOT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_DOT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_DOT_DOT)
#define _tpp_lexer_has_TOK_DOT_DOT_DOT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_DOT_DOT_DOT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_DOT_DOT_DOT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_SLASH)
#define _tpp_lexer_has_TOK_SLASH_SLASH(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_SLASH)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_SLASH) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_SLASH_EQUAL)
#define _tpp_lexer_has_TOK_SLASH_SLASH_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_SLASH_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_SLASH_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_EQUAL)
#define _tpp_lexer_has_TOK_SLASH_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_SLASH_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_SLASH_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_COLON_COLON)
#define _tpp_lexer_has_TOK_COLON_COLON(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_COLON_COLON)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_COLON_COLON) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_COLON_EQUAL)
#define _tpp_lexer_has_TOK_COLON_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_COLON_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_COLON_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS)
#define _tpp_lexer_has_TOK_LANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE)
#define _tpp_lexer_has_TOK_LANGLE_MINUS_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE)
#define _tpp_lexer_has_TOK_LANGLE_MINUS_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_LANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL)
#define _tpp_lexer_has_TOK_LANGLE_LANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_LANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL)
#define _tpp_lexer_has_TOK_LANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE)
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE)
#define _tpp_lexer_has_TOK_LANGLE_EQUAL_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_RANGLE)
#define _tpp_lexer_has_TOK_LANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_LANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_LANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EXCLAIM)
#define _tpp_lexer_has_TOK_EQUAL_EXCLAIM(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PERCENT)
#define _tpp_lexer_has_TOK_EQUAL_PERCENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PERCENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PERCENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT)
#define _tpp_lexer_has_TOK_EQUAL_PERCENT_PERCENT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PERCENT_PERCENT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AMP)
#define _tpp_lexer_has_TOK_EQUAL_AMP(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AMP)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AMP) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_STAR)
#define _tpp_lexer_has_TOK_EQUAL_STAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_STAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_STAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_STAR_STAR)
#define _tpp_lexer_has_TOK_EQUAL_STAR_STAR(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_STAR_STAR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_STAR_STAR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PLUS)
#define _tpp_lexer_has_TOK_EQUAL_PLUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PLUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PLUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_MINUS)
#define _tpp_lexer_has_TOK_EQUAL_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_SLASH)
#define _tpp_lexer_has_TOK_EQUAL_SLASH(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_SLASH)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_SLASH) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_SLASH_SLASH)
#define _tpp_lexer_has_TOK_EQUAL_SLASH_SLASH(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_SLASH_SLASH)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_SLASH_SLASH) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_COLON)
#define _tpp_lexer_has_TOK_EQUAL_COLON(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_COLON)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_COLON) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE)
#define _tpp_lexer_has_TOK_EQUAL_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
#define _tpp_lexer_has_TOK_EQUAL_LANGLE_LANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_LANGLE_LANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL)
#define _tpp_lexer_has_TOK_EQUAL_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM)
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EXCLAIM(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL_EXCLAIM) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL)
#define _tpp_lexer_has_TOK_EQUAL_EQUAL_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_EQUAL_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE)
#define _tpp_lexer_has_TOK_EQUAL_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_EQUAL_RANGLE_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_QMARK)
#define _tpp_lexer_has_TOK_EQUAL_QMARK(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_QMARK)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_QMARK) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AT)
#define _tpp_lexer_has_TOK_EQUAL_AT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AT_AT)
#define _tpp_lexer_has_TOK_EQUAL_AT_AT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_AT_AT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_AT_AT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_HAT)
#define _tpp_lexer_has_TOK_EQUAL_HAT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_HAT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_HAT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PIPE)
#define _tpp_lexer_has_TOK_EQUAL_PIPE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_PIPE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_PIPE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_TILDE)
#define _tpp_lexer_has_TOK_EQUAL_TILDE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_EQUAL_TILDE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_EQUAL_TILDE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS)
#define _tpp_lexer_has_TOK_RANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE)
#define _tpp_lexer_has_TOK_RANGLE_MINUS_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE)
#define _tpp_lexer_has_TOK_RANGLE_MINUS_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_MINUS_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_LANGLE)
#define _tpp_lexer_has_TOK_RANGLE_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL)
#define _tpp_lexer_has_TOK_RANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE)
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_LANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL_LANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE)
#define _tpp_lexer_has_TOK_RANGLE_EQUAL_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_EQUAL_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_MINUS(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_MINUS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
#define _tpp_lexer_has_TOK_RANGLE_RANGLE_RANGLE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_RANGLE_RANGLE_RANGLE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_QMARK_EQUAL)
#define _tpp_lexer_has_TOK_QMARK_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_QMARK_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_QMARK_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_QMARK_QMARK)
#define _tpp_lexer_has_TOK_QMARK_QMARK(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_QMARK_QMARK)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_QMARK_QMARK) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_EQUAL)
#define _tpp_lexer_has_TOK_AT_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT)
#define _tpp_lexer_has_TOK_AT_AT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT_EQUAL)
#define _tpp_lexer_has_TOK_AT_AT_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_AT_AT_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_AT_AT_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_HAT_EQUAL)
#define _tpp_lexer_has_TOK_HAT_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_HAT_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_HAT_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_HAT_HAT)
#define _tpp_lexer_has_TOK_HAT_HAT(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_HAT_HAT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_HAT_HAT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PIPE_EQUAL)
#define _tpp_lexer_has_TOK_PIPE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PIPE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PIPE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_PIPE_PIPE)
#define _tpp_lexer_has_TOK_PIPE_PIPE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_PIPE_PIPE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_PIPE_PIPE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_TILDE_EQUAL)
#define _tpp_lexer_has_TOK_TILDE_EQUAL(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_TILDE_EQUAL)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_TILDE_EQUAL) */
#if TPP_CONF_IS_CONST(TPP_HAVE_TOK_TILDE_TILDE)
#define _tpp_lexer_has_TOK_TILDE_TILDE(self) TPP_CONF_DEFAULT(TPP_HAVE_TOK_TILDE_TILDE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_TOK_TILDE_TILDE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_DEFINED)
#define _tpp_lexer_has_BUILTIN_EXPR_DEFINED(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_DEFINED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_DEFINED) */
#if TPP_CONF_IS_CONST(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
#define _tpp_lexer_has_DONT_EXPAND_DEFINED_IN_EXPR(self) TPP_CONF_DEFAULT(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_DONT_EXPAND_DEFINED_IN_EXPR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_STRINGS)
#define _tpp_lexer_has_BUILTIN_EXPR_STRINGS(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_STRINGS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_STRINGS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_FLOATS)
#define _tpp_lexer_has_BUILTIN_EXPR_FLOATS(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_FLOATS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_FLOATS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_OPTIONAL_TT) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
#define _tpp_lexer_has_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_IF_ELSE_IN_EXPRESSIONS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR)
#define _tpp_lexer_has_BUILTIN_EXPR_LOGICAL_XOR(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_LOGICAL_XOR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
#define _tpp_lexer_has_BUILTIN_EXPR_CHARACTER_LITERALS(self) TPP_CONF_DEFAULT(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_BUILTIN_EXPR_CHARACTER_LITERALS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_EXTERN_C_FOR_SYSHDR)
#define _tpp_lexer_has_EXTERN_C_FOR_SYSHDR(self) TPP_CONF_DEFAULT(TPP_HAVE_EXTERN_C_FOR_SYSHDR)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_EXTERN_C_FOR_SYSHDR) */
#if TPP_CONF_IS_CONST(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)
#define _tpp_lexer_has_SEARCH_SYSTEM_INCLUDE_PATH(self) TPP_CONF_DEFAULT(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH) */
#if TPP_CONF_IS_CONST(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE)
#define _tpp_lexer_has_INCLUDE_RELATIVE_TO_EVERY_FILE(self) TPP_CONF_DEFAULT(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE) */
#if TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS)
#define _tpp_lexer_has_LEXER_DECODEINT_HEX_LITERALS(self) TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_HEX_LITERALS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS)
#define _tpp_lexer_has_LEXER_DECODEINT_BINARY_LITERALS(self) TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_BINARY_LITERALS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS)
#define _tpp_lexer_has_LEXER_DECODEINT_OCTAL_LITERALS(self) TPP_CONF_DEFAULT(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_LEXER_DECODEINT_OCTAL_LITERALS) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)
#define _tpp_lexer_has_PRAGMA_MESSAGE_PRINTS_LOCATION(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE_PRINTS_LOCATION) */
#if TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
#define _tpp_lexer_has_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED(self) TPP_CONF_DEFAULT(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED)
#endif /* TPP_CONF_IS_CONST(TPP_HAVE_PRAGMA_MESSAGE_OMITS_TRAILING_LINEFEED) */

/************************************************************************/
/* File: parts/file.h                                                   */
/************************************************************************/

typedef enum tpp_file_kind {
	TPP_FILE_KIND_IO,      /* File found on hard-disk */
	TPP_FILE_KIND_TEXT,    /* Explicitly injected text (same as `TPP_FILE_KIND_IO', but single-chunk'd and non-expandable) */
#if TPP_HAVE_FILE_SUBTEXT
	TPP_FILE_KIND_SUBTEXT, /* Same as `TPP_FILE_KIND_TEXT', but used to describe temporary sub-chunk files */
#endif /* TPP_HAVE_FILE_SUBTEXT */
#if TPP_HAVE_CPP_MACROS
	TPP_FILE_KIND_MACRO,   /* Expanded macro */
#endif /* TPP_HAVE_CPP_MACROS */
#if TPP_HAVE_FILE_DUMMY
	TPP_FILE_KIND_DUMMY,   /* Dummy file */
#endif /* TPP_HAVE_FILE_DUMMY */
} tpp_file_kind;

#if TPP_HAVE_UNICODE
typedef enum tpp_file_encoding {
	TPP_FILE_ENCODING_UTF8,       /* Assume utf-8 until an invalid byte sequence is encountered (when that happens, set to `TPP_FILE_ENCODING_ASCII') */
	TPP_FILE_ENCODING_ASCII,      /* An invalid utf-8 byte sequence is encountered */
	TPP_FILE_ENCODING_FORCE_UTF8, /* Always use utf-8 (used when a BOM was encountered at the start of the file) */

	/* The following are only used internally and (despite their names) must be treated as "TPP_FILE_ENCODING_FORCE_UTF8" */
	TPP_FILE_ENCODING_UTF16_LE,   /* TPP_FILE_KIND_IO-only: Underlying file is in utf-16 (le) and auto-converted to utf-8 during reading */
	TPP_FILE_ENCODING_UTF16_BE,   /* TPP_FILE_KIND_IO-only: Underlying file is in utf-16 (be) and auto-converted to utf-8 during reading */
	TPP_FILE_ENCODING_UTF32_LE,   /* TPP_FILE_KIND_IO-only: Underlying file is in utf-32 (le) and auto-converted to utf-8 during reading */
	TPP_FILE_ENCODING_UTF32_BE,   /* TPP_FILE_KIND_IO-only: Underlying file is in utf-32 (be) and auto-converted to utf-8 during reading */
#if TPP_HAVE_FILE_ENCODING_EMBED
	TPP_FILE_ENCODING_EMBED,      /* TPP_FILE_KIND_IO-only: Convert file bytes to sequence of ,-separated integers */
#endif /* TPP_HAVE_FILE_ENCODING_EMBED */
} tpp_file_encoding;
#define TPP_FILE_ENCODING_ISUTF8(enc)  ((enc) != TPP_FILE_ENCODING_ASCII)
#define TPP_FILE_ENCODING_ISASCII(enc) ((enc) == TPP_FILE_ENCODING_ASCII)
#endif /* TPP_HAVE_UNICODE */


#undef TPP_HAVE_FILE_FLAGS
#if (TPP_HAVE_FILE_NONBLOCK ||                               \
     TPP_HAVE_FILE_NOCLOSE ||                                \
     TPP_HAVE_FILE_NOKWD ||                                  \
     (!TPP_HAVE_USER_KEYWORDS && TPP_HAVE_LEXER_OPENFILE) || \
     TPP_HAVE_FILE_SYSHDR ||                                 \
     TPP_HAVE_FILE_EXTERN_C ||                               \
     TPP_HAVE_IFNDEF_INCLUDE_GUARDS ||                       \
     TPP_HAVE_CPP_DIRECTIVES)
#define TPP_HAVE_FILE_FLAGS 1
#else /* ... */
#define TPP_HAVE_FILE_FLAGS 0
#endif /* !... */

#if TPP_HAVE_FILE_FLAGS
#define tpp_file_flags uint_least8_t /* Set of `TPP_FILE_FLAGS_*' */
#define TPP_FILE_FLAGS_NORMAL       UINT8_C(0x00) /* Normal flags */
#if TPP_HAVE_FILE_NONBLOCK
#define TPP_FILE_FLAGS_NONBLOCK     UINT8_C(0x01) /* TPP_FILE_KIND_IO: Do non-blocking I/O */
#endif /* TPP_HAVE_FILE_NONBLOCK */
#if TPP_HAVE_FILE_NOCLOSE
#define TPP_FILE_FLAGS_NOCLOSE      UINT8_C(0x02) /* TPP_FILE_KIND_IO: Don't `tpp_io_close(tff_file)' on destruction */
#endif /* TPP_HAVE_FILE_NOCLOSE */
#if TPP_HAVE_FILE_NOKWD
#define TPP_FILE_FLAGS_NOKWD        UINT8_C(0x04) /* TPP_FILE_KIND_IO + TPP_FILE_KIND_TEXT: The file's "tff_name" field isn't actually a "tpp_keyword::tk_kwd", but rather a raw \0-terminated C string. */
#endif /* TPP_HAVE_FILE_NOKWD */
#if !TPP_HAVE_USER_KEYWORDS && TPP_HAVE_LEXER_OPENFILE
#define TPP_FILE_FLAGS_FREENAME     UINT8_C(0x08) /* TPP_FILE_KIND_IO + TPP_FILE_KIND_TEXT: Must tpp_free(tff_name) when the file is finalized */
#endif /* !TPP_HAVE_USER_KEYWORDS && TPP_HAVE_LEXER_OPENFILE */
#if TPP_HAVE_FILE_SYSHDR
#define TPP_FILE_FLAGS_SYSHDR       UINT8_C(0x10) /* TPP_FILE_KIND_IO + TPP_FILE_KIND_TEXT: Suppress all warnings produced in the context of this file */
#endif /* TPP_HAVE_FILE_SYSHDR */
#if TPP_HAVE_FILE_EXTERN_C
#define TPP_FILE_FLAGS_EXTERN_C     UINT8_C(0x20) /* TPP_FILE_KIND_IO + TPP_FILE_KIND_TEXT: Treat everything within the file as being wrapped by an implicit `extern "C"' */
#endif /* TPP_HAVE_FILE_EXTERN_C */
#if TPP_HAVE_IFNDEF_INCLUDE_GUARDS
#define TPP_FILE_FLAGS_NOGUARD      UINT8_C(0x40) /* A non-COMMENT/SPACE/LF (or blank/comment directive) was encountered since the start of the
                                                   * file. A #ifndef-directive encountered at this point can never count as a #include-guard. */
#endif /* TPP_HAVE_IFNDEF_INCLUDE_GUARDS */
#if TPP_HAVE_CPP_DIRECTIVES
#define TPP_FILE_FLAGS_NODIRECTIVES UINT8_C(0x80) /* A non-COMMENT/SPACE token was encountered since the last
                                                   * TPP_TOK_LF, meaning PP-directives may not be parsed. */
#endif /* TPP_HAVE_CPP_DIRECTIVES */
#endif /* TPP_HAVE_FILE_FLAGS */



#if TPP_HAVE_IFDEF_STACK
typedef enum tpp_ifdef_mode {
	TPP_IFDEF_MODE_IFDEF, /* Inside of an active #ifdef (or #if, #elif, ...) block.
	                       * Allowed follow-up directives are: "#elif", "#else", "#endif" */
	TPP_IFDEF_MODE_ELSE,  /* Inside of an active #else-block (following an already-skipped #if-block)
	                       * Allowed follow-up directives are: "#endif" */
} tpp_ifdef_mode;

typedef struct tpp_ifdef_stack_entry {
	tpp_ifdef_mode TPP_INTERNAL(tidse_mode);    /* Behavioral mode of this entry */
	tpp_lcinfo     TPP_INTERNAL(tidse_created); /* line/column info of #if/#ifdef/#ifndef directive that created this block */
	tpp_lcinfo     TPP_INTERNAL(tidse_updated); /* line/column info of last directive that updated this block.
	                                             * Or in other words: staring-position of current sub-block
	                                             * e.g.: after #elif or #else, points at that directive, while
	                                             *       "tidse_created" continues to point at initial #if/... */
} tpp_ifdef_stack_entry;

#define tpp_ifdef_stack_entry_getcreated(self) (self)->TPP_INTERNAL(tidse_created)
#define tpp_ifdef_stack_entry_getupdated(self) (self)->TPP_INTERNAL(tidse_updated)

typedef struct tpp_ifdef_stack {
	tpp_size               TPP_INTERNAL(tids_alc); /* Allocated size of `tids_vec' */
	tpp_size               TPP_INTERNAL(tids_cnt); /* Used size of `tids_vec' */
	tpp_ifdef_stack_entry *TPP_INTERNAL(tids_vec); /* [0..tids_cnt][owned] Vector of active #ifdef-stack entries */
} tpp_ifdef_stack;

#define tpp_ifdef_stack_init(self)             \
	(void)((self)->TPP_INTERNAL(tids_alc) = 0, \
	       (self)->TPP_INTERNAL(tids_cnt) = 0, \
	       (self)->TPP_INTERNAL(tids_vec) = NULL)
#define tpp_ifdef_stack_fini(self) \
	tpp_free((self)->TPP_INTERNAL(tids_vec))

/* Clear the #ifdef-stack */
#define tpp_ifdef_stack_clear(self) \
	(tpp_ifdef_stack_fini(self),    \
	 tpp_ifdef_stack_init(self))

/* Check if the given #ifdef-stack is empty */
#define tpp_ifdef_stack_isempty(self) \
	((self)->TPP_INTERNAL(tids_cnt) == 0)

/* Return the last #ifdef-stack entry. The caller
 * must ensure that "!tpp_ifdef_stack_isempty(self)" */
#define tpp_ifdef_stack_getlast(self) \
	(&(self)->TPP_INTERNAL(tids_vec)[(self)->TPP_INTERNAL(tids_cnt) - 1])

/* Check if the most-recent #ifdef-stack entry indicates
 * that TPP is currently inside of a #else-block. The caller
 * must ensure that "!tpp_ifdef_stack_isempty(self)" */
#define tpp_ifdef_stack_isafterelse(self) \
	((self)->TPP_INTERNAL(tids_vec)[(self)->TPP_INTERNAL(tids_cnt) - 1].TPP_INTERNAL(tidse_mode) == TPP_IFDEF_MODE_ELSE)

/* Allocate an additional #ifdef-stack entry, and return a pointer to it.
 * This function will increment `self->tids_cnt', but it is up to the
 * caller to initialize the returned #ifdef-stack entry
 *
 * @return: * :   The (uninitialized) #ifdef-stack entry
 * @return: NULL: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_ifdef_stack_entry *TPPCALL
tpp_ifdef_stack_append(tpp_ifdef_stack *tpp_restrict self);

/* Do the inverse of "tpp_ifdef_stack_append()", removing the last entry, and
 * potentially freeing unused memory.
 * The caller is responsible to ensure that `tpp_ifdef_stack_isnonempty(self)' */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_ifdef_stack_remove(tpp_ifdef_stack *tpp_restrict self);
#endif /* TPP_HAVE_IFDEF_STACK */


struct tpp_keyword;
#if TPP_HAVE_CPP_MACROS
struct tpp_macro;
#endif /* TPP_HAVE_CPP_MACROS */
#if TPP_HAVE_FILE_MACRO_TRACKARGS
struct tpp_lexer_arginfo;
#endif /* TPP_HAVE_FILE_MACRO_TRACKARGS */

typedef struct tpp_file {
	tpp_char const     *TPP_INTERNAL(tf_tpos);  /* [?..?][valid_if(DID_CALL(tpp_lexer_yieldraw))]
	                                             * Start of last-loaded token (also valid in "tf_tprev"-files)
	                                             * WARNING: This field is NOT maintained/updated by `tpp_file_*' APIs
	                                             *          It is only here so it overlaps with the lexer's token's
	                                             *          "tt_start" field, such that said field is saved when
	                                             *          a new file is pushed onto the #include-stack, and can
	                                             *          then be used to calculate line/column information when
	                                             *          lexer prints its #include-stack. */
	/* Important: "tf_pos" and "tf_chunk" must come first, so they can shadow the tail of "tpp_token" */
	tpp_char const     *TPP_INTERNAL(tf_pos);   /* [0..1][<= tf_end] File pointer to next unread byte. */
	TPP_REF tpp_string *TPP_INTERNAL(tf_chunk); /* [0..1][const_if(tf_kind != TPP_FILE_KIND_IO)] Currently loaded text-chunk (mutable for text-files) */
	tpp_char const     *TPP_INTERNAL(tf_end);   /* [0..1][>= tf_chunk->ts_str && <= tf_chunk->ts_str+tf_chunk->ts_len][const_if(tf_kind != TPP_FILE_KIND_IO)] End of effective file content (mutable for text-files) */
#if TPP_HAVE_INCLUDE_STACK
	struct tpp_file    *TPP_INTERNAL(tf_prev);  /* [0..1] Parent file in #include stack */
	struct tpp_file    *TPP_INTERNAL(tf_tprev); /* [0..1] Real parent for the purposes of message tracebacks (not affected by `tpp_file_autopopfile_pushoff') */
#define _tpp_file_init_prev(self) , (self)->TPP_INTERNAL(tf_prev) = NULL, (self)->TPP_INTERNAL(tf_tprev) = NULL
#else /* TPP_HAVE_INCLUDE_STACK */
#define _tpp_file_init_prev(self) /* nothing */
#endif /* !TPP_HAVE_INCLUDE_STACK */
#if TPP_HAVE_FILE_LC_CACHE
	tpp_char const     *TPP_INTERNAL(tf_lcpos); /* [0..1] Position that `tf_lcval' applies to. */
	tpp_lcinfo          TPP_INTERNAL(tf_lcval); /* [valid_if(tf_lcpos)] Cached line/column at `tf_lcpos' */
#define _tpp_file_init_lcpos(self) , (self)->TPP_INTERNAL(tf_lcpos) = NULL
#else /* TPP_HAVE_FILE_LC_CACHE */
#define _tpp_file_init_lcpos(self) /* nothing */
#endif /* !TPP_HAVE_FILE_LC_CACHE */
#if TPP_HAVE_IFDEF_STACK
	tpp_ifdef_stack     TPP_INTERNAL(tf_ifdef); /* #ifdef-stack */
#define _tpp_file_init_ifdef(self) , tpp_ifdef_stack_init(&(self)->TPP_INTERNAL(tf_ifdef))
#else /* TPP_HAVE_IFDEF_STACK */
#define _tpp_file_init_ifdef(self) /* nothing */
#endif /* !TPP_HAVE_IFDEF_STACK */
	tpp_file_kind       TPP_INTERNAL(tf_kind);  /* [const] File kind */
#if TPP_HAVE_UNICODE
	tpp_file_encoding   TPP_INTERNAL(tf_enc);   /* File encoding */
#define _tpp_file_init_enc_ex(self, v) , (self)->TPP_INTERNAL(tf_enc) = v
#else /* TPP_HAVE_UNICODE */
#define _tpp_file_init_enc(self)       /* nothing */
#endif /* !TPP_HAVE_UNICODE */
#if TPP_HAVE_FILE_FLAGS
	tpp_file_flags      TPP_INTERNAL(tf_flags); /* File flags (set of `TPP_FILE_FLAGS_*') */
#define _tpp_file_init_flags(self, v) , (self)->TPP_INTERNAL(tf_flags) = (v)
#else /* TPP_HAVE_FILE_FLAGS */
#define _tpp_file_init_flags(self, v) /* nothing */
#endif /* !TPP_HAVE_FILE_FLAGS */
#define _tpp_file_init_enc(self)   _tpp_file_init_enc_ex(self, TPP_FILE_ENCODING_UTF8)
	union {
		struct {
			char const *TPP_INTERNAL(tff_name);     /* [0..1][const] Filename by which this file was included (if available) */
			tpp_lcinfo  TPP_INTERNAL(tff_start_lc); /* [valid_if(tf_chunk != NULL)] Line/Column numbers (0-based) of `tf_chunk->ts_str', or `TPP_LCINFO_INVALID' */
#if TPP_HAVE_FILE_SETFILENAME
			TPP_REF tpp_string *TPP_INTERNAL(tff_user_filename); /* [0..1] User-defined override for name of this file */
#define _tpp_file_init_io_user_filename(self) , (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(tff_user_filename) = NULL
#else /* TPP_HAVE_FILE_SETFILENAME */
#define _tpp_file_init_io_user_filename(self) /* nothing */
#endif /* !TPP_HAVE_FILE_SETFILENAME */
#if TPP_HAVE_FILE_GETHASH
			tpp_hash TPP_INTERNAL(tff_hash); /* [valid_if(tf_chunk != NULL)] Hash of all (decoded) file data up to the start of the current chunk */
#endif /* TPP_HAVE_FILE_GETHASH */
#if TPP_HAVE_FILE_KEEPPOS
			/* Need an additional "tpp_char const *ttf_keep" here whose only purpose
			 * is to set an extra, lower-bound of effective text-data to always
			 * keep loaded. But this pointer can also just be NULL, in which case
			 * only data in [tf_pos,tf_end) must be kept loaded!
			 * This pointer is needed when parsing the argument list of macros,
			 * and is needed to keep already-parsed argument data in memory when
			 * using tpp_lexer_yieldpp (which doesn't have a *_at variant), as
			 * well as keep the names of macros loaded such that (once the end
			 * of a macro argument list is found), the bottom-most macro name
			 * is still loaded in memory for "tpp_file_getlastpos()":
			 * >> #define foo(a, b) a+b
			 * >> #define bar       foo(10
			 * >> bar,20)
			 * 1. While parsing macro arguments, when "bar" is popped from
			 *    the #include-stack, the string "10" from "bar" is saved
			 *    in "tpp_lexer_arginfo", alongside a TPP_REF to the chunk
			 *    containing that string
			 * 2. Then, in the main file "tf_tpos" will point at "bar", but
			 *    the next call to tpp_lexer_yieldpp() (that will eventually
			 *    return ",") would be allocated to deallocate the chunk that
			 *    contains "bar" (which we don't want). Because of that, the
			 *    macro-argument parsing code must set "ttf_keep = tf_tpos"
			 *    (assuming that "!ttf_keep || ttf_keep > tf_tpos") before
			 *    continuing to yield tokens, such that "bar" will continue
			 *    to remain loaded
			 * 3. Once the argument is fully loaded, "ttf_keep" can be reset
			 *    to its previous value, and "tf_tpos" can once again be set
			 *    to "bar", allowing tracebacks to display the correct location */
			tpp_char const  *TPP_INTERNAL(ttf_keep);     /* [0..1][<= tf_end] Extra pointer specifying a position in memory that must be kept loaded.
			                                              * When `tpp_file_expandchunk()' is called, and this is field is non-NULL, it will
			                                              * be updated to point to the same effective position in a newly allocated chunk.
			                                              * If it is also less than "tf_pos", then it represents of lower bound of memory
			                                              * to retain in a new file chunk. */
#define _tpp_file_init_io_keep(self) , (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(ttf_keep) = NULL
#else /* TPP_HAVE_FILE_KEEPPOS */
#define _tpp_file_init_io_keep(self) /* nothing */
#endif /* !TPP_HAVE_FILE_KEEPPOS */
			tpp_io_handle    TPP_INTERNAL(tff_file);     /* [owned_if(!TPP_FILE_FLAGS_NOCLOSE)] Underlying I/O file */
#if TPP_HAVE_UNICODE
			union {
				struct {
					uint_least8_t TPP_INTERNAL(tffu_tailc);    /* [valid_if(tf_enc) == TPP_FILE_ENCODING_UTF[16|32]_[LE|BE]] Read, unaligned tail data */
					unsigned char TPP_INTERNAL(tffu_tailv)[3]; /* [valid_if(tf_enc) == TPP_FILE_ENCODING_UTF[16|32]_[LE|BE]] Read, unaligned tail data */
				} TPP_INTERNAL(tffed_unicode);
#if TPP_HAVE_FILE_ENCODING_EMBED
				tpp_uintmax TPP_INTERNAL(tffed_embedlimit); /* Max # of remaining bytes that may be embedded */
#endif /* TPP_HAVE_FILE_ENCODING_EMBED */
			} TPP_INTERNAL(tff_encdat);
#endif /* TPP_HAVE_UNICODE */
		} TPP_INTERNAL(td_io); /* [tf_kind == TPP_FILE_KIND_IO] */

		struct {
			char const *TPP_INTERNAL(tft_name);     /* [0..1][const] Filename for messages (if available) */
			tpp_lcinfo  TPP_INTERNAL(tft_start_lc); /* [valid_if(tf_chunk != NULL)] Line/Column numbers (0-based) of `tf_chunk->ts_str', or `TPP_LCINFO_INVALID' */
#if TPP_HAVE_FILE_SETFILENAME
			TPP_REF tpp_string *TPP_INTERNAL(tft_user_filename); /* [0..1] User-defined override for name of this file */
#define _tpp_file_init_text_user_filename(self) , (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_text).TPP_INTERNAL(tft_user_filename) = NULL
#else /* TPP_HAVE_FILE_SETFILENAME */
#define _tpp_file_init_text_user_filename(self) /* nothing */
#endif /* !TPP_HAVE_FILE_SETFILENAME */
		} TPP_INTERNAL(td_text); /* [tf_kind == TPP_FILE_KIND_TEXT] */

#if TPP_HAVE_CPP_MACROS
		struct {
			/* [1..1][const] The macro definition that produced this file
			 * as its expansion (also holds a reference to "tm_expansions") */
			TPP_REF struct tpp_macro *TPP_INTERNAL(tfm_macro);
#if TPP_HAVE_FILE_MACRO_TRACKARGS
			/* [1..1][valid_if(tpp_macro_isfunction(tfm_macro))][owned][const]
			 * Arguments passed during macro invocation */
			struct tpp_lexer_arginfo *TPP_INTERNAL(tfm_args);
#endif /* TPP_HAVE_FILE_MACRO_TRACKARGS */
		} TPP_INTERNAL(td_macro); /* [tf_kind == TPP_FILE_KIND_MACRO] */
#endif /* TPP_HAVE_CPP_MACROS */

#if TPP_HAVE_FILE_DUMMY
		struct {
			char const *TPP_INTERNAL(tfd_name);     /* [0..1][const] Filename for messages (if available) */
			tpp_lcinfo  TPP_INTERNAL(tfd_start_lc); /* Line/Column numbers (0-based), or `TPP_LCINFO_INVALID' */
#if TPP_HAVE_FILE_SETFILENAME
			TPP_REF tpp_string *TPP_INTERNAL(tfd_user_filename); /* [0..1] User-defined override for name of this file */
#endif /* TPP_HAVE_FILE_SETFILENAME */
		} TPP_INTERNAL(td_dummy); /* [tf_kind == TPP_FILE_KIND_DUMMY] */
#endif /* TPP_HAVE_FILE_DUMMY */

	} TPP_INTERNAL(tf_data);
} tpp_file;

#define tpp_file_alloc() ((tpp_file *)tpp_malloc(sizeof(tpp_file)))
#define tpp_file_free(p) tpp_free(p)
#define tpp_file_move(dst, src) \
	(void)(*(dst) = *(src), tpp_dbg_memset(src, sizeof(tpp_file)))

#if TPP_HAVE_UNICODE
#define tpp_file_isutf8(self)  TPP_FILE_ENCODING_ISUTF8((self)->TPP_INTERNAL(tf_enc))
#define tpp_file_isascii(self) TPP_FILE_ENCODING_ISASCII((self)->TPP_INTERNAL(tf_enc))
#else /* TPP_HAVE_UNICODE */
#define tpp_file_isutf8(self)  0
#define tpp_file_isascii(self) 1
#endif /* !TPP_HAVE_UNICODE */

/* Public API for accessing internal components of "tpp_file" */
#define tpp_file_getkind(self)  ((self)->TPP_INTERNAL(tf_kind))
#define tpp_file_getpos(self)   ((self)->TPP_INTERNAL(tf_pos))
#define tpp_file_getend(self)   ((self)->TPP_INTERNAL(tf_end))
#define tpp_file_getchunk(self) ((self)->TPP_INTERNAL(tf_chunk))
#if TPP_HAVE_IFDEF_STACK
#define tpp_file_getifdef(self) (&(self)->TPP_INTERNAL(tf_ifdef))
#endif /* !TPP_HAVE_IFDEF_STACK */


/* Access macro information */
#if TPP_HAVE_CPP_MACROS
#define tpp_file_ismacro(self)  (tpp_file_getkind(self) == TPP_FILE_KIND_MACRO)
#define tpp_file_getmacro(self) ((self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_macro).TPP_INTERNAL(tfm_macro))
#endif /* TPP_HAVE_CPP_MACROS */

/* Returns a pointer to the start of the effectively relevant source.
 * - For the currently loaded file, this is the start of the current
 *   token. If no tokens have been yielded yet, the value returned by
 *   this function is undefined.
 * - For macros further up the #include-stack, this (tries to) point
 *   to the start of the macro's name. However, if the macro's name
 *   was located in a file that has since been popped, this will
 *   instead be the start of whatever macro-invocation originally
 *   caused whatever file to be pushed which then eventually contained
 *   the start of the current macro-call:
 *   >> #define foo(a, b) a+b
 *   >> #define bar       foo(10
 *   >> bar,20)
 *      ^      ^ tpp_file_getpos(self)   (These are the pointed-to positions from the parent-
 *      tpp_file_getlastpos()             file of the one containing the expanded "10+20" text)
 */
#define tpp_file_getlastpos(self) ((self)->TPP_INTERNAL(tf_tpos))



/* Check if the next "tpp_lexer_yieldpp()" done in the context of this file is
 * allowed to parse directives. Since directives are only allowed to appear
 * directly following a line-feed within the same file, or at the start of some
 * file, this function allows you to check if the file is in a scenario where
 * the lexer yielding tokens from it is allowed to parse directives.  */
#if TPP_HAVE_CPP_DIRECTIVES
#define tpp_file_getallowdirectives(self) \
	(!((self)->TPP_INTERNAL(tf_flags) & TPP_FILE_FLAGS_NODIRECTIVES))
#else /* TPP_HAVE_CPP_DIRECTIVES */
#define tpp_file_getallowdirectives(self) 0
#endif /* !TPP_HAVE_CPP_DIRECTIVES */


/* Check if "self" has either been included via a -isystem path,
 * or made use of "#pragma GCC system_header". In either case,
 * when this flags is set for "tpp_file_gettextfile(file)", in
 * a call to "tpp_lexer_warnf()", and the warning would otherwise
 * be emitted as "TPP_WSTATE_WARN", the warning is ignored instead */
#if TPP_HAVE_FILE_SYSHDR
#define tpp_file_getsystemheader(self) \
	((self)->TPP_INTERNAL(tf_flags) & TPP_FILE_FLAGS_SYSHDR)
#else /* TPP_HAVE_FILE_SYSHDR */
#define tpp_file_getsystemheader(self) 0
#endif /* !TPP_HAVE_FILE_SYSHDR */


/* Check if the contents of "self" should be treated as being wrapped
 * by an implicit `extern "C"' block in C++. This flag is set for the
 * current "text-file" (tpp_file_gettextfile(tpp_lexer_getfile(self))),
 * and is controlled using  */
#if TPP_HAVE_FILE_EXTERN_C
#define tpp_file_getextern_c(self) \
	((self)->TPP_INTERNAL(tf_flags) & TPP_FILE_FLAGS_EXTERN_C)
#endif /* TPP_HAVE_FILE_EXTERN_C */


/* Return the predecessor of "self" for the purposes of #include tracebacks.
 * If "self" has no precessor (see `tpp_file_isbasefile()'), return "NULL". */
#if TPP_HAVE_INCLUDE_STACK
#define tpp_file_getprev(self) (self)->TPP_INTERNAL(tf_tprev)
#else /* TPP_HAVE_INCLUDE_STACK */
#define tpp_file_getprev(self) ((tpp_file *)NULL)
#endif /* !TPP_HAVE_INCLUDE_STACK */


/* Check if "self" is the "base"-file (that is: the file that
 * doesn't have a parent, meaning that EOF here *will* result
 * in the lexer having to indicate TPP_TOK_EOF on all fronts) */
#if TPP_HAVE_INCLUDE_STACK
#define tpp_file_isbasefile(self) ((self)->TPP_INTERNAL(tf_tprev) == NULL)
#else /* TPP_HAVE_INCLUDE_STACK */
#define tpp_file_isbasefile(self) 1
#endif /* !TPP_HAVE_INCLUDE_STACK */


/* Initialize common fields of "self" */
#define _tpp_file_init_common(self) \
	_tpp_file_init_lcpos(self)      \
	_tpp_file_init_ifdef(self)

/* Temporarily disable automatic pop-to-prev-file on EOF */
#if TPP_HAVE_INCLUDE_STACK
#define tpp_file_autopopfile_pushoff(self)                            \
	do {                                                              \
		tpp_file *const _tfapfp_prev = (self)->TPP_INTERNAL(tf_prev); \
		(self)->TPP_INTERNAL(tf_prev) = NULL
#define tpp_file_autopopfile_break(self)                                                \
		(void)(tpp_assert((self)->TPP_INTERNAL(tf_prev) == NULL && "New files pushed"), \
		       (self)->TPP_INTERNAL(tf_prev) = _tfapfp_prev)
#define tpp_file_autopopfile_pop(self)    \
		tpp_file_autopopfile_break(self); \
	} while (0)
#else /* TPP_HAVE_INCLUDE_STACK */
#define tpp_file_autopopfile_pushoff(self) do {
#define tpp_file_autopopfile_break(self)   (void)0
#define tpp_file_autopopfile_pop(self)     } while (0)
#endif /* !TPP_HAVE_INCLUDE_STACK */


#if TPP_HAVE_CPP_MACROS
#define _tpp_file_io2text(self)                                   \
	((self)->TPP_INTERNAL(tf_kind) == TPP_FILE_KIND_IO            \
	 ? (void)((self)->TPP_INTERNAL(tf_kind) = TPP_FILE_KIND_TEXT) \
	 : (void)0)
#else /* TPP_HAVE_CPP_MACROS */
#define _tpp_file_io2text(self) \
	(void)((self)->TPP_INTERNAL(tf_kind) = TPP_FILE_KIND_TEXT)
#endif /* !TPP_HAVE_CPP_MACROS */


/* - Disable automatic popping of "self" from the #include-stack
 * - Disable I/O expansion by reading additional data from the file
 * - Make it so the file's EOF position can be overwritten freely
 *   (such that trying to yield additional tokens at/beyond that
 *   position will cause "tpp_lexer_yieldraw()" to return TPP_TOK_EOF)
 * - The previous state can be restored by `tpp_file_popeof()'
 *
 * WARNING:
 * - The caller must ensure that all files pushed are
 *   also popped before breaking out of a PUSHEOF block
 * - These functions don't save/restore the #ifdef-stack
 *   For that, also make use of "tpp_file_pushifdef()" */
#define tpp_file_pusheof(self)                                            \
	do {                                                                  \
		tpp_file_kind const _tfpeof_kind = (self)->TPP_INTERNAL(tf_kind); \
		tpp_char const *const _tfpeof_end = (self)->TPP_INTERNAL(tf_end); \
		_tpp_file_io2text(self)
#define tpp_file_setpos(self, pos) \
		(void)((self)->TPP_INTERNAL(tf_pos) = (pos))
#define tpp_file_seteof(self, end) \
		(void)((self)->TPP_INTERNAL(tf_end) = (end))
#define tpp_file_breakeof(self)                             \
		(void)((self)->TPP_INTERNAL(tf_end)  = _tfpeof_end, \
		       (self)->TPP_INTERNAL(tf_kind) = _tfpeof_kind)
#define tpp_file_popeof(self)    \
		tpp_file_breakeof(self); \
	} while (0)


/* Push (+clear) and later (clear+)restore the #ifdef-stack of a given file */
#if TPP_HAVE_IFDEF_STACK
#define tpp_file_pushifdef(self)                                             \
	do {                                                                     \
		tpp_ifdef_stack const _tfpid_stack = (self)->TPP_INTERNAL(tf_ifdef); \
		tpp_ifdef_stack_init(&(self)->TPP_INTERNAL(tf_ifdef))
#define tpp_file_breakifdef(self)                                     \
		(void)(tpp_ifdef_stack_fini(&(self)->TPP_INTERNAL(tf_ifdef)), \
		       (self)->TPP_INTERNAL(tf_ifdef) = _tfpid_stack)
#define tpp_file_popifdef(self)    \
		tpp_file_breakifdef(self); \
	} while (0)
#else /* TPP_HAVE_IFDEF_STACK */
#define tpp_file_pushifdef(self)  do {
#define tpp_file_breakifdef(self) (void)0
#define tpp_file_popifdef(self)   } while (0)
#endif /* !TPP_HAVE_IFDEF_STACK */


#if TPP_HAVE_FILE_KEEPPOS
/* Push the current keep-pointer for "self"
 * This macro has no effect if "tpp_file_getkind(self) != TPP_FILE_KIND_IO" */
#define tpp_file_pushkeep(self) \
	do {                        \
		tpp_char const *const _tfpk_oldkeep = (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(ttf_keep);
#define tpp_file_breakkeep(self) \
		(void)((self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(ttf_keep) = _tfpk_oldkeep)
#define tpp_file_popkeep(self)    \
		tpp_file_breakkeep(self); \
	} while (0)

/* Returns the keep-pointer for the file (which may be "NULL").
 * Return value is undefined if "tpp_file_getkind(self) != TPP_FILE_KIND_IO" */
#define tpp_file_getkeep(self) \
	(self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(ttf_keep)

/* Set the keep-pointer for the file (given "ptr" must not be "NULL").
 * This macro has no effect if "tpp_file_getkind(self) != TPP_FILE_KIND_IO"
 *
 * @return: true:  Keep pointer was updated because "ptr" describes a greater
 *                 area of effect than the previously active keep-range.
 * @return: false: Keep pointer was not updated */
#define tpp_file_setkeep(self, ptr)                                              \
	(tpp_assert(!(self)->tf_chunk || (ptr) >= tpp_string_str((self)->tf_chunk)), \
	 tpp_assert((ptr) <= (self)->tf_end),                                        \
	 (!tpp_file_getkeep(self) || ((ptr) < tpp_file_getkeep(self))) &&            \
	 ((self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(ttf_keep) = (ptr), 1))
#else /* TPP_HAVE_FILE_KEEPPOS */
#define tpp_file_pushkeep(self)  do {
#define tpp_file_breakkeep(self) (void)0
#define tpp_file_popkeep(self)   } while (0)
#define tpp_file_getkeep(self)   tpp_file_getpos(self)
#endif /* !TPP_HAVE_FILE_KEEPPOS */


/* Push a (temporary) extra-file onto the #include-stack (replacing "self")
 * whose contents can be overwritten to be a (sub-)text chunk of the actual
 * current file. If that (sub-)text chunk is the same as the chunk currently
 * loaded on the (then) parent-file, LC information remains available. Else,
 * calls to "tpp_file_getlcinfo()" return "TPP_LCINFO_INVALID" within the sub-
 * text file.
 *
 * These functions are meant for:
 * - tpp_file_subtext_setchunk_fromarg / tpp_lexer_seekpp_rparen:
 *   Re-parsing text retrieved from "tpp_lexer_arginfo", as is necessary
 *   when expanding the arguments of macros. Because macro arguments can
 *   span across multiple files, and may contain (at that point removed)
 *   preprocessor directives, such processing is done via sub-text files:
 *   >> #define foo(a, b) a+b
 *   >> #define bar       foo(10 _,_
 *   >> bar 20)    // [10][ ][_][,][_][ ][20]
 *   The second argument "b" is "_ 20", but those tokens are split across
 *   2 different text locations: "_" and " 20". As such, there will be no
 *   LC information for available within the sub-text of "b". On the other
 *   hand, "a" is "10 _", which appears consecutive thus continues to have
 *   LC information available
 * - tpp_file_subtext_setchunk_fromstring / tpp_lexer_parsestring_cb:
 *   Re-parsing text from a decoded string literal, as is necessary for
 *   evaluation of the "_Pragma()" builtin, as well as "#pragma tpp_exec()"
 *   Here, the same restrictions apply: if the contained string is single-
 *   chunked (meaning it's decoded text can alias its source file), then
 *   LC information is available. Otherwise, it isn't:
 *   - LC information available in pragma:
 *     >> _Pragma("push_macro('foo')")
 *   - No LC information available in pragma:
 *     >> _Pragma("push_macro(\"foo\")")
 *     (because string decode doesn't map linearly to source file)
 *
 * Usage:
 * >> tpp_errno TPPCALL my_parsestring_cb(void *arg, tpp_string *chunk,
   >>                                     tpp_char const *str, tpp_size length) {
 * >>     tpp_token_id tok;
 * >>     tpp_lexer *lexer = (tpp_lexer *)arg;
 * >>     tpp_file *file = tpp_lexer_getfile(lexer);
 * >>     tpp_file_subtext_push(file);
 * >>     tpp_file_subtext_setchunk_fromstring(file, chunk, str, length);
 * >>     tok = tpp_lexer_yield(lexer);
 * >>     ...
 * >>     tpp_file_subtext_pop(file);
 * >> }
 *
 * NOTES:
 * - A call to "tpp_file_subtext_push()" is similar to the combination of:
 *   - tpp_file_pusheof()
 *   - tpp_file_pushifdef()
 *   - tpp_file_autopopfile_pushoff()
 * - A call to "tpp_file_subtext_setchunk()" automatically does:
 *   - tpp_file_seteof()
 */
#if TPP_HAVE_FILE_SUBTEXT
#if TPP_HAVE_IFDEF_STACK
#define _tpp_file_subtext_init_ifdef(self) , tpp_ifdef_stack_init(&(self)->TPP_INTERNAL(tf_ifdef))
#define _tpp_file_subtext_fini_ifdef(self) tpp_ifdef_stack_fini(&(self)->TPP_INTERNAL(tf_ifdef)),
#else /* TPP_HAVE_IFDEF_STACK */
#define _tpp_file_subtext_init_ifdef(self)   /* nothing */
#define _tpp_file_subtext_fini_ifdef(self)   /* nothing */
#endif /* !TPP_HAVE_IFDEF_STACK */

#define tpp_file_subtext_push(self)                                   \
	do {                                                              \
		tpp_file _tfptf_prev = *(self);                               \
		(self)->TPP_INTERNAL(tf_prev)  = NULL; /* Prevent file pop */ \
		(self)->TPP_INTERNAL(tf_tprev) = &_tfptf_prev;                \
		(self)->TPP_INTERNAL(tf_kind)  = TPP_FILE_KIND_SUBTEXT        \
		_tpp_file_subtext_init_ifdef(self)                            \
		_tpp_file_init_lcpos(self)
#define tpp_file_subtext_setchunk(self, chunk, pos, end) \
		(void)((self)->TPP_INTERNAL(tf_chunk) = (chunk), \
		       (self)->TPP_INTERNAL(tf_pos)   = (pos),   \
		       (self)->TPP_INTERNAL(tf_end)   = (end))
#define tpp_file_subtext_setchunk_fromarg(self, arg) \
		tpp_file_subtext_setchunk(self, (arg)->tlai_chunk, (arg)->tlai_start, (arg)->tlai_end)
#define tpp_file_subtext_setchunk_fromstring(self, chunk, start, len) \
		tpp_file_subtext_setchunk(self, chunk, start, (start) + (len))
#define _tpp_file_subtext_break_common(self)                \
		tpp_assert((self)->TPP_INTERNAL(tf_prev) == NULL && \
		           "Extra files were pushed"),              \
		*(self) = _tfptf_prev
#define tpp_file_subtext_break(self)              \
		(void)(_tpp_file_subtext_fini_ifdef(self) \
		       _tpp_file_subtext_break_common(self))
#define tpp_file_subtext_pop(self)    \
		tpp_file_subtext_break(self); \
	} while (0)
#endif /* TPP_HAVE_FILE_SUBTEXT */



/* Tell an I/O file that it has been initialized, causing its associated
 * keyword's "tkm_file_inclcount" to be updated if necessary. */
#if TPP_HAVE_KEYWORD_INCLCOUNT
TPP_DECL TPP_NONNULL((1)) void TPPCALL
_tpp_file_io_notify_initialized(tpp_file *tpp_restrict self);
#else /* TPP_HAVE_KEYWORD_INCLCOUNT */
#define _tpp_file_io_notify_initialized(self) (void)0
#endif /* !TPP_HAVE_KEYWORD_INCLCOUNT */

/* Initialize "self " as a "TPP_FILE_KIND_IO" file
 * @param: char const    *filename: [0..1] Filename (if known)
 * @param: tpp_io_handle  fp:       File descriptor (inherited)
 * @param: tpp_file_flags flags:    File flags (set of `TPP_FILE_FLAGS_*') */
#if TPP_HAVE_FILE_NOKWD
#define tpp_file_init_io(self, filename, /*inherit*/ fp) tpp_file_init_io_ex(self, filename, fp, TPP_FILE_FLAGS_NOKWD)
#else /* TPP_HAVE_FILE_NOKWD */
#define tpp_file_init_io(self, filename, /*inherit*/ fp) tpp_file_init_io_ex(self, filename, fp, TPP_FILE_FLAGS_NORMAL)
#endif /* !TPP_HAVE_FILE_NOKWD */
#define tpp_file_init_io_ex(self, filename, /*inherit*/ fp, flags) \
	tpp_file_init_io_ex2(self, filename, /*inherit*/ fp, flags, TPP_FILE_ENCODING_UTF8)
#define tpp_file_init_io_ex2(self, filename, /*inherit*/ fp, flags, enc)                          \
	(void)((self)->TPP_INTERNAL(tf_pos)   = NULL,                                                 \
	       (self)->TPP_INTERNAL(tf_chunk) = NULL,                                                 \
	       (self)->TPP_INTERNAL(tf_end)   = NULL                                                  \
	       _tpp_file_init_prev(self),                                                             \
	       (self)->TPP_INTERNAL(tf_kind) = TPP_FILE_KIND_IO                                       \
	       _tpp_file_init_enc_ex(self, enc)                                                       \
	       _tpp_file_init_flags(self, flags)                                                      \
	       _tpp_file_init_common(self),                                                           \
	       (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(tff_name) = (filename), \
	       (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_io).TPP_INTERNAL(tff_file) = (fp)        \
	       _tpp_file_init_io_user_filename(self)                                                  \
	       _tpp_file_init_io_keep(self),                                                          \
	       _tpp_file_io_notify_initialized(self))

/* Initialize "self" from a given "tpp_lexer_openfile_result" */
#if TPP_HAVE_LEXER_OPENFILE
#define tpp_file_init_io_from_ofr(self, /*inherit*/ /*tpp_lexer_openfile_result **/ ofr) \
	tpp_file_init_io_from_ofr_ex(self, ofr, TPP_FILE_ENCODING_UTF8)
#define tpp_file_init_io_from_ofr_ex(self, /*inherit*/ /*tpp_lexer_openfile_result **/ ofr, enc) \
	tpp_file_init_io_ex2(self, tpp_lexer_openfile_result_getfilename(ofr),                       \
	                     (ofr)->tlofr_handle, tpp_lexer_openfile_result_getfileflags(ofr), enc)
#endif /* TPP_HAVE_LEXER_OPENFILE */



/* Initialize "self " as a "TPP_FILE_KIND_TEXT" file
 * @param: char const         *filename:  [0..1] Filename (if known)
 * @param: TPP_REF tpp_string *chunk:     [inherit(always)] File data chunk
 * @param: void const         *text:      File data base pointer
 * @param: tpp_size            text_size: File data size
 * @param: tpp_lcinfo          start_lc:  [valid_if(chunk)] 0-based line/column info for start of "text", or `TPP_LCINFO_INVALID'
 * @param: tpp_file_encoding   encoding:  File data encoding
 * @param: tpp_file_flags      flags:     File flags (set of `TPP_FILE_FLAGS_*') */
#define tpp_file_init_text(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_file_init_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_UTF8)
#define tpp_file_init_text_ascii(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_file_init_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_ASCII)
#if TPP_HAVE_UNICODE
#define tpp_file_init_text_utf8(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_file_init_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_FORCE_UTF8)
#endif /* TPP_HAVE_UNICODE */
#define tpp_file_init_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding)        \
	(void)((self)->TPP_INTERNAL(tf_pos)   = (tpp_char const *)(text),                                   \
	       (self)->TPP_INTERNAL(tf_chunk) = (chunk),                                                    \
	       (self)->TPP_INTERNAL(tf_end)   = (tpp_char const *)(text) + (text_size)                      \
	       _tpp_file_init_prev(self),                                                                   \
	       (self)->TPP_INTERNAL(tf_kind) = TPP_FILE_KIND_TEXT                                           \
	       _tpp_file_init_enc_ex(self, encoding)                                                        \
	       _tpp_file_init_flags(self, flags)                                                            \
	       _tpp_file_init_common(self)                                                                  \
	       _tpp_file_init_text_user_filename(self),                                                     \
	       (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_text).TPP_INTERNAL(tft_name)     = (filename), \
	       (self)->TPP_INTERNAL(tf_data).TPP_INTERNAL(td_text).TPP_INTERNAL(tft_start_lc) = (start_lc))


/* Initialize "self" as a macro expansion file (internal API) */
#if TPP_HAVE_CPP_MACROS
#define _tpp_file_init_macro(self, prev_file, /*inherit(always)*/ macro, \
                             /*inherit(always)*/ chunk, start, end)      \
	(void)((self)->tf_pos   = (start),                                   \
	       (self)->tf_chunk = (chunk),                                   \
	       (self)->tf_end   = (end)                                      \
	       _tpp_file_init_common(file),                                  \
	       (self)->tf_prev = (self)->tf_tprev = (prev_file),             \
	       (self)->tf_kind                    = TPP_FILE_KIND_MACRO      \
	       _tpp_file_init_enc_ex(self, (macro)->tm_body_enc)             \
	       _tpp_file_init_macro_flags(self),                             \
	       ++((self)->tf_data.td_macro.tfm_macro = macro)->tm_expansions)
#if TPP_HAVE_CPP_DIRECTIVES
#define _tpp_file_init_macro_flags(self) _tpp_file_init_flags(self, TPP_FILE_FLAGS_NODIRECTIVES)
#else /* TPP_HAVE_CPP_DIRECTIVES */
#define _tpp_file_init_macro_flags(self) _tpp_file_init_flags(self, TPP_FILE_FLAGS_NORMAL)
#endif /* !TPP_HAVE_CPP_DIRECTIVES */
#endif /* TPP_HAVE_CPP_MACROS */



/* Finalize the given file. */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_file_fini(tpp_file *tpp_restrict self);


/* Try to expand the currently loaded `self->tf_chunk':
 * - If the file's kind isn't `TPP_FILE_KIND_IO', return `TPP_EOK'
 * - Allocate a new `tpp_string' suitable for holding both
 *   [tf_pos,tf_end), as well as at least 1 additional byte.
 *   HINT: When `!tpp_string_isshared(self->tf_chunk)', the old
 *         chunk string may simply be re-used (since it'd be free'd
 *         during the re-assignment below anyways). If this isn't
 *         intended (iow: you want to keep the contents of the previous
 *         chunk loaded into memory), you can simply `tpp_string_incref'
 *         it before calling this function.
 * - Copy [tf_pos,tf_end) into this new string
 * - Read from the underlying file into the tail of the new string
 * #if TPP_HAVE_UNICODE
 *   - If the underlying file's encoding is TPP_FILE_ENCODING_UTF(16|32)_(LE|BE),
 *     the read data is converted to utf-8 at this point.
 * #endif // TPP_HAVE_UNICODE
 *   - If the underlying file could not be read, return `TPP_EIO'
 *   - If nothing could be read, free the new string and return `TPP_EOK'
 *   - Else:
 *     - adjust `tf_pos' to point into the new string, and
 *       set `tf_end' to point at the end of the new string.
 *     - replace `tf_chunk' with the new string
 *     - return `TPP_EOK'
 * @return: TPP_EOK:         Either the current chunk was expanded (the delta
 *                           between `tf_pos' and `tf_end' has increased), or
 *                           no further data can be read from `self'.
 * @return: TPP_EIO:         I/O error
 * @return: TPP_ENOMEM:      Out of memory
 * #if TPP_HAVE_FILE_NONBLOCK
 * @return: TPP_EWOULDBLOCK: Operation would block.
 * #endif // TPP_HAVE_FILE_NONBLOCK */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_file_expandchunk(tpp_file *tpp_restrict self);

/* Encode/decode pointer<=>text-offset such that effective positions
 * are retained across calls to `tpp_file_expandchunk()'.
 *
 * WARNING: Any calls that modify "tf_pos", or "tpp_token::tt_end",
 *          including "tpp_lexer_yieldraw()" will CLOBBER all relative
 *          offsets within the current file. "tpp_lexer_yieldraw_at()"
 *          however will not (since that one doesn't modify the file's
 *          position as it uses the one given as argument instead).
 *
 * NOTES:
 *  - This needs to use "tf_pos" as relative base, since the start
 *    of the currently loaded chunk can change if another chunk is
 *    allocated that doesn't include the already-read buffer area
 *    located in [tf_chunk->ts_str,tf_pos)
 *  - Use these functions to support memory relocation across calls
 *    to `tpp_file_expandchunk()' (which may relocate the current
 *    text chunk)
 */
#define tpp_file_ptr2rel(self, ptr) (tpp_size)((ptr) - tpp_file_getpos(self))
#define tpp_file_rel2ptr(self, rel) (tpp_file_getpos(self) + (rel))

/* Same as above, but pointers are relative to the file's keep-position */
#if TPP_HAVE_FILE_KEEPPOS
#define tpp_file_keep_ptr2rel(self, ptr) (tpp_size)((ptr) - tpp_file_getkeep(self))
#define tpp_file_keep_rel2ptr(self, rel) (tpp_file_getkeep(self) + (rel))
#endif /* TPP_HAVE_FILE_KEEPPOS */


/* Return line/column information (0-based) for "pos"
 * @return: TPP_LCINFO_INVALID: line/column information could not be determined */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_lcinfo TPPCALL
tpp_file_getlcinfo(tpp_file *tpp_restrict self, tpp_char const *pos);

/* Helpers to return line/column information (0-based) for the
 * start/end positions of the last thing read from the file "self":
 * - For the current file, this describes the start/end of the
 *   currently loaded token
 * - If the current file is a macro (tpp_file_ismacro()), and
 *   this function is called on its parent (tpp_file_getprev()),
 *   then this returns the bounds of the token sequence that was
 *   used to make the macro call
 * - If the current file is an I/O or TEXT file, and this function
 *   is called on its parent (tpp_file_getprev()), then this returns
 *   the bounds of the "#include"-directive that was used to include
 *   the child-file.
 * - When passed file returned by `tpp_file_getlcfile()', this will
 *   return the line/column values associated with the "__LINE__"
 *   macro (and it's TPP "__COLUMN__" extension). This last case is
 *   what you probably want to use.
 *
 * Examples:
 * >> #define assert(x) (void)((x) || (_assert(#x, __FILE__, __LINE__, __COLUMN__), 0))
 * >> ...
 * >>
 * >> if (x)
 * >>     assert(y);
 *        ^        ^ tpp_file_getpos / tpp_file_getendlcinfo
 *        tpp_file_getlastpos / tpp_file_getstartlcinfo
 *
 * iow: "tpp_file_getlastpos" position for tracebacks (points at what "caused" a macro/file push)
 *      "tpp_file_getpos" position of next byte to-be parsed once lexer returns to this file. */
TPP_INLINE TPP_WUNUSED TPP_NONNULL((1)) tpp_lcinfo TPPCALL
tpp_file_getstartlcinfo(tpp_file *tpp_restrict self) {
	return tpp_file_getlcinfo(self, tpp_file_getlastpos(self));
}
TPP_INLINE TPP_WUNUSED TPP_NONNULL((1)) tpp_lcinfo TPPCALL
tpp_file_getendlcinfo(tpp_file *tpp_restrict self) {
	return tpp_file_getlcinfo(self, tpp_file_getpos(self));
}

/* Returns the filename of "self", or "NULL" if unknown. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) /*utf-8*/ char const *TPPCALL
tpp_file_getrealfilename(tpp_file const *tpp_restrict self);

#if TPP_HAVE_FILE_GETREALFILENAMEKWD
/* Returns the filename "keyword" (which may not always be available,
 * even when "tpp_file_getrealfilename()" returns non-NULL) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) struct tpp_keyword *TPPCALL
tpp_file_getrealfilenamekwd(tpp_file const *tpp_restrict self);
#endif /* TPP_HAVE_FILE_GETREALFILENAMEKWD */

/* Same as `tpp_file_getrealfilename()', but may be overwritten by "#line" directives */
#if TPP_HAVE_FILE_SETFILENAME
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) /*utf-8*/ char const *TPPCALL
tpp_file_getfilename(tpp_file const *tpp_restrict self);

/* Sets the user-filename override of "self" to "filename"
 *
 * NOTE: The caller must ensure that:
 *       >> self->tf_kind == TPP_FILE_KIND_IO ||
 *       >> self->tf_kind == TPP_FILE_KIND_TEXT;
 *
 * You may also pass "NULL" for `filename' to disable the override */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_file_setfilename(tpp_file *tpp_restrict self, tpp_string *filename);
#else /* TPP_HAVE_FILE_SETFILENAME */
#define tpp_file_getfilename(self) tpp_file_getrealfilename(self)
#endif /* !TPP_HAVE_FILE_SETFILENAME */

/* Set the (0-based) line that applies to "pos"
 * (as returned by "tpp_file_getlcinfo") in "self"
 *
 * NOTE: The caller must ensure that:
 *       >> self->tf_kind == TPP_FILE_KIND_IO ||
 *       >> self->tf_kind == TPP_FILE_KIND_TEXT; */
#if TPP_HAVE_FILE_SETLINE
TPP_DECL TPP_NONNULL((1, 2)) void TPPCALL
tpp_file_setline(tpp_file *tpp_restrict self,
                 tpp_char const *pos, tpp_line line);
#endif /* TPP_HAVE_FILE_SETLINE */

#if TPP_HAVE_FILE_GETHASH
/* Return the hash of all (decoded) bytes read from "self" up to (but not including) "pos"
 * This *includes* the bytes of any already-unloaded chunk of "self", though "pos" must
 * point into the current chunk (past hash values from previous chunks cannot be determined)
 *
 * Also note that the hash can *only* be determined when `tpp_file_getchunk(self) != NULL'.
 * If the file doesn't have an input chunk (e.g.: its contents are statically allocated),
 * then this function always returns the same value. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_hash TPPCALL
tpp_file_gethash(tpp_file const *tpp_restrict self, tpp_char const *pos);
#endif /* TPP_HAVE_FILE_GETHASH */

#if TPP_HAVE_FILE_GETFULLHASH
/* Same as `tpp_file_gethash()', but also includes the hash values of all parent files,
 * such that the `tpp_file_gethash(f, tpp_file_getlastpos(f))' of every file reachable
 * via `tpp_file_getprev()' is included in the return value in one way or another. Note
 * that the value returned here may be different from the hash that would be calculated
 * if all #include-ed files had been inlined into each other. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_hash TPPCALL
tpp_file_getfullhash(tpp_file const *tpp_restrict self, tpp_char const *pos);
#endif /* TPP_HAVE_FILE_GETFULLHASH */

typedef struct tpp_lcinfo_ex {
	tpp_lcinfo      tlcix_info;     /* Line/column information, or "TPP_LCINFO_INVALID" if unknown */
#if TPP_HAVE_CPP_MACROS
	/* Projection (source) file:
	 * >> #define foo(x) 10+x+20
	 * >> foo(15)
	 *
	 * When requesting lcinfo about the "15" token in the expanded
	 * file ("10+15+20"), "tlcix_projfile" points at the file containing
	 * "foo(15)", and "tlcix_projpos" points at the "15" in "foo(15)".
	 * Meanwhile, "tlcix_info" will point at the "x" token in the
	 * definition of "foo".
	 *
	 * There are many reasons why projection can fail, even when you
	 * might think that there isn't a reason why it should. This is
	 * because there are some edge-cases where TPP3 is unable to
	 * retroactively determine the correct position of tokens, such
	 * as use of "##"-operators, or changing lexer features between
	 * the macro being expanded, and "tpp_file_getlcinfo_ex" being
	 * called. Depending on configuration (and especially changes
	 * thereof), the projection location might even be wrong. */
	tpp_file       *tlcix_projfile; /* [0..1] Projection source file, or NULL if queried position wasn't projected */
	tpp_char const *tlcix_projpos;  /* [1..1][valid_if(tlcix_fromfile)] Position in "tlcix_projfile" */
#endif /* TPP_HAVE_CPP_MACROS */
} tpp_lcinfo_ex;

/* Same as "tpp_file_getlcinfo()", but if the current file is an expanded macro, see if
 * the specified "pos" points into the expanded portion of a macro argument, in which
 * case this function also (tries to) include information on where that argument was
 * projected from. */
#if TPP_HAVE_CPP_MACROS
TPP_DECL TPP_NONNULL((1, 2, 3)) void TPPCALL
tpp_file_getlcinfo_ex(tpp_file *tpp_restrict self, tpp_char const *pos,
                      tpp_lcinfo_ex *tpp_restrict result);
#else /* TPP_HAVE_CPP_MACROS */
#define tpp_file_getlcinfo_ex(self, pos, result) \
	(void)((result)->tlcix_info = tpp_file_getlcinfo(self, pos))
#endif /* !TPP_HAVE_CPP_MACROS */




#if TPP_HAVE_INCLUDE_STACK
/* Returns the last file in the #include-stack (using "tf_tprev") */
TPP_DECL TPP_RETNONNULL TPP_WUNUSED TPP_NONNULL((1)) tpp_file *TPPCALL
tpp_file_getbasefile(tpp_file const *tpp_restrict self);

#if TPP_HAVE_CPP_MACROS || TPP_HAVE_FILE_SUBTEXT || TPP_HAVE_FILE_DUMMY
/* Returns the first tf_kind==TPP_FILE_KIND_IO || tf_kind==TPP_FILE_KIND_TEXT file
 * in the #include-stack (using "tf_tprev"). If no such file exists, returns "NULL" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_file *TPPCALL
tpp_file_gettextfile(tpp_file const *tpp_restrict self);

/* Same as `tpp_file_gettextfile()', but re-return "self" instead of returning "NULL"
 * The term "lc" here refers to the fact that this is the file that's used as basis
 * for the builtin __FILE__, __LINE__ and __COLUMN__ macros. */
TPP_DECL TPP_RETNONNULL TPP_WUNUSED TPP_NONNULL((1)) tpp_file *TPPCALL
tpp_file_getlcfile(tpp_file const *tpp_restrict self);
#else /* TPP_HAVE_CPP_MACROS || TPP_HAVE_FILE_SUBTEXT || TPP_HAVE_FILE_DUMMY */
#define tpp_file_gettextfile(self) ((tpp_file *)(self))
#define tpp_file_getlcfile(self)   ((tpp_file *)(self))
#endif /* !TPP_HAVE_CPP_MACROS || TPP_HAVE_FILE_SUBTEXT || TPP_HAVE_FILE_DUMMY */

#if TPP_HAVE_FILE_DUMMY
/* Push/pop a so-called "dummy-file" that goes between "self" and parent, which
 * is a copy of "self", but with all file/chunk-data stripped, except that the
 * current values for the following are preserved (for tracebacks):
 * - tpp_file_getfilename(self)
 * - tpp_file_getlcinfo(self, pos)   (returned by tpp_file_getlcinfo() for any pointer)
 *
 * NOTES:
 * - The caller must ensure that self->tf_kind == TPP_FILE_KIND_IO ||
 *                               self->tf_kind == TPP_FILE_KIND_TEXT
 * - Used to implement gcc's "# <linenum> <filename> 1" directive
 *
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_file_pushdummy(tpp_file *tpp_restrict self, tpp_char const *pos);

/* Check if "self" has a parent, and if so: if that parent is a "dummy"
 * file. If that is the case, unlink that dummy file from the #include-
 * stack and free it. Otherwise, do nothing
 *
 * NOTES:
 * - The caller must ensure that self->tf_kind == TPP_FILE_KIND_IO ||
 *                               self->tf_kind == TPP_FILE_KIND_TEXT
 * - Used to implement gcc's "# <linenum> <filename> 2" directive
 *
 * @return: true:  Success (a dummy file was popped)
 * @return: false: Failure (there was no dummy file to pop) */
TPP_DECL TPP_NONNULL((1)) bool TPPCALL
tpp_file_popdummy(tpp_file *tpp_restrict self);
#endif /* TPP_HAVE_FILE_DUMMY */

#else /* TPP_HAVE_INCLUDE_STACK */
#define tpp_file_getlcfile(self) ((tpp_file *)(self))
#if TPP_HAVE_CPP_MACROS || TPP_HAVE_FILE_SUBTEXT || TPP_HAVE_FILE_DUMMY
#define tpp_file_gettextfile(self)                         \
	(((self)->TPP_INTERNAL(tf_kind) == TPP_FILE_KIND_IO || \
	  (self)->TPP_INTERNAL(tf_kind) == TPP_FILE_KIND_TEXT) \
	 ? ((tpp_file *)(self))                                \
	 : NULL)
#else /* TPP_HAVE_CPP_MACROS || TPP_HAVE_FILE_SUBTEXT || TPP_HAVE_FILE_DUMMY */
#define tpp_file_gettextfile(self) ((tpp_file *)(self))
#endif /* !TPP_HAVE_CPP_MACROS && !TPP_HAVE_FILE_SUBTEXT && !TPP_HAVE_FILE_DUMMY */
#endif /* !TPP_HAVE_INCLUDE_STACK */


/* Width of \t as reported by `tpp_file_getlcinfo()' */
#if TPP_TABSIZE >= 0
#define tpp_gettabsize() TPP_TABSIZE
#else /* TPP_TABSIZE >= 0 */
TPP_DECL tpp_column _tpp_tabsize; /* Internal API -- use getters/setters below */
#define tpp_gettabsize()  _tpp_tabsize
#define tpp_settabsize(v) (void)(_tpp_tabsize = (v))
#endif /* TPP_TABSIZE < 0 */


/* Update "self" according to text-data from [text,text+size) */
#if TPP_HAVE_UNICODE
TPP_DECL TPP_WUNUSED tpp_lcinfo TPPCALL
tpp_lcinfo_account_ex(tpp_lcinfo lc, tpp_char const *text,
                      tpp_size size, tpp_file_encoding enc);
#else /* TPP_HAVE_UNICODE */
TPP_DECL TPP_WUNUSED tpp_lcinfo TPPCALL
tpp_lcinfo_account(tpp_lcinfo lc, tpp_char const *text, tpp_size size);
#define tpp_lcinfo_account_ex(lc, text, size, enc) \
	tpp_lcinfo_account(lc, text, size)
#endif /* !TPP_HAVE_UNICODE */


/************************************************************************/
/* File: parts/macro.h                                                  */
/************************************************************************/

#if TPP_HAVE_CPP_MACROS

#define tpp_macro_kind uint_least8_t
#define TPP_MACRO_KIND_KEYWORD      UINT8_C(0)
#define TPP_MACRO_KIND_FUNC_PAREN   '('
#define TPP_MACRO_KIND_ISFUNC(kind) ((kind) != TPP_MACRO_KIND_KEYWORD)
#define TPP_MACRO_KIND_ASTOK(kind)  TPP_TOK_OFCHAR(kind)
#define TPP_MACRO_KIND_OFTOK(tok)   ((tpp_macro_kind)(unsigned int)(tok))
#if TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS
#define TPP_MACRO_KIND_FUNC_BRACKET '['
#define TPP_MACRO_KIND_FUNC_BRACE   '{'
#define TPP_MACRO_KIND_FUNC_ANGLE   '<'
#define TPP_MACRO_KIND_ASTOK_RPAREN(kind) ((kind) == '(' ? ')' : ((kind) == '[' ? ']' : ((kind) == '{' ? '}' : '>')))
#else /* TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS */
#define TPP_MACRO_KIND_ASTOK_RPAREN(kind) ')'
#endif /* !TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS */

#undef TPP_HAVE_MACRO_FLAGS
#if (TPP_HAVE_NAMED_VARARGS_IN_MACROS ||                   \
     TPP_HAVE_VA_ARGS_IN_MACROS ||                         \
     TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION) ||           \
     TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) || \
     TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE))
#define TPP_HAVE_MACRO_FLAGS 1
#else /* ... */
#define TPP_HAVE_MACRO_FLAGS 0
#endif /* !... */

#undef TPP_HAVE_MACRO_DATA_FUNC_N_VAOPT
#undef TPP_HAVE_MACRO_DATA_FUNC_N_VANARGS
#if (TPP_HAVE_VA_COMMA_IN_MACROS ||      \
     TPP_HAVE_VA_GLUE_COMMA_IN_MACROS || \
     TPP_HAVE_VA_OPT_IN_MACROS)
#define TPP_HAVE_MACRO_DATA_FUNC_N_VAOPT 1
#else /* ... */
#define TPP_HAVE_MACRO_DATA_FUNC_N_VAOPT 0
#endif /* !... */
#if TPP_HAVE_VA_NARGS_IN_MACROS
#define TPP_HAVE_MACRO_DATA_FUNC_N_VANARGS 1
#else /* ...*/
#define TPP_HAVE_MACRO_DATA_FUNC_N_VANARGS 0
#endif /* !...*/



#if TPP_HAVE_MACRO_FLAGS
#define tpp_macro_flag uint_least8_t /* Set of `TPP_MACRO_FLAG_*' */
#define TPP_MACRO_FLAG_NORMAL     UINT8_C(0x00) /* Normal flags */
#if TPP_HAVE_NAMED_VARARGS_IN_MACROS || TPP_HAVE_VA_ARGS_IN_MACROS
#define TPP_MACRO_FLAG_VARIADIC   UINT8_C(0x01) /* The last argument of the function is variadic. */
#endif /* TPP_HAVE_NAMED_VARARGS_IN_MACROS || TPP_HAVE_VA_ARGS_IN_MACROS */
#if TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#define TPP_MACRO_FLAG_KEEPARGSPC UINT8_C(0x02) /* When set, keep whitespace surrounding macro arguments during invocation.
                                                 * WARNING: Also affects recursive macro expansion. */
#endif /* TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION)
#define TPP_MACRO_FLAG_SELFEXPAND UINT8_C(0x04) /* After being expanded, this function is allowed to re-invoke itself and be expanded, when
                                                 * the generated text is not identical to a previous iteration. (s.a.: `-fmacro-recursion') */
#endif /* TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE)
#define TPP_MACRO_FLAG_MAGIC_WHITESPACE UINT8_C(0x08) /* Add extra whitespace during argument expansion when necessary */
#endif /* TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE) */
#endif /* TPP_HAVE_MACRO_FLAGS */


typedef struct tpp_macro_argument {
	tpp_token_id    TPP_INTERNAL(tma_id);      /* [const] (Keyword) token id associated with this argument name. */
	tpp_size        TPP_INTERNAL(tma_ins_exp); /* [const] Amount of times the argument is inserted after expansion. */
#if TPP_HAVE_STRINGIZE_MACRO_ARGUMENT || TPP_HAVE_CHARIZE_MACRO_ARGUMENT
	tpp_size        TPP_INTERNAL(tma_ins_str); /* [const] Amount of times the argument is inserted in its string-escaped form. */
#endif /* TPP_HAVE_STRINGIZE_MACRO_ARGUMENT || TPP_HAVE_CHARIZE_MACRO_ARGUMENT */
#if TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT || TPP_HAVE_GLUE_MACRO_ARGUMENT
	tpp_size        TPP_INTERNAL(tma_ins);     /* [const] Amount of times the argument is inserted without expansion. */
#endif /* TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT || TPP_HAVE_GLUE_MACRO_ARGUMENT */
} tpp_macro_argument;


/* Opcodes for function-tyle macro expansion */
#define tpp_macro_opcode tpp_size
enum {
	TPP_INTERNAL(TPP_MACRO_OPCODE_END),      /* +0  Expansion has finished */
	TPP_INTERNAL(TPP_MACRO_OPCODE_SKIP),     /* +1  Advance macro body template reader by ARG[0] bytes */
	TPP_INTERNAL(TPP_MACRO_OPCODE_COPY),     /* +1  Copy ARG[0] bytes from macro body template & advance reader */
	TPP_INTERNAL(TPP_MACRO_OPCODE_INS_EXP),  /* +2  Insert argument[ARG[0]] (expanded) and advance macro body template reader by ARG[1] bytes */
#if TPP_HAVE_STRINGIZE_MACRO_ARGUMENT
	TPP_INTERNAL(TPP_MACRO_OPCODE_INS_STR),  /* +2  Insert argument[ARG[0]] ("-escaped) and advance macro body template reader by ARG[1] bytes */
#endif /* TPP_HAVE_STRINGIZE_MACRO_ARGUMENT */
#if TPP_HAVE_CHARIZE_MACRO_ARGUMENT
	TPP_INTERNAL(TPP_MACRO_OPCODE_INS_CHR),  /* +2  Insert argument[ARG[0]] ('-escaped) and advance macro body template reader by ARG[1] bytes */
#endif /* TPP_HAVE_CHARIZE_MACRO_ARGUMENT */
#if TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT || TPP_HAVE_GLUE_MACRO_ARGUMENT
	TPP_INTERNAL(TPP_MACRO_OPCODE_INS),      /* +2  Insert argument[ARG[0]] (non-expanded) and advance macro body template reader by ARG[1] bytes */
#endif /* TPP_HAVE_DONT_EXPAND_MACRO_ARGUMENT || TPP_HAVE_GLUE_MACRO_ARGUMENT */
#if TPP_HAVE_VA_COMMA_IN_MACROS || TPP_HAVE_VA_GLUE_COMMA_IN_MACROS
	TPP_INTERNAL(TPP_MACRO_OPCODE_VA_COMMA), /* +1  TPP_MACRO_OPCODE_SKIP[ARG[0]]; If varargs are non-empty: insert a ','-character */
#endif /* TPP_HAVE_VA_COMMA_IN_MACROS || TPP_HAVE_VA_GLUE_COMMA_IN_MACROS */
#if TPP_HAVE_VA_OPT_IN_MACROS
	TPP_INTERNAL(TPP_MACRO_OPCODE_VA_OPT),   /* +3  TPP_MACRO_OPCODE_SKIP[ARG[0]]; If varargs are non-empty: TPP_MACRO_OPCODE_COPY[ARG[1]]; TPP_MACRO_OPCODE_SKIP[ARG[2]] */
#endif /* TPP_HAVE_VA_OPT_IN_MACROS */
#if TPP_HAVE_VA_NARGS_IN_MACROS
	TPP_INTERNAL(TPP_MACRO_OPCODE_VA_NARGS), /* +1  TPP_MACRO_OPCODE_SKIP[ARG[0]]; insert decimal token representing # of varargs (or "0" if there are no varargs) */
#endif /* TPP_HAVE_VA_NARGS_IN_MACROS */
};

struct tpp_keyword;
struct tpp_macro_argbuf; /* Opaque... */
typedef struct tpp_macro {
	tpp_refcnt          TPP_INTERNAL(tm_refcnt);     /* Reference count */
	tpp_macro_kind      TPP_INTERNAL(tm_kind);       /* [const] Macro kind (one of `TPP_MACRO_KIND_*') */
#if TPP_HAVE_MACRO_FLAGS
	tpp_macro_flag      TPP_INTERNAL(tm_flags);      /* [const] Macro flags (set of `TPP_MACRO_FLAG_*') */
#endif /* TPP_HAVE_MACRO_FLAGS */
	TPP_REF tpp_string *TPP_INTERNAL(tm_body_chunk); /* [0..1][const] Data-chunk containing the macro's body (or "NULL" if static or originating from file with "tf_chunk == NULL") */
	tpp_char const     *TPP_INTERNAL(tm_body_start); /* [1..1][const] Pointer to start of macro body */
	tpp_char const     *TPP_INTERNAL(tm_body_end);   /* [1..1][const] Pointer to end of macro body */
#if TPP_HAVE_UNICODE
	tpp_file_encoding   TPP_INTERNAL(tm_body_enc);   /* Encoding of body. */
#endif /* TPP_HAVE_UNICODE */
	tpp_size            TPP_INTERNAL(tm_expansions); /* The amount of existing expansions of this macro.
	                                                  * NOTE: Depending on the `TPP_MACRO_FLAG_SELFEXPAND' flag,
	                                                  *       this value may not be allowed to exceed one(1). */
	char const         *TPP_INTERNAL(tm_deffile);    /* [0..1][const] File in which this macro was defined (or "NULL" if unknown / custom definition) */
	tpp_lcinfo          TPP_INTERNAL(tm_deflc);      /* [const][valid_if(tm_deffile != NULL)] Macro name line/column (0-based) */
	tpp_lcinfo          TPP_INTERNAL(tm_body_lc);    /* [const][valid_if(tm_deffile != NULL)] Macro body line/column (0-based) */
	union {
		struct {
			tpp_size            TPP_INTERNAL(tmf_argc);       /* [const] Amount of arguments this macro-function takes */
			tpp_macro_argument *TPP_INTERNAL(tmf_argv);       /* [const][0..f_argc][owned] Vector of argument information (used for fast calculation of the expanded macro's size) */
			tpp_size            TPP_INTERNAL(tmf_expbase);    /* [const] Base size of macro expansion buffer (== (tm_body_end-tm_body_start) - <TOTAL_SPACE_FROM(TPP_MACRO_OPCODE_SKIP-like)>) */
#if TPP_HAVE_MACRO_DATA_FUNC_N_VAOPT
			tpp_size            TPP_INTERNAL(tmf_n_vaopt);    /* [const] Amount of extra bytes inserted when varargs are given (if: tpp_lexer_seekraw_rparen:OUT(*p_argc) > tmf_argc). */
#endif /* TPP_HAVE_MACRO_DATA_FUNC_N_VAOPT */
#if TPP_HAVE_MACRO_DATA_FUNC_N_VANARGS
			tpp_size            TPP_INTERNAL(tmf_n_vanargs);  /* [const] Amount of times `__VA_NARGS__' is used in `tmf_expand'. */
#endif /* TPP_HAVE_MACRO_DATA_FUNC_N_VANARGS*/
			struct tpp_macro_argbuf
			                   *TPP_INTERNAL(tmf_argbuf);     /* [0..1][owned] Internal cache used during macro expansion */
			tpp_macro_opcode    TPP_INTERNAL(tmf_expand)[TPP_FLEX_ARRAY]; /* [const][1..n] Sequence of `TPP_MACRO_OPCODE_*'-opcodes, together with their operands */
		} TPP_INTERNAL(tmd_func); /* [TPP_MACRO_KIND_ISFUNC(tm_kind)] */
	} TPP_INTERNAL(tm_data);
} tpp_macro;

#define _tpp_macro_sizeof_keyword() \
	tpp_offsetof(tpp_macro, TPP_INTERNAL(tm_data))
#define _tpp_macro_sizeof_function(expand_count)                                                      \
	(tpp_offsetof(tpp_macro, TPP_INTERNAL(tm_data).TPP_INTERNAL(tmd_func).TPP_INTERNAL(tmf_expand)) + \
	 ((expand_count) * sizeof(tpp_macro_opcode)))

#define _tpp_macro_alloc_keyword()                      ((tpp_macro *)tpp_malloc(_tpp_macro_sizeof_keyword()))
#define _tpp_macro_alloc_function(expand_count)         ((tpp_macro *)tpp_malloc(_tpp_macro_sizeof_function(expand_count)))
#define _tpp_macro_tryalloc_function(expand_count)      ((tpp_macro *)tpp_trymalloc(_tpp_macro_sizeof_function(expand_count)))
#define _tpp_macro_realloc_function(p, expand_count)    ((tpp_macro *)tpp_realloc(p, _tpp_macro_sizeof_function(expand_count)))
#define _tpp_macro_tryrealloc_function(p, expand_count) ((tpp_macro *)tpp_tryrealloc(p, _tpp_macro_sizeof_function(expand_count)))
#define _tpp_macro_free(p)                              tpp_free(p)

TPP_DECL TPP_NONNULL((1)) void TPPCALL tpp_macro_destroy(tpp_macro *tpp_restrict self);
#define tpp_macro_isshared(self) tpp_refcnt_isshared(&(self)->TPP_INTERNAL(tm_refcnt))
#define tpp_macro_incref(self)   tpp_refcnt_inc(&(self)->TPP_INTERNAL(tm_refcnt))
#define tpp_macro_decref(self)   (void)(tpp_refcnt_decfetch(&(self)->TPP_INTERNAL(tm_refcnt)) || (tpp_macro_destroy(self), 0))

#if TPP_HAVE_LEXER_COPY
/* Allocate+return a hard-copy of "self"
 * @return: NULL: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) TPP_REF tpp_macro *TPPCALL
tpp_macro_copy(tpp_macro const *tpp_restrict self);
#endif /* TPP_HAVE_LEXER_COPY */

#if TPP_HAVE_MACRO_EQUALS
/* Compare 2 macro definitions to see if they are identical. */
TPP_DECL TPP_PURECALL TPP_WUNUSED TPP_NONNULL((1, 2)) bool TPPCALL
tpp_macro_equals(tpp_macro const *lhs, tpp_macro const *rhs);
#endif /* TPP_HAVE_MACRO_EQUALS */

/* Public API */
#define tpp_macro_isfunction(self)     TPP_MACRO_KIND_ISFUNC((self)->TPP_INTERNAL(tm_kind))
#define tpp_macro_iskeyword(self)      (!tpp_macro_isfunction(self))
#define tpp_macro_getbodychunk(self)   ((self)->TPP_INTERNAL(tm_body_chunk))
#define tpp_macro_getbodystart(self)   ((self)->TPP_INTERNAL(tm_body_start))
#define tpp_macro_getbodyend(self)     ((self)->TPP_INTERNAL(tm_body_end))
#define tpp_macro_getbodysize(self)    ((tpp_size)(tpp_macro_getbodyend(self) - tpp_macro_getbodystart(self)))
#define tpp_macro_getdeffilename(self) ((self)->TPP_INTERNAL(tm_deffile))
#define tpp_macro_getdeflcinfo(self)   ((self)->TPP_INTERNAL(tm_deflc))
#define tpp_macro_getbodylcinfo(self)  ((self)->TPP_INTERNAL(tm_body_lc))
#if TPP_HAVE_UNICODE
#define tpp_macro_isbodyutf8(self)  TPP_FILE_ENCODING_ISUTF8((self)->TPP_INTERNAL(tm_body_enc))
#define tpp_macro_isbodyascii(self) TPP_FILE_ENCODING_ISASCII((self)->TPP_INTERNAL(tm_body_enc))
#else /* TPP_HAVE_UNICODE */
#define tpp_macro_isbodyutf8(self)  0
#define tpp_macro_isbodyascii(self) 1
#endif /* !TPP_HAVE_UNICODE */

/* The following all require the caller to ensure that `tpp_macro_isfunction(self)' */
#define tpp_macro_getfuncargc(self)      ((self)->TPP_INTERNAL(tm_data).TPP_INTERNAL(tmd_func).TPP_INTERNAL(tmf_argc))
#define tpp_macro_getfuncargtok(self, i) ((self)->TPP_INTERNAL(tm_data).TPP_INTERNAL(tmd_func).TPP_INTERNAL(tmf_argv)[i].TPP_INTERNAL(tma_id))
#define tpp_macro_getfunclparen(self)    TPP_MACRO_KIND_ASTOK((self)->TPP_INTERNAL(tm_kind))
#define tpp_macro_getfuncrparen(self)    TPP_MACRO_KIND_ASTOK_RPAREN((self)->TPP_INTERNAL(tm_kind))
#if TPP_HAVE_NAMED_VARARGS_IN_MACROS || TPP_HAVE_VA_ARGS_IN_MACROS
#define tpp_macro_isvarargs(self) ((self)->TPP_INTERNAL(tm_flags) & TPP_MACRO_FLAG_VARIADIC)
#else /* TPP_HAVE_NAMED_VARARGS_IN_MACROS || TPP_HAVE_VA_ARGS_IN_MACROS */
#define tpp_macro_isvarargs(self) 0
#endif /* !TPP_HAVE_NAMED_VARARGS_IN_MACROS && !TPP_HAVE_VA_ARGS_IN_MACROS */
#if TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#define tpp_macro_keepsargspc(self) ((self)->TPP_INTERNAL(tm_flags) & TPP_MACRO_FLAG_KEEPARGSPC)
#else /* TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#define tpp_macro_keepsargspc(self) (TPP_HAVE_MACRO_ARGUMENT_WHITESPACE != 0)
#endif /* !TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION)
#define tpp_macro_allowsselfexpansion(self) ((self)->TPP_INTERNAL(tm_flags) & TPP_MACRO_FLAG_SELFEXPAND)
#else /* TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION) */
#define tpp_macro_allowsselfexpansion(self) (TPP_HAVE_MACRO_RECURSION != 0)
#endif /* !TPP_CONF_IS_RT(TPP_HAVE_MACRO_RECURSION) */
#if TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE)
#define tpp_macro_hasmagicwhitespace(self) ((self)->TPP_INTERNAL(tm_flags) & TPP_MACRO_FLAG_MAGIC_WHITESPACE)
#else /* TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE) */
#define tpp_macro_hasmagicwhitespace(self) (TPP_HAVE_MAGIC_WHITESPACE != 0)
#endif /* !TPP_CONF_IS_RT(TPP_HAVE_MAGIC_WHITESPACE) */





typedef struct tpp_builtin_macro {
	tpp_size TPP_INTERNAL(tbm_body_size);            /* Length of "tbm_body" (in characters; excluding trailing NUL) */
	tpp_char TPP_INTERNAL(tbm_body)[TPP_FLEX_ARRAY]; /* [tbm_body_size] Body text (followed by a trailing NUL) */
} tpp_builtin_macro;

#define TPP_BUILTIN_MACRO_DEFINE(name, value)                      \
	struct name##_struct {                                         \
		tpp_size TPP_INTERNAL(tbm_body_size);                      \
		char TPP_INTERNAL(tbm_body)[sizeof(value) / sizeof(char)]; \
	} const name = {                                               \
		/* .tbm_body_size = */ (sizeof(value) / sizeof(char)) - 1, \
		/* .tbm_body      = */ value,                              \
	}

#define tpp_builtin_macro_getbody(self) ((self)->TPP_INTERNAL(tbm_body))
#define tpp_builtin_macro_getsize(self) ((self)->TPP_INTERNAL(tbm_body_size))

/* Return the hard-coded expansion of the builtin macro linked to "id".
 * If "id" isn't a builtin keyword, or that keyword doesn't specify a
 * value for "TPP_BUILTIN_MACRO()", return "NULL" instead. */
TPP_DECL TPP_CONSTCALL TPP_WUNUSED tpp_builtin_macro const *TPPCALL
tpp_macro_getbuiltin(tpp_token_id id);

#endif /* TPP_HAVE_CPP_MACROS */

/************************************************************************/
/* File: parts/keyword.h                                                */
/************************************************************************/

#if TPP_HAVE_PRAGMA_PUSH_MACRO
struct tpp_macro;
typedef struct tpp_macro_pushent {
	TPP_REF struct tpp_macro *TPP_INTERNAL(tmpe_macro); /* [0..1] The macro that was pushed, or "NULL" if not defined at the time. */
	tpp_size                  TPP_INTERNAL(tmpe_count); /* # of times that `tmpe_macro' was pushed without the macro actually having changed */
} tpp_macro_pushent;

typedef struct tpp_macro_pushstack {
	tpp_size           TPP_INTERNAL(tmps_cnt); /* # of elements on `tmps_vec' */
	tpp_macro_pushent *TPP_INTERNAL(tmps_vec); /* [0..tmps_vec][owned] Vector of pushed macros (push_macro appends at the end; pop_macro takes from the end) */
} tpp_macro_pushstack;

/* Initialize/finalize a given macro-push stack */
#define tpp_macro_pushstack_init(self)         \
	(void)((self)->TPP_INTERNAL(tmps_cnt) = 0, \
	       (self)->TPP_INTERNAL(tmps_vec) = NULL)
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_macro_pushstack_fini(tpp_macro_pushstack *tpp_restrict self);
#if TPP_HAVE_LEXER_COPY
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_macro_pushstack_copy(tpp_macro_pushstack *tpp_restrict self,
                         tpp_macro_pushstack const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

/* Allocate space for- and return a new (uninitialized) macro-push entry
 * @return: * :   The newly allocated macro-push entry.
 * @return: NULL: Out-of-memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_macro_pushent *TPPCALL
tpp_macro_pushstack_append(tpp_macro_pushstack *tpp_restrict self);
#endif /* TPP_HAVE_PRAGMA_PUSH_MACRO */

#undef TPP_HAVE_KEYWORD_FLAGS
#if (TPP_HAVE_PRAGMA_ONCE ||                          \
     TPP_HAVE_CPP_IMPORT ||                           \
     TPP_HAVE_CLANG_MACRO___has_attribute ||          \
     TPP_HAVE_CLANG_MACRO___has_builtin ||            \
     TPP_HAVE_CLANG_MACRO___has_cpp_attribute ||      \
     TPP_HAVE_CLANG_MACRO___has_declspec_attribute || \
     TPP_HAVE_CLANG_MACRO___has_extension ||          \
     TPP_HAVE_CLANG_MACRO___has_feature ||            \
     TPP_HAVE_CLANG_MACRO___has_c_attribute ||        \
     TPP_HAVE_MACRO___is_deprecated ||                \
     TPP_HAVE_MACRO___is_poisoned ||                  \
     TPP_HAVE_PRAGMA_DEPRECATED ||                    \
     TPP_HAVE_PRAGMA_GCC_POISON ||                    \
     TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS)
#define TPP_HAVE_KEYWORD_FLAGS 1
#else /* ... */
#define TPP_HAVE_KEYWORD_FLAGS 0
#endif /* !... */

#undef TPP_HAVE_KEYWORD_MISC
#if (TPP_HAVE_KEYWORD_FLAGS ||         \
     TPP_HAVE_CPP_ASSERT ||            \
     TPP_HAVE_IFNDEF_INCLUDE_GUARDS || \
     TPP_HAVE_KEYWORD_INCLCOUNT ||     \
     TPP_HAVE_PRAGMA_PUSH_MACRO ||     \
     TPP_HAVE_MACRO___TPP_COUNTER ||   \
     TPP_HAVE_KEYWORD_USERDATA)
#define TPP_HAVE_KEYWORD_MISC 1
#else /* ... */
#define TPP_HAVE_KEYWORD_MISC 0
#endif /* !... */



#if TPP_HAVE_KEYWORD_MISC

/* Keyword flags... */
#if TPP_HAVE_KEYWORD_FLAGS
#define tpp_keyword_flags uint_least32_t /* Set of `TPP_KEYWORD_FLAG_*' */
#define TPP_KEYWORD_FLAG_NORMAL                 UINT32_C(0x00000000) /* Normal flags */
#if TPP_HAVE_CLANG_MACRO___has_attribute
#define TPP_KEYWORD_FLAG_HAS_ATTRIBUTE          UINT32_C(0x00000001) /* `__has_attribute()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_attribute */
#if TPP_HAVE_CLANG_MACRO___has_builtin
#define TPP_KEYWORD_FLAG_HAS_BUILTIN            UINT32_C(0x00000002) /* `__has_builtin()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_builtin */
#if TPP_HAVE_CLANG_MACRO___has_cpp_attribute
#define TPP_KEYWORD_FLAG_HAS_CPP_ATTRIBUTE      UINT32_C(0x00000004) /* `__has_cpp_attribute()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_cpp_attribute */
#if TPP_HAVE_CLANG_MACRO___has_declspec_attribute
#define TPP_KEYWORD_FLAG_HAS_DECLSPEC_ATTRIBUTE UINT32_C(0x00000008) /* `__has_declspec_attribute()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_declspec_attribute */
#if TPP_HAVE_CLANG_MACRO___has_extension
#define TPP_KEYWORD_FLAG_HAS_EXTENSION          UINT32_C(0x00000010) /* `__has_extension()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_extension */
#if TPP_HAVE_CLANG_MACRO___has_feature
#define TPP_KEYWORD_FLAG_HAS_FEATURE            UINT32_C(0x00000020) /* `__has_feature()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_feature */
#if TPP_HAVE_PRAGMA_DEPRECATED || TPP_HAVE_MACRO___is_deprecated
#define TPP_KEYWORD_FLAG_IS_DEPRECATED          UINT32_C(0x00000040) /* Warn when the keyword appears as the result of lexical processing. */
#endif /* TPP_HAVE_PRAGMA_DEPRECATED || TPP_HAVE_MACRO___is_deprecated */
#if TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS
#define TPP_KEYWORD_FLAG_USERMASK               UINT32_C(0x0000007f) /* Set of flags modifiable through `#pragma tpp_set_keyword_flags()'. */
#endif /* TPP_HAVE_PRAGMA_TPP_SET_KEYWORD_FLAGS */
#if TPP_HAVE_PRAGMA_GCC_POISON || TPP_HAVE_MACRO___is_poisoned
#define TPP_KEYWORD_FLAG_IS_POISONED            UINT32_C(0x00000080) /* Extension for `TPP_KEYWORD_FLAG_IS_DEPRECATED':
                                                                      * Don't emit a warning if the keyword is used inside of a macro.
                                                                      * -> Only warn if it is used from a text file. */
#endif /* TPP_HAVE_PRAGMA_GCC_POISON || TPP_HAVE_MACRO___is_poisoned */
#if TPP_HAVE_CLANG_MACRO___has_c_attribute
#define TPP_KEYWORD_FLAG_HAS_C_ATTRIBUTE        UINT32_C(0x00000100) /* `__has_c_attribute()' */
#endif /* TPP_HAVE_CLANG_MACRO___has_c_attribute */
#if TPP_HAVE_CPP_IMPORT
#define TPP_KEYWORD_FLAG_HDR_IMPORTED           UINT32_C(0x20000000) /* Set after this header was `#import'-ed */
#endif /* TPP_HAVE_CPP_IMPORT */
#if TPP_HAVE_PRAGMA_ONCE
#define TPP_KEYWORD_FLAG_HDR_ONCE               UINT32_C(0x40000000) /* Set after `#pragma once' was encountered */
#endif /* TPP_HAVE_PRAGMA_ONCE */
#if TPP_HAVE_IFNDEF_INCLUDE_GUARDS
#define TPP_KEYWORD_FLAG_HDR_GUARD_VALID        UINT32_C(0x80000000) /* The configured "tkm_file_guard" is valid and should be used
                                                                      * (Set when the file is removed from the #include-stack with
                                                                      * its #ifdef-stack empty, and "tkm_file_guard != NULL") */
#endif /* TPP_HAVE_IFNDEF_INCLUDE_GUARDS */
#endif /* TPP_HAVE_KEYWORD_FLAGS */

struct tpp_keyword;

#if TPP_HAVE_CPP_ASSERT
typedef struct tpp_assertion {
	struct tpp_keyword const *TPP_INTERNAL(tas_value); /* [0..1] Assertion value, or "NULL" if entry is unused */
} tpp_assertion;

typedef struct tpp_assertions {
	tpp_size       TPP_INTERNAL(tass_assc); /* Amount of assertions made. */
	tpp_hash       TPP_INTERNAL(tass_bckm); /* Allocated bucket mask. */
	tpp_assertion *TPP_INTERNAL(tass_bckv); /* [0..tass_bckm+1][owned] Hash-map of assertions */
} tpp_assertions;

#define tpp_assertions_init(self)               \
	(void)((self)->TPP_INTERNAL(tass_assc) = 0, \
	       (self)->TPP_INTERNAL(tass_bckm) = 0, \
	       (self)->TPP_INTERNAL(tass_bckv) = NULL)
#define tpp_assertions_fini(self)               \
	(tpp_free((self)->TPP_INTERNAL(tass_bckv)), \
	 tpp_dbg_memset(self, sizeof(tpp_assertions)))

/* Return the # of assertions made */
#define tpp_assertions_getcount(self) \
	((self)->TPP_INTERNAL(tass_assc))

/* Check if *any* keywords have been asserted within the given assertion-set "self" */
#define tpp_assertions_containsany(self) \
	((self)->TPP_INTERNAL(tass_assc) != 0)

/* Delete *all* assertions made within "self" */
#define tpp_assertions_unassertall(self) \
	(void)(tpp_assertions_fini(self),    \
	       tpp_assertions_init(self))

#if TPP_HAVE_LEXER_COPY
/* Copy the given set of assertions
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_assertions_copy(tpp_assertions *tpp_restrict self,
                    tpp_assertions const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

/* Check if a given "value" is being asserted by "self" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) bool TPPCALL
tpp_assertions_contains(tpp_assertions const *tpp_restrict self,
                        struct tpp_keyword const *tpp_restrict value);

/* Assert a given "value" within "self".
 * @return: TPP_EOK:    Assertion was added
 * @return: TPP_ENOENT: Assertion was already added before (SOFT_ERROR)
 * @return: TPP_ENOMEM: Out of memory (HARD_ERROR) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_assertions_assert(tpp_assertions *tpp_restrict self,
                      struct tpp_keyword const *tpp_restrict value);

/* Unassert a given "value" within "self".
 * @return: true:  Assertion was removed
 * @return: false: Assertion didn't exist in the first place */
TPP_DECL TPP_NONNULL((1, 2)) bool TPPCALL
tpp_assertions_unassert(tpp_assertions *tpp_restrict self,
                        struct tpp_keyword const *tpp_restrict value);
#endif /* TPP_HAVE_CPP_ASSERT */


typedef struct tpp_keyword_misc {
#if TPP_HAVE_KEYWORD_FLAGS
	tpp_keyword_flags TPP_INTERNAL(tkm_flags); /* Set of `TPP_KEYWORD_FLAG_*' */
#define _tpp_keyword_misc_init_flags(self) , (self)->TPP_INTERNAL(tkm_flags) = TPP_KEYWORD_FLAG_NORMAL
#else /* TPP_HAVE_KEYWORD_FLAGS */
#define _tpp_keyword_misc_init_flags(self) /* nothing */
#endif /* !TPP_HAVE_KEYWORD_FLAGS */
#if TPP_HAVE_CPP_ASSERT
	tpp_assertions TPP_INTERNAL(tkm_assertions); /* Assertions made for the associated keyword */
#define _tpp_keyword_misc_init_assertions(self) , tpp_assertions_init(&(self)->TPP_INTERNAL(tkm_assertions))
#else /* TPP_HAVE_CPP_ASSERT */
#define _tpp_keyword_misc_init_assertions(self) /* nothing */
#endif /* !TPP_HAVE_CPP_ASSERT */
#if TPP_HAVE_IFNDEF_INCLUDE_GUARDS
	struct tpp_keyword const *TPP_INTERNAL(tkm_file_guard); /* [0..1] Name of the #include guard for this file, or NULL if unknown. */
#define _tpp_keyword_misc_init_file_guard(self) , (self)->TPP_INTERNAL(tkm_file_guard) = NULL
#else /* TPP_HAVE_IFNDEF_INCLUDE_GUARDS */
#define _tpp_keyword_misc_init_file_guard(self) /* nothing */
#endif /* !TPP_HAVE_IFNDEF_INCLUDE_GUARDS */
#if TPP_HAVE_KEYWORD_INCLCOUNT
	tpp_size TPP_INTERNAL(tkm_file_inclcount); /* # of times that this file exists on the #include-stack (or "TPP_SIZE_MAX" if unknown) */
#define _tpp_keyword_misc_init_file_inclcount(self) , (self)->TPP_INTERNAL(tkm_file_inclcount) = TPP_SIZE_MAX
#else /* TPP_HAVE_KEYWORD_INCLCOUNT */
#define _tpp_keyword_misc_init_file_inclcount(self) /* nothing */
#endif /* !TPP_HAVE_KEYWORD_INCLCOUNT */
#if TPP_HAVE_PRAGMA_PUSH_MACRO
	tpp_macro_pushstack TPP_INTERNAL(tkm_macro_pushstack); /* For `#pragma push_macro()' */
#define _tpp_keyword_misc_init_macro_pushstack(self) , tpp_macro_pushstack_init(&(self)->TPP_INTERNAL(tkm_macro_pushstack))
#else /* TPP_HAVE_PRAGMA_PUSH_MACRO */
#define _tpp_keyword_misc_init_macro_pushstack(self) /* nothing */
#endif /* !TPP_HAVE_PRAGMA_PUSH_MACRO */
#if TPP_HAVE_MACRO___TPP_COUNTER
	tpp_counter TPP_INTERNAL(tkm_builtin_counter); /* Next value for __TPP_COUNTER */
#define _tpp_keyword_misc_init_builtin_counter(self) , (self)->TPP_INTERNAL(tkm_builtin_counter) = 0
#else /* TPP_HAVE_MACRO___TPP_COUNTER */
#define _tpp_keyword_misc_init_builtin_counter(self) /* nothing */
#endif /* !TPP_HAVE_MACRO___TPP_COUNTER */
#if TPP_HAVE_KEYWORD_USERDATA
	void          *TPP_INTERNAL(tkm_userdata_ptr); /* [?..?] User-data pointer (initialize to "NULL") */
	void (TPPCALL *TPP_INTERNAL(tkm_userdata_dtor))(void *ptr); /* [0..1] Optional finalizer for user-data */
#define tpp_keyword_misc_setuserdata(self, ptr, dtor) \
	(void)((self)->tkm_userdata_ptr  = (ptr),         \
	       (self)->tkm_userdata_dtor = (dtor))
#define tpp_keyword_misc_getuserdata(self)      ((self)->tkm_userdata_ptr)
#define tpp_keyword_misc_getuserdata_dtor(self) ((self)->tkm_userdata_dtor)
#define _tpp_keyword_misc_init_userdata(self)   , (self)->TPP_INTERNAL(tkm_userdata_ptr) = NULL, (self)->TPP_INTERNAL(tkm_userdata_dtor) = NULL
#else /* TPP_HAVE_KEYWORD_USERDATA */
#define tpp_keyword_misc_getuserdata(self)      ((void *)NULL)
#define tpp_keyword_misc_getuserdata_dtor(self) ((void (TPPCALL *)(void *))NULL)
#define _tpp_keyword_misc_init_userdata(self)   /* nothing */
#endif /* !TPP_HAVE_KEYWORD_USERDATA */
} tpp_keyword_misc;

#define _tpp_keyword_misc_init(self)                    \
	(void)((void)0 _tpp_keyword_misc_init_flags(self)   \
	       _tpp_keyword_misc_init_assertions(self)      \
	       _tpp_keyword_misc_init_file_guard(self)      \
	       _tpp_keyword_misc_init_file_inclcount(self)  \
	       _tpp_keyword_misc_init_macro_pushstack(self) \
	       _tpp_keyword_misc_init_builtin_counter(self) \
	       _tpp_keyword_misc_init_userdata(self))
#define _tpp_keyword_misc_alloc()    ((tpp_keyword_misc *)tpp_malloc(sizeof(tpp_keyword_misc)))
#define _tpp_keyword_misc_tryalloc() ((tpp_keyword_misc *)tpp_trymalloc(sizeof(tpp_keyword_misc)))
#define _tpp_keyword_misc_free(p)    tpp_free(p)
#endif /* TPP_HAVE_KEYWORD_MISC */


#if TPP_HAVE_CPP_MACROS
struct tpp_macro;
#endif /* TPP_HAVE_CPP_MACROS */

#undef TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS
typedef struct tpp_keyword {
	tpp_token_id              TPP_INTERNAL(tk_id);                  /* [const] Keyword ID */
	struct tpp_keyword       *TPP_INTERNAL(tk_next);                /* [0..1] Next keyword with a similar hash */
#if TPP_HAVE_CPP_MACROS
	TPP_REF struct tpp_macro *TPP_INTERNAL(tk_macro);               /* [0..1][const_if(IS_BUILTIN)] Macro definition */
#define TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS 1
#endif /* TPP_HAVE_CPP_MACROS */
#if TPP_HAVE_KEYWORD_MISC
	tpp_keyword_misc         *TPP_INTERNAL(tk_misc);                /* [0..1][const_if(IS_BUILTIN)][owned] Misc. keyword data (lazily allocated) */
#define TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS 1
#endif /* TPP_HAVE_KEYWORD_MISC */
	tpp_hash                  TPP_INTERNAL(tk_hash);                /* [const] Hash for `tk_kwd' */
#if TPP_HAVE_KEYWORD_ASSTRING
	tpp_refcnt_atomic         TPP_INTERNAL(tk_refcnt);              /* Keyword reference count (for binary compatibility with "tpp_string") */
#endif /* TPP_HAVE_KEYWORD_ASSTRING */
	tpp_size                  TPP_INTERNAL(tk_len);                 /* [const] # of bytes (char-s) in `tk_kwd' (excluding trailing \0) */
	tpp_char                  TPP_INTERNAL(tk_kwd)[TPP_FLEX_ARRAY]; /* [const][tk_len] Keyword string (in input encoding; \0-terminated; never contains \-escaped linefeeds) */
/*	tpp_char                  TPP_INTERNAL(tk_nul);                  * [const][== 0] Ensure ZERO-termination of the keyword name. */
} tpp_keyword;

#if TPP_HAVE_USER_KEYWORDS
#define tpp_keyword_sizeof(len) \
	(tpp_offsetof(tpp_keyword, TPP_INTERNAL(tk_kwd)) + ((len) + 1) * sizeof(tpp_char))
#define _tpp_keyword_alloc(len)         ((tpp_keyword *)tpp_malloc(tpp_keyword_sizeof(len)))
#define _tpp_keyword_tryalloc(len)      ((tpp_keyword *)tpp_trymalloc(tpp_keyword_sizeof(len)))
#define _tpp_keyword_realloc(p, len)    ((tpp_keyword *)tpp_realloc(p, tpp_keyword_sizeof(len)))
#define _tpp_keyword_tryrealloc(p, len) ((tpp_keyword *)tpp_tryrealloc(p, tpp_keyword_sizeof(len)))
#define _tpp_keyword_free(p)            tpp_free(p)
#endif /* TPP_HAVE_USER_KEYWORDS */

/* When true, there are certain actions that require builtin keywords
 * to be copied into the current lexer's keyword table. These include
 * user-defined macros (with built-in identifiers as names), as well
 * as any other "misc"-related, custom data being assigned to keywords */
#ifndef TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS
#define TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS 0
#endif /* !TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS */

/* Use this macro for comparing keywords instead of doing "a == b"
 * We need to compare the IDs of keywords, since builtin keywords
 * may need to be copied into the current lexer's `tpp_keywords'
 * if `tk_macro' or `tk_misc' need to be modified */
#if TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS
#define tpp_keyword_equals(a, b) ((a)->TPP_INTERNAL(tk_id) == (b)->TPP_INTERNAL(tk_id))
#else /* TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS */
#define tpp_keyword_equals(a, b) ((a) == (b))
#endif /* !TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS */

/* Public API for accessing "tpp_keyword" internals */
#define tpp_keyword_isuser(self)    TPP_TOK_ISUSERKEYWORD((self)->TPP_INTERNAL(tk_id))
#define tpp_keyword_isbuiltin(self) (!tpp_keyword_isuser(self))
#define tpp_keyword_getid(self)     ((self)->TPP_INTERNAL(tk_id))
#define tpp_keyword_getstr(self)    ((self)->TPP_INTERNAL(tk_kwd))
#define tpp_keyword_getcstr(self)   ((char const *)(self)->TPP_INTERNAL(tk_kwd))
#define tpp_keyword_getlen(self)    ((self)->TPP_INTERNAL(tk_len))
#define tpp_keyword_gethash(self)   ((self)->TPP_INTERNAL(tk_hash))
#if TPP_HAVE_CPP_MACROS
#define tpp_keyword_getmacro(self)  ((self)->TPP_INTERNAL(tk_macro))
#endif /* TPP_HAVE_CPP_MACROS */

/* Check if "self" matches the C, constant string literal "STR" */
#define tpp_keyword_equals_conststr(self, STR)                       \
	(tpp_keyword_getlen(self) == (sizeof(STR) / sizeof(char)) - 1 && \
	 tpp_memcmp(tpp_keyword_getstr(self), STR, sizeof(STR) - sizeof(char)) == 0)

/* Check if "self" matches "str...+=len" */
#define tpp_keyword_equals_str(self, /*tpp_char const **/ str, len) \
	(tpp_keyword_getlen(self) == (len) &&                           \
	 tpp_memcmp(tpp_keyword_getstr(self), str, (len) * sizeof(char)) == 0)

/* Check if "self" matches "cstr...+=len" */
#define tpp_keyword_equals_cstr(self, /*char const **/ cstr, len) \
	tpp_keyword_equals_str(self, (tpp_char const *)(cstr), len)


/* Convert back-and-forth between keywords and strings */
#if TPP_HAVE_KEYWORD_ASSTRING
#define _TPP_KEYWORD_STRING_ABI_START TPP_INTERNAL(tk_refcnt)
#define tpp_keyword_asstring(self) ((tpp_string *)&(self)->_TPP_KEYWORD_STRING_ABI_START)
#define tpp_string_askeyword(self) ((tpp_keyword *)((char *)(self) - tpp_offsetof(tpp_keyword, _TPP_KEYWORD_STRING_ABI_START)))
#endif /* TPP_HAVE_KEYWORD_ASSTRING */

#if TPP_HAVE_KEYWORD_USERDATA
/* Get the user-data pointer for "self"
 * @return: NULL: No pointer set, or set pointer is "NULL" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) void *TPPCALL
tpp_keyword_getuserdata(tpp_keyword const *tpp_restrict self);

/* Set the user-data pointer for "self"
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_keyword_setuserdata(tpp_keyword *tpp_restrict self,
                        void *ptr, void (TPPCALL *dtor)(void *ptr));
#endif /* TPP_HAVE_KEYWORD_USERDATA */

#if TPP_HAVE_PRAGMA_PUSH_MACRO
/* Push the current macro-definition of "self"
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_keyword_pushmacro(tpp_keyword *tpp_restrict self);

/* Pop the current macro-definition of "self"
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOENT: Macro-push-stack was already empty (soft-error) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_keyword_popmacro(tpp_keyword *tpp_restrict self);
#endif /* TPP_HAVE_PRAGMA_PUSH_MACRO */

#if TPP_HAVE_CPP_MACROS
/* Check if "tpp_keyword_undef()" can be invoked on "self" */
#define tpp_keyword_canundef(self) \
	(tpp_keyword_getmacro(self) != NULL)

/* Delete the macro definition of `self'.
 * The caller must ensure that `tpp_keyword_canundef(self)' */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keyword_undef(tpp_keyword *tpp_restrict self);
#else /* TPP_HAVE_CPP_MACROS */
#define tpp_keyword_canundef(self) 0
#endif /* !TPP_HAVE_CPP_MACROS */


#if TPP_HAVE_IFNDEF_INCLUDE_GUARDS
/* Return the keyword registered as #ifndef-guard of
 * the given (should-be) filename-keyword "self"
 *
 * If no keyword has been registered for this purpose,
 * return "NULL" instead. */
#define tpp_keyword_get_file_guard(self)                           \
	((self)->TPP_INTERNAL(tk_misc)                                 \
	 ? (self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_file_guard) \
	 : NULL)

/* Set the keyword registered as #ifndef-guard of
 * the given (should-be) filename-keyword "self"
 *
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_keyword_set_file_guard(tpp_keyword *self, tpp_keyword const *guard);
#endif /* TPP_HAVE_IFNDEF_INCLUDE_GUARDS */



#if TPP_HAVE_MACRO___TPP_COUNTER
/* Return the next value that will be returned by __TPP_COUNTER() for this keyword */
#define tpp_keyword_get_builtin_counter(self)                           \
	((self)->TPP_INTERNAL(tk_misc)                                      \
	 ? (self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_builtin_counter) \
	 : 0)

/* Reset the counter such that `tpp_keyword_get_builtin_counter()' returns `0' */
#define tpp_keyword_reset_builtin_counter(self)                                     \
	((self)->TPP_INTERNAL(tk_misc)                                                  \
	 ? (void)((self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_builtin_counter) = 0) \
	 : (void)0)

/* Fetch+increment the __TPP_COUNTER() value of this keyword
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_keyword_inc_builtin_counter(tpp_keyword *tpp_restrict self,
                                tpp_counter *tpp_restrict p_result);
#else /* TPP_HAVE_MACRO___TPP_COUNTER */
#define tpp_keyword_get_builtin_counter(self)   0
#define tpp_keyword_reset_builtin_counter(self) (void)0
#endif /* !TPP_HAVE_MACRO___TPP_COUNTER */



#if TPP_HAVE_KEYWORD_FLAGS
/* Return the flags (set of `TPP_KEYWORD_FLAG_*') linked to "self" */
#define tpp_keyword_getflags(self)                            \
	((self)->TPP_INTERNAL(tk_misc)                            \
	 ? (self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_flags) \
	 : TPP_KEYWORD_FLAG_NORMAL)

/* Set the flags (set of `TPP_KEYWORD_FLAG_*') linked to "self"
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_keyword_setflags(tpp_keyword *tpp_restrict self,
                     tpp_keyword_flags flags);
#endif /* TPP_HAVE_KEYWORD_FLAGS */



#if TPP_HAVE_CPP_ASSERT
/* Return the # of assertions made */
#define tpp_keyword_getassertcount(self) \
	((self)->TPP_INTERNAL(tk_misc) ? tpp_assertions_getcount((self)->TPP_INTERNAL(tk_misc)) : 0)

/* Check if *any* keywords have been asserted within the given assertion-set "self" */
#define tpp_keyword_containsanyassert(self) \
	((self)->TPP_INTERNAL(tk_misc) && tpp_assertions_containsany(&(self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_assertions)))

/* Delete *all* assertions made within "self" */
#define tpp_keyword_unassertall(self)                                                           \
	((self)->TPP_INTERNAL(tk_misc)                                                              \
	 ? tpp_assertions_unassertall(&(self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_assertions)) \
	 : (void)0)

/* Check if a given "value" is being asserted by "self" */
#define tpp_keyword_containsassert(self, value) \
	((self)->TPP_INTERNAL(tk_misc) && tpp_assertions_contains(&(self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_assertions), value))

/* Assert a given "value" within "self".
 * @return: TPP_EOK:    Assertion was added
 * @return: TPP_ENOENT: Assertion was already added before (SOFT_ERROR)
 * @return: TPP_ENOMEM: Out of memory (HARD_ERROR) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_keyword_addassert(tpp_keyword *self, tpp_keyword const *value);

/* Unassert a given "value" within "self".
 * @return: true:  Assertion was removed
 * @return: false: Assertion didn't exist in the first place */
#define tpp_keyword_unassert(self, value) \
	((self)->TPP_INTERNAL(tk_misc) && tpp_assertions_unassert(&(self)->TPP_INTERNAL(tk_misc)->TPP_INTERNAL(tkm_assertions), value))
#else /* TPP_HAVE_CPP_ASSERT */
#define tpp_keyword_getassertcount(self)        0
#define tpp_keyword_containsanyassert(self)     false
#define tpp_keyword_unassertall(self)           (void)0
#define tpp_keyword_containsassert(self, value) false
#define tpp_keyword_unassert(self, value)       false
#endif /* !TPP_HAVE_CPP_ASSERT */



/* Calculate the hash of a given keyword string */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_hash TPPCALL
tpp_hashof(tpp_char const *tpp_restrict kwd, tpp_size len);

/* Initial hash value */
#define TPP_HASH_INITIAL TPP_HASH_C(1)

/* >> tpp_hash tpp_hash_combine_char(tpp_hash a, tpp_char b);
 * Combine a given hash value "a" with a character "b". */
#define tpp_hash_combine_char(a, b) ((a) * 263 + (tpp_char)(b))

/* >> tpp_hash tpp_hash_combine_hash(tpp_hash a, tpp_hash b);
 * Combine a given hash value "a" with another hash value "b". */
#define tpp_hash_combine_hash(a, b) ((a) * 263 + (tpp_hash)(b))


#undef TPP_HAVE_BSE_FILE_PARAM
#if TPP_HAVE_BSE && TPP_HAVE_UNICODE
#define TPP_HAVE_BSE_FILE_PARAM 1
#define tpp_bse_file__PARAM  , tpp_file const *tpp_restrict file
#define tpp_bse_file__ARG(x) , x
#else /* TPP_HAVE_BSE && TPP_HAVE_UNICODE */
#define TPP_HAVE_BSE_FILE_PARAM 0
#define tpp_bse_file__PARAM  /* nothing */
#define tpp_bse_file__ARG(x) /* nothing */
#endif /* !TPP_HAVE_BSE || !TPP_HAVE_UNICODE */

#if ((TPP_HAVE_BSE && TPP_HAVE_UNICODE) ||                                       \
     (TPP_HAVE_IDENTIFIER_ESCAPE_NAMED && (TPP_HAVE_DECODE_NAMED_ESCAPE_LEXER_PARAM || \
                                           TPP_CONF_IS_RT(TPP_HAVE_TRIGRAPHS))))
struct tpp_lexer;
#define tpp_esc_lexer__PARAM  , struct tpp_lexer const *tpp_restrict lexer
#define tpp_esc_lexer__ARG(x) , x
#else /* ... */
#define tpp_esc_lexer__PARAM  /* nothing */
#define tpp_esc_lexer__ARG(x) /* nothing */
#endif /* !... */


/* Check if "ch" may be the first byte of a \-character */
#if TPP_HAVE_TRIGRAPHS
#define _tpp_maybe_isbackslash(ch) ((ch) == '\\' || (ch) == '?') /* ?: because "??/" maps to "\" */
#else /* TPP_HAVE_TRIGRAPHS */
#define _tpp_maybe_isbackslash(ch) ((ch) == '\\')
#endif /* !TPP_HAVE_TRIGRAPHS */

/* Check if "ch" may be the first byte of a LF-style character */
#if TPP_HAVE_UNICODE
#define _tpp_maybe_islf(ch) tpp_ascii_islf_or_mblf(ch)
#else /* TPP_HAVE_UNICODE */
#define _tpp_maybe_islf(ch) tpp_ascii_islf(ch)
#endif /* !TPP_HAVE_UNICODE */

/* Helper macros to skip over BSE when parsing already-loaded text.
 * tpp_skipbse_fwd: If "pos" points at a \-character, skip forward until end of BSE (if it is one)
 * tpp_skipbse_bck: If "pos" points after a line-feed character, skip backward until start of BSE (if it is one) */
#if TPP_HAVE_BSE
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_char const *TPPCALL
_tpp_skipbse_fwd(tpp_char const *pos, tpp_char const *end tpp_bse_file__PARAM);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_char const *TPPCALL
_tpp_skipbse_bck(tpp_char const *pos, tpp_char const *start tpp_bse_file__PARAM);
#define tpp_skipbse_fwd(pos, end, file)   (((pos) >= (end) || !_tpp_maybe_isbackslash(*(pos))) ? (pos) : _tpp_skipbse_fwd(pos, end tpp_bse_file__ARG(file)))
#define tpp_skipbse_bck(pos, start, file) (((pos) <= (start) || !_tpp_maybe_islf((pos)[-1])) ? (pos) : _tpp_skipbse_bck(pos, start tpp_bse_file__ARG(file)))
#else /* TPP_HAVE_BSE */
#define tpp_skipbse_fwd(pos, end, file)   (pos)
#define tpp_skipbse_bck(pos, start, file) (pos)
#endif /* !TPP_HAVE_BSE */


#if TPP_HAVE_ESCAPED_KEYWORDS
/* Same as `tpp_hashof()', but skip over \-escaped linefeeds when calculating the hash */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_hash TPPCALL
tpp_hashof_esc_(tpp_char const *tpp_restrict kwd, tpp_size len tpp_esc_lexer__PARAM);
#define tpp_hashof_esc(kwd, len, lexer) tpp_hashof_esc_(kwd, len tpp_esc_lexer__ARG(lexer))

/* Copy `in_text...+=len' to `out_text', whilst removing \-escaped linefeeds
 * The caller must ensure that `out_text' has space for at least `len' bytes,
 * and the actual # of used bytes of `out_text' is returned. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_size TPPCALL
tpp_without_esc_(tpp_char *tpp_restrict out_text,
                 tpp_char const *tpp_restrict in_text,
                 tpp_size len tpp_esc_lexer__PARAM);
#define tpp_without_esc(out_text, in_text, len, lexer) \
	tpp_without_esc_(out_text, in_text, len tpp_esc_lexer__ARG(lexer))

/* Compare 2 strings, one of which may contain \-escaped linefeeds that must be skipped. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3)) int TPPCALL
tpp_memcmp_esc_(tpp_char const *lhs_without_esc, tpp_size lhs_len,
                tpp_char const *rhs_with_esc, tpp_size rhs_len
                tpp_esc_lexer__PARAM);
#define tpp_memcmp_esc(lhs_without_esc, lhs_len, rhs_with_esc, rhs_len, lexer) \
	tpp_memcmp_esc_(lhs_without_esc, lhs_len, rhs_with_esc, rhs_len tpp_esc_lexer__ARG(lexer))
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */


/* Lookup one of the built-in, pre-defined keywords */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_keyword const *TPPCALL
tpp_builtin_getkeyword(tpp_char const *tpp_restrict kwd,
                       tpp_size len, tpp_hash hash);
TPP_DECL TPP_WUNUSED tpp_keyword const *TPPCALL
tpp_builtin_getkeyword_byid(enum tpp_token_id id);
#if TPP_HAVE_ESCAPED_KEYWORDS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_keyword const *TPPCALL
tpp_builtin_getkeyword_esc_(tpp_char const *tpp_restrict kwd,
                            tpp_size len, tpp_hash hash
                            tpp_esc_lexer__PARAM);
#define tpp_builtin_getkeyword_esc(kwd, len, hash, lexer) \
	tpp_builtin_getkeyword_esc_(kwd, len, hash tpp_esc_lexer__ARG(lexer))
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */



/* Custom keywords table */
#if TPP_HAVE_USER_KEYWORDS
typedef struct tpp_keywords {
	unsigned int          TPP_INTERNAL(tks_kwdc); /* Amount of keyword entries stored. */
	tpp_hash              TPP_INTERNAL(tks_bckm); /* Allocated bucket mask. */
	TPP_REF tpp_keyword **TPP_INTERNAL(tks_bckv); /* [0..1][owned][0..tks_bckc+1][owned] Resizable keyword hash-map vector.
	                                               * NOTE: When the keyword map is destroyed, all linked keywords are, too.
	                                               *       Since this only happens when a lexer is finalized, this should
	                                               *       only happen once *all* keywords have their reference counters
	                                               *       set to "1". For this purpose, "tpp_keywords_fini" asserts that
	                                               *       no keyword has some other reference count value. */
} tpp_keywords;

TPP_DECL TPP_REF tpp_keyword *tpp_keywords_empty_map[1]; /* Consider this one TPP_INTERNAL */

/* Initialize/finalize a given keywords table. */
#define tpp_keywords_init(self)                \
	(void)((self)->TPP_INTERNAL(tks_kwdc) = 0, \
	       (self)->TPP_INTERNAL(tks_bckm) = 0, \
	       (self)->TPP_INTERNAL(tks_bckv) = tpp_keywords_empty_map)
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keywords_fini(tpp_keywords *tpp_restrict self);
#if TPP_HAVE_LEXER_COPY
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_keywords_copy(tpp_keywords *tpp_restrict self,
                  tpp_keywords const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

/* Reset (re-initialize) "self" */
#define tpp_keywords_reset(self) \
	(tpp_keywords_fini(self), tpp_keywords_init(self))


/* Lookup keywords within the given keywords-table **ONLY**
 * @return: * :   The keyword in question
 * @return: NULL: No such keyword (consider using "tpp_keywords_getkeyword" to
 *                also check for builtin keywords, or "tpp_keywords_newkeyword"
 *                to do the same, but lazily create missing keywords) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword *TPPCALL
_tpp_keywords_getkeyword(tpp_keywords const *tpp_restrict self,
                         tpp_char const *tpp_restrict kwd,
                         tpp_size len, tpp_hash hash);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_keyword *TPPCALL
_tpp_keywords_getkeyword_byid(tpp_keywords const *tpp_restrict self,
                              enum tpp_token_id id);
#if TPP_HAVE_ESCAPED_KEYWORDS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword *TPPCALL
_tpp_keywords_getkeyword_esc_(tpp_keywords const *tpp_restrict self,
                              tpp_char const *tpp_restrict kwd,
                              tpp_size len, tpp_hash hash
                              tpp_esc_lexer__PARAM);
#define _tpp_keywords_getkeyword_esc(self, kwd, len, hash, lexer) \
	_tpp_keywords_getkeyword_esc_(self, kwd, len, hash tpp_esc_lexer__ARG(lexer))
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */


/* Same as above, but also search the built-in keyword table (tpp_builtin_getkeyword) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword const *TPPCALL
tpp_keywords_getkeyword(tpp_keywords const *tpp_restrict self,
                        tpp_char const *tpp_restrict kwd,
                        tpp_size len, tpp_hash hash);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_keyword const *TPPCALL
tpp_keywords_getkeyword_byid(tpp_keywords const *tpp_restrict self,
                             enum tpp_token_id id);
#if TPP_HAVE_ESCAPED_KEYWORDS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword const *TPPCALL
tpp_keywords_getkeyword_esc_(tpp_keywords const *tpp_restrict self,
                             tpp_char const *tpp_restrict kwd,
                             tpp_size len, tpp_hash hash
                             tpp_esc_lexer__PARAM);
#define tpp_keywords_getkeyword_esc(self, kwd, len, hash, lexer) \
	tpp_keywords_getkeyword_esc_(self, kwd, len, hash tpp_esc_lexer__ARG(lexer))
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */


/* Same as above, but if the keyword doesn't exist in `self' or the builtin
 * keyword table, a new keyword is allocated, given an ID, and inserted into `self'
 * @return: * :   The keyword associated with `kwd' (possibly having been just allocated)
 * @return: NULL: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword const *TPPCALL
tpp_keywords_newkeyword(tpp_keywords *tpp_restrict self,
                        tpp_char const *tpp_restrict kwd,
                        tpp_size len, tpp_hash hash);
#if TPP_HAVE_BSE
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword const *TPPCALL
tpp_keywords_newkeyword_esc_(tpp_keywords *tpp_restrict self,
                             tpp_char const *tpp_restrict kwd,
                             tpp_size len, tpp_hash hash
                             tpp_esc_lexer__PARAM);
#define tpp_keywords_newkeyword_esc(self, kwd, len, hash, lexer) \
	tpp_keywords_newkeyword_esc_(self, kwd, len, hash tpp_esc_lexer__ARG(lexer))
#endif /* TPP_HAVE_BSE */


#if TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS
/* Check if "kwd" is contained in "self".
 * If so: do nothing and simply re-return "kwd"
 *
 * Otherwise, assume that "kwd" is a "builtin" keyword (as returned
 * by `tpp_builtin_getkeyword()'), in which the keyword is copied,
 * inserted into "self", and said copy is returned.
 *
 * This function must be used to make a keyword "writable" (which is
 * required before its `tk_macro' / `tk_misc' fields can safely be
 * written to (and in the later case: all fields of a potentially
 * pointed-to `tpp_keyword_misc', too)
 *
 * @return: * :   A writable copy of "kwd"
 * @return: NULL: Out of memory (TPP_ENOMEM) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_keyword *TPPCALL
tpp_keywords_copybuiltin(tpp_keywords *tpp_restrict self,
                         tpp_keyword const *tpp_restrict kwd);
#endif /* TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS */
#endif /* TPP_HAVE_USER_KEYWORDS */


#if TPP_HAVE_KEYWORDS_UNDEFALL
/* Delete all user-defined macro definitions */
#if TPP_HAVE_CPP_MACROS
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keywords_undefall(tpp_keywords *tpp_restrict self);
#else /* TPP_HAVE_CPP_MACROS */
#define tpp_keywords_undefall(self) (void)0
#endif /* !TPP_HAVE_CPP_MACROS */
#endif /* TPP_HAVE_KEYWORDS_UNDEFALL */


#if TPP_HAVE_KEYWORDS_UNASSERTALL
/* Delete all user-defined keyword assertions */
#if TPP_HAVE_CPP_ASSERT
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keywords_unassertall(tpp_keywords *tpp_restrict self);
#else /* TPP_HAVE_CPP_ASSERT */
#define tpp_keywords_unassertall(self) (void)0
#endif /* !TPP_HAVE_CPP_ASSERT */
#endif /* TPP_HAVE_KEYWORDS_UNASSERTALL */


#if TPP_HAVE_KEYWORDS_RESETFLAGS
/* Modify the flags of all keywords as `flags = flags & keep_mask' */
#if TPP_HAVE_KEYWORD_FLAGS
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keywords_resetflags(tpp_keywords *tpp_restrict self,
                        tpp_keyword_flags keep_mask);
#else /* TPP_HAVE_KEYWORD_FLAGS */
#define tpp_keywords_resetflags(self, keep_mask) (void)0
#endif /* !TPP_HAVE_KEYWORD_FLAGS */
#endif /* TPP_HAVE_KEYWORDS_RESETFLAGS */

#if TPP_HAVE_KEYWORDS_RESETCOUNTERS
/* Call `tpp_keyword_reset_builtin_counter()' on every keyword, thereby
 * resetting all side-effects of expansions of `__TPP_COUNTER' thus far. */
#if TPP_HAVE_MACRO___TPP_COUNTER
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_keywords_resetcounters(tpp_keywords *tpp_restrict self);
#else /* TPP_HAVE_MACRO___TPP_COUNTER */
#define tpp_keywords_resetcounters(self) (void)0
#endif /* !TPP_HAVE_MACRO___TPP_COUNTER */
#endif /* TPP_HAVE_KEYWORDS_RESETCOUNTERS */


/************************************************************************/
/* File: parts/extensions.h                                             */
/************************************************************************/

#if TPP_HAVE_EXTENSIONS
typedef enum tpp_extension_id {
#define TPP_DEFS
#define TPP_EXTENSION(id, name, default) id,
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DEFS
	TPP_EXT_COUNT
} tpp_extension_id;

/* Default extension state */
typedef union tpp_extensions_state {
	struct {
#define TPP_DEFS
#define TPP_EXTENSION(id, name, default) unsigned int TPP_INTERNAL(tef_##id): 1;
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DEFS
	} TPP_INTERNAL(tes_flags);
	unsigned char TPP_INTERNAL(tes_bitset)[TPP_EXT_COUNT ? ((TPP_EXT_COUNT + TPP_CHAR_BIT - 1) / TPP_CHAR_BIT) : 1];
} tpp_extensions_state;
TPP_CONST_DECL tpp_extensions_state const tpp_extensions_state_default;

#define tpp_extensions_state_getid(self, id) \
	((self)->TPP_INTERNAL(tes_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] & (1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_extensions_state_enable(self, id) \
	(void)((self)->TPP_INTERNAL(tes_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] |= (1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_extensions_state_disable(self, id) \
	(void)((self)->TPP_INTERNAL(tes_bitset)[(unsigned int)(id) / TPP_CHAR_BIT] &= ~(1 << ((unsigned int)(id) % TPP_CHAR_BIT)))
#define tpp_extensions_state_setid(self, id, enabled) \
	((enabled) ? tpp_extensions_state_enable(self, id) : tpp_extensions_state_disable(self, id))


typedef struct tpp_extensions {
	tpp_extensions_state   TPP_INTERNAL(te_state);   /* [const_if(te_pushcnt > 0)] Enabled-extensions state */
#if TPP_HAVE_EXTENSIONS_PUSH_POP
	tpp_size               TPP_INTERNAL(te_pushcnt); /* # of times extensions were pushed since last modified */
	struct tpp_extensions *TPP_INTERNAL(te_prev);    /* [0..1][owned] Old extension state. */
#endif /* TPP_HAVE_EXTENSIONS_PUSH_POP */
} tpp_extensions;

#if TPP_HAVE_EXTENSIONS_PUSH_POP
#define _tpp_extensions_alloc() ((tpp_extensions *)tpp_malloc(sizeof(tpp_extensions)))
#define _tpp_extensions_free(p) tpp_free(p)

#define tpp_extensions_init(self)                                           \
	(void)((self)->TPP_INTERNAL(te_state)   = tpp_extensions_state_default, \
	       (self)->TPP_INTERNAL(te_pushcnt) = 0,                            \
	       (self)->TPP_INTERNAL(te_prev)    = NULL)
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_extensions_fini(tpp_extensions *tpp_restrict self);

#if TPP_HAVE_LEXER_COPY
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_extensions_copy(tpp_extensions *tpp_restrict self,
                    tpp_extensions const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

/* Push the current extensions state */
#define tpp_extensions_push(self) (void)(++(self)->TPP_INTERNAL(te_pushcnt))

/* Pop the current extensions state (may only be called when `tpp_extensions_canpop(self)') */
TPP_DECL TPP_NONNULL((1)) void TPPCALL tpp_extensions_pop(tpp_extensions *tpp_restrict self);
#define tpp_extensions_canpop(self) ((self)->TPP_INTERNAL(te_pushcnt) != 0 || (self)->TPP_INTERNAL(te_prev) != NULL)

/* When true, `tpp_extensions_setid()' must first copy the extension
 * state (which requires heap memory, and may thus fail) */
#define tpp_extensions_mustcopy(self) ((self)->TPP_INTERNAL(te_pushcnt) != 0)

/* @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: OOM */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_extensions_setid(tpp_extensions *tpp_restrict self,
                     tpp_extension_id id, bool enabled);
#else /* TPP_HAVE_EXTENSIONS_PUSH_POP */
#define tpp_extensions_init(self) (void)((self)->TPP_INTERNAL(te_state) = tpp_extensions_state_default)
#define tpp_extensions_fini(self) (void)0
#if TPP_HAVE_LEXER_COPY
#define tpp_extensions_copy(self, from) (*(self) = *(from), TPP_EOK)
#endif /* TPP_HAVE_LEXER_COPY */
#define tpp_extensions_setid(self, id, enabled) \
	(tpp_extensions_state_setid(&(self)->TPP_INTERNAL(te_state), id, enabled), TPP_EOK)
#endif /* !TPP_HAVE_EXTENSIONS_PUSH_POP */
#define tpp_extensions_getid(self, id) \
	tpp_extensions_state_getid(&(self)->TPP_INTERNAL(te_state), id)

/* Reset (re-initialize) "self" */
#define tpp_extensions_reset(self) \
	(tpp_extensions_fini(self), tpp_extensions_init(self))


/* Convert between extension IDs and their human-readable names. */
TPP_DECL TPP_WUNUSED char const *TPPCALL
tpp_extension_getname(tpp_extension_id id);

/* @return: TPP_EXT_COUNT: No such extension */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_extension_id TPPCALL
tpp_extension_byname_ex(char const *tpp_restrict name, tpp_size name_maxlen);
#define tpp_extension_byname(name) tpp_extension_byname_ex(name, TPP_SIZE_MAX)

#if TPP_HAVE_TPP_EXTENSION_NEAREST
/* Returns the ID of the extension with the name that is closest to "name"
 * When no extensions are defined (at all), this will return "TPP_EXT_COUNT" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_extension_id TPPCALL
tpp_extension_nearest_ex(char const *tpp_restrict name, tpp_size name_maxlen);
#define tpp_extension_nearest(name) tpp_extension_nearest_ex(name, TPP_SIZE_MAX)
#endif /* TPP_HAVE_TPP_EXTENSION_NEAREST */

#else /* TPP_HAVE_EXTENSIONS */
#define tpp_extensions_state_get(self, id) 1
#define tpp_extensions_get(self, id)       1
#endif /* !TPP_HAVE_EXTENSIONS */

/************************************************************************/
/* File: parts/warnings.h                                               */
/************************************************************************/

#if TPP_HAVE_WARNING_NUMBERS
#define TPP_WARNING_NUMBER_INVALID UINT_MAX
#endif /* TPP_HAVE_WARNING_NUMBERS */

#if TPP_HAVE_WARNINGS


/************************************************************************/
/* WARNING STATE                                                        */
/************************************************************************/

/* Configuration options for warnings.
 *
 * NOTE: When a warning has multiple groups (and/or a number), and is triggered,
 *       then the state used for emission is the one with the lowest, numerical
 *       value (e.g.: if at least one group is "TPP_WSTATE_DISABLED", then the
 *       warning is disabled). The used group/number will be printed however. */
typedef enum tpp_warning_state {
	TPP_WSTATE_DISABLED = 0, /* Warning exists, but is disabled */
	TPP_WSTATE_WARN     = 1, /* Regular warning */
#if TPP_HAVE_WARNING_ERROR
	TPP_WSTATE_ERROR    = 2, /* Error (s.a. `tpp_lexer::tl_maxerrors') */
#define TPP_WSTATE_ERROR_OR_FATAL TPP_WSTATE_ERROR
#else /* TPP_HAVE_WARNING_ERROR */
#define TPP_WSTATE_ERROR_OR_FATAL TPP_WSTATE_FATAL
#endif /* !TPP_HAVE_WARNING_ERROR */
	TPP_WSTATE_FATAL    = 3, /* Immediately cause a `TPP_ELEXERROR' error */
#define TPP_WSTATE_UNDEFINED TPP_WSTATE_FATAL /* Intended for numbers-definitions: refer to linked groups */

#if TPP_HAVE_WARNING_SUPPRESS
	TPP_WSTATE_SUPPRESS = -1, /* Treat as `TPP_WSTATE_DISABLED' a couple of times, then switch to old state
	                           * HINT: In "tpp_warnings_state", this is represented as "TPP_WSTATE_FATAL". */
#endif /* TPP_HAVE_WARNING_SUPPRESS */

#if TPP_HAVE_WARNING_DEFAULT
	TPP_WSTATE_DEFAULT = 99, /* Only for `tpp_warnings_setctx()': restore behavior from `tpp_warnings_state_default' */
#endif /* TPP_HAVE_WARNING_DEFAULT */
} tpp_warning_state;

/* Check if "lhs" is more important than "rhs".
 *
 * When a warning is emitted, the context that is configured to the greatest
 * importance is used to determine how that specific warning should be treated. */
#define tpp_warning_state_ismoreimportant(lhs, rhs) \
	((int)(lhs) < (int)(rhs))

/* Check if the warning state specified by "self" will cause something to be emitted. */
#if TPP_HAVE_WARNING_SUPPRESS
#if 1
#define tpp_warning_state_willemit(self) ((int)(self) > 0)
#else
#define tpp_warning_state_willemit(self) \
	((self) != TPP_WSTATE_DISABLED && (self) != TPP_WSTATE_SUPPRESS)
#endif
#else /* TPP_HAVE_WARNING_SUPPRESS */
#define tpp_warning_state_willemit(self) \
	((self) != TPP_WSTATE_DISABLED)
#endif /* !TPP_HAVE_WARNING_SUPPRESS */



/************************************************************************/
/* WARNING GROUPS                                                       */
/************************************************************************/

typedef enum tpp_warning_group_id {
#define TPP_DEFS
#define TPP_WGROUP(wgroup_id, names, default) wgroup_id,
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DEFS
	TPP_WG_COUNT
} tpp_warning_group_id;

/* Return a pointer to a \0\0-terminated list of strings describing the names
 * of for the given warning group "id". Returns "NULL" if "id" is "TPP_WG_COUNT"
 * or some other invalid warning group ID. */
TPP_DECL TPP_WUNUSED char const *TPPCALL
tpp_warning_group_getnames(tpp_warning_group_id id);

/* @return: TPP_WG_COUNT: No such warning_group */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_warning_group_id TPPCALL
tpp_warning_group_byname_ex(char const *tpp_restrict name, tpp_size name_maxlen);
#define tpp_warning_group_byname(name) tpp_warning_group_byname_ex(name, TPP_SIZE_MAX)

#if TPP_HAVE_TPP_WARNING_GROUP_NEAREST
/* Returns the ID of the warning group with the name that is closest to "name"
 * When no warning groups are defined (at all), this will return "TPP_WG_COUNT" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_warning_group_id TPPCALL
tpp_warning_group_nearest_ex(char const *tpp_restrict name, tpp_size name_maxlen);
#define tpp_warning_group_nearest(name) tpp_warning_group_nearest_ex(name, TPP_SIZE_MAX)
#endif /* TPP_HAVE_TPP_WARNING_GROUP_NEAREST */



/************************************************************************/
/* WARNING ID                                                           */
/************************************************************************/

typedef enum tpp_warning_id {
#define TPP_DEFS
#define TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, format) warning_id,
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DEFS
	TPP_W_COUNT
} tpp_warning_id;

/* Returns a TPP_WG_COUNT-terminated list of group IDs associated with the given warning "id".
 * When the given "id" is "TPP_W_COUNT" or invalid, return a pointer to an empty warning-group-id-list. */
TPP_DECL TPP_RETNONNULL TPP_WUNUSED tpp_warning_group_id const *TPPCALL
tpp_warning_getgroups(tpp_warning_id id);

/* Returns the "tpp_lexer_printf_warning"-style format string assigned with "id".
 * When "id" is TPP_W_COUNT, invalid, or declared as "TPP_WARNING_EX", return "NULL" instead. */
TPP_DECL TPP_WUNUSED char const *TPPCALL
tpp_warning_getformat(tpp_warning_id id);

#if TPP_HAVE_WARNING_NUMBERS
/* Returns the warning ID linked to a given "number", or "TPP_W_COUNT" if "number" is unknown */
TPP_DECL TPP_WUNUSED tpp_warning_id TPPCALL
tpp_warning_ofnumber(unsigned int number);

/* Returns the TPP_WARNING_NUMBER_INVALID-terminated list of warning numbers
 * associated with "warning_id". If "warning_id" doesn't have any warning
 * numbers, return a pointer to "TPP_WARNING_NUMBER_INVALID". */
TPP_DECL TPP_RETNONNULL TPP_WUNUSED unsigned int const *TPPCALL
tpp_warning_getnumbers(tpp_warning_id warning_id);
#else /* TPP_HAVE_WARNING_NUMBERS */
#define tpp_warning_ofnumber(number) TPP_W_COUNT
#endif /* !TPP_HAVE_WARNING_NUMBERS */




/************************************************************************/
/* WARNING CONTEXT ID                                                   */
/************************************************************************/

/* Warning context ID (used internally to keep track
 * of warning states for groups & numbered warnings) */
typedef enum tpp_warning_context_id {
#define TPP_DEFS
#define TPP_WGROUP(wgroup_id, names, default) TPP_WC_##wgroup_id,
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"

#if TPP_HAVE_WARNING_NUMBERS
	TPP_WC_NUMBER_MIN,
	TPP_INTERNAL(_TPP_WC_NUMBER_MIN) = TPP_WC_NUMBER_MIN - 1,
#define TPP_DECLARE_NUMBERED_WARNING(warning_id) TPP_WC_##warning_id,
#define TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, format) \
	TPP_TUPLE_IF_NONEMPTY(numbers, TPP_DECLARE_NUMBERED_WARNING, warning_id)
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DECLARE_NUMBERED_WARNING
#endif /* TPP_HAVE_WARNING_NUMBERS */
#undef TPP_DEFS
	TPP_WC_COUNT
} tpp_warning_context_id;

/* Check what kind of context is being described by "self" */
#if TPP_HAVE_WARNING_NUMBERS
#define tpp_warning_context_id_isgroup(self) \
	(!tpp_warning_context_id_isnumber(self))
#define tpp_warning_context_id_isnumber(self) \
	((unsigned int)(self) >= (unsigned int)TPP_WC_NUMBER_MIN)
#else /* TPP_HAVE_WARNING_NUMBERS */
#define tpp_warning_context_id_isgroup(self)  1
#define tpp_warning_context_id_isnumber(self) 0
#endif /* !TPP_HAVE_WARNING_NUMBERS */

/* Return the context-id of a given "tpp_warning_group_id wgroup_id" */
#define tpp_warning_context_id_ofgroup(wgroup_id) \
	((tpp_warning_context_id)(unsigned int)(wgroup_id))

/* Return the group-id of a given "tpp_warning_context_id ctx_id".
 * Caller must ensure that `tpp_warning_context_id_isgroup(ctx_id)' */
#define tpp_warning_context_id_asgroup(ctx_id) \
	((tpp_warning_group_id)(unsigned int)(ctx_id))

#if TPP_HAVE_WARNING_NUMBERS
/* Returns the context-id of a given (should-be) "numbered" warning.
 * When "warning_id" is invalid, "TPP_W_COUNT", or not numbered, this
 * function will return "TPP_WC_COUNT" instead. */
TPP_DECL TPP_WUNUSED tpp_warning_context_id TPPCALL
tpp_warning_context_id_ofwarning(tpp_warning_id warning_id);

/* Returns the warning-id linked to "ctx_id", when `tpp_warning_context_id_isnumber(ctx_id)'.
 * When no warning is linked to "ctx_id" ("ctx_id" is either linked to a warning group, or
 * is "TPP_WC_COUNT" or some other invalid ID), return "TPP_W_COUNT" instead. */
TPP_DECL TPP_WUNUSED tpp_warning_id TPPCALL
tpp_warning_context_id_aswarning(tpp_warning_context_id ctx_id);
#else /* TPP_HAVE_WARNING_NUMBERS */
#define tpp_warning_context_id_ofwarning(warning_id) TPP_WC_COUNT
#define tpp_warning_context_id_aswarning(ctx_id)     TPP_W_COUNT
#endif /* !TPP_HAVE_WARNING_NUMBERS */




/************************************************************************/
/* WARNINGS STATE                                                       */
/************************************************************************/
typedef union tpp_warnings_state {
	struct {
#define TPP_DEFS
#define TPP_WGROUP(wgroup_id, names, default) \
	unsigned int TPP_INTERNAL(twsg_##wgroup_id): 2; /* One of `tpp_warning_state' */
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#if TPP_HAVE_WARNING_NUMBERS
#define TPP_DECLARE_NUMBERED_WARNING(warning_id) \
	unsigned int TPP_INTERNAL(twsn_##warning_id): 2; /* One of `tpp_warning_state' */
#define TPP_WARNING(warning_id, wgroup_ids, numbers, numbers_default, format) \
	TPP_TUPLE_IF_NONEMPTY(numbers, TPP_DECLARE_NUMBERED_WARNING, warning_id)
#undef GUARD_TPP_AMALGAMATION_H
#include "tpp-amalgamation.h"
#undef TPP_DECLARE_NUMBERED_WARNING
#endif /* TPP_HAVE_WARNING_NUMBERS */
#undef TPP_DEFS
	} TPP_INTERNAL(tws_state);
	unsigned char TPP_INTERNAL(tws_bitset)[TPP_WC_COUNT ? (((TPP_WC_COUNT * 2) + TPP_CHAR_BIT - 1) / TPP_CHAR_BIT) : 1];
} tpp_warnings_state;

TPP_DECL tpp_warnings_state const tpp_warnings_state_default;

#define _tpp_warnings_state_bitindx(ctx_id) (((unsigned int)((unsigned int)(ctx_id) / (TPP_CHAR_BIT >> 1))))
#define _tpp_warnings_state_bitshft(ctx_id) (((unsigned int)((unsigned int)(ctx_id) % (TPP_CHAR_BIT >> 1))) << 1)

/* Get/set the warning state of a given "tpp_warning_context_id ctx_id" */
#define tpp_warnings_state_get(self, ctx_id) \
	((tpp_warning_state)(((self)->TPP_INTERNAL(tws_bitset)[_tpp_warnings_state_bitindx(ctx_id)] >> _tpp_warnings_state_bitshft(ctx_id)) & 3))
#define tpp_warnings_state_set(self, ctx_id, value)                                                                                \
	(void)((self)->TPP_INTERNAL(tws_bitset)[_tpp_warnings_state_bitindx(ctx_id)] =                                                 \
	       ((self)->TPP_INTERNAL(tws_bitset)[_tpp_warnings_state_bitindx(ctx_id)] & ~(3 << _tpp_warnings_state_bitshft(ctx_id))) | \
	       (((unsigned char)(unsigned int)(value)) << _tpp_warnings_state_bitshft(ctx_id)))



#if TPP_HAVE_WARNING_SUPPRESS
typedef struct tpp_warning_suppress_item {
	tpp_warning_context_id TPP_INTERNAL(twsi_ctx_id);  /* Context ID of this suppression item */
	tpp_warning_state      TPP_INTERNAL(twsi_restore); /* Warning state to restore once the warning is no longer being suppressed */
	tpp_size               TPP_INTERNAL(twsi_count);   /* # of times to suppress this warning before restoring its previous state */
} tpp_warning_suppress_item;

typedef struct tpp_warning_suppressions {
	tpp_size                   TPP_INTERNAL(tws_ctxc); /* # of warnings that are being suppressed right now */
	tpp_size                   TPP_INTERNAL(tws_ctxa); /* Allocated size of `tws_ctxv' */
	tpp_warning_suppress_item *TPP_INTERNAL(tws_ctxv); /* [0..tws_ctxc|alloc(tws_ctxa)][owned] Vector of suppressions (sorted by `twsi_ctx_id') */
} tpp_warning_suppressions;
#define tpp_warning_suppressions_init(self)    \
	(void)((self)->TPP_INTERNAL(tws_ctxc) = 0, \
	       (self)->TPP_INTERNAL(tws_ctxa) = 0, \
	       (self)->TPP_INTERNAL(tws_ctxv) = NULL)
#define tpp_warning_suppressions_fini(self)    \
	(tpp_free((self)->TPP_INTERNAL(tws_ctxv)), \
	 tpp_dbg_memset(self, sizeof(tpp_warning_suppressions)))
#endif /* TPP_HAVE_WARNING_SUPPRESS */


/* Lexer warnings configuration */
typedef struct tpp_warnings {
	tpp_warnings_state       TPP_INTERNAL(tw_state);        /* [const_if(tw_pushcnt > 0)] Warning state */
#if TPP_HAVE_WARNING_SUPPRESS
	tpp_warning_suppressions TPP_INTERNAL(tw_suppressions); /* [const_if(tw_pushcnt > 0)] Information about suppressed warnings */
#define _tpp_warnings_init_suppressions(self) , tpp_warning_suppressions_init(&(self)->TPP_INTERNAL(tw_suppressions))
#else /* TPP_HAVE_WARNING_SUPPRESS */
#define _tpp_warnings_init_suppressions(self) /* nothing */
#endif /* !TPP_HAVE_WARNING_SUPPRESS */
#if TPP_HAVE_WARNINGS_PUSH_POP
	tpp_size                 TPP_INTERNAL(tw_pushcnt);      /* # of times warnings pushed were since last modified */
	struct tpp_warnings     *TPP_INTERNAL(tw_prev);         /* [0..1][owned] Old warning state. */
#define _tpp_warnings_init_push(self) , (self)->TPP_INTERNAL(tw_pushcnt) = 0, (self)->TPP_INTERNAL(tw_prev) = NULL
#else /* TPP_HAVE_WARNINGS_PUSH_POP */
#define _tpp_warnings_init_push(self) /* nothing */
#endif /* !TPP_HAVE_WARNINGS_PUSH_POP */
} tpp_warnings;

/* Initialize a given warnings context "self" */
#define tpp_warnings_init(self)                                        \
	(void)((self)->TPP_INTERNAL(tw_state) = tpp_warnings_state_default \
	       _tpp_warnings_init_suppressions(self)                       \
	       _tpp_warnings_init_push(self))

#undef TPP_HAVE_WARNINGS_FINI
#define TPP_HAVE_WARNINGS_FINI \
	(TPP_HAVE_WARNING_SUPPRESS || TPP_HAVE_WARNINGS_PUSH_POP)

/* Finalize a given warnings context "self" */
#if TPP_HAVE_WARNINGS_FINI
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_warnings_fini(tpp_warnings *tpp_restrict self);

#if TPP_HAVE_LEXER_COPY
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_warnings_copy(tpp_warnings *tpp_restrict self,
                  tpp_warnings const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */
#else /* TPP_HAVE_WARNINGS_FINI */
#define tpp_warnings_fini(self) tpp_dbg_memset(self, sizeof(tpp_warnings))
#if TPP_HAVE_LEXER_COPY
#define tpp_warnings_copy(self, from) (*(self) = *(from), TPP_EOK)
#endif /* TPP_HAVE_LEXER_COPY */
#endif /* !TPP_HAVE_WARNINGS_FINI */

/* Reset (re-initialize) "self" */
#define tpp_warnings_reset(self) \
	(tpp_warnings_fini(self), tpp_warnings_init(self))


#if TPP_HAVE_WARNINGS_PUSH_POP
#define _tpp_warnings_alloc() ((tpp_warnings *)tpp_malloc(sizeof(tpp_warnings)))
#define _tpp_warnings_free(p) tpp_free(p)

/* Push the current warnings state */
#define tpp_warnings_push(self) (void)(++(self)->TPP_INTERNAL(tw_pushcnt))

/* Pop the current warnings state (may only be called when `tpp_warnings_canpop(self)') */
TPP_DECL TPP_NONNULL((1)) void TPPCALL tpp_warnings_pop(tpp_warnings *tpp_restrict self);
#define tpp_warnings_canpop(self)             \
	((self)->TPP_INTERNAL(tw_pushcnt) != 0 || \
	 (self)->TPP_INTERNAL(tw_prev) != NULL)

/* When true, `tpp_warnings_setctx()' must first copy the extension
 * state (which requires heap memory, and may thus fail) */
#define tpp_warnings_mustcopy(self) ((self)->TPP_INTERNAL(tw_pushcnt) != 0)
#endif /* TPP_HAVE_WARNINGS_PUSH_POP */

/* Return the state of "ctx_id". The caller is
 * responsible to ensure that "ctx_id" is valid. */
#if TPP_HAVE_WARNING_SUPPRESS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_warning_state TPPCALL
tpp_warnings_getctx(tpp_warnings const *tpp_restrict self,
                    tpp_warning_context_id ctx_id);
#else /* TPP_HAVE_WARNING_SUPPRESS */
#define tpp_warnings_getctx(self, ctx_id) \
	tpp_warnings_state_get(&(self)->TPP_INTERNAL(tw_state), ctx_id)
#endif /* !TPP_HAVE_WARNING_SUPPRESS */


#undef TPP_HAVE_WARNINGS_SETCTX_MAYFAIL
#define TPP_HAVE_WARNINGS_SETCTX_MAYFAIL \
	(TPP_HAVE_WARNING_SUPPRESS || TPP_HAVE_WARNINGS_PUSH_POP)

/* Set the state of "ctx_id" to "state".
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HAVE_WARNINGS_SETCTX_MAYFAIL
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_warnings_setctx(tpp_warnings *tpp_restrict self,
                    tpp_warning_context_id ctx_id,
                    tpp_warning_state state);
#else /* TPP_HAVE_WARNINGS_SETCTX_MAYFAIL */
#define tpp_warnings_setctx(self, ctx_id, state) \
	(_tpp_warnings_setctx_nofail(self, ctx_id, state), TPP_EOK)
TPP_DECL TPP_NONNULL((1)) void TPPCALL
_tpp_warnings_setctx_nofail(tpp_warnings *tpp_restrict self,
                            tpp_warning_context_id ctx_id,
                            tpp_warning_state state);
#endif /* !TPP_HAVE_WARNINGS_SETCTX_MAYFAIL */



typedef struct tpp_warning_invokeinfo {
	tpp_warning_state      TPP_INTERNAL(twii_state);  /* State with which the warning should be invoked.
	                                                   * Always one of:
	                                                   * - TPP_WSTATE_DISABLED
	                                                   * - TPP_WSTATE_WARN
	                                                   * - TPP_WSTATE_ERROR      #if TPP_HAVE_WARNING_ERROR
	                                                   * - TPP_WSTATE_FATAL */
	tpp_warning_context_id TPP_INTERNAL(twii_ctx_id); /* Context ID that for error messages */
} tpp_warning_invokeinfo;

#define tpp_warning_invokeinfo_getstate(self) (self)->TPP_INTERNAL(twii_state)
#define tpp_warning_invokeinfo_getctxid(self) (self)->TPP_INTERNAL(twii_ctx_id)


#undef TPP_HAVE_WARNINGS_INVOKE_MAYFAIL
#define TPP_HAVE_WARNINGS_INVOKE_MAYFAIL \
	(TPP_HAVE_WARNING_SUPPRESS && TPP_HAVE_WARNINGS_PUSH_POP)

/* Invoke "warning_id" (updating suppression counters if necessary) and
 * returning information about the context/state with which the warning
 * should be processed.
 *
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory (only "#if TPP_HAVE_WARNINGS_INVOKE_MAYFAIL") */
#if TPP_HAVE_WARNINGS_INVOKE_MAYFAIL
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3)) tpp_errno TPPCALL
tpp_warnings_invoke(tpp_warnings *tpp_restrict self, tpp_warning_id warning_id,
                    tpp_warning_invokeinfo *tpp_restrict result);
#else /* TPP_HAVE_WARNINGS_INVOKE_MAYFAIL */
#define tpp_warnings_invoke(self, warning_id, result) \
	(_tpp_warnings_invoke_nofail(self, warning_id, result), TPP_EOK)
TPP_DECL TPP_NONNULL((1, 3)) void TPPCALL
_tpp_warnings_invoke_nofail(tpp_warnings const *tpp_restrict self, tpp_warning_id warning_id,
                            tpp_warning_invokeinfo *tpp_restrict result);
#endif /* !TPP_HAVE_WARNINGS_INVOKE_MAYFAIL */

#endif /* TPP_HAVE_WARNINGS */

/************************************************************************/
/* File: parts/sysinclude.h                                             */
/************************************************************************/

#if TPP_HAVE_INCLUDE_PATH
typedef struct tpp_include_path_entry {
#if TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING
	TPP_REF tpp_string *TPP_INTERNAL(tipe_pathstr); /* [1..1] The path described by this entry (with a trailing TPP_FS_SEP_S). */
#else /* TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING */
	char               *TPP_INTERNAL(tipe_path);    /* [1..1][owned] The path described by this entry (with a trailing TPP_FS_SEP_S). */
#endif /* !TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING */
} tpp_include_path_entry;

#if TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING
#define _tpp_include_path_entry_fini(self)                  \
	(tpp_string_decref((self)->TPP_INTERNAL(tipe_pathstr)), \
	 tpp_dbg_memset(self, sizeof(tpp_include_path_entry)))
#define _tpp_include_path_entry_getpath(self) \
	tpp_string_cstr((self)->TPP_INTERNAL(tipe_pathstr))
#else /* TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING */
#define _tpp_include_path_entry_fini(self)      \
	(tpp_free((self)->TPP_INTERNAL(tipe_path)), \
	 tpp_dbg_memset(self, sizeof(tpp_include_path_entry)))
#define _tpp_include_path_entry_getpath(self) \
	((char const *)(self)->TPP_INTERNAL(tipe_path))
#endif /* !TPP_HAVE_INCLUDE_PATH_ENTRY_IS_STRING */

typedef struct tpp_include_path_list {
	tpp_include_path_entry *TPP_INTERNAL(tipl_list); /* [0..tipl_size][owned] List of include paths. */
	tpp_size                TPP_INTERNAL(tipl_size); /* # of entries in `tipl_list' */
} tpp_include_path_list;

/* Initialize/finalize a given "tpp_include_path_list" */
#define tpp_include_path_list_init(self)           \
	(void)((self)->TPP_INTERNAL(tipl_list) = NULL, \
	       (self)->TPP_INTERNAL(tipl_size) = 0)
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_include_path_list_fini(tpp_include_path_list *tpp_restrict self);

/* Return the # of paths described by "self" */
#define tpp_include_path_list_getcount(self) \
	(self)->TPP_INTERNAL(tipl_size)

/* Return the i'th path as a NUL-terminated string. */
#define tpp_include_path_list_getentry(self, i) \
	_tpp_include_path_entry_getpath(&(self)->TPP_INTERNAL(tipl_list)[i])

/* Clear this include-path list. */
#define tpp_include_path_list_clear(self) \
	(tpp_include_path_list_fini(self),    \
	 tpp_include_path_list_init(self))

/* Append the given "path" to "self".
 * @param: path:        The path to append.
 * @param: path_maxlen: The max length of "path". The actual length of the path that will
 *                      be appended to the path list is "tpp_strnlen(path, path_maxlen)".
 *
 * @return: TPP_EOK:    Success, or path was already present and was moved to the end.
 * @return: TPP_ENOMEM: Out of memory. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_include_path_list_pushtail(tpp_include_path_list *tpp_restrict self,
                               char const *path, tpp_size path_maxlen);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_include_path_list_pushhead(tpp_include_path_list *tpp_restrict self,
                               char const *path, tpp_size path_maxlen);

/* Remove the given "path" from "self".
 * @param: path:        The path to remove.
 * @param: path_maxlen: The max length of "path". The actual length of the path that will
 *                      be removed from the path list is "tpp_strnlen(path, path_maxlen)".
 *
 * @return: TPP_EOK:    Path was located and removed
 * @return: TPP_ENOENT: Path could not be found */
TPP_DECL TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_include_path_list_remove(tpp_include_path_list *tpp_restrict self,
                             char const *path, tpp_size path_maxlen);



/* Collective descriptor for defined include paths.
 * The actual order of paths in TPP3 is as follows (this matches GCC):
 *
 * 1.  (#include "foo.h" only): Relative to the current I/O-file, or (when
 *                              "TPP_HAVE_INCLUDE_RELATIVE_TO_EVERY_FILE" is
 *                              enabled): every I/O-file on the #include-stack
 * 2.  (#include "foo.h" only): Paths specified in "tip_quote_list" (if available)
 * 3.  Paths specified in "tip_system_list"
 * 4.  Paths specified in "tip_syshdr_list"
 * 5.  Paths hard-coded using "TPP_CONFIG_SYSTEM_INCLUDE_PATH"
 * 6.  Paths specified in "tip_after_list" (if available)
 */
typedef struct tpp_include_paths {
	tpp_include_path_list TPP_INTERNAL(tip_system_list); /* System #include-path list: #pragma TPP include_path("/usr/include") */
#if TPP_HAVE_INCLUDE_PATH_QUOTE
	tpp_include_path_list TPP_INTERNAL(tip_quote_list);  /* "-quote #include-path list: #pragma TPP include_path(quote: "/usr/include") */
#define _tpp_include_paths_init_quote(self) , tpp_include_path_list_init(&(self)->TPP_INTERNAL(tip_quote_list))
#define _tpp_include_paths_fini_quote(self) , tpp_include_path_list_fini(&(self)->TPP_INTERNAL(tip_quote_list))
#else /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#define _tpp_include_paths_init_quote(self) /* nothing */
#define _tpp_include_paths_fini_quote(self) /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
	tpp_include_path_list TPP_INTERNAL(tip_syshdr_list);  /* #include-paths treated as TPP_FILE_FLAGS_SYSHDR: #pragma TPP include_path(system: "/usr/include") */
#define _tpp_include_paths_init_syshdr(self) , tpp_include_path_list_init(&(self)->TPP_INTERNAL(tip_syshdr_list))
#define _tpp_include_paths_fini_syshdr(self) , tpp_include_path_list_fini(&(self)->TPP_INTERNAL(tip_syshdr_list))
#else /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#define _tpp_include_paths_init_syshdr(self) /* nothing */
#define _tpp_include_paths_fini_syshdr(self) /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
	tpp_include_path_list TPP_INTERNAL(tip_after_list);  /* #include-path list searched after all others: #pragma TPP include_path(dirafter: "/usr/include") */
#define _tpp_include_paths_init_after(self) , tpp_include_path_list_init(&(self)->TPP_INTERNAL(tip_after_list))
#define _tpp_include_paths_fini_after(self) , tpp_include_path_list_fini(&(self)->TPP_INTERNAL(tip_after_list))
#else /* TPP_HAVE_INCLUDE_PATH_AFTER */
#define _tpp_include_paths_init_after(self) /* nothing */
#define _tpp_include_paths_fini_after(self) /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_AFTER */

#if TPP_HAVE_INCLUDE_PATH_PUSH_POP
	tpp_size                  TPP_INTERNAL(tip_pushcnt); /* # of times paths pushed were since last modified */
	struct tpp_include_paths *TPP_INTERNAL(tip_prev);    /* [0..1][owned] Old warning state. */
#define _tpp_include_paths_init_push(self) , (self)->TPP_INTERNAL(tip_pushcnt) = 0, (self)->TPP_INTERNAL(tip_prev) = NULL
#else /* TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#define _tpp_include_paths_init_push(self) /* nothing */
#endif /* !TPP_HAVE_INCLUDE_PATH_PUSH_POP */
} tpp_include_paths;

/* Initialize/finalize include paths. */
#define tpp_include_paths_init(self)                                    \
	(tpp_include_path_list_init(&(self)->TPP_INTERNAL(tip_system_list)) \
	 _tpp_include_paths_init_quote(self)                                \
	 _tpp_include_paths_init_syshdr(self)                               \
	 _tpp_include_paths_init_after(self)                                \
	 _tpp_include_paths_init_push(self))
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_include_paths_fini(tpp_include_paths *tpp_restrict self);

/* Reset (re-initialize) "self" */
#define tpp_include_paths_reset(self) \
	(tpp_include_paths_fini(self), tpp_include_paths_init(self))


#if TPP_HAVE_LEXER_COPY
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_include_paths_copy(tpp_include_paths *tpp_restrict self,
                       tpp_include_paths const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

#undef TPP_HAVE_INCLUDE_PATH_MULTIPLE
typedef enum tpp_include_path_kind {
	TPP_INCLUDE_PATH_KIND_SYSTEM = tpp_offsetof(tpp_include_paths, TPP_INTERNAL(tip_system_list)),
#if TPP_HAVE_INCLUDE_PATH_QUOTE
	TPP_INCLUDE_PATH_KIND_QUOTE = tpp_offsetof(tpp_include_paths, TPP_INTERNAL(tip_quote_list)),
#define TPP_HAVE_INCLUDE_PATH_MULTIPLE 1
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
	TPP_INCLUDE_PATH_KIND_SYSHDR = tpp_offsetof(tpp_include_paths, TPP_INTERNAL(tip_syshdr_list)),
#define TPP_HAVE_INCLUDE_PATH_MULTIPLE 1
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
	TPP_INCLUDE_PATH_KIND_AFTER = tpp_offsetof(tpp_include_paths, TPP_INTERNAL(tip_after_list)),
#define TPP_HAVE_INCLUDE_PATH_MULTIPLE 1
#endif /* TPP_HAVE_INCLUDE_PATH_AFTER */
} tpp_include_path_kind;
#ifndef TPP_HAVE_INCLUDE_PATH_MULTIPLE
#define TPP_HAVE_INCLUDE_PATH_MULTIPLE 0
#endif /* !TPP_HAVE_INCLUDE_PATH_MULTIPLE */

#if TPP_HAVE_INCLUDE_PATH_MULTIPLE
#define _tpp_include_paths_bykind(self, kind) \
	((tpp_include_path_list *)((char *)(self) + (tpp_size)(unsigned int)(kind)))
#else /* TPP_HAVE_INCLUDE_PATH_MULTIPLE */
#define _tpp_include_paths_bykind(self, kind) (&(self)->TPP_INTERNAL(tip_system_list))
#endif /* !TPP_HAVE_INCLUDE_PATH_MULTIPLE */


/* Access include paths */
#define tpp_include_paths_numsystem(self)    tpp_include_path_list_getcount(&(self)->TPP_INTERNAL(tip_system_list))
#define tpp_include_paths_getsystem(self, i) tpp_include_path_list_getentry(&(self)->TPP_INTERNAL(tip_system_list), i)
#if TPP_HAVE_INCLUDE_PATH_QUOTE
#define tpp_include_paths_numquote(self)     tpp_include_path_list_getcount(&(self)->TPP_INTERNAL(tip_quote_list))
#define tpp_include_paths_getquote(self, i)  tpp_include_path_list_getentry(&(self)->TPP_INTERNAL(tip_quote_list), i)
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
#define tpp_include_paths_numsyshdr(self)    tpp_include_path_list_getcount(&(self)->TPP_INTERNAL(tip_syshdr_list))
#define tpp_include_paths_getsyshdr(self, i) tpp_include_path_list_getentry(&(self)->TPP_INTERNAL(tip_syshdr_list), i)
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
#define tpp_include_paths_numafter(self)     tpp_include_path_list_getcount(&(self)->TPP_INTERNAL(tip_after_list))
#define tpp_include_paths_getafter(self, i)  tpp_include_path_list_getentry(&(self)->TPP_INTERNAL(tip_after_list), i)
#endif /* TPP_HAVE_INCLUDE_PATH_AFTER */
#define tpp_include_paths_numbykind(self, kind)    tpp_include_path_list_getcount(_tpp_include_paths_bykind(self, kind))
#define tpp_include_paths_getbykind(self, kind, i) tpp_include_path_list_getentry(_tpp_include_paths_bykind(self, kind), i)

/* Helper methods to add/remove paths to different include path lists */
#if TPP_HAVE_INCLUDE_PATH_PUSH_POP
#define _tpp_include_paths_alloc() ((tpp_include_paths *)tpp_malloc(sizeof(tpp_include_paths)))
#define _tpp_include_paths_free(p) tpp_free(p)

#if TPP_HAVE_INCLUDE_PATH_MULTIPLE
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3)) tpp_errno TPPCALL
tpp_include_paths_addbykind(tpp_include_paths *tpp_restrict self,
                            tpp_include_path_kind kind,
                            char const *path, tpp_size path_maxlen);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3)) tpp_errno TPPCALL
tpp_include_paths_addbykind_head(tpp_include_paths *tpp_restrict self,
                                 tpp_include_path_kind kind,
                                 char const *path, tpp_size path_maxlen);

/* @return: TPP_EOK:    Path was located and removed
 * @return: TPP_ENOENT: Path could not be found
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_NONNULL((1, 3)) tpp_errno TPPCALL
tpp_include_paths_delbykind(tpp_include_paths *tpp_restrict self,
                            tpp_include_path_kind kind,
                            char const *path, tpp_size path_maxlen);

/* @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_include_paths_clearbykind(tpp_include_paths *tpp_restrict self,
                              tpp_include_path_kind kind);
#else /* TPP_HAVE_INCLUDE_PATH_MULTIPLE */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
_tpp_include_paths_addbykind(tpp_include_paths *tpp_restrict self,
                             char const *path, tpp_size path_maxlen);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
_tpp_include_paths_addbykind_head(tpp_include_paths *tpp_restrict self,
                                  char const *path, tpp_size path_maxlen);

/* @return: TPP_EOK:    Path was located and removed
 * @return: TPP_ENOENT: Path could not be found
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_NONNULL((1, 2)) tpp_errno TPPCALL
_tpp_include_paths_delbykind(tpp_include_paths *tpp_restrict self,
                             char const *path, tpp_size path_maxlen);

/* @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_NONNULL((1)) tpp_errno TPPCALL
_tpp_include_paths_clearbykind(tpp_include_paths *tpp_restrict self);
#define tpp_include_paths_addbykind(self, kind, path, path_maxlen) \
	_tpp_include_paths_addbykind(self, path, path_maxlen)
#define tpp_include_paths_addbykind_head(self, kind, path, path_maxlen) \
	_tpp_include_paths_addbykind_head(self, path, path_maxlen)
#define tpp_include_paths_delbykind(self, kind, path, path_maxlen) \
	_tpp_include_paths_delbykind(self, path, path_maxlen)
#define tpp_include_paths_clearbykind(self, kind) \
	_tpp_include_paths_clearbykind(self)
#endif /* !TPP_HAVE_INCLUDE_PATH_MULTIPLE */


#define tpp_include_paths_addsystem(self, path, path_maxlen)      tpp_include_paths_addbykind(self, TPP_INCLUDE_PATH_KIND_SYSTEM, path, path_maxlen)
#define tpp_include_paths_addsystem_head(self, path, path_maxlen) tpp_include_paths_addbykind_head(self, TPP_INCLUDE_PATH_KIND_SYSTEM, path, path_maxlen)
#define tpp_include_paths_delsystem(self, path, path_maxlen)      tpp_include_paths_delbykind(self, TPP_INCLUDE_PATH_KIND_SYSTEM, path, path_maxlen)
#define tpp_include_paths_clearsystem(self)                       tpp_include_paths_clearbykind(self, TPP_INCLUDE_PATH_KIND_SYSTEM)
#if TPP_HAVE_INCLUDE_PATH_QUOTE
#define tpp_include_paths_addquote(self, path, path_maxlen)      tpp_include_paths_addbykind(self, TPP_INCLUDE_PATH_KIND_QUOTE, path, path_maxlen)
#define tpp_include_paths_addquote_head(self, path, path_maxlen) tpp_include_paths_addbykind_head(self, TPP_INCLUDE_PATH_KIND_QUOTE, path, path_maxlen)
#define tpp_include_paths_delquote(self, path, path_maxlen)      tpp_include_paths_delbykind(self, TPP_INCLUDE_PATH_KIND_QUOTE, path, path_maxlen)
#define tpp_include_paths_clearquote(self)                       tpp_include_paths_clearbykind(self, TPP_INCLUDE_PATH_KIND_QUOTE)
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
#define tpp_include_paths_addsyshdr(self, path, path_maxlen)      tpp_include_paths_addbykind(self, TPP_INCLUDE_PATH_KIND_SYSHDR, path, path_maxlen)
#define tpp_include_paths_addsyshdr_head(self, path, path_maxlen) tpp_include_paths_addbykind_head(self, TPP_INCLUDE_PATH_KIND_SYSHDR, path, path_maxlen)
#define tpp_include_paths_delsyshdr(self, path, path_maxlen)      tpp_include_paths_delbykind(self, TPP_INCLUDE_PATH_KIND_SYSHDR, path, path_maxlen)
#define tpp_include_paths_clearsyshdr(self)                       tpp_include_paths_clearbykind(self, TPP_INCLUDE_PATH_KIND_SYSHDR)
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
#define tpp_include_paths_addafter(self, path, path_maxlen)      tpp_include_paths_addbykind(self, TPP_INCLUDE_PATH_KIND_AFTER, path, path_maxlen)
#define tpp_include_paths_addafter_head(self, path, path_maxlen) tpp_include_paths_addbykind_head(self, TPP_INCLUDE_PATH_KIND_AFTER, path, path_maxlen)
#define tpp_include_paths_delafter(self, path, path_maxlen)      tpp_include_paths_delbykind(self, TPP_INCLUDE_PATH_KIND_AFTER, path, path_maxlen)
#define tpp_include_paths_clearafter(self)                       tpp_include_paths_clearbykind(self, TPP_INCLUDE_PATH_KIND_AFTER)
#endif /* TPP_HAVE_INCLUDE_PATH_AFTER */

/* Push the current include paths state */
#define tpp_include_paths_push(self) (void)(++(self)->TPP_INTERNAL(tip_pushcnt))

/* Pop the current include paths state (may only be called when `tpp_include_paths_canpop(self)') */
TPP_DECL TPP_NONNULL((1)) void TPPCALL tpp_include_paths_pop(tpp_include_paths *tpp_restrict self);
#define tpp_include_paths_canpop(self)         \
	((self)->TPP_INTERNAL(tip_pushcnt) != 0 || \
	 (self)->TPP_INTERNAL(tip_prev) != NULL)

/* When true, `tpp_include_paths_setctx()' must first copy the extension
 * state (which requires heap memory, and may thus fail) */
#define tpp_include_paths_mustcopy(self) ((self)->TPP_INTERNAL(tip_pushcnt) != 0)

#else /* TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#define tpp_include_paths_addsystem(self, path, path_maxlen)      tpp_include_path_list_pushtail(&(self)->TPP_INTERNAL(tip_system_list), path, path_maxlen)
#define tpp_include_paths_addsystem_head(self, path, path_maxlen) tpp_include_path_list_pushhead(&(self)->TPP_INTERNAL(tip_system_list), path, path_maxlen)
#define tpp_include_paths_delsystem(self, path, path_maxlen)      tpp_include_path_list_remove(&(self)->TPP_INTERNAL(tip_system_list), path, path_maxlen)
#define tpp_include_paths_clearsystem(self)                       tpp_include_path_list_clear(&(self)->TPP_INTERNAL(tip_system_list))
#if TPP_HAVE_INCLUDE_PATH_QUOTE
#define tpp_include_paths_addquote(self, path, path_maxlen)      tpp_include_path_list_pushtail(&(self)->TPP_INTERNAL(tip_quote_list), path, path_maxlen)
#define tpp_include_paths_addquote_head(self, path, path_maxlen) tpp_include_path_list_pushhead(&(self)->TPP_INTERNAL(tip_quote_list), path, path_maxlen)
#define tpp_include_paths_delquote(self, path, path_maxlen)      tpp_include_path_list_remove(&(self)->TPP_INTERNAL(tip_quote_list), path, path_maxlen)
#define tpp_include_paths_clearquote(self)                       tpp_include_path_list_clear(&(self)->TPP_INTERNAL(tip_quote_list))
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
#define tpp_include_paths_addsyshdr(self, path, path_maxlen)      tpp_include_path_list_pushtail(&(self)->TPP_INTERNAL(tip_syshdr_list), path, path_maxlen)
#define tpp_include_paths_addsyshdr_head(self, path, path_maxlen) tpp_include_path_list_pushhead(&(self)->TPP_INTERNAL(tip_syshdr_list), path, path_maxlen)
#define tpp_include_paths_delsyshdr(self, path, path_maxlen)      tpp_include_path_list_remove(&(self)->TPP_INTERNAL(tip_syshdr_list), path, path_maxlen)
#define tpp_include_paths_clearsyshdr(self)                       tpp_include_path_list_clear(&(self)->TPP_INTERNAL(tip_syshdr_list))
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
#define tpp_include_paths_addafter(self, path, path_maxlen)      tpp_include_path_list_pushtail(&(self)->TPP_INTERNAL(tip_after_list), path, path_maxlen)
#define tpp_include_paths_addafter_head(self, path, path_maxlen) tpp_include_path_list_pushhead(&(self)->TPP_INTERNAL(tip_after_list), path, path_maxlen)
#define tpp_include_paths_delafter(self, path, path_maxlen)      tpp_include_path_list_remove(&(self)->TPP_INTERNAL(tip_after_list), path, path_maxlen)
#define tpp_include_paths_clearafter(self)                       tpp_include_path_list_clear(&(self)->TPP_INTERNAL(tip_after_list))
#endif /* TPP_HAVE_INCLUDE_PATH_AFTER */
#endif /* !TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#endif /* TPP_HAVE_INCLUDE_PATH */

/************************************************************************/
/* File: parts/hooks.h                                                  */
/************************************************************************/

#if TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK)
#ifndef tpp_lexer_foreach_include_path_flags__PARAM
#if TPP_HAVE_FILE_SYSHDR
#define tpp_lexer_foreach_include_path_flags__PARAM  , tpp_file_flags flags
#define tpp_lexer_foreach_include_path_flags__ARG(x) , x
#else /* TPP_HAVE_FILE_SYSHDR */
#define tpp_lexer_foreach_include_path_flags__PARAM  /* nothing */
#define tpp_lexer_foreach_include_path_flags__ARG(x) /* nothing */
#endif /* !TPP_HAVE_FILE_SYSHDR */
#endif /* !tpp_lexer_foreach_include_path_flags__PARAM */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) */

/* Possible values for `tpp_hooks_call_system_include_path(when)' */
#if TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK
typedef enum tpp_hook_system_include_path_when {
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_FIRST,         /* Called at the very start */
#if TPP_HAVE_INCLUDE_PATH
#if TPP_HAVE_INCLUDE_PATH_QUOTE
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_BEFORE_QUOTE,  /* Called for '"'-paths after trying to import relative to current file, but before "tip_quote_list" is checked */
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_BEFORE_SYSTEM, /* Called before "tip_system_list" is checked */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_BEFORE_SYSHDR, /* Called before "tip_syshdr_list" is checked */
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#endif /* TPP_HAVE_INCLUDE_PATH */
#if TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_BEFORE_CONFIG, /* Called before "TPP_CONFIG_SYSTEM_INCLUDE_PATH" is checked */
#endif /* TPP_HAVE_SEARCH_SYSTEM_INCLUDE_PATH */
#if TPP_HAVE_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_BEFORE_AFTER,  /* Called before "tip_after_list" is checked */
#endif /* TPP_HAVE_INCLUDE_PATH && TPP_HAVE_INCLUDE_PATH_AFTER */
	TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_LAST,          /* Called at the very end */
} tpp_hook_system_include_path_when;
#endif /* TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK */




#undef TPP_HAVE_HOOKS
#if (TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK) ||           \
     TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK) ||           \
     TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK) ||           \
     TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK) ||             \
     TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK) ||        \
     TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK) ||        \
     TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK) ||            \
     TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) ||   \
     TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK) || \
     TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK) ||        \
     TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK))
#define TPP_HAVE_HOOKS 1
#else /* ... */
#define TPP_HAVE_HOOKS 0
#endif /* !... */

#if TPP_HAVE_HOOKS
struct tpp_lexer;
struct tpp_lexer_decodestring_config;
#if TPP_HAVE_WARNINGS
struct tpp_lexer_printf_info;
#endif /* TPP_HAVE_WARNINGS */
typedef struct tpp_hooks {
	/* >> tpp_formatprinter th_warnprinter;
	 * Called by `tpp_lexer_warnf()` to print warning messages
	 * Potentially unused if `TPP_HAVE_WARNHANDLER_HOOK` is also overwritten
	 * @param: arg: The current lexer (`tpp_lexer *`) */
#if TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK)
#if TPP_HAVE_WARNPRINTER_HOOK != TPP_HOOK_RT_NOOP
	tpp_formatprinter TPP_INTERNAL(th_warnprinter); /* [1..1] */
#else /* TPP_HAVE_WARNPRINTER_HOOK != TPP_HOOK_RT_NOOP */
	tpp_formatprinter TPP_INTERNAL(th_warnprinter); /* [0..1] */
#endif /* TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_RT_NOOP */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK) */

	/* >> tpp_errno (TPPCALL *th_warnhandler)(struct tpp_lexer *tpp_restrict self, struct tpp_lexer_printf_info *tpp_restrict info, tpp_warning_invokeinfo const *tpp_restrict invokeinfo, tpp_warning_id id, va_list args);
	 * Called by `tpp_lexer_warnf()` to handle warning notifications. Can be
	 * overwritten to implement custom behavior in regards to handling of warnings.
	 * @param: info:       Warning context location
	 * @param: invokeinfo: Warning invocation method
	 * @param: id:         Warning ID
	 * @param: arg:        Variable arguments passed to warning
	 * @return: TPP_EOK:        Success (warning was emitted)
	 * @return: TPP_EWARNPRINT: Error during invocation of `TPP_HOOK_WARNPRINTER`
	 * @return: TPP_ENOMEM:     A `TPP_WARNING_EX` returned with this error
	 * @return: TPP_EIO:        A `TPP_WARNING_EX` returned with this error
	 * @return: TPP_ELEXERROR:  A `TPP_WARNING_EX` returned with this error */
#if TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK)
#if TPP_HAVE_WARNHANDLER_HOOK != TPP_HOOK_RT_NOOP
	tpp_errno (TPPCALL *TPP_INTERNAL(th_warnhandler))(struct tpp_lexer *tpp_restrict self, struct tpp_lexer_printf_info *tpp_restrict info, tpp_warning_invokeinfo const *tpp_restrict invokeinfo, tpp_warning_id id, va_list args); /* [1..1] */
#else /* TPP_HAVE_WARNHANDLER_HOOK != TPP_HOOK_RT_NOOP */
	tpp_errno (TPPCALL *TPP_INTERNAL(th_warnhandler))(struct tpp_lexer *tpp_restrict self, struct tpp_lexer_printf_info *tpp_restrict info, tpp_warning_invokeinfo const *tpp_restrict invokeinfo, tpp_warning_id id, va_list args); /* [0..1] */
#endif /* TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_RT_NOOP */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK) */

	/* >> tpp_formatprinter th_mesgprinter;
	 * Used by `#pragma message` to print messages
	 * @param: arg: The current lexer (`tpp_lexer *`) */
#if TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK)
#if TPP_HAVE_MESGPRINTER_HOOK != TPP_HOOK_RT_NOOP
	tpp_formatprinter TPP_INTERNAL(th_mesgprinter); /* [1..1] */
#else /* TPP_HAVE_MESGPRINTER_HOOK != TPP_HOOK_RT_NOOP */
	tpp_formatprinter TPP_INTERNAL(th_mesgprinter); /* [0..1] */
#endif /* TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_RT_NOOP */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK) */

	/* >> tpp_errno (TPPCALL *th_parseexpr)(struct tpp_lexer *tpp_restrict self, tpp_expr_value *tpp_restrict result);
	 * User-defined callback for parsing `#if`-style expressions
	 * - This callback is invoked in a context where `self` points
	 *   before the expression's first token (meaning that this
	 *   callback is responsible to do the initial yield using
	 *   whatever method it wants to use).
	 * - When it is known that the expression has finite length,
	 *   as in: it has to end before EOF, or at the next unmatched
	 *   `)`-token, the caller will have configured the lexer's
	 *   current EOF accordingly (and disabled file-popping)
	 * - When this function returns an error, the caller will rewind
	 *   back to the start of the expression (or even further, if
	 *   applicable; meaning this callback doesn't need to concern
	 *   itself with rollback)
	 *
	 * @return: TPP_EOK:         Success (`*result` was initialized)
	 * @return: TPP_ENOMEM:      Out of memory
	 * @return: TPP_EIO:         Filesystem I/O operation failed
	 * @return: TPP_EWOULDBLOCK: Operation would block
	 * @return: TPP_ELEXERROR:   A lexer error happened
	 * @return: TPP_EWARNPRINT:  Error while printing a warning */
#if TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK)
#if TPP_HAVE_PARSEEXPR_HOOK != TPP_HOOK_RT_NOOP
	tpp_errno (TPPCALL *TPP_INTERNAL(th_parseexpr))(struct tpp_lexer *tpp_restrict self, tpp_expr_value *tpp_restrict result); /* [1..1] */
#else /* TPP_HAVE_PARSEEXPR_HOOK != TPP_HOOK_RT_NOOP */
	tpp_errno (TPPCALL *TPP_INTERNAL(th_parseexpr))(struct tpp_lexer *tpp_restrict self, tpp_expr_value *tpp_restrict result); /* [0..1] */
#endif /* TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_RT_NOOP */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK) */

	/* >> tpp_errno (TPPCALL *th_unknown_pragma)(struct tpp_lexer *tpp_restrict self);
	 * Called whenever a `#pragma` is encountered that is not recognized.
	 * When called, the lexer is set-up to point at the first token after the `#pragma`.
	 * @return: TPP_EOK:    Pragma has been handled
	 * @return: TPP_ENOENT: Pragma is still unknown, and a warning should be emitted
	 * @return: TPP_EIO:    I/O error
	 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_unknown_pragma))(struct tpp_lexer *tpp_restrict self); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK) */

	/* >> tpp_errno (TPPCALL *th_new_dependency)(struct tpp_lexer *tpp_restrict self, tpp_keyword *filename_kwd);
	 * Called whenever some file is `#include`-ed for the first time
	 * @param: filename_kwd: Then `tpp_keyword` used to describe the file's name. The actual
	 *                       filename can be queried as `tpp_keyword_getcstr(filename_kwd)`. */
#if TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_new_dependency))(struct tpp_lexer *tpp_restrict self, tpp_keyword *filename_kwd); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK) */

	/* >> tpp_errno (TPPCALL *th_ident_sccs)(struct tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_string *chunk, tpp_char const *comment_str, tpp_size comment_len);
	 * Called to handle `#ident` and `#sccs` directives
	 * @param: mode:        Either `TPP_KWD_ident` or `TPP_KWD_sccs`
	 * @param: chunk:       If non-NULL a string that must be `tpp_string_incref()`d
	 *                      if you want to keep `comment_str` alive. If NULL, then the
	 *                      given `comment_str` is statically allocated and doesn't need
	 *                      any chunk to stay alive
	 * @param: comment_str: The source comment that should be inserted
	 * @param: comment_len: Length of `comment_str` in bytes
	 * @return: TPP_EOK:    Success
	 * @return: TPP_EIO:    I/O error
	 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_ident_sccs))(struct tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_string *chunk, tpp_char const *comment_str, tpp_size comment_len); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK) */

	/* >> tpp_errno (TPPCALL *th_system_include_path)(struct tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_hook_system_include_path_when when, tpp_errno (TPPCALL *cb)(void *arg, char const *relative_to tpp_lexer_foreach_include_path_flags__PARAM), void *arg);
	 * Extra callback invoked by `tpp_lexer_foreach_include_path()` at diffrent
	 * points during the process of enumerating include paths. This callback is
	 * then allowed to enumerate some additional include paths that may exist, but
	 * for one reason or another (mainly: speed) aren't known to TPP via its system
	 * include path APIs (`tpp_lexer_includes_add*`)
	 * @param: when: One of `TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_*`: describes the
	 *               caller's position in `tpp_lexer_foreach_include_path()`.
	 * @return: * :         First non-TPP_ENOENT return value of `cb`
	 * @return: TPP_ENOENT: File still not found
	 * @return: TPP_EIO:    I/O error
	 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_system_include_path))(struct tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_hook_system_include_path_when when, tpp_errno (TPPCALL *cb)(void *arg, char const *relative_to tpp_lexer_foreach_include_path_flags__PARAM), void *arg); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) */

	/* >> tpp_ssize (TPPCALL *th_unknown_string_escape)(struct tpp_lexer *tpp_restrict self, tpp_char const **p_pos, tpp_char const *end, struct tpp_lexer_decodestring_config const *tpp_restrict config);
	 * Called by `tpp_lexer_decodestring()` when an unknown `\`-escape sequence is encountered
	 * This hook can be used to define additional, user-defined escape sequences, or any other
	 * arbitrary behavior to-be performed when specific escape-sequences are found.
	 * On entry, `*p_pos` points at the first (unrecognized) character after the leading `\`, and
	 * if the hook was able to parse said escape sequence, it should update `*p_pos` to point after
	 * it before returning
	 * @param: p_pos:  [in]  Pointer to start of unrecognized `\`-escape sequence
	 *                 [out] First character no longer part of `\`-escape sequence (if recognized)
	 *                 [out] Unchanged (if not recognized)
	 * @param: end:    The of containing string sequence
	 * @param: config: Identically-named argument of `tpp_lexer_decodestring()`
	 * @return: * :    Sum of positive return values of `data_printer` and `utf8_printer`
	 * @return: < 0:   First negative return value of `data_printer` or `utf8_printer`
	 * @return: TPP_SSIZE_OFERR(TPP_ENOENT): Escape sequence still not recognized
	 *                 (please leave `*p_pos` unchanged in this case). The caller will
	 *                 proceed by emitting `TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE` */
#if TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK)
	tpp_ssize (TPPCALL *TPP_INTERNAL(th_unknown_string_escape))(struct tpp_lexer *tpp_restrict self, tpp_char const **p_pos, tpp_char const *end, struct tpp_lexer_decodestring_config const *tpp_restrict config); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK) */

	/* >> tpp_errno (TPPCALL *th_raise_lexerror)(struct tpp_lexer *tpp_restrict self);
	 * Called by `tpp_lexer_warnf()` just before it's about to return `TPP_ELEXERROR`
	 * This hook can be used to do additional state changes that may be necessary by the
	 * hosting application in order to handle the resulting `TPP_ELEXERROR`
	 * @return: TPP_EOK: Have `tpp_lexer_warnf()` still return `TPP_ELEXERROR`
	 * @return: * :      Make `tpp_lexer_warnf()` return this instead of `TPP_ELEXERROR` */
#if TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_raise_lexerror))(struct tpp_lexer *tpp_restrict self); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK) */

	/* >> tpp_errno (TPPCALL *th_isfloatsuffix)(struct tpp_lexer *tpp_restrict self, tpp_char const *pos);
	 * Called by `tpp_lexer_yieldraw()` when `TPP_HAVE_SMART_FLOAT_TOKENS` is enabled and
	 * a sequence like `1.f` is encountered where the lexer is unsure if the `f` should be
	 * part of the float-token (in the form of a float-suffix), or if this is actually be
	 * parsed as 3 tokens: `[C_INT:1][DOT:.][f:f]`. For this purpose, this hook is called
	 * with `pos` pointing at the `f` (though additional characters thereafter may not be
	 * loaded yet, though can be loaded using `tpp_lexer_readchar()`)
	 * @return: TPP_EOK:    Pointed-to location actually *does* refer to a float suffix
	 * @return: TPP_ENOENT: It's not a float suffix
	 * @return: TPP_EIO:    I/O error
	 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK)
	tpp_errno (TPPCALL *TPP_INTERNAL(th_isfloatsuffix))(struct tpp_lexer *tpp_restrict self, tpp_char const *pos); /* [0..1] */
#endif /* TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK) */
} tpp_hooks;
#endif /* TPP_HAVE_HOOKS */

/* Called by `tpp_lexer_warnf()` to print warning messages
 * Potentially unused if `TPP_HAVE_WARNHANDLER_HOOK` is also overwritten
 * @param: arg: The current lexer (`tpp_lexer *`) */
#if TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK)
#if TPP_HAVE_WARNPRINTER_HOOK != TPP_HOOK_RT_NOOP
#define tpp_hooks_call_warnprinter(self, lexer, text, num_bytes) \
	tpp_formatprinter_print((self)->TPP_INTERNAL(th_warnprinter), lexer, text, num_bytes)
#else /* TPP_HAVE_WARNPRINTER_HOOK != TPP_HOOK_RT_NOOP */
#define tpp_hooks_call_warnprinter(self, lexer, text, num_bytes) \
	((self)->TPP_INTERNAL(th_warnprinter) ? tpp_formatprinter_print((self)->TPP_INTERNAL(th_warnprinter), lexer, text, num_bytes) : 0)
#endif /* TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_RT_NOOP */
#define tpp_hooks_get_warnprinter(self)    (self)->TPP_INTERNAL(th_warnprinter)
#define tpp_hooks_set_warnprinter(self, v) (void)((self)->TPP_INTERNAL(th_warnprinter) = (v))
#define tpp_hooks_reset_warnprinter(self)  (void)((self)->TPP_INTERNAL(th_warnprinter) = _TPP_HOOKS_DEFAULT_WARNPRINTER)
#define _tpp_hooks_init_warnprinter(self)  , (self)->TPP_INTERNAL(th_warnprinter) = _TPP_HOOKS_DEFAULT_WARNPRINTER
#if TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_WARNPRINTER)
#define _TPP_HOOKS_DEFAULT_WARNPRINTER (&TPP_HOOK_WARNPRINTER)
#elif TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_RT_BUILTIN
#define _TPP_HOOKS_DEFAULT_WARNPRINTER (&_tpp_lexer_builtin_warn_or_mesg_printer)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_WARNPRINTER NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK) */
#if TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_get_warnprinter(self) (&TPP_HOOK_WARNPRINTER)
#define tpp_hooks_call_warnprinter(self, lexer, text, num_bytes) \
	TPP_HOOK_WARNPRINTER(lexer, text, num_bytes)
#elif TPP_HAVE_WARNPRINTER_HOOK == TPP_HOOK_CONST_BUILTIN
#define tpp_hooks_get_warnprinter(self) (&_tpp_lexer_builtin_warn_or_mesg_printer)
#define tpp_hooks_call_warnprinter(self, lexer, text, num_bytes) \
	_tpp_lexer_builtin_warn_or_mesg_printer(lexer, text, num_bytes)
#else /*  */
#define tpp_hooks_call_warnprinter(self, lexer, text, num_bytes) 0
#endif /* ... */
#define _tpp_hooks_init_warnprinter(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_WARNPRINTER_HOOK) */

/* Called by `tpp_lexer_warnf()` to handle warning notifications. Can be
 * overwritten to implement custom behavior in regards to handling of warnings.
 * @param: info:       Warning context location
 * @param: invokeinfo: Warning invocation method
 * @param: id:         Warning ID
 * @param: arg:        Variable arguments passed to warning
 * @return: TPP_EOK:        Success (warning was emitted)
 * @return: TPP_EWARNPRINT: Error during invocation of `TPP_HOOK_WARNPRINTER`
 * @return: TPP_ENOMEM:     A `TPP_WARNING_EX` returned with this error
 * @return: TPP_EIO:        A `TPP_WARNING_EX` returned with this error
 * @return: TPP_ELEXERROR:  A `TPP_WARNING_EX` returned with this error */
#if TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK)
#if TPP_HAVE_WARNHANDLER_HOOK != TPP_HOOK_RT_NOOP
#define tpp_hooks_call_warnhandler(self, lexer, info, invokeinfo, id, args) \
	(*(self)->TPP_INTERNAL(th_warnhandler))(lexer, info, invokeinfo, id, args)
#else /* TPP_HAVE_WARNHANDLER_HOOK != TPP_HOOK_RT_NOOP */
#define tpp_hooks_call_warnhandler(self, lexer, info, invokeinfo, id, args) \
	((self)->TPP_INTERNAL(th_warnhandler) ? (*(self)->TPP_INTERNAL(th_warnhandler))(lexer, info, invokeinfo, id, args) : TPP_EOK)
#endif /* TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_RT_NOOP */
#define tpp_hooks_get_warnhandler(self)    (self)->TPP_INTERNAL(th_warnhandler)
#define tpp_hooks_set_warnhandler(self, v) (void)((self)->TPP_INTERNAL(th_warnhandler) = (v))
#define tpp_hooks_reset_warnhandler(self)  (void)((self)->TPP_INTERNAL(th_warnhandler) = _TPP_HOOKS_DEFAULT_WARNHANDLER)
#define _tpp_hooks_init_warnhandler(self)  , (self)->TPP_INTERNAL(th_warnhandler) = _TPP_HOOKS_DEFAULT_WARNHANDLER
#if TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_WARNHANDLER)
#define _TPP_HOOKS_DEFAULT_WARNHANDLER (&TPP_HOOK_WARNHANDLER)
#elif TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_RT_BUILTIN
#define _TPP_HOOKS_DEFAULT_WARNHANDLER (&_tpp_lexer_builtin_warnhandler)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_WARNHANDLER NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK) */
#if TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_warnhandler(self, lexer, info, invokeinfo, id, args) \
	TPP_HOOK_WARNHANDLER(lexer, info, invokeinfo, id, args)
#elif TPP_HAVE_WARNHANDLER_HOOK == TPP_HOOK_CONST_BUILTIN
#define tpp_hooks_call_warnhandler(self, lexer, info, invokeinfo, id, args) \
	_tpp_lexer_builtin_warnhandler(lexer, info, invokeinfo, id, args)
#else /*  */
#define tpp_hooks_call_warnhandler(self, lexer, info, invokeinfo, id, args) TPP_EOK
#endif /* ... */
#define _tpp_hooks_init_warnhandler(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_WARNHANDLER_HOOK) */

/* Used by `#pragma message` to print messages
 * @param: arg: The current lexer (`tpp_lexer *`) */
#if TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK)
#if TPP_HAVE_MESGPRINTER_HOOK != TPP_HOOK_RT_NOOP
#define tpp_hooks_call_mesgprinter(self, lexer, text, num_bytes) \
	tpp_formatprinter_print((self)->TPP_INTERNAL(th_mesgprinter), lexer, text, num_bytes)
#else /* TPP_HAVE_MESGPRINTER_HOOK != TPP_HOOK_RT_NOOP */
#define tpp_hooks_call_mesgprinter(self, lexer, text, num_bytes) \
	((self)->TPP_INTERNAL(th_mesgprinter) ? tpp_formatprinter_print((self)->TPP_INTERNAL(th_mesgprinter), lexer, text, num_bytes) : 0)
#endif /* TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_RT_NOOP */
#define tpp_hooks_get_mesgprinter(self)    (self)->TPP_INTERNAL(th_mesgprinter)
#define tpp_hooks_set_mesgprinter(self, v) (void)((self)->TPP_INTERNAL(th_mesgprinter) = (v))
#define tpp_hooks_reset_mesgprinter(self)  (void)((self)->TPP_INTERNAL(th_mesgprinter) = _TPP_HOOKS_DEFAULT_MESGPRINTER)
#define _tpp_hooks_init_mesgprinter(self)  , (self)->TPP_INTERNAL(th_mesgprinter) = _TPP_HOOKS_DEFAULT_MESGPRINTER
#if TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_MESGPRINTER)
#define _TPP_HOOKS_DEFAULT_MESGPRINTER (&TPP_HOOK_MESGPRINTER)
#elif TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_RT_BUILTIN
#define _TPP_HOOKS_DEFAULT_MESGPRINTER (&_tpp_lexer_builtin_warn_or_mesg_printer)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_MESGPRINTER NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK) */
#if TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_get_mesgprinter(self) (&TPP_HOOK_MESGPRINTER)
#define tpp_hooks_call_mesgprinter(self, lexer, text, num_bytes) \
	TPP_HOOK_MESGPRINTER(lexer, text, num_bytes)
#elif TPP_HAVE_MESGPRINTER_HOOK == TPP_HOOK_CONST_BUILTIN
#define tpp_hooks_get_mesgprinter(self) (&_tpp_lexer_builtin_warn_or_mesg_printer)
#define tpp_hooks_call_mesgprinter(self, lexer, text, num_bytes) \
	_tpp_lexer_builtin_warn_or_mesg_printer(lexer, text, num_bytes)
#else /*  */
#define tpp_hooks_call_mesgprinter(self, lexer, text, num_bytes) 0
#endif /* ... */
#define _tpp_hooks_init_mesgprinter(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_MESGPRINTER_HOOK) */

/* User-defined callback for parsing `#if`-style expressions
 * - This callback is invoked in a context where `self` points
 *   before the expression's first token (meaning that this
 *   callback is responsible to do the initial yield using
 *   whatever method it wants to use).
 * - When it is known that the expression has finite length,
 *   as in: it has to end before EOF, or at the next unmatched
 *   `)`-token, the caller will have configured the lexer's
 *   current EOF accordingly (and disabled file-popping)
 * - When this function returns an error, the caller will rewind
 *   back to the start of the expression (or even further, if
 *   applicable; meaning this callback doesn't need to concern
 *   itself with rollback)
 *
 * @return: TPP_EOK:         Success (`*result` was initialized)
 * @return: TPP_ENOMEM:      Out of memory
 * @return: TPP_EIO:         Filesystem I/O operation failed
 * @return: TPP_EWOULDBLOCK: Operation would block
 * @return: TPP_ELEXERROR:   A lexer error happened
 * @return: TPP_EWARNPRINT:  Error while printing a warning */
#if TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK)
#if TPP_HAVE_PARSEEXPR_HOOK != TPP_HOOK_RT_NOOP
#define tpp_hooks_call_parseexpr(self, lexer, result) \
	(*(self)->TPP_INTERNAL(th_parseexpr))(lexer, result)
#else /* TPP_HAVE_PARSEEXPR_HOOK != TPP_HOOK_RT_NOOP */
#define tpp_hooks_call_parseexpr(self, lexer, result) \
	((self)->TPP_INTERNAL(th_parseexpr) ? (*(self)->TPP_INTERNAL(th_parseexpr))(lexer, result) : tpp_expr_value_init_zero(result))
#endif /* TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_RT_NOOP */
#define tpp_hooks_get_parseexpr(self)    (self)->TPP_INTERNAL(th_parseexpr)
#define tpp_hooks_set_parseexpr(self, v) (void)((self)->TPP_INTERNAL(th_parseexpr) = (v))
#define tpp_hooks_reset_parseexpr(self)  (void)((self)->TPP_INTERNAL(th_parseexpr) = _TPP_HOOKS_DEFAULT_PARSEEXPR)
#define _tpp_hooks_init_parseexpr(self)  , (self)->TPP_INTERNAL(th_parseexpr) = _TPP_HOOKS_DEFAULT_PARSEEXPR
#if TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_PARSEEXPR)
#define _TPP_HOOKS_DEFAULT_PARSEEXPR (&TPP_HOOK_PARSEEXPR)
#elif TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_RT_BUILTIN
#define _TPP_HOOKS_DEFAULT_PARSEEXPR (&_tpp_lexer_builtin_parseexpr)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_PARSEEXPR NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK) */
#if TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_parseexpr(self, lexer, result) \
	TPP_HOOK_PARSEEXPR(lexer, result)
#elif TPP_HAVE_PARSEEXPR_HOOK == TPP_HOOK_CONST_BUILTIN
#define tpp_hooks_call_parseexpr(self, lexer, result) \
	_tpp_lexer_builtin_parseexpr(lexer, result)
#else /*  */
#define tpp_hooks_call_parseexpr(self, lexer, result) tpp_expr_value_init_zero(result)
#endif /* ... */
#define _tpp_hooks_init_parseexpr(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_PARSEEXPR_HOOK) */

/* Called whenever a `#pragma` is encountered that is not recognized.
 * When called, the lexer is set-up to point at the first token after the `#pragma`.
 * @return: TPP_EOK:    Pragma has been handled
 * @return: TPP_ENOENT: Pragma is still unknown, and a warning should be emitted
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK)
#define tpp_hooks_call_unknown_pragma(self, lexer) \
	((self)->TPP_INTERNAL(th_unknown_pragma) ? (*(self)->TPP_INTERNAL(th_unknown_pragma))(lexer) : TPP_ENOENT)
#define tpp_hooks_get_unknown_pragma(self)    (self)->TPP_INTERNAL(th_unknown_pragma)
#define tpp_hooks_set_unknown_pragma(self, v) (void)((self)->TPP_INTERNAL(th_unknown_pragma) = (v))
#define tpp_hooks_reset_unknown_pragma(self)  (void)((self)->TPP_INTERNAL(th_unknown_pragma) = _TPP_HOOKS_DEFAULT_UNKNOWN_PRAGMA)
#define _tpp_hooks_init_unknown_pragma(self)  , (self)->TPP_INTERNAL(th_unknown_pragma) = _TPP_HOOKS_DEFAULT_UNKNOWN_PRAGMA
#if TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_UNKNOWN_PRAGMA)
#define _TPP_HOOKS_DEFAULT_UNKNOWN_PRAGMA (&TPP_HOOK_UNKNOWN_PRAGMA)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_UNKNOWN_PRAGMA NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK) */
#if TPP_HAVE_UNKNOWN_PRAGMA_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_unknown_pragma(self, lexer) \
	TPP_HOOK_UNKNOWN_PRAGMA(lexer)
#else /*  */
#define tpp_hooks_call_unknown_pragma(self, lexer) TPP_ENOENT
#endif /* ... */
#define _tpp_hooks_init_unknown_pragma(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_PRAGMA_HOOK) */

/* Called whenever some file is `#include`-ed for the first time
 * @param: filename_kwd: Then `tpp_keyword` used to describe the file's name. The actual
 *                       filename can be queried as `tpp_keyword_getcstr(filename_kwd)`. */
#if TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK)
#define tpp_hooks_call_new_dependency(self, lexer, filename_kwd) \
	((self)->TPP_INTERNAL(th_new_dependency) ? (*(self)->TPP_INTERNAL(th_new_dependency))(lexer, filename_kwd) : TPP_EOK)
#define tpp_hooks_get_new_dependency(self)    (self)->TPP_INTERNAL(th_new_dependency)
#define tpp_hooks_set_new_dependency(self, v) (void)((self)->TPP_INTERNAL(th_new_dependency) = (v))
#define tpp_hooks_reset_new_dependency(self)  (void)((self)->TPP_INTERNAL(th_new_dependency) = _TPP_HOOKS_DEFAULT_NEW_DEPENDENCY)
#define _tpp_hooks_init_new_dependency(self)  , (self)->TPP_INTERNAL(th_new_dependency) = _TPP_HOOKS_DEFAULT_NEW_DEPENDENCY
#if TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_NEW_DEPENDENCY)
#define _TPP_HOOKS_DEFAULT_NEW_DEPENDENCY (&TPP_HOOK_NEW_DEPENDENCY)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_NEW_DEPENDENCY NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK) */
#if TPP_HAVE_NEW_DEPENDENCY_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_new_dependency(self, lexer, filename_kwd) \
	TPP_HOOK_NEW_DEPENDENCY(lexer, filename_kwd)
#else /*  */
#define tpp_hooks_call_new_dependency(self, lexer, filename_kwd) TPP_EOK
#endif /* ... */
#define _tpp_hooks_init_new_dependency(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_NEW_DEPENDENCY_HOOK) */

/* Called to handle `#ident` and `#sccs` directives
 * @param: mode:        Either `TPP_KWD_ident` or `TPP_KWD_sccs`
 * @param: chunk:       If non-NULL a string that must be `tpp_string_incref()`d
 *                      if you want to keep `comment_str` alive. If NULL, then the
 *                      given `comment_str` is statically allocated and doesn't need
 *                      any chunk to stay alive
 * @param: comment_str: The source comment that should be inserted
 * @param: comment_len: Length of `comment_str` in bytes
 * @return: TPP_EOK:    Success
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK)
#define tpp_hooks_call_ident_sccs(self, lexer, mode, chunk, comment_str, comment_len) \
	((self)->TPP_INTERNAL(th_ident_sccs) ? (*(self)->TPP_INTERNAL(th_ident_sccs))(lexer, mode, chunk, comment_str, comment_len) : TPP_EOK)
#define tpp_hooks_get_ident_sccs(self)    (self)->TPP_INTERNAL(th_ident_sccs)
#define tpp_hooks_set_ident_sccs(self, v) (void)((self)->TPP_INTERNAL(th_ident_sccs) = (v))
#define tpp_hooks_reset_ident_sccs(self)  (void)((self)->TPP_INTERNAL(th_ident_sccs) = _TPP_HOOKS_DEFAULT_IDENT_SCCS)
#define _tpp_hooks_init_ident_sccs(self)  , (self)->TPP_INTERNAL(th_ident_sccs) = _TPP_HOOKS_DEFAULT_IDENT_SCCS
#if TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_IDENT_SCCS)
#define _TPP_HOOKS_DEFAULT_IDENT_SCCS (&TPP_HOOK_IDENT_SCCS)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_IDENT_SCCS NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK) */
#if TPP_HAVE_IDENT_SCCS_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_ident_sccs(self, lexer, mode, chunk, comment_str, comment_len) \
	TPP_HOOK_IDENT_SCCS(lexer, mode, chunk, comment_str, comment_len)
#else /*  */
#define tpp_hooks_call_ident_sccs(self, lexer, mode, chunk, comment_str, comment_len) TPP_EOK
#endif /* ... */
#define _tpp_hooks_init_ident_sccs(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_IDENT_SCCS_HOOK) */

/* Extra callback invoked by `tpp_lexer_foreach_include_path()` at diffrent
 * points during the process of enumerating include paths. This callback is
 * then allowed to enumerate some additional include paths that may exist, but
 * for one reason or another (mainly: speed) aren't known to TPP via its system
 * include path APIs (`tpp_lexer_includes_add*`)
 * @param: when: One of `TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_*`: describes the
 *               caller's position in `tpp_lexer_foreach_include_path()`.
 * @return: * :         First non-TPP_ENOENT return value of `cb`
 * @return: TPP_ENOENT: File still not found
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK)
#define tpp_hooks_call_system_include_path(self, lexer, mode, when, cb, arg) \
	((self)->TPP_INTERNAL(th_system_include_path) ? (*(self)->TPP_INTERNAL(th_system_include_path))(lexer, mode, when, cb, arg) : TPP_ENOENT)
#define tpp_hooks_get_system_include_path(self)    (self)->TPP_INTERNAL(th_system_include_path)
#define tpp_hooks_set_system_include_path(self, v) (void)((self)->TPP_INTERNAL(th_system_include_path) = (v))
#define tpp_hooks_reset_system_include_path(self)  (void)((self)->TPP_INTERNAL(th_system_include_path) = _TPP_HOOKS_DEFAULT_SYSTEM_INCLUDE_PATH)
#define _tpp_hooks_init_system_include_path(self)  , (self)->TPP_INTERNAL(th_system_include_path) = _TPP_HOOKS_DEFAULT_SYSTEM_INCLUDE_PATH
#if TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_SYSTEM_INCLUDE_PATH)
#define _TPP_HOOKS_DEFAULT_SYSTEM_INCLUDE_PATH (&TPP_HOOK_SYSTEM_INCLUDE_PATH)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_SYSTEM_INCLUDE_PATH NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) */
#if TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_system_include_path(self, lexer, mode, when, cb, arg) \
	TPP_HOOK_SYSTEM_INCLUDE_PATH(lexer, mode, when, cb, arg)
#else /*  */
#define tpp_hooks_call_system_include_path(self, lexer, mode, when, cb, arg) TPP_ENOENT
#endif /* ... */
#define _tpp_hooks_init_system_include_path(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_SYSTEM_INCLUDE_PATH_HOOK) */

/* Called by `tpp_lexer_decodestring()` when an unknown `\`-escape sequence is encountered
 * This hook can be used to define additional, user-defined escape sequences, or any other
 * arbitrary behavior to-be performed when specific escape-sequences are found.
 * On entry, `*p_pos` points at the first (unrecognized) character after the leading `\`, and
 * if the hook was able to parse said escape sequence, it should update `*p_pos` to point after
 * it before returning
 * @param: p_pos:  [in]  Pointer to start of unrecognized `\`-escape sequence
 *                 [out] First character no longer part of `\`-escape sequence (if recognized)
 *                 [out] Unchanged (if not recognized)
 * @param: end:    The of containing string sequence
 * @param: config: Identically-named argument of `tpp_lexer_decodestring()`
 * @return: * :    Sum of positive return values of `data_printer` and `utf8_printer`
 * @return: < 0:   First negative return value of `data_printer` or `utf8_printer`
 * @return: TPP_SSIZE_OFERR(TPP_ENOENT): Escape sequence still not recognized
 *                 (please leave `*p_pos` unchanged in this case). The caller will
 *                 proceed by emitting `TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE` */
#if TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK)
#define tpp_hooks_call_unknown_string_escape(self, lexer, p_pos, end, config) \
	((self)->TPP_INTERNAL(th_unknown_string_escape) ? (*(self)->TPP_INTERNAL(th_unknown_string_escape))(lexer, p_pos, end, config) : TPP_SSIZE_OFERR(TPP_ENOENT))
#define tpp_hooks_get_unknown_string_escape(self)    (self)->TPP_INTERNAL(th_unknown_string_escape)
#define tpp_hooks_set_unknown_string_escape(self, v) (void)((self)->TPP_INTERNAL(th_unknown_string_escape) = (v))
#define tpp_hooks_reset_unknown_string_escape(self)  (void)((self)->TPP_INTERNAL(th_unknown_string_escape) = _TPP_HOOKS_DEFAULT_UNKNOWN_STRING_ESCAPE)
#define _tpp_hooks_init_unknown_string_escape(self)  , (self)->TPP_INTERNAL(th_unknown_string_escape) = _TPP_HOOKS_DEFAULT_UNKNOWN_STRING_ESCAPE
#if TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_UNKNOWN_STRING_ESCAPE)
#define _TPP_HOOKS_DEFAULT_UNKNOWN_STRING_ESCAPE (&TPP_HOOK_UNKNOWN_STRING_ESCAPE)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_UNKNOWN_STRING_ESCAPE NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK) */
#if TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_unknown_string_escape(self, lexer, p_pos, end, config) \
	TPP_HOOK_UNKNOWN_STRING_ESCAPE(lexer, p_pos, end, config)
#else /*  */
#define tpp_hooks_call_unknown_string_escape(self, lexer, p_pos, end, config) TPP_SSIZE_OFERR(TPP_ENOENT)
#endif /* ... */
#define _tpp_hooks_init_unknown_string_escape(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_UNKNOWN_STRING_ESCAPE_HOOK) */

/* Called by `tpp_lexer_warnf()` just before it's about to return `TPP_ELEXERROR`
 * This hook can be used to do additional state changes that may be necessary by the
 * hosting application in order to handle the resulting `TPP_ELEXERROR`
 * @return: TPP_EOK: Have `tpp_lexer_warnf()` still return `TPP_ELEXERROR`
 * @return: * :      Make `tpp_lexer_warnf()` return this instead of `TPP_ELEXERROR` */
#if TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK)
#define tpp_hooks_call_raise_lexerror(self, lexer) \
	((self)->TPP_INTERNAL(th_raise_lexerror) ? (*(self)->TPP_INTERNAL(th_raise_lexerror))(lexer) : TPP_ELEXERROR)
#define tpp_hooks_get_raise_lexerror(self)    (self)->TPP_INTERNAL(th_raise_lexerror)
#define tpp_hooks_set_raise_lexerror(self, v) (void)((self)->TPP_INTERNAL(th_raise_lexerror) = (v))
#define tpp_hooks_reset_raise_lexerror(self)  (void)((self)->TPP_INTERNAL(th_raise_lexerror) = _TPP_HOOKS_DEFAULT_RAISE_LEXERROR)
#define _tpp_hooks_init_raise_lexerror(self)  , (self)->TPP_INTERNAL(th_raise_lexerror) = _TPP_HOOKS_DEFAULT_RAISE_LEXERROR
#if TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_RAISE_LEXERROR)
#define _TPP_HOOKS_DEFAULT_RAISE_LEXERROR (&TPP_HOOK_RAISE_LEXERROR)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_RAISE_LEXERROR NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK) */
#if TPP_HAVE_RAISE_LEXERROR_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_raise_lexerror(self, lexer) \
	TPP_HOOK_RAISE_LEXERROR(lexer)
#else /*  */
#define tpp_hooks_call_raise_lexerror(self, lexer) TPP_ELEXERROR
#endif /* ... */
#define _tpp_hooks_init_raise_lexerror(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_RAISE_LEXERROR_HOOK) */

/* Called by `tpp_lexer_yieldraw()` when `TPP_HAVE_SMART_FLOAT_TOKENS` is enabled and
 * a sequence like `1.f` is encountered where the lexer is unsure if the `f` should be
 * part of the float-token (in the form of a float-suffix), or if this is actually be
 * parsed as 3 tokens: `[C_INT:1][DOT:.][f:f]`. For this purpose, this hook is called
 * with `pos` pointing at the `f` (though additional characters thereafter may not be
 * loaded yet, though can be loaded using `tpp_lexer_readchar()`)
 * @return: TPP_EOK:    Pointed-to location actually *does* refer to a float suffix
 * @return: TPP_ENOENT: It's not a float suffix
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#if TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK)
#define tpp_hooks_call_isfloatsuffix(self, lexer, pos) \
	((self)->TPP_INTERNAL(th_isfloatsuffix) ? (*(self)->TPP_INTERNAL(th_isfloatsuffix))(lexer, pos) : TPP_ENOENT)
#define tpp_hooks_get_isfloatsuffix(self)    (self)->TPP_INTERNAL(th_isfloatsuffix)
#define tpp_hooks_set_isfloatsuffix(self, v) (void)((self)->TPP_INTERNAL(th_isfloatsuffix) = (v))
#define tpp_hooks_reset_isfloatsuffix(self)  (void)((self)->TPP_INTERNAL(th_isfloatsuffix) = _TPP_HOOKS_DEFAULT_ISFLOATSUFFIX)
#define _tpp_hooks_init_isfloatsuffix(self)  , (self)->TPP_INTERNAL(th_isfloatsuffix) = _TPP_HOOKS_DEFAULT_ISFLOATSUFFIX
#if TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_RT_USER && defined(TPP_HOOK_ISFLOATSUFFIX)
#define _TPP_HOOKS_DEFAULT_ISFLOATSUFFIX (&TPP_HOOK_ISFLOATSUFFIX)
#else /* ... */
#define _TPP_HOOKS_DEFAULT_ISFLOATSUFFIX NULL
#endif /* !... */
#else /* TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK) */
#if TPP_HAVE_ISFLOATSUFFIX_HOOK == TPP_HOOK_CONST_USER
#define tpp_hooks_call_isfloatsuffix(self, lexer, pos) \
	TPP_HOOK_ISFLOATSUFFIX(lexer, pos)
#else /*  */
#define tpp_hooks_call_isfloatsuffix(self, lexer, pos) TPP_ENOENT
#endif /* ... */
#define _tpp_hooks_init_isfloatsuffix(self) /* nothing */
#endif /* !TPP_HOOK_ISRT(TPP_HAVE_ISFLOATSUFFIX_HOOK) */

/* Initialize lexer hooks */
#define tpp_hooks_init(self) \
	(void)(0 _tpp_hooks_init_warnprinter(self) \
	       _tpp_hooks_init_warnhandler(self) \
	       _tpp_hooks_init_mesgprinter(self) \
	       _tpp_hooks_init_parseexpr(self) \
	       _tpp_hooks_init_unknown_pragma(self) \
	       _tpp_hooks_init_new_dependency(self) \
	       _tpp_hooks_init_ident_sccs(self) \
	       _tpp_hooks_init_system_include_path(self) \
	       _tpp_hooks_init_unknown_string_escape(self) \
	       _tpp_hooks_init_raise_lexerror(self) \
	       _tpp_hooks_init_isfloatsuffix(self))


/************************************************************************/
/* Builtin hooks...                                                     */
/************************************************************************/
#if TPP_HAVE_BUILTIN_WARNPRINTER_HOOK || TPP_HAVE_BUILTIN_MESGPRINTER_HOOK
TPP_DECL TPP_FORMATPRINTER_DEFINE(_tpp_lexer_builtin_warn_or_mesg_printer, arg, text, num_bytes);
#endif /* TPP_HAVE_BUILTIN_WARNPRINTER_HOOK || TPP_HAVE_BUILTIN_MESGPRINTER_HOOK */

#if TPP_HAVE_BUILTIN_WARNHANDLER_HOOK
struct tpp_lexer_printf_info;
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL
_tpp_lexer_builtin_warnhandler(struct tpp_lexer *tpp_restrict self,
                               struct tpp_lexer_printf_info *tpp_restrict info,
                               tpp_warning_invokeinfo const *tpp_restrict invokeinfo,
                               tpp_warning_id id, va_list args);
#endif /* TPP_HAVE_BUILTIN_WARNHANDLER_HOOK */

#if TPP_HAVE_BUILTIN_MESGPRINTER_HOOK
TPP_DECL TPP_FORMATPRINTER_DEFINE(_tpp_lexer_builtin_mesgprinter, arg, text, num_bytes);
#endif /* TPP_HAVE_BUILTIN_MESGPRINTER_HOOK */

#if TPP_HAVE_BUILTIN_PARSEEXPR_HOOK
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
_tpp_lexer_builtin_parseexpr(struct tpp_lexer *tpp_restrict self,
                             tpp_expr_value *tpp_restrict result);
#endif /* TPP_HAVE_BUILTIN_PARSEEXPR_HOOK */
/************************************************************************/


/************************************************************************/
/* File: parts/lexer.h                                                  */
/************************************************************************/

#undef TPP_HAVE_LEXER_STATE_FLAGS
#if (TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS || \
     TPP_HAVE_WARNINGS)
#define TPP_HAVE_LEXER_STATE_FLAGS 1
#else /* ... */
#define TPP_HAVE_LEXER_STATE_FLAGS 0
#endif /* !... */


#if TPP_HAVE_LEXER_STATE_FLAGS
#define tpp_lexer_state_flags uint_least8_t
#define TPP_LEXER_STATE_FLAG_NORMAL       UINT8_C(0x00) /* Normal state flags */
#if TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS
#define TPP_LEXER_STATE_FLAG_ALLTOKENS    UINT8_C(0x01) /* Prevent `tpp_lexer_yieldpp()' from (possibly) skipp SPACE/LF/COMMENT tokens */
#endif /* TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS */
#if TPP_HAVE_WARNINGS
#define TPP_LEXER_STATE_FLAG_NOWARNINGS   UINT8_C(0x02) /* Do not emit any warnings/errors (don't even trigger them) -- should be used during seek-ahead yields. */
#endif /* TPP_HAVE_WARNINGS */
#endif /* TPP_HAVE_LEXER_STATE_FLAGS */


union TPP_INTERNAL(tpp_lexer_core) {
	tpp_token      TPP_INTERNAL(tlc_tok);  /* [valid_if(WAS_CALLED(tpp_lexer_yieldraw()))] Last-read token (never
	                                        * set to one of `TPP_TOK_E*'; iow: always positive or TPP_TOK_EOF). */
	struct {
		char _tli_pad[tpp_offsetof(tpp_token, TPP_INTERNAL(tt_start))];
		tpp_file   TPP_INTERNAL(tli_file); /* [OVERRIDE(.tf_prev, [owned])]
		                                    * The file that lies at the top of the lexer's #include/macro-stack.
		                                    * this is also the file whose buffer currently contains `tl_tok' */
	} TPP_INTERNAL(tlc_input);
};

typedef struct tpp_lexer {
	union TPP_INTERNAL(tpp_lexer_core) TPP_INTERNAL(tl_core); /* Lexer core */

	/* Lexer state flags */
#if TPP_HAVE_LEXER_STATE_FLAGS
	tpp_lexer_state_flags TPP_INTERNAL(tl_state);
#endif /* TPP_HAVE_LEXER_STATE_FLAGS */


	/* Custom keywords table. */
#if TPP_HAVE_USER_KEYWORDS
	tpp_keywords TPP_INTERNAL(tl_kwds);
#endif /* TPP_HAVE_USER_KEYWORDS */


	/* Lexer extensions. */
#if TPP_HAVE_EXTENSIONS
	tpp_extensions TPP_INTERNAL(tl_exts);
#endif /* TPP_HAVE_EXTENSIONS */


	/* Enabled tokens */
#if TPP_HAVE_FEATURES
	tpp_features TPP_INTERNAL(tl_feat);
#endif /* TPP_HAVE_FEATURES */


	/* system #include paths (/usr/include, ...) */
#if TPP_HAVE_INCLUDE_PATH
	tpp_include_paths TPP_INTERNAL(tl_include_paths);
#endif /* TPP_HAVE_INCLUDE_PATH */


	/* User-overwritable function pointer hooks */
#if TPP_HAVE_HOOKS
	tpp_hooks TPP_INTERNAL(tl_hooks);
#endif /* TPP_HAVE_HOOKS */


	/* Compiler warnings configuration */
#if TPP_HAVE_WARNINGS
	tpp_warnings TPP_INTERNAL(tl_warn);
#endif /* TPP_HAVE_WARNINGS */


	/* Lexer error limits */
#if TPP_HAVE_WARNING_ERROR
	tpp_size TPP_INTERNAL(tl_error_count); /* # of times "TPP_WSTATE_ERROR" was emitted.
	                                        * When this is non-zero by the time your compiler finishes
	                                        * compiling your source file, you should NOT proceed, but
	                                        * propagate an error. */
#define tpp_lexer_geterrorcount(self)    (self)->TPP_INTERNAL(tl_error_count)
#define tpp_lexer_seterrorcount(self, v) (void)((self)->TPP_INTERNAL(tl_error_count) = (v))
#if TPP_ERROR_LIMIT < 0
	tpp_size TPP_INTERNAL(tl_error_limit); /* Once `tl_error_count >= tl_error_limit', "TPP_WSTATE_ERROR" is treated as "TPP_WSTATE_FATAL" */
#define tpp_lexer_geterrorlimit(self)    ((self)->TPP_INTERNAL(tl_error_limit))
#define tpp_lexer_seterrorlimit(self, v) (void)((self)->TPP_INTERNAL(tl_error_limit) = (v))
#else /* TPP_ERROR_LIMIT < 0 */
#define tpp_lexer_geterrorlimit(self) TPP_ERROR_LIMIT
#endif /* TPP_ERROR_LIMIT >= 0 */
#else /* TPP_HAVE_WARNING_ERROR */
#define tpp_lexer_geterrorcount(self) 0
#endif /* !TPP_HAVE_WARNING_ERROR */


	/* Lexer warning counter */
#if TPP_HAVE_LEXER_WARNING_COUNT
	tpp_size TPP_INTERNAL(tl_warning_count); /* # of times "TPP_WSTATE_WARN" was emitted. */
#define tpp_lexer_getwarningcount(self)    (self)->TPP_INTERNAL(tl_warning_count)
#define tpp_lexer_setwarningcount(self, v) (void)((self)->TPP_INTERNAL(tl_warning_count) = (v))
#endif /* TPP_HAVE_LEXER_WARNING_COUNT */


	/* Lexer inclusion limit */
#if TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED
#if TPP_MAX_INCLUDE_DEPTH < 0
	tpp_size TPP_INTERNAL(tl_inclusion_limit); /* How many times the same file can be #include-ed before "TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED" is emitted */
#define tpp_lexer_getinclusionlimit(self)    ((self)->TPP_INTERNAL(tl_inclusion_limit))
#define tpp_lexer_setinclusionlimit(self, v) (void)((self)->TPP_INTERNAL(tl_inclusion_limit) = (v))
#else /* TPP_MAX_INCLUDE_DEPTH < 0 */
#define tpp_lexer_getinclusionlimit(self) TPP_MAX_INCLUDE_DEPTH
#endif /* TPP_MAX_INCLUDE_DEPTH >= 0 */
#elif TPP_MAX_INCLUDE_DEPTH < 0
#define tpp_lexer_getinclusionlimit(self) (-TPP_MAX_INCLUDE_DEPTH)
#else /* ... */
#define tpp_lexer_getinclusionlimit(self) TPP_MAX_INCLUDE_DEPTH
#endif /* !... */


	/* Lexer recursive macro limit */
#if TPP_HAVE_MACRO_RECURSION
#if TPP_MAX_RECURSIVE_MACRO_DEPTH < 0
	tpp_size TPP_INTERNAL(tl_recursive_macro_limit); /* How many times the same recursive macro can  */
#define tpp_lexer_getrecursivemacrolimit(self)    ((self)->TPP_INTERNAL(tl_recursive_macro_limit))
#define tpp_lexer_setrecursivemacrolimit(self, v) (void)((self)->TPP_INTERNAL(tl_recursive_macro_limit) = (v))
#else /* TPP_MAX_RECURSIVE_MACRO_DEPTH < 0 */
#define tpp_lexer_getrecursivemacrolimit(self) TPP_MAX_RECURSIVE_MACRO_DEPTH
#endif /* TPP_MAX_RECURSIVE_MACRO_DEPTH >= 0 */
#elif TPP_MAX_RECURSIVE_MACRO_DEPTH < 0
#define tpp_lexer_getrecursivemacrolimit(self) (-TPP_MAX_RECURSIVE_MACRO_DEPTH)
#else /* ... */
#define tpp_lexer_getrecursivemacrolimit(self) TPP_MAX_RECURSIVE_MACRO_DEPTH
#endif /* !... */
#if !TPP_IGNORE_INVALID_CONFIGURATION
#if TPP_MAX_RECURSIVE_MACRO_DEPTH != 0 && !TPP_HAVE_MACRO_RECURSION
#error "Invalid configuration: 'TPP_MAX_RECURSIVE_MACRO_DEPTH' can only take effect when 'TPP_HAVE_MACRO_RECURSION' is enabled"
#elif TPP_MAX_RECURSIVE_MACRO_DEPTH == 1 && TPP_HAVE_MACRO_RECURSION
#error "Invalid configuration: when 'TPP_MAX_RECURSIVE_MACRO_DEPTH=1' is hardcoded, 'TPP_HAVE_MACRO_RECURSION' being on/off makes no difference"
#endif /* ... */
#endif /* !TPP_IGNORE_INVALID_CONFIGURATION */



	/* Next value for __COUNTER__ */
#if TPP_HAVE_MACRO___COUNTER__
	tpp_counter TPP_INTERNAL(tl_builtin_counter); /* Next value for __COUNTER__ */
#define tpp_lexer_getnextcounter(self)    ((self)->TPP_INTERNAL(tl_builtin_counter))
#define tpp_lexer_setnextcounter(self, v) (void)((self)->TPP_INTERNAL(tl_builtin_counter) = (v))
#endif /* TPP_HAVE_MACRO___COUNTER__ */


	/* Value for current time (expansion of __TIME__ can't change between multiple expansions) */
#if TPP_HAVE_LEXER_TIME
	tpp_time TPP_INTERNAL(tl_time); /* Current time, or empty if not yet loaded */
#define tpp_lexer_gettimeptr(self) (&(self)->TPP_INTERNAL(tl_time))
#define tpp_lexer_gettime(self)    (self)->TPP_INTERNAL(tl_time)
#define tpp_lexer_settime(self, v) (void)((self)->TPP_INTERNAL(tl_time) = (v))
#endif /* TPP_HAVE_LEXER_TIME */


	/* Seed for random-number generation (combined with `tpp_lexer_getinputhash()' before use).
	 * Also combined with the final seed of I/O and TEXT files as those files are popped. */
#if TPP_HAVE_LEXER_RAND
	tpp_hash TPP_INTERNAL(tl_rngseed); /* Next RandomNumberGenerationSEED */
#define tpp_lexer_getrngseed(self)    (self)->TPP_INTERNAL(tl_rngseed)
#define tpp_lexer_setrngseed(self, v) (void)((self)->TPP_INTERNAL(tl_rngseed) = (v))
#define tpp_lexer_resetrngseed(self)  (void)((self)->TPP_INTERNAL(tl_rngseed) = TPP_HASH_INITIAL)
#define _tpp_lexer_addrngseed(self, hash) \
	tpp_lexer_setrngseed(self, tpp_hash_combine_hash(tpp_lexer_getrngseed(self), hash))
#define _tpp_lexer_addrngseed_from_file(self, file)                                             \
	(tpp_file_getkind(file) == TPP_FILE_KIND_IO || tpp_file_getkind(file) == TPP_FILE_KIND_TEXT \
	 ? _tpp_lexer_addrngseed(self, tpp_file_gethash(file, (file)->TPP_INTERNAL(tf_end)))        \
	 : (void)0)
#else /* TPP_HAVE_LEXER_RAND */
#define tpp_lexer_resetrngseed(self)                (void)0
#define _tpp_lexer_addrngseed(self, hash)           (void)0
#define _tpp_lexer_addrngseed_from_file(self, file) (void)0
#endif /* !TPP_HAVE_LEXER_RAND */


	/* Format to use for file-and-line prefixes in messages. */
#if TPP_HAVE_RT_FILE_AND_LINE_FORMAT
	char const *TPP_INTERNAL(tl_file_and_line_format); /* [1..1] format for file-and-line prefixes in messages */
#define tpp_lexer_getfileandlineformat(self)         (self)->TPP_INTERNAL(tl_file_and_line_format)
#define tpp_lexer_setfileandlineformat(self, format) (void)((self)->TPP_INTERNAL(tl_file_and_line_format) = (format))
#define tpp_lexer_resetfileandlineformat(self)       (void)((self)->TPP_INTERNAL(tl_file_and_line_format) = TPP_CONFIG_FILE_AND_LINE_FORMAT)
#else /* TPP_HAVE_RT_FILE_AND_LINE_FORMAT */
#define tpp_lexer_getfileandlineformat(self)   TPP_CONFIG_FILE_AND_LINE_FORMAT
#define tpp_lexer_resetfileandlineformat(self) (void)0
#endif /* !TPP_HAVE_RT_FILE_AND_LINE_FORMAT */
} tpp_lexer;

/* Check if a runtime-configurable config option "conf" in "TPP_HAVE_conf" is currently enabled.
 * When "TPP_HAVE_conf" is configured as "TPP_CONF_IS_CONST()", return that constant instead. */
#define tpp_lexer_has(self, conf) _tpp_lexer_has_##conf(self)

/* Current token */
#define tpp_lexer_gettok(self)          ((self)->TPP_INTERNAL(tl_core).TPP_INTERNAL(tlc_tok).TPP_INTERNAL(tt_id))
#define tpp_lexer_gettoken(self)        (&(self)->TPP_INTERNAL(tl_core).TPP_INTERNAL(tlc_tok))
#define tpp_lexer_hastokenkwd(self)     tpp_token_haskwd(tpp_lexer_gettoken(self))
#define tpp_lexer_gettokenkwd(self)     tpp_token_getkwd(tpp_lexer_gettoken(self))
#define tpp_lexer_gettokenkwdcstr(self) tpp_token_getkwdcstr(tpp_lexer_gettoken(self))
#define tpp_lexer_gettokenstart(self)   tpp_token_getstart(tpp_lexer_gettoken(self))
#define tpp_lexer_gettokenend(self)     tpp_token_getend(tpp_lexer_gettoken(self))
#define tpp_lexer_gettokenlen(self)     tpp_token_getlen(tpp_lexer_gettoken(self))

/* Current file */
#define tpp_lexer_getfile(self)     (&(self)->TPP_INTERNAL(tl_core).TPP_INTERNAL(tlc_input).TPP_INTERNAL(tli_file))
#define tpp_lexer_getfilekind(self) tpp_file_getkind(tpp_lexer_getfile(self))
#define tpp_lexer_getlcfile(self)   tpp_file_getlcfile(tpp_lexer_getfile(self))   /* [1..1] Returns the file that is used to determine __LINE__ and __COLUMN__ */
#define tpp_lexer_getbasefile(self) tpp_file_getbasefile(tpp_lexer_getfile(self)) /* [1..1] Return the "base" file (that is: the last one in the #include-stack) */
#define tpp_lexer_gettextfile(self) tpp_file_gettextfile(tpp_lexer_getfile(self)) /* [0..1] Return the last I/O or TEXT file */

/* L/C information helpers */
#define tpp_lexer_getlcinfoat(self, pos)                 tpp_file_getlcinfo(tpp_lexer_getfile(self), pos)
#define tpp_lexer_getlcinfoat_ex(self, pos, result)      tpp_file_getlcinfo_ex(tpp_lexer_getfile(self), pos, result)
#define tpp_lexer_getlcinfoattokenstart(self)            tpp_lexer_getlcinfoat(self, tpp_lexer_gettokenstart(self))
#define tpp_lexer_getlcinfoattokenstart_ex(self, result) tpp_lexer_getlcinfoat_ex(self, tpp_lexer_gettokenstart(self), result)
#define tpp_lexer_getlcinfoattokenend(self)              tpp_lexer_getlcinfoat(self, tpp_lexer_gettokenend(self))
#define tpp_lexer_getlcinfoattokenend_ex(self, result)   tpp_lexer_getlcinfoat_ex(self, tpp_lexer_gettokenend(self), result)

/* Lexer input hash API */
#if TPP_HAVE_FILE_GETFULLHASH
#define tpp_lexer_getinputhashat(self, pos)      tpp_file_getfullhash(tpp_lexer_getfile(self), pos)
#define tpp_lexer_getinputhashattokenstart(self) tpp_lexer_getinputhashat(self, tpp_lexer_gettokenstart(self))
#define tpp_lexer_getinputhashattokenend(self)   tpp_lexer_getinputhashat(self, tpp_lexer_gettokenend(self))
#define tpp_lexer_getinputhash(self)             tpp_lexer_getinputhashattokenstart(self)
#endif /* TPP_HAVE_FILE_GETFULLHASH */

/* Convenience L/C information helpers.
 * If you don't want to bother learning what all the above does, then it's these that
 * you want to use -- these return the values as reported by __LINE__ and __COLUMN__. */
#define tpp_lexer_getlcfilename(self)  tpp_file_getfilename(tpp_lexer_getlcfile(self))    /* [0..1] Value of __FILE__ */
#define tpp_lexer_getstartlcinfo(self) tpp_file_getstartlcinfo(tpp_lexer_getlcfile(self)) /* Value of __LINE__ / __COLUMN__ */
#define tpp_lexer_getendlcinfo(self)   tpp_file_getendlcinfo(tpp_lexer_getlcfile(self))   /* Theoretical value of `__LINE__ / __COLUMN__' at end of current token */
#define tpp_lexer_getlcinfo(self)      tpp_lexer_getstartlcinfo(self)                     /* Convenience alias to make it clear what you want to use */

/* Warnings... */
#if TPP_HAVE_WARNINGS
#if TPP_HAVE_WARNINGS_PUSH_POP
#define tpp_lexer_pushwarnings(self)   tpp_warnings_push(&(self)->TPP_INTERNAL(tl_warn))
#define tpp_lexer_popwarnings(self)    tpp_warnings_pop(&(self)->TPP_INTERNAL(tl_warn))
#define tpp_lexer_canpopwarnings(self) tpp_warnings_canpop(&(self)->TPP_INTERNAL(tl_warn))
#else /* TPP_HAVE_WARNINGS_PUSH_POP */
#define tpp_lexer_canpopwarnings(self) 0
#endif /* !TPP_HAVE_WARNINGS_PUSH_POP */
#define tpp_lexer_getwarningctx(self, ctx_id)             tpp_warnings_getctx(&(self)->TPP_INTERNAL(tl_warn), ctx_id)
#define tpp_lexer_setwarningctx(self, ctx_id, state)      tpp_warnings_setctx(&(self)->TPP_INTERNAL(tl_warn), ctx_id, state)
#define tpp_lexer_invokewarning(self, warning_id, result) tpp_warnings_invoke(&(self)->TPP_INTERNAL(tl_warn), warning_id, result)
#define tpp_lexer_resetwarnings(self)                     tpp_warnings_reset(&(self)->TPP_INTERNAL(tl_warn))
#endif /* TPP_HAVE_WARNINGS */

/* Extensions... */
#if TPP_HAVE_EXTENSIONS
#define tpp_lexer_getextension(self, TPP_EXT_x)          tpp_extensions_getid(&(self)->TPP_INTERNAL(tl_exts), TPP_EXT_x)
#define tpp_lexer_setextension(self, TPP_EXT_x, enabled) tpp_extensions_setid(&(self)->TPP_INTERNAL(tl_exts), TPP_EXT_x, enabled)
#define tpp_lexer_enableextension(self, TPP_EXT_x)       tpp_lexer_setextension(self, TPP_EXT_x, true)
#define tpp_lexer_disableextension(self, TPP_EXT_x)      tpp_lexer_setextension(self, TPP_EXT_x, false)
#if TPP_HAVE_EXTENSIONS_PUSH_POP
#define tpp_lexer_pushextensions(self)   tpp_extensions_push(&(self)->TPP_INTERNAL(tl_exts))
#define tpp_lexer_popextensions(self)    tpp_extensions_pop(&(self)->TPP_INTERNAL(tl_exts))
#define tpp_lexer_canpopextensions(self) tpp_extensions_canpop(&(self)->TPP_INTERNAL(tl_exts))
#endif /* TPP_HAVE_EXTENSIONS_PUSH_POP */
#define tpp_lexer_resetextensions(self) tpp_extensions_reset(&(self)->TPP_INTERNAL(tl_exts))
#else /* TPP_HAVE_EXTENSIONS */
#define tpp_lexer_getextension(self, TPP_EXT_x) 0
#define tpp_lexer_resetextensions(self)         (void)0
#endif /* !TPP_HAVE_EXTENSIONS */

/* Features... */
#if TPP_HAVE_FEATURES
#define tpp_lexer_getfeature(self, TPP_FEAT_x)          tpp_features_getid(&(self)->TPP_INTERNAL(tl_feat), TPP_FEAT_x)
#define tpp_lexer_setfeature(self, TPP_FEAT_x, enabled) tpp_features_setid(&(self)->TPP_INTERNAL(tl_feat), TPP_FEAT_x, enabled)
#define tpp_lexer_enablefeature(self, TPP_FEAT_x)       tpp_features_enable(&(self)->TPP_INTERNAL(tl_feat), TPP_FEAT_x)
#define tpp_lexer_disablefeature(self, TPP_FEAT_x)      tpp_features_disable(&(self)->TPP_INTERNAL(tl_feat), TPP_FEAT_x)
#define tpp_lexer_resetfeatures(self)                   tpp_features_reset(&(self)->TPP_INTERNAL(tl_feat))
#else /* TPP_HAVE_FEATURES */
#define tpp_lexer_getfeature(self, TPP_FEAT_x) 0
#define tpp_lexer_resetfeatures(self)          (void)0
#endif /* !TPP_HAVE_FEATURES */

/* Check if "tpp_lexer_yieldpp()" might parse directives right now.
 * Since directives are only allowed to appear directly following a
 * line-feed within the same file, or at the start of some file, this
 * function allows you to check if the lexer is in a scenario where
 * it allows directives to be parsed. */
#define tpp_lexer_yieldpp_getallowdirectives(self) \
	tpp_file_getallowdirectives(tpp_lexer_getfile(self))



/* Include path... */
#if TPP_HAVE_INCLUDE_PATH
#define tpp_lexer_includes_addbykind(self, kind, path, path_maxlen)      tpp_include_paths_addbykind(&(self)->TPP_INTERNAL(tl_include_paths), kind, path, path_maxlen)
#define tpp_lexer_includes_addbykind_head(self, kind, path, path_maxlen) tpp_include_paths_addbykind_head(&(self)->TPP_INTERNAL(tl_include_paths), kind, path, path_maxlen)
#define tpp_lexer_includes_delbykind(self, kind, path, path_maxlen)      tpp_include_paths_delbykind(&(self)->TPP_INTERNAL(tl_include_paths), kind, path, path_maxlen)
#define tpp_lexer_includes_clearbykind(self, kind)                       tpp_include_paths_clearbykind(&(self)->TPP_INTERNAL(tl_include_paths), kind)
#define tpp_lexer_includes_getbykind(self, kind, i)                      tpp_include_paths_getbykind(&(self)->TPP_INTERNAL(tl_include_paths), kind, i)
#define tpp_lexer_includes_numbykind(self, kind)                         tpp_include_paths_numbykind(&(self)->TPP_INTERNAL(tl_include_paths), kind)

#define tpp_lexer_includes_addsystem(self, path, path_maxlen)      tpp_include_paths_addsystem(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_addsystem_head(self, path, path_maxlen) tpp_include_paths_addsystem_head(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_delsystem(self, path, path_maxlen)      tpp_include_paths_delsystem(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_clearsystem(self)                       tpp_include_paths_clearsystem(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_includes_getsystem(self, i)                      tpp_include_paths_getsystem(&(self)->TPP_INTERNAL(tl_include_paths), i)
#define tpp_lexer_includes_numsystem(self)                         tpp_include_paths_numsystem(&(self)->TPP_INTERNAL(tl_include_paths))
#if TPP_HAVE_INCLUDE_PATH_QUOTE
#define tpp_lexer_includes_addquote(self, path, path_maxlen)      tpp_include_paths_addquote(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_addquote_head(self, path, path_maxlen) tpp_include_paths_addquote_head(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_delquote(self, path, path_maxlen)      tpp_include_paths_delquote(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_clearquote(self)                       tpp_include_paths_clearquote(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_includes_getquote(self, i)                      tpp_include_paths_getquote(&(self)->TPP_INTERNAL(tl_include_paths), i)
#define tpp_lexer_includes_numquote(self)                         tpp_include_paths_numquote(&(self)->TPP_INTERNAL(tl_include_paths))
#endif /* TPP_HAVE_INCLUDE_PATH_QUOTE */
#if TPP_HAVE_INCLUDE_PATH_SYSHDR
#define tpp_lexer_includes_addsyshdr(self, path, path_maxlen)      tpp_include_paths_addsyshdr(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_addsyshdr_head(self, path, path_maxlen) tpp_include_paths_addsyshdr_head(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_delsyshdr(self, path, path_maxlen)      tpp_include_paths_delsyshdr(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_clearsyshdr(self)                       tpp_include_paths_clearsyshdr(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_includes_getsyshdr(self, i)                      tpp_include_paths_getsyshdr(&(self)->TPP_INTERNAL(tl_include_paths), i)
#define tpp_lexer_includes_numsyshdr(self)                         tpp_include_paths_numsyshdr(&(self)->TPP_INTERNAL(tl_include_paths))
#endif /* TPP_HAVE_INCLUDE_PATH_SYSHDR */
#if TPP_HAVE_INCLUDE_PATH_AFTER
#define tpp_lexer_includes_addafter(self, path, path_maxlen)      tpp_include_paths_addafter(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_addafter_head(self, path, path_maxlen) tpp_include_paths_addafter_head(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_delafter(self, path, path_maxlen)      tpp_include_paths_delafter(&(self)->TPP_INTERNAL(tl_include_paths), path, path_maxlen)
#define tpp_lexer_includes_clearafter(self)                       tpp_include_paths_clearafter(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_includes_getafter(self, i)                      tpp_include_paths_getafter(&(self)->TPP_INTERNAL(tl_include_paths), i)
#define tpp_lexer_includes_numafter(self)                         tpp_include_paths_numafter(&(self)->TPP_INTERNAL(tl_include_paths))
#endif /* TPP_HAVE_INCLUDE_PATH_AFTER */
#if TPP_HAVE_INCLUDE_PATH_PUSH_POP
#define tpp_lexer_pushincludes(self)   tpp_include_paths_push(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_popincludes(self)    tpp_include_paths_pop(&(self)->TPP_INTERNAL(tl_include_paths))
#define tpp_lexer_canpopincludes(self) tpp_include_paths_canpop(&(self)->TPP_INTERNAL(tl_include_paths))
#endif /* TPP_HAVE_INCLUDE_PATH_PUSH_POP */
#define tpp_lexer_resetincludes(self)  tpp_include_paths_reset(&(self)->TPP_INTERNAL(tl_include_paths))
#endif /* TPP_HAVE_INCLUDE_PATH */



/* Wrappers for keywords API */
#if TPP_HAVE_USER_KEYWORDS
#define _tpp_lexer_kwds_getkeyword(self, kwd, len, hash) _tpp_keywords_getkeyword(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash)
#define _tpp_lexer_kwds_getkeyword_byid(self, id)        _tpp_keywords_getkeyword_byid(&(self)->TPP_INTERNAL(tl_kwds), id)
#define tpp_lexer_kwds_getkeyword(self, kwd, len, hash)  tpp_keywords_getkeyword(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash)
#define tpp_lexer_kwds_getkeyword_byid(self, id)         tpp_keywords_getkeyword_byid(&(self)->TPP_INTERNAL(tl_kwds), id)
#define tpp_lexer_kwds_newkeyword(self, kwd, len, hash)  tpp_keywords_newkeyword(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash)
#if TPP_HAVE_ESCAPED_KEYWORDS
#define _tpp_lexer_kwds_getkeyword_esc(self, kwd, len, hash) _tpp_keywords_getkeyword_esc(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash, self)
#define tpp_lexer_kwds_getkeyword_esc(self, kwd, len, hash) tpp_keywords_getkeyword_esc(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash, self)
#define tpp_lexer_kwds_newkeyword_esc(self, kwd, len, hash) tpp_keywords_newkeyword_esc(&(self)->TPP_INTERNAL(tl_kwds), kwd, len, hash, self)
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */
#if TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS
#define tpp_lexer_kwds_copybuiltin(self, kwd) tpp_keywords_copybuiltin(&(self)->TPP_INTERNAL(tl_kwds), kwd)
#endif /* TPP_HAVE_COPYABLE_BUILTIN_KEYWORDS */

#if TPP_HAVE_KEYWORDS_RESETFLAGS
/* Modify the flags of all keywords as `flags = flags & keep_mask' */
#define tpp_lexer_kwds_resetflags(self, keep_mask) tpp_keywords_resetflags(&(self)->TPP_INTERNAL(tl_kwds), keep_mask)
#endif /* TPP_HAVE_KEYWORDS_RESETFLAGS */

#if TPP_HAVE_KEYWORDS_RESETCOUNTERS
/* Call `tpp_keyword_reset_builtin_counter()' on every keyword, thereby
 * resetting all side-effects of expansions of `__TPP_COUNTER' thus far. */
#define tpp_lexer_kwds_resetcounters(self) tpp_keywords_resetcounters(&(self)->TPP_INTERNAL(tl_kwds))
#endif /* TPP_HAVE_KEYWORDS_RESETCOUNTERS */

/* Reset (re-initialize) all user-defined keywords
 * WARNING: To use this function, you should first finalize the #include-stack (i.e.:
 *          call `tpp_lexer_finifile()'), since the #include-stack usually contains
 *          references to certain keywords that will become dangling after a call to
 *          this function */
#define tpp_lexer_kwds_reset(self) tpp_keywords_reset(&(self)->TPP_INTERNAL(tl_kwds))
#else /* TPP_HAVE_USER_KEYWORDS */
#define tpp_lexer_kwds_getkeyword(self, kwd, len, hash)  tpp_builtin_getkeyword(kwd, len, hash)
#define tpp_lexer_kwds_getkeyword_byid(self, id)         tpp_builtin_getkeyword_byid(id)
#if TPP_HAVE_ESCAPED_KEYWORDS
#define tpp_lexer_kwds_getkeyword_esc(self, kwd, len, hash, file) tpp_builtin_getkeyword_esc(kwd, len, hash, file)
#endif /* TPP_HAVE_ESCAPED_KEYWORDS */
#define tpp_lexer_kwds_reset(self) (void)0
#endif /* !TPP_HAVE_USER_KEYWORDS */


/* Invocation of hooks */
/* >> TPP_FORMATPRINTER_DEFINE(tpp_lexer_callhook_warnprinter, arg, text, num_bytes);
 * Called by `tpp_lexer_warnf()` to print warning messages
 * Potentially unused if `TPP_HAVE_WARNHANDLER_HOOK` is also overwritten
 * @param: arg: The current lexer (`tpp_lexer *`) */
#define tpp_lexer_callhook_warnprinter(self, text, num_bytes) \
	tpp_hooks_call_warnprinter(&(self)->TPP_INTERNAL(tl_hooks), self, text, num_bytes)
#ifdef tpp_hooks_get_warnprinter
#define tpp_lexer_gethook_warnprinter(self) tpp_hooks_get_warnprinter(&(self)->TPP_INTERNAL(tl_hooks))
#endif /* tpp_hooks_get_warnprinter */
#ifdef tpp_hooks_set_warnprinter
#define tpp_lexer_sethook_warnprinter(self, v) tpp_hooks_set_warnprinter(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_warnprinter(self)  tpp_hooks_reset_warnprinter(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_warnprinter */

/* >> tpp_errno tpp_lexer_callhook_warnhandler(tpp_lexer *tpp_restrict self, tpp_lexer_printf_info *tpp_restrict info, tpp_warning_invokeinfo const *tpp_restrict invokeinfo, tpp_warning_id id, va_list args);
 * Called by `tpp_lexer_warnf()` to handle warning notifications. Can be
 * overwritten to implement custom behavior in regards to handling of warnings.
 * @param: info:       Warning context location
 * @param: invokeinfo: Warning invocation method
 * @param: id:         Warning ID
 * @param: arg:        Variable arguments passed to warning
 * @return: TPP_EOK:        Success (warning was emitted)
 * @return: TPP_EWARNPRINT: Error during invocation of `TPP_HOOK_WARNPRINTER`
 * @return: TPP_ENOMEM:     A `TPP_WARNING_EX` returned with this error
 * @return: TPP_EIO:        A `TPP_WARNING_EX` returned with this error
 * @return: TPP_ELEXERROR:  A `TPP_WARNING_EX` returned with this error */
#define tpp_lexer_callhook_warnhandler(self, info, invokeinfo, id, args) \
	tpp_hooks_call_warnhandler(&(self)->TPP_INTERNAL(tl_hooks), self, info, invokeinfo, id, args)
#ifdef tpp_hooks_set_warnhandler
#define tpp_lexer_gethook_warnhandler(self)    tpp_hooks_get_warnhandler(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_warnhandler(self, v) tpp_hooks_set_warnhandler(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_warnhandler(self)  tpp_hooks_reset_warnhandler(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_warnhandler */

/* >> TPP_FORMATPRINTER_DEFINE(tpp_lexer_callhook_mesgprinter, arg, text, num_bytes);
 * Used by `#pragma message` to print messages
 * @param: arg: The current lexer (`tpp_lexer *`) */
#define tpp_lexer_callhook_mesgprinter(self, text, num_bytes) \
	tpp_hooks_call_mesgprinter(&(self)->TPP_INTERNAL(tl_hooks), self, text, num_bytes)
#ifdef tpp_hooks_get_mesgprinter
#define tpp_lexer_gethook_mesgprinter(self) tpp_hooks_get_mesgprinter(&(self)->TPP_INTERNAL(tl_hooks))
#endif /* tpp_hooks_get_mesgprinter */
#ifdef tpp_hooks_set_mesgprinter
#define tpp_lexer_sethook_mesgprinter(self, v) tpp_hooks_set_mesgprinter(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_mesgprinter(self)  tpp_hooks_reset_mesgprinter(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_mesgprinter */

/* >> tpp_errno tpp_lexer_callhook_parseexpr(tpp_lexer *tpp_restrict self, tpp_expr_value *tpp_restrict result);
 * User-defined callback for parsing `#if`-style expressions
 * - This callback is invoked in a context where `self` points
 *   before the expression's first token (meaning that this
 *   callback is responsible to do the initial yield using
 *   whatever method it wants to use).
 * - When it is known that the expression has finite length,
 *   as in: it has to end before EOF, or at the next unmatched
 *   `)`-token, the caller will have configured the lexer's
 *   current EOF accordingly (and disabled file-popping)
 * - When this function returns an error, the caller will rewind
 *   back to the start of the expression (or even further, if
 *   applicable; meaning this callback doesn't need to concern
 *   itself with rollback)
 *
 * @return: TPP_EOK:         Success (`*result` was initialized)
 * @return: TPP_ENOMEM:      Out of memory
 * @return: TPP_EIO:         Filesystem I/O operation failed
 * @return: TPP_EWOULDBLOCK: Operation would block
 * @return: TPP_ELEXERROR:   A lexer error happened
 * @return: TPP_EWARNPRINT:  Error while printing a warning */
#define tpp_lexer_callhook_parseexpr(self, result) \
	tpp_hooks_call_parseexpr(&(self)->TPP_INTERNAL(tl_hooks), self, result)
#ifdef tpp_hooks_set_parseexpr
#define tpp_lexer_gethook_parseexpr(self)    tpp_hooks_get_parseexpr(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_parseexpr(self, v) tpp_hooks_set_parseexpr(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_parseexpr(self)  tpp_hooks_reset_parseexpr(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_parseexpr */

/* >> tpp_errno tpp_lexer_callhook_unknown_pragma(tpp_lexer *tpp_restrict self);
 * Called whenever a `#pragma` is encountered that is not recognized.
 * When called, the lexer is set-up to point at the first token after the `#pragma`.
 * @return: TPP_EOK:    Pragma has been handled
 * @return: TPP_ENOENT: Pragma is still unknown, and a warning should be emitted
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#define tpp_lexer_callhook_unknown_pragma(self) \
	tpp_hooks_call_unknown_pragma(&(self)->TPP_INTERNAL(tl_hooks), self)
#ifdef tpp_hooks_set_unknown_pragma
#define tpp_lexer_gethook_unknown_pragma(self)    tpp_hooks_get_unknown_pragma(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_unknown_pragma(self, v) tpp_hooks_set_unknown_pragma(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_unknown_pragma(self)  tpp_hooks_reset_unknown_pragma(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_unknown_pragma */

/* >> tpp_errno tpp_lexer_callhook_new_dependency(tpp_lexer *tpp_restrict self, tpp_keyword *filename_kwd);
 * Called whenever some file is `#include`-ed for the first time
 * @param: filename_kwd: Then `tpp_keyword` used to describe the file's name. The actual
 *                       filename can be queried as `tpp_keyword_getcstr(filename_kwd)`. */
#define tpp_lexer_callhook_new_dependency(self, filename_kwd) \
	tpp_hooks_call_new_dependency(&(self)->TPP_INTERNAL(tl_hooks), self, filename_kwd)
#ifdef tpp_hooks_set_new_dependency
#define tpp_lexer_gethook_new_dependency(self)    tpp_hooks_get_new_dependency(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_new_dependency(self, v) tpp_hooks_set_new_dependency(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_new_dependency(self)  tpp_hooks_reset_new_dependency(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_new_dependency */

/* >> tpp_errno tpp_lexer_callhook_ident_sccs(tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_string *chunk, tpp_char const *comment_str, tpp_size comment_len);
 * Called to handle `#ident` and `#sccs` directives
 * @param: mode:        Either `TPP_KWD_ident` or `TPP_KWD_sccs`
 * @param: chunk:       If non-NULL a string that must be `tpp_string_incref()`d
 *                      if you want to keep `comment_str` alive. If NULL, then the
 *                      given `comment_str` is statically allocated and doesn't need
 *                      any chunk to stay alive
 * @param: comment_str: The source comment that should be inserted
 * @param: comment_len: Length of `comment_str` in bytes
 * @return: TPP_EOK:    Success
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#define tpp_lexer_callhook_ident_sccs(self, mode, chunk, comment_str, comment_len) \
	tpp_hooks_call_ident_sccs(&(self)->TPP_INTERNAL(tl_hooks), self, mode, chunk, comment_str, comment_len)
#ifdef tpp_hooks_set_ident_sccs
#define tpp_lexer_gethook_ident_sccs(self)    tpp_hooks_get_ident_sccs(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_ident_sccs(self, v) tpp_hooks_set_ident_sccs(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_ident_sccs(self)  tpp_hooks_reset_ident_sccs(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_ident_sccs */

/* >> tpp_errno tpp_lexer_callhook_system_include_path(tpp_lexer *tpp_restrict self, tpp_token_id mode, tpp_hook_system_include_path_when when, tpp_errno (TPPCALL *cb)(void *arg, char const *relative_to tpp_lexer_foreach_include_path_flags__PARAM), void *arg);
 * Extra callback invoked by `tpp_lexer_foreach_include_path()` at diffrent
 * points during the process of enumerating include paths. This callback is
 * then allowed to enumerate some additional include paths that may exist, but
 * for one reason or another (mainly: speed) aren't known to TPP via its system
 * include path APIs (`tpp_lexer_includes_add*`)
 * @param: when: One of `TPP_HOOK_SYSTEM_INCLUDE_PATH_WHEN_*`: describes the
 *               caller's position in `tpp_lexer_foreach_include_path()`.
 * @return: * :         First non-TPP_ENOENT return value of `cb`
 * @return: TPP_ENOENT: File still not found
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#define tpp_lexer_callhook_system_include_path(self, mode, when, cb, arg) \
	tpp_hooks_call_system_include_path(&(self)->TPP_INTERNAL(tl_hooks), self, mode, when, cb, arg)
#ifdef tpp_hooks_set_system_include_path
#define tpp_lexer_gethook_system_include_path(self)    tpp_hooks_get_system_include_path(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_system_include_path(self, v) tpp_hooks_set_system_include_path(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_system_include_path(self)  tpp_hooks_reset_system_include_path(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_system_include_path */

/* >> tpp_ssize tpp_lexer_callhook_unknown_string_escape(tpp_lexer *tpp_restrict self, tpp_char const **p_pos, tpp_char const *end, tpp_lexer_decodestring_config const *tpp_restrict config);
 * Called by `tpp_lexer_decodestring()` when an unknown `\`-escape sequence is encountered
 * This hook can be used to define additional, user-defined escape sequences, or any other
 * arbitrary behavior to-be performed when specific escape-sequences are found.
 * On entry, `*p_pos` points at the first (unrecognized) character after the leading `\`, and
 * if the hook was able to parse said escape sequence, it should update `*p_pos` to point after
 * it before returning
 * @param: p_pos:  [in]  Pointer to start of unrecognized `\`-escape sequence
 *                 [out] First character no longer part of `\`-escape sequence (if recognized)
 *                 [out] Unchanged (if not recognized)
 * @param: end:    The of containing string sequence
 * @param: config: Identically-named argument of `tpp_lexer_decodestring()`
 * @return: * :    Sum of positive return values of `data_printer` and `utf8_printer`
 * @return: < 0:   First negative return value of `data_printer` or `utf8_printer`
 * @return: TPP_SSIZE_OFERR(TPP_ENOENT): Escape sequence still not recognized
 *                 (please leave `*p_pos` unchanged in this case). The caller will
 *                 proceed by emitting `TPP_W_UNKNOWN_STRING_ESCAPE_SEQUENCE` */
#define tpp_lexer_callhook_unknown_string_escape(self, p_pos, end, config) \
	tpp_hooks_call_unknown_string_escape(&(self)->TPP_INTERNAL(tl_hooks), self, p_pos, end, config)
#ifdef tpp_hooks_set_unknown_string_escape
#define tpp_lexer_gethook_unknown_string_escape(self)    tpp_hooks_get_unknown_string_escape(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_unknown_string_escape(self, v) tpp_hooks_set_unknown_string_escape(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_unknown_string_escape(self)  tpp_hooks_reset_unknown_string_escape(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_unknown_string_escape */

/* >> tpp_errno tpp_lexer_callhook_raise_lexerror(tpp_lexer *tpp_restrict self);
 * Called by `tpp_lexer_warnf()` just before it's about to return `TPP_ELEXERROR`
 * This hook can be used to do additional state changes that may be necessary by the
 * hosting application in order to handle the resulting `TPP_ELEXERROR`
 * @return: TPP_EOK: Have `tpp_lexer_warnf()` still return `TPP_ELEXERROR`
 * @return: * :      Make `tpp_lexer_warnf()` return this instead of `TPP_ELEXERROR` */
#define tpp_lexer_callhook_raise_lexerror(self) \
	tpp_hooks_call_raise_lexerror(&(self)->TPP_INTERNAL(tl_hooks), self)
#ifdef tpp_hooks_set_raise_lexerror
#define tpp_lexer_gethook_raise_lexerror(self)    tpp_hooks_get_raise_lexerror(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_raise_lexerror(self, v) tpp_hooks_set_raise_lexerror(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_raise_lexerror(self)  tpp_hooks_reset_raise_lexerror(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_raise_lexerror */

/* >> tpp_errno tpp_lexer_callhook_isfloatsuffix(tpp_lexer *tpp_restrict self, tpp_char const *pos);
 * Called by `tpp_lexer_yieldraw()` when `TPP_HAVE_SMART_FLOAT_TOKENS` is enabled and
 * a sequence like `1.f` is encountered where the lexer is unsure if the `f` should be
 * part of the float-token (in the form of a float-suffix), or if this is actually be
 * parsed as 3 tokens: `[C_INT:1][DOT:.][f:f]`. For this purpose, this hook is called
 * with `pos` pointing at the `f` (though additional characters thereafter may not be
 * loaded yet, though can be loaded using `tpp_lexer_readchar()`)
 * @return: TPP_EOK:    Pointed-to location actually *does* refer to a float suffix
 * @return: TPP_ENOENT: It's not a float suffix
 * @return: TPP_EIO:    I/O error
 * @return: TPP_ENOMEM: Out of memory */
#define tpp_lexer_callhook_isfloatsuffix(self, pos) \
	tpp_hooks_call_isfloatsuffix(&(self)->TPP_INTERNAL(tl_hooks), self, pos)
#ifdef tpp_hooks_set_isfloatsuffix
#define tpp_lexer_gethook_isfloatsuffix(self)    tpp_hooks_get_isfloatsuffix(&(self)->TPP_INTERNAL(tl_hooks))
#define tpp_lexer_sethook_isfloatsuffix(self, v) tpp_hooks_set_isfloatsuffix(&(self)->TPP_INTERNAL(tl_hooks), v)
#define tpp_lexer_resethook_isfloatsuffix(self)  tpp_hooks_reset_isfloatsuffix(&(self)->TPP_INTERNAL(tl_hooks), v)
#endif /* tpp_hooks_set_isfloatsuffix */



/* Initialize/finalize everything about "self", except for the
 * currently loaded file; which the caller must still initialize
 * using one of the "tpp_lexer_initfile_*" functions below. */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_lexer_init(tpp_lexer *tpp_restrict self);

/* Finalize the lexer, except for the currently loaded file.
 *
 * If the caller made use of "tpp_lexer_initfile_*", then they
 * must also (either before or after this function) call
 * `tpp_lexer_finifile()' to finalize the currently loaded file. */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_lexer_fini(tpp_lexer *tpp_restrict self);

/* Move-construct "self" out of "from"
 * Use this function instead of directly assigning one lexer on-to
 * another: even though the later would currently work to do so,
 * that might change in the future so use of this macro gives you
 * that forward-compatibility. */
#define tpp_lexer_move(self, from) \
	(void)(*(self) = *(from), tpp_dbg_memset(from, sizeof(tpp_lexer)))

#if TPP_HAVE_LEXER_COPY
/* Initialize "self" as a copy of "from". This will copy everything
 * configured in "from" (features, extensions, allocated keyword IDs,
 * macros, include paths, warnings, etc), into "self". The only thing
 * that is not copied is the #include-stack, meaning that after a call
 * to this function, the caller must still call `tpp_lexer_initfile_*'
 *
 * Additionally, the following properties are not copied:
 * - tpp_keyword_misc_getuserdata_dtor()  (only "tpp_keyword_misc_getuserdata()"
 *                                         is copied; dtors are set to "NULL")
 *
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_copy(tpp_lexer *tpp_restrict self,
               tpp_lexer const *tpp_restrict from);
#endif /* TPP_HAVE_LEXER_COPY */

/* Finalize the currently loaded file (including any extra files
 * found on the #include-stack, but that hadn't been popped yet)
 *
 * This function must be called after "tpp_lexer_initfile_*" has been */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_lexer_finifile(tpp_lexer *tpp_restrict self);


/* Initialize a lexer's file to read the given [text,text+text_size) blob.
 * @param: start_lc: [valid_if(chunk != NULL)] */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
_tpp_lexer_initfile_text(tpp_lexer *tpp_restrict self,
                         /*utf-8*/ char const *filename,
                         /*inherit(always)*/ TPP_REF tpp_string *chunk,
                         void const *text, tpp_size text_size,
                         tpp_lcinfo start_lc
#if TPP_HAVE_FILE_FLAGS
                         , tpp_file_flags flags
#endif /* TPP_HAVE_FILE_FLAGS */
#if TPP_HAVE_UNICODE
                         , tpp_file_encoding encoding
#endif /* TPP_HAVE_UNICODE */
                         );
#if TPP_HAVE_FILE_FLAGS && TPP_HAVE_UNICODE
#define tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_initfile_text(self, filename, chunk, text, text_size, start_lc, flags, encoding)
#elif TPP_HAVE_FILE_FLAGS
#define tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_initfile_text(self, filename, chunk, text, text_size, start_lc, flags)
#elif TPP_HAVE_UNICODE
#define tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_initfile_text(self, filename, chunk, text, text_size, start_lc, encoding)
#else /* ... */
#define tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_initfile_text(self, filename, chunk, text, text_size, start_lc)
#endif /* !... */
#define tpp_lexer_initfile_text(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_UTF8)
#define tpp_lexer_initfile_text_ascii(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_ASCII)
#if TPP_HAVE_UNICODE
#define tpp_lexer_initfile_text_utf8(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_initfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_FORCE_UTF8)
#endif /* TPP_HAVE_UNICODE */


#if TPP_HAVE_LEXER_INIT_IO
/* Initialize a lexer such that it starts reading from "handle"
 * @param: filename: [0..1] Filename to use for messages (s.a. `tpp_file_getrealfilename()')
 *                          WARNING: This filename is *NOT* copied -- it must remain
 *                                   allocated and valid until "self" is finalized.
 * @param: handle:   The I/O handle to read from in order to retrieve text data.
 * @param: ioflags:  Extra flags specifying how to interact with "handle":
 *                   - TPP_FILE_FLAGS_NONBLOCK: Do non-blocking reads (useful in case "handle" is a pipe)
 *                   - TPP_FILE_FLAGS_NOCLOSE:  A later call to `tpp_lexer_finifile()' will not close "handle"
 *                   - TPP_FILE_FLAGS_SYSHDR:   Do not emit warnings */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_lexer_initfile_io_ex(tpp_lexer *tpp_restrict self, /*utf-8*/ char const *filename,
                         tpp_io_handle handle, tpp_file_flags ioflags);
#define tpp_lexer_initfile_io(self, filename, handle) \
	tpp_lexer_initfile_io_ex(self, filename, handle, TPP_FILE_FLAGS_NORMAL)
#endif /* TPP_HAVE_LEXER_INIT_IO */

#if TPP_HAVE_LEXER_INIT_OPEN
/* Initialize a lexer such that it starts reading from "filename"
 * @param: filename_maxlen: Max length of "filename" (in characters). You may
 *                          pass TPP_SIZE_MAX when "filename" is NUL-terminated.
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOENT: No such file or directory
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_initfile_open(tpp_lexer *tpp_restrict self,
                        /*utf-8*/ char const *tpp_restrict filename,
                        tpp_size filename_maxlen);
#endif /* TPP_HAVE_LEXER_INIT_OPEN */


#if TPP_HAVE_INCLUDE_STACK
#if TPP_HAVE_LEXER_INIT_IO
/* Push another file onto the #include-stack:
 * After a call to this function, the caller is responsible to yield the first token!
 * @param: filename: [0..1] Filename to use for messages (s.a. `tpp_file_getrealfilename()')
 *                          WARNING: This filename is *NOT* copied -- it must remain
 *                                   allocated and valid until "self" is finalized.
 * @param: handle:   The I/O handle to read from in order to retrieve text data.
 * @param: ioflags:  Extra flags specifying how to interact with "handle":
 *                   - TPP_FILE_FLAGS_NONBLOCK: Do non-blocking reads (useful in case "handle" is a pipe)
 *                   - TPP_FILE_FLAGS_NOCLOSE:  A later call to `tpp_lexer_finifile()' will not close "handle"
 *                   - TPP_FILE_FLAGS_SYSHDR:   Do not emit warnings
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_pushfile_io_ex(tpp_lexer *tpp_restrict self, /*utf-8*/ char const *filename,
                         tpp_io_handle handle, tpp_file_flags ioflags);
#define tpp_lexer_pushfile_io(self, filename, handle) \
	tpp_lexer_pushfile_io_ex(self, filename, handle, TPP_FILE_FLAGS_NORMAL)
#endif /* TPP_HAVE_LEXER_INIT_IO */

#if TPP_HAVE_LEXER_INIT_OPEN
/* Push another file onto the #include-stack:
 * After a call to this function, the caller is responsible to yield the first token!
 * @param: filename_maxlen: Max length of "filename" (in characters). You may
 *                          pass TPP_SIZE_MAX when "filename" is NUL-terminated.
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOENT: No such file or directory
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_pushfile_open(tpp_lexer *tpp_restrict self,
                        /*utf-8*/ char const *tpp_restrict filename,
                        tpp_size filename_maxlen);
#endif /* TPP_HAVE_LEXER_INIT_OPEN */

/* Push another file onto the #include-stack: [text,text+text_size) blob.
 * After a call to this function, the caller is responsible to yield the first token!
 * @param: start_lc: [valid_if(chunk != NULL)]
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
_tpp_lexer_pushfile_text(tpp_lexer *tpp_restrict self,
                         /*utf-8*/ char const *filename,
                         /*inherit(always)*/ TPP_REF tpp_string *chunk,
                         void const *text, tpp_size text_size,
                         tpp_lcinfo start_lc
#if TPP_HAVE_FILE_FLAGS
                         , tpp_file_flags flags
#endif /* TPP_HAVE_FILE_FLAGS */
#if TPP_HAVE_UNICODE
                         , tpp_file_encoding encoding
#endif /* TPP_HAVE_UNICODE */
                         );
#if TPP_HAVE_FILE_FLAGS && TPP_HAVE_UNICODE
#define tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_pushfile_text(self, filename, chunk, text, text_size, start_lc, flags, encoding)
#elif TPP_HAVE_FILE_FLAGS
#define tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_pushfile_text(self, filename, chunk, text, text_size, start_lc, flags)
#elif TPP_HAVE_UNICODE
#define tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_pushfile_text(self, filename, chunk, text, text_size, start_lc, encoding)
#else /* ... */
#define tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, encoding) \
	_tpp_lexer_pushfile_text(self, filename, chunk, text, text_size, start_lc)
#endif /* !... */
#define tpp_lexer_pushfile_text(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_UTF8)
#define tpp_lexer_pushfile_text_ascii(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_ASCII)
#if TPP_HAVE_UNICODE
#define tpp_lexer_pushfile_text_utf8(self, filename, chunk, text, text_size, start_lc, flags) \
	tpp_lexer_pushfile_text_ex(self, filename, chunk, text, text_size, start_lc, flags, TPP_FILE_ENCODING_FORCE_UTF8)
#endif /* TPP_HAVE_UNICODE */


/* Check if the current file can be popped. */
#define tpp_lexer_canpopfile(self) \
	(tpp_lexer_getfile(self)->TPP_INTERNAL(tf_prev) != NULL)

/* Pop the current file off the #include-stack.
 * The caller is responsible to ensure that "tpp_lexer_canpopfile(self) == true"
 * After a call to this function, the caller is responsible to yield the next token!
 * WARNING: It is the caller's responsibility to call "tpp_lexer_manualpopfile_popfile()"
 *          instead of this function if rollback of the pop should be possible.
 * NOTE: It is recommended to call "tpp_lexer_warn_nonempty_ifdef()" before calling
 *       this function in order to warn about unterminated #ifdef-blocks. */
TPP_DECL TPP_NONNULL((1)) void TPPCALL
tpp_lexer_popfile(tpp_lexer *tpp_restrict self);
#define tpp_lexer_popallfiles(self)        \
	do {                                   \
		while (tpp_lexer_canpopfile(self)) \
			tpp_lexer_popfile(self);       \
	} while (0)
#else /* TPP_HAVE_INCLUDE_STACK */
#define tpp_lexer_popallfiles(self) (void)0
#endif /* !TPP_HAVE_INCLUDE_STACK */



#if TPP_HAVE_LEXER_OPENFILE
typedef struct tpp_lexer_openfile_result {
	tpp_io_handle  tlofr_handle;       /* [1..1][owned] I/O handle for requested file (must be inherited by caller) */
#if TPP_HAVE_USER_KEYWORDS
	tpp_keyword   *tlofr_filename_kwd; /* [1..1] Keyword for filename */
#define tpp_lexer_openfile_result_getfilename(self) tpp_keyword_getcstr((self)->tlofr_filename_kwd)
#else /* TPP_HAVE_USER_KEYWORDS */
	char          *tlofr_filename;     /* [1..1][owned] Filename string */
#define tpp_lexer_openfile_result_getfilename(self) ((char const *)(self)->tlofr_filename)
#endif /* !TPP_HAVE_USER_KEYWORDS */
#if TPP_HAVE_FILE_SYSHDR
	tpp_file_flags tlofr_fileflags;    /* Either "TPP_FILE_FLAGS_NORMAL" or "TPP_FILE_FLAGS_SYSHDR" or "TPP_FILE_FLAGS_EXTERN_C" */
#define _tpp_lexer_openfile_result_getfileflags(self) ((self)->tlofr_fileflags)
#else /* TPP_HAVE_FILE_SYSHDR */
#define _tpp_lexer_openfile_result_getfileflags(self) TPP_FILE_FLAGS_NORMAL
#endif /* !TPP_HAVE_FILE_SYSHDR */
#if TPP_HAVE_USER_KEYWORDS
#define tpp_lexer_openfile_result_getfileflags(self) _tpp_lexer_openfile_result_getfileflags(self)
#elif TPP_HAVE_FILE_NOKWD
#define tpp_lexer_openfile_result_getfileflags(self) (_tpp_lexer_openfile_result_getfileflags(self) | TPP_FILE_FLAGS_FREENAME | TPP_FILE_FLAGS_NOKWD)
#else /* ... */
#define tpp_lexer_openfile_result_getfileflags(self) (_tpp_lexer_openfile_result_getfileflags(self) | TPP_FILE_FLAGS_FREENAME)
#endif /* !... */
} tpp_lexer_openfile_result;


#if TPP_HAVE_USER_KEYWORDS
#define tpp_lexer_openfile_result_fini(self) \
	(tpp_io_close((self)->tlofr_handle),     \
	 tpp_dbg_memset(self, sizeof(*(self))))
#else /* TPP_HAVE_USER_KEYWORDS */
#define tpp_lexer_openfile_result_fini(self) \
	(tpp_io_close((self)->tlofr_handle),     \
	 tpp_free((self)->tlofr_filename),       \
	 tpp_dbg_memset(self, sizeof(*(self))))
#endif /* !TPP_HAVE_USER_KEYWORDS */

#if TPP_HAVE_LEXER_OPENFILE_EX
#define TPP_LEXER_OPENFILE_FLAG_NORMAL 0 /* Normal flags */
#ifdef tpp_keyword_flags
#define tpp_lexer_openfile_flags tpp_keyword_flags /* Set of `TPP_LEXER_OPENFILE_FLAG_*' */
#if TPP_HAVE_CPP_IMPORT
#define TPP_LEXER_OPENFILE_FLAG_HDR_IMPORTED TPP_KEYWORD_FLAG_HDR_IMPORTED    /* Filter out files that were already #import-ed */
#endif /* TPP_HAVE_CPP_IMPORT */
#if TPP_HAVE_PRAGMA_ONCE
#define TPP_LEXER_OPENFILE_FLAG_HDR_ONCE     TPP_KEYWORD_FLAG_HDR_ONCE        /* Filter out files with "#pragma once" */
#endif /* TPP_HAVE_PRAGMA_ONCE */
#if TPP_HAVE_IFNDEF_INCLUDE_GUARDS
#define TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED  TPP_KEYWORD_FLAG_HDR_GUARD_VALID /* Filter out files with a confirmed "#ifndef"-block of a macro that is current defined */
#endif /* TPP_HAVE_IFNDEF_INCLUDE_GUARDS */
#else /* tpp_keyword_flags */
#define tpp_lexer_openfile_flags uint_least32_t /* Set of `TPP_LEXER_OPENFILE_FLAG_*' */
#endif /* !tpp_keyword_flags */
#if TPP_HAVE_CPP_INCLUDE_NEXT || TPP_HAVE_MACRO___has_include_next
#define TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT UINT32_C(0x10000000) /* Reject files that are already on the #include-stack */
#endif /* TPP_HAVE_CPP_INCLUDE_NEXT || TPP_HAVE_MACRO___has_include_next */
#if TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED
#define TPP_LEXER_OPENFILE_FLAG_CHECK_LIMIT  UINT32_C(0x08000000) /* Emit a warning if the file already appears too often on the #include-stack */
#else /* TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED */
#define TPP_LEXER_OPENFILE_FLAG_CHECK_LIMIT  UINT32_C(0x00000000) /* no-op */
#endif /* !TPP_HAVE_TPP_W_INCLUDE_RECURSION_LIMIT_EXCEEDED */
#if TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING
#define TPP_LEXER_OPENFILE_FLAG_WARN_CASING  UINT32_C(0x04000000) /* Emit a warning "TPP_W_NONPORTABLE_FILENAME_CASING" if the file's casing is bad */
#else /* TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING */
#define TPP_LEXER_OPENFILE_FLAG_WARN_CASING  UINT32_C(0x00000000) /* no-op */
#endif /* !TPP_HAVE_TPP_W_NONPORTABLE_FILENAME_CASING */

/* Same as `tpp_lexer_openfile', but return `TPP_EMASKED' if the file was already
 * included before, and its keyword has any of the bits specified by `mask_flags' set.
 *
 * NOTES:
 * - A special case is made when "mask_flags & TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED",
 *   in which case, "TPP_EMASKED" is only returned if "tkm_file_guard" is a macro that
 *   is currently considered to be `#if defined()'.
 * - Another special case is made for "TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT", which
 *   causes "TPP_EMASKED" to be returned if the file's keyword is already included
 *   somewhere on the #include-stack.
 * - Also: when "mask_flags & TPP_KEYWORD_FLAG_HDR_IMPORTED", and the file's keyword
 *   doesn't already have the "TPP_KEYWORD_FLAG_HDR_IMPORTED" flag set, the open will
 *   succeed, and the "TPP_KEYWORD_FLAG_HDR_IMPORTED" flag will become set (so-as to
 *   implement the include-once semantics of "#import")
 * - This function always sets "tlofr_fileflags = TPP_FILE_FLAGS_NORMAL".
 *   If the given "relative_to" belongs to a system header, then it is up
 *   to the caller to set that flag. "tpp_lexer_open_include_string_ex()"
 *   will do so automatically after calling this function.
 *
 * @param: mask_flags: Set of flags describing circumstances under which TPP_EMASKED
 *                     should be returned:
 *                     - TPP_LEXER_OPENFILE_FLAG_HDR_IMPORTED
 *                     - TPP_LEXER_OPENFILE_FLAG_HDR_ONCE
 *                     - TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED
 *                     - TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT
 *
 * @return: TPP_EOK:     Success
 * @return: TPP_ENOMEM:  Insufficient memory
 * @return: TPP_ENOENT:  No such file, or TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT was
 *                       given, and the file is already located on the #include-stack.
 * @return: TPP_EMASKED: Flags specified by "mask_flags" were already set */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3, 5)) tpp_errno TPPCALL
tpp_lexer_openfile_ex(/*1..1*/ tpp_lexer *tpp_restrict self,
                      /*0..1*/ char const *tpp_restrict relative_to,
                      /*1..1*/ /*utf-8*/ char const *filename, tpp_size filename_maxlen,
                      /*1..1*/ tpp_lexer_openfile_result *tpp_restrict result,
                      tpp_lexer_openfile_flags mask_flags);
#define tpp_lexer_openfile(self, relative_to, filename, filename_maxlen, result) \
	tpp_lexer_openfile_ex(self, relative_to, filename, filename_maxlen, result, TPP_LEXER_OPENFILE_FLAG_NORMAL)
#else /* TPP_HAVE_LEXER_OPENFILE_EX */
/* Construct the filename, open the file, and initialize "result" accordingly
 * @param: relative_to: The `tpp_file::tf_data.td_io.tff_name' of another file,
 *                      in case "filename" is a relative path, in which case the
 *                      filename of the file to open should be relative to the
 *                      directory of "relative_to"
 * @param: result:      Open file information (pass along to "tpp_file_init_io()")
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Insufficient memory
 * @return: TPP_ENOENT: File not found (if you have additional "relative_to", try them) */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3, 5)) tpp_errno TPPCALL
tpp_lexer_openfile(/*1..1*/ tpp_lexer *tpp_restrict self,
                   /*0..1*/ char const *tpp_restrict relative_to,
                   /*1..1*/ /*utf-8*/ char const *filename, tpp_size filename_maxlen,
                   /*1..1*/ tpp_lexer_openfile_result *tpp_restrict result);
#endif /* !TPP_HAVE_LEXER_OPENFILE_EX */
#endif /* TPP_HAVE_LEXER_OPENFILE */

#if TPP_HAVE_JOINPATH
/* Form an absolute filename by combining "relative_to" with "filename"
 * @return: * :   The absolute path (must be free'd by caller using "tpp_free()")
 * @return: NULL: Out of memory. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((2)) char *TPPCALL
tpp_joinpath(/*0..1*/ char const *tpp_restrict relative_to,
             /*1..1*/ /*utf-8*/ char const *filename,
             tpp_size filename_maxlen);
#endif /* TPP_HAVE_JOINPATH */


#if TPP_HAVE_LEXER_CLI_DEFINE
/* Define (or override) a macro `macro_name` with a body definition `macro_body`
 * When `macro_name` contains an opening `(` character, it, as well as `macro_body`
 * are parsed as a function-like macro. The same also goes for `{`, `[` and `<`
 * when `TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS` is enabled.
 *
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 4)) tpp_errno TPPCALL
tpp_lexer_define(tpp_lexer *tpp_restrict self,
                 char const *macro_name, tpp_size macro_name_maxlen,
                 char const *macro_body, tpp_size macro_body_maxlen);

/* Delete a macro definition
 * @return: true:  Success
 * @return: false: No such macro */
TPP_DECL TPP_NONNULL((1, 2)) bool TPPCALL
tpp_lexer_undef(tpp_lexer *tpp_restrict self,
                char const *macro_name, tpp_size macro_name_maxlen);
#endif /* TPP_HAVE_LEXER_CLI_DEFINE */

#if TPP_HAVE_KEYWORDS_UNDEFALL
/* Delete all user-defined macro definitions */
#define tpp_lexer_undefall(self) tpp_keywords_undefall(&(self)->TPP_INTERNAL(tl_kwds))
#endif /* TPP_HAVE_KEYWORDS_UNDEFALL */


#if TPP_HAVE_LEXER_CLI_ASSERT
/* Add a new keyword assertions for `key` and `value`.
 * This is the same as doing `#assert {key}({value})`
 * @return: TPP_EOK:    Success
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 4)) tpp_errno TPPCALL
tpp_lexer_assert(tpp_lexer *tpp_restrict self,
                 char const *key, tpp_size key_maxlen,
                 char const *value, tpp_size value_maxlen);

/* Delete a new keyword assertions for `key` and `value`.
 * This is the same as doing `#unassert {key}({value})`
 * @return: true:  Success
 * @return: false: No such assertion */
TPP_DECL TPP_NONNULL((1, 2, 4)) bool TPPCALL
tpp_lexer_unassert(tpp_lexer *tpp_restrict self,
                   char const *key, tpp_size key_maxlen,
                   char const *value, tpp_size value_maxlen);

/* Delete all keyword assertions for `key`.
 * This is the same as doing `#unassert {key}` */
TPP_DECL TPP_NONNULL((1, 2)) void TPPCALL
tpp_lexer_unassertall(tpp_lexer *tpp_restrict self,
                      char const *key, tpp_size key_maxlen);
#endif /* TPP_HAVE_LEXER_CLI_ASSERT */

#if TPP_HAVE_KEYWORDS_UNASSERTALL
/* Delete all user-defined keyword assertions */
#define tpp_lexer_unassertall2(self) tpp_keywords_unassertall(&(self)->TPP_INTERNAL(tl_kwds))
#endif /* TPP_HAVE_KEYWORDS_UNASSERTALL */


#if TPP_HAVE_LEXER_RAND
/* Produce a random number based on:
 * - `tpp_lexer_getrngseed()' (affected by `tpp_lexer_popfile()' + `tpp_lexer_manualpopfile_break_commit()')
 * - `tpp_lexer_getinputhash()' (affected by everything read from files currently on the #include-stack)
 *
 * The result of the combination of those 2 values if then put
 * through a PRNG, before the result of the PRNG is then returned
 * by this function.
 *
 * This function is used to implement the builtin macro `__TPP_RANDOM()` */
TPP_DECL TPP_PURECALL TPP_WUNUSED TPP_NONNULL((1)) tpp_hash TPPCALL
tpp_lexer_getrand(tpp_lexer const *tpp_restrict self);

TPP_INLINE TPP_WUNUSED TPP_NONNULL((1)) tpp_hash TPPCALL
tpp_lexer_nextrand(tpp_lexer *tpp_restrict self) {
	tpp_hash const result = tpp_lexer_getrand(self);
	tpp_lexer_setrngseed(self, result);
	return result;
}
#endif /* TPP_HAVE_LEXER_RAND */



/* Read a single character (byte) whilst accounting for BSE (if enabled)
 * and automatically extending the current file if EOF is reached.
 * On true EOF:
 * - *p_result = '\0'
 * - *p_pos = tpp_lexer_getfile(self)->tf_end
 * - return TPP_EOK;
 *
 * @return: TPP_EOK:    Character was read
 * @return: TPP_ENOMEM: Out of memory
 * @return: TPP_EIO:    Failed to read from underlying file */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL
tpp_lexer_readchar(tpp_lexer *tpp_restrict self,
                   tpp_char const **tpp_restrict p_pos,
                   tpp_char *tpp_restrict p_result);

#if TPP_HAVE_UNICODE
/* Same as `tpp_lexer_readchar()', but (if the current file's encoding allows
 * it, and IN(*p_pos) points at a multi-byte character), decode a multi-byte
 * character and return it. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3)) tpp_errno TPPCALL
tpp_lexer_readunichar(tpp_lexer *tpp_restrict self,
                      tpp_char const **tpp_restrict p_pos,
                      tpp_unichar *tpp_restrict p_result);
#endif /* TPP_HAVE_UNICODE */



/* Temporarily modify lexer state flags */
#if TPP_HAVE_LEXER_STATE_FLAGS
#define _tpp_lexer_pushstate(self, mask, flags)                                       \
	do {                                                                              \
		tpp_lexer_state_flags const _tlsp_old_flags = (self)->TPP_INTERNAL(tl_state); \
		(self)->TPP_INTERNAL(tl_state) = ((self)->TPP_INTERNAL(tl_state) & (tpp_lexer_state_flags)(mask)) | (tpp_lexer_state_flags)(flags)
#define _tpp_lexer_enablestate(self, state)  (void)((self)->TPP_INTERNAL(tl_state) |= (state))
#define _tpp_lexer_disablestate(self, state) (void)((self)->TPP_INTERNAL(tl_state) &= ~(state))
#define _tpp_lexer_breakstate(self) \
		(void)((self)->TPP_INTERNAL(tl_state) = _tlsp_old_flags)
#define _tpp_lexer_popstate(self)    \
		_tpp_lexer_breakstate(self); \
	} while (0)
#else /* TPP_HAVE_LEXER_STATE_FLAGS */
#define _tpp_lexer_pushstate(self, mask, flags) do {
#define _tpp_lexer_enablestate(self, state)     (void)0
#define _tpp_lexer_disablestate(self, state)    (void)0
#define _tpp_lexer_breakstate(self)             (void)0
#define _tpp_lexer_popstate(self)               } while (0)
#endif /* !TPP_HAVE_LEXER_STATE_FLAGS */
#define _tpp_lexer_pushstate_on(self, flags)  _tpp_lexer_pushstate(self, ~0, flags)
#define _tpp_lexer_pushstate_off(self, flags) _tpp_lexer_pushstate(self, ~(flags), 0)

/* Alter the lexer state such that no warning messages are produces. */
#if TPP_HAVE_WARNINGS
#define tpp_lexer_nowarnings_pushon(self) _tpp_lexer_pushstate_on(self, TPP_LEXER_STATE_FLAG_NOWARNINGS)
#define tpp_lexer_nowarnings_break(self)  _tpp_lexer_breakstate(self)
#define tpp_lexer_nowarnings_pop(self)    _tpp_lexer_popstate(self)
#else /* TPP_HAVE_WARNINGS */
#define tpp_lexer_nowarnings_pushon(self) do {
#define tpp_lexer_nowarnings_break(self)  (void)0
#define tpp_lexer_nowarnings_pop(self)    } while (0)
#endif /* !TPP_HAVE_WARNINGS */

/* Alter the lexer state such that `tpp_lexer_yieldpp()' does not filter tokens. */
#if TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS
#define tpp_lexer_alltokens_pushon(self) _tpp_lexer_pushstate_on(self, TPP_LEXER_STATE_FLAG_ALLTOKENS)
#define tpp_lexer_alltokens_break(self)  _tpp_lexer_breakstate(self)
#define tpp_lexer_alltokens_pop(self)    _tpp_lexer_popstate(self)
#else /* TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS */
#define tpp_lexer_alltokens_pushon(self) do {
#define tpp_lexer_alltokens_break(self)  (void)0
#define tpp_lexer_alltokens_pop(self)    } while (0)
#endif /* !TPP_HAVE_LEXER_STATE_FLAG_ALLTOKENS */

#if TPP_HAVE_LEXER_MANUALPOPFILE
#define tpp_lexer_popfilerlbk_pushon(self) _tpp_lexer_pushstate_on(self, TPP_LEXER_STATE_FLAG_POPFILERLBK)
#define tpp_lexer_popfilerlbk_break(self)  _tpp_lexer_breakstate(self)
#define tpp_lexer_popfilerlbk_pop(self)    _tpp_lexer_popstate(self)
#else /* TPP_HAVE_LEXER_MANUALPOPFILE */
#define tpp_lexer_popfilerlbk_pushon(self) do {
#define tpp_lexer_popfilerlbk_break(self)  (void)0
#define tpp_lexer_popfilerlbk_pop(self)    } while (0)
#endif /* !TPP_HAVE_LEXER_MANUALPOPFILE */


/* Temporarily disable automatic pop-to-prev-file on EOF */
#define tpp_lexer_autopopfile_pushoff(self) tpp_file_autopopfile_pushoff(tpp_lexer_getfile(self))
#define tpp_lexer_autopopfile_break(self)   tpp_file_autopopfile_break(tpp_lexer_getfile(self))
#define tpp_lexer_autopopfile_pop(self)     tpp_file_autopopfile_pop(tpp_lexer_getfile(self))


/* Do a raw yield and update `self->tl_tok' in the process, then return `tl_tok.tt_id'.
 * - On EOF, automatically pop `tl_file->tf_prev' and continue reading from there
 * - On error, return one of `TPP_TOK_E*' (e.g. `TPP_TOK_EIO').
 *   Such error codes will NOT be stored in `tl_tok.tt_id'!
 *
 * NOTE: This function does *NOT* deal with:
 * - Preprocessor directives
 * - Builtin macros
 * - User-defined macros
 * - Filtering out comment, line-feed, and whitespace tokens
 *
 * @return: * :                  The newly read token
 * @return: TPP_TOK_ENOMEM:      Out of memory
 * @return: TPP_TOK_EIO:         I/O error while trying to read from file
 * @return: TPP_TOK_EWOULDBLOCK: Current file uses "TPP_FILE_FLAGS_NONBLOCK" and operation would have blocked
 * @return: TPP_TOK_ELEXERROR:   Lexer error
 * @return: TPP_TOK_EWARNPRINT:  Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yieldraw(tpp_lexer *tpp_restrict self);

/* Same as `tpp_lexer_yieldraw()', but populate the token from a custom `*p_pos',
 * and don't pop files from the current #include-stack (unless `p_pos' is the top-
 * most file's `tf_pos')
 *
 * NOTES:
 *  - This function will *NOT* populate "tpp_lexer_gettoken(self)->tt_end",
 *    however the value it would have written there is OUT(*p_pos), meaning
 *    you can just use that instead, and call this function multiple times
 *    to yield more than 1 token
 *  - This function can be used to peek future tokens, as it will also expand
 *    the current file when `*p_pos' would go beyond its end. (in this case,
 *    `*p_pos' is updated such that it always remains valid)
 *  - Unlike `tpp_lexer_yieldraw()', this function will *not* modify the
 *    currently loaded file's `tf_pos' (unless `p_pos == &file->tf_pos'),
 *    meaning that if EOF is reached, the file's chunk will only ever be
 *    expanded, but no old data (that would appear before `tf_pos') will
 *    be deallocated
 *  - This function will also not automatically move on to the next file
 *    in line when the current one has been fully exhausted (unless the
 *    given `p_pos == &file->tf_pos'), meaning that TPP_TOK_EOF will be
 *    returned when no more data can be loaded.
 *
 * This is used to implement `tpp_lexer_yieldraw()', which simply
 * passes `p_pos = &tpp_lexer_gettoken(self)->tt_end'
 *
 * @return: * : See `tpp_lexer_yieldraw()' */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_token_id TPPCALL
tpp_lexer_yieldraw_at(tpp_lexer *tpp_restrict self, tpp_char const **p_pos);


typedef struct tpp_lexer_seek_backup {
	tpp_token_id              TPP_INTERNAL(tlsb_id);    /* Saved token id */
	struct tpp_keyword const *TPP_INTERNAL(tlsb_kwd);   /* [1..1][valid_if(TPP_TOK_ISKEYWORD(tlsb_id))] Saved token keyword */
	tpp_size                  TPP_INTERNAL(tlsb_len);   /* Relative length of token */
} tpp_lexer_seek_backup;

/* Save/restore the currently loaded token. This must be done before/after
 * making use of `tpp_lexer_yieldraw_at()' with a custom text pointer:
 * >> tpp_token_id seek_next_token(tpp_lexer *self) {
 * >>     tpp_token_id result;
 * >>     tpp_lexer_seek_backup backup;
 * >>     tpp_char const *pos;
 * >>     pos    = tpp_lexer_seek_start(self, &backup);
 * >>     result = tpp_lexer_yieldraw_at(self, &pos);
 * >>     if (SHOULD_COMMIT(result)) {
 * >>         tpp_lexer_seek_commit(self, pos);
 * >>     } else {
 * >>         tpp_lexer_seek_rollback(self, &backup);
 * >>     }
 * >>     return result;
 * >> } */
TPP_INLINE TPP_RETNONNULL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_char const *TPPCALL
tpp_lexer_seek_start(tpp_lexer *tpp_restrict self,
                     tpp_lexer_seek_backup *tpp_restrict backup) {
	tpp_char const *result;
	tpp_token *const token = tpp_lexer_gettoken(self);
	backup->TPP_INTERNAL(tlsb_id)  = tpp_token_getid(token);
	backup->TPP_INTERNAL(tlsb_kwd) = tpp_token_getkwd(token);
	backup->TPP_INTERNAL(tlsb_len) = tpp_token_getlen(token);
	result                         = tpp_token_getend(token);
	token->TPP_INTERNAL(tt_end)    = tpp_token_getstart(token);
	return result;
}
#define tpp_lexer_seek_commit(self, pos) \
	(void)(tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_end) = (pos))
#define tpp_lexer_seek_rollback(self, backup)                                                                             \
	(tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_kwd)   = (backup)->TPP_INTERNAL(tlsb_kwd),                                 \
	 tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_start) = tpp_lexer_gettokenend(self),                                      \
	 tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_end)   = tpp_lexer_gettokenstart(self) + (backup)->TPP_INTERNAL(tlsb_len), \
	 tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_id)    = (backup)->TPP_INTERNAL(tlsb_id))



#if TPP_HAVE_LEXER_MANUALPOPFILE
/* Enter a region of code where it is possible to manually (and possibly temporarily)
 * pop the currently loaded lexer file such that the file next-up in the #include-
 * stack can be yielded from instead.
 *
 * NOTES:
 *  - These macros respect "tpp_lexer_autopopfile_pushoff" such that
 *    "tpp_lexer_manualpopfile_canpopfile(self)" returns "false" if
 *    the then top-most file had automatic popping disabled.
 *  - Changes made to the effective "tf_pos" of files must be restored
 *    by the user before calling "tpp_lexer_manualpopfile_popfile()".
 *
 * This functionality is needed/used to scan for the opening '(' token in macro calls
 * in those cases where the file containing the original macro invocation ends with
 * EOF before such a token can be located:
 * >> #define foo(a, b) a+b
 * >> #define bar       foo
 * >> bar(10, 20)  // Here, "foo" (macro name) and "(" are located in different files, but macro expansion must still happen
 * >> bar[10, 20]  // But for this case, a rollback behavior is still needed to still yield "foo" as an identifer
 *
 * Use these macros as follows:
 * >> // Check if the next "raw", non-space token will be "(".
 * >> // If so, yield to it (such that the current token becomes '(') and return "true"
 * >> // Otherwise, don't change anything and return "false"
 * >> // -- Error handling omitted for brevity
 * >> bool search_for_lparen(tpp_lexer *self) {
 * >>     tpp_lexer_seek_backup backup;
 * >>     tpp_char const *pos = tpp_lexer_seek_start(self, &backup);
 * >>     tpp_token_id tok;
 * >>     do {
 * >>         tok = tpp_lexer_yieldraw_at(self, &pos);
 * >>     } while (TPP_TOK_ISSPACE_OR_COMMENT(tok));
 * >>     if (tok == '(') { // Found in same file
 * >>         tpp_lexer_seek_commit(self, pos);
 * >>         return true;
 * >>     }
 * >>     tpp_lexer_seek_rollback(self, &backup);
 * >>     if (tok == TPP_TOK_EOF) {
 * >>         // Check files further up the #include-stack
 * >>         tpp_lexer_manualpopfile_start(self);
 * >>         while (tpp_lexer_manualpopfile_canpopfile(self)) {
 * >>             tpp_lexer_manualpopfile_popfile(self);
 * >>             pos = tpp_lexer_seek_start(self, &backup);
 * >>             do {
 * >>                 tok = tpp_lexer_yieldraw_at(self, &pos);
 * >>             } while (TPP_TOK_ISSPACE_OR_COMMENT(tok));
 * >>             if (tok == '(') {
 * >>                 tpp_lexer_seek_commit(self, pos);
 * >>                 tpp_lexer_manualpopfile_break_commit(self);
 * >>                 return true;
 * >>             }
 * >>             tpp_lexer_seek_rollback(self, &backup);
 * >>             if (tok != TPP_TOK_EOF)
 * >>                 break;
 * >>         }
 * >>         tpp_lexer_manualpopfile_end_rollback(self);
 * >>     }
 * >>     return false;
 * >> }
 *
 * Another use case is to:
 * - Setup
 *   - Use "tpp_file_autopopfile_pushoff()" to set a limit on how far files can be popped
 *   - Use "tpp_file_setkeep()" on all popable files to prevent old data from being free'd
 *   - Save "tpp_file_getpos()" of popable files relative to their "tpp_file_getkeep()"
 *   - Use "tpp_lexer_manualpopfile_start()"
 *   - Set the "TPP_LEXER_STATE_FLAG_POPFILERLBK" state flag
 * - At this, functions like "tpp_lexer_yieldpp()" or "tpp_lexer_yield()"
 *   can be called like normal.
 * - Rollback can then Implement rollback as:
 *   - Restore the "TPP_LEXER_STATE_FLAG_POPFILERLBK" flag
 *   - "tpp_lexer_manualpopfile_end_rollback(self)"
 *   - Restore positions of popable files by doing "tpp_file_getkeep() + REL_POS"
 *   - Restore the old keep-positions of popable files
 *   - Calling "tpp_file_autopopfile_pop()" on popable files
 * - But be careful: side-effects like macro definitions or #pragma directives aren't rolled back"
 *
 * HINT: Something similar to this is done to parse the argument lists of macros when
 *       rollback needs to be possible due to the "TPP_MACRO_FLAG_SELFEXPAND" extension.
 *
 * WARNING: All additional files pushed onto the #include-stack at any point while
 *          inside of a tpp_lexer_manualpopfile_start()-block must be popped again
 *          before the block may be committed or rolled back! */
#define tpp_lexer_manualpopfile_start(self) \
	do{ tpp_file *const _tlmpf_orig_prev = tpp_lexer_getfile(self)->TPP_INTERNAL(tf_prev)
TPP_DECL TPP_NONNULL((1)) void TPPCALL tpp_lexer_manualpopfile_popfile(tpp_lexer *tpp_restrict self);
#define tpp_lexer_manualpopfile_canpopfile(self) (tpp_lexer_getfile(self)->TPP_INTERNAL(tf_prev) != NULL)
TPP_DECL TPP_NONNULL((1)) void TPPCALL _tpp_lexer_manualpopfile_break_rollback(tpp_lexer *tpp_restrict self, tpp_file *tpp_restrict orig_prev);
TPP_DECL TPP_NONNULL((1)) void TPPCALL _tpp_lexer_manualpopfile_break_commit(tpp_lexer *tpp_restrict self, tpp_file *tpp_restrict orig_prev);
#define tpp_lexer_manualpopfile_break_rollback(self) _tpp_lexer_manualpopfile_break_rollback(self, _tlmpf_orig_prev)
#define tpp_lexer_manualpopfile_break_commit(self)   _tpp_lexer_manualpopfile_break_commit(self, _tlmpf_orig_prev)
#define tpp_lexer_manualpopfile_break(self, rollback)   \
		((rollback)                                     \
		 ? tpp_lexer_manualpopfile_break_rollback(self) \
		 : tpp_lexer_manualpopfile_break_commit(self))
#define tpp_lexer_manualpopfile_end_rollback(self)    \
		tpp_lexer_manualpopfile_break_rollback(self); \
	} while (0)
#define tpp_lexer_manualpopfile_end_commit(self)    \
		tpp_lexer_manualpopfile_break_commit(self); \
	} while (0)
#define tpp_lexer_manualpopfile_end(self, rollback)    \
		tpp_lexer_manualpopfile_break(self, rollback); \
	} while (0)
#endif /* TPP_HAVE_LEXER_MANUALPOPFILE */



/* Wrapper around `tpp_lexer_yieldraw()' that filters certain tokens (based on
 * configured features), and implements handling for preprocessor directives,
 * like "#define", "#include", etc:
 * - TPP_TOK_LF:      Filtered based on `TPP_HAVE_TOK_LF' / `TPP_FEAT_TPP_TOK_LF'
 * - TPP_TOK_SPACE:   Filtered based on `TPP_HAVE_TOK_SPACE' / `TPP_FEAT_TPP_TOK_SPACE'
 * - TPP_TOK_COMMENT: Filtered based on `TPP_HAVE_TOK_COMMENT' / `TPP_FEAT_TPP_TOK_COMMENT'
 *
 * @return: * :                  The newly read token (after accounting for preprocessor directives)
 * @return: TPP_TOK_ENOMEM:      Out of memory
 * @return: TPP_TOK_EIO:         I/O error while trying to read from file
 * @return: TPP_TOK_EWOULDBLOCK: Current file uses "TPP_FILE_FLAGS_NONBLOCK" and operation would have blocked
 * @return: TPP_TOK_ELEXERROR:   Lexer error
 * @return: TPP_TOK_EWARNPRINT:  Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yieldpp(tpp_lexer *tpp_restrict self);


/* Wrapper around `tpp_lexer_yieldpp()' that adds handling for macro expansion.
 * @return: * :                  The newly read token (after accounting for macros)
 * @return: TPP_TOK_ENOMEM:      Out of memory
 * @return: TPP_TOK_EIO:         I/O error while trying to read from file
 * @return: TPP_TOK_EWOULDBLOCK: Current file uses "TPP_FILE_FLAGS_NONBLOCK" and operation would have blocked
 * @return: TPP_TOK_ELEXERROR:   Lexer error
 * @return: TPP_TOK_EWARNPRINT:  Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yield(tpp_lexer *tpp_restrict self);

/* Handle a keyword-style macro (used to implement "tpp_lexer_yield()").
 * @return: TPP_TOK_EOF: Caller should yield again.
 * @return: * : The new expansion token after keywords were handled */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yield_handle_keyword(tpp_lexer *tpp_restrict self, tpp_token_id tok);



#if TPP_HAVE_FILE_NONBLOCK
/* Same as `tpp_lexer_yield()', but handle "TPP_TOK_EWOULDBLOCK" by temporarily
 * clearing the "TPP_FILE_FLAGS_NONBLOCK" flag, and re-attempting the yield. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yield_blocking(tpp_lexer *tpp_restrict self);

/* Same as `tpp_lexer_yieldpp()', but handle "TPP_TOK_EWOULDBLOCK" by temporarily
 * clearing the "TPP_FILE_FLAGS_NONBLOCK" flag, and re-attempting the yield. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yieldpp_blocking(tpp_lexer *tpp_restrict self);

/* Same as `tpp_lexer_yieldraw()', but handle "TPP_TOK_EWOULDBLOCK" by temporarily
 * clearing the "TPP_FILE_FLAGS_NONBLOCK" flag, and re-attempting the yield. */
#define tpp_lexer_yieldraw_blocking(self) \
	tpp_lexer_yieldraw_at_blocking(self, &tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_end))

/* Same as `tpp_lexer_yieldraw_at()', but handle "TPP_TOK_EWOULDBLOCK" by temporarily
 * clearing the "TPP_FILE_FLAGS_NONBLOCK" flag, and re-attempting the yield. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_token_id TPPCALL
tpp_lexer_yieldraw_at_blocking(tpp_lexer *tpp_restrict self, tpp_char const **p_pos);
#else /* TPP_HAVE_FILE_NONBLOCK */
#define tpp_lexer_yield_blocking(self)              tpp_lexer_yield(self)
#define tpp_lexer_yieldpp_blocking(self)            tpp_lexer_yieldpp(self)
#define tpp_lexer_yieldraw_blocking(self)           tpp_lexer_yieldraw(self)
#define tpp_lexer_yieldraw_at_blocking(self, p_pos) tpp_lexer_yieldraw_at(self, p_pos)
#endif /* !TPP_HAVE_FILE_NONBLOCK */



#if TPP_HAVE_LEXER_YIELD_INCLUDE_STRING
/* Special token IDs for include paths */
#define TPP_TOK_INCPATH_DQUOTE TPP_TOK_OFCHAR('"') /* #include "foo.h" */
#define TPP_TOK_INCPATH_LANGLE TPP_TOK_OFCHAR('<') /* #include <foo.h> */

/* (Mostly) the same as "tpp_lexer_yield()", except:
 * - Never process preprocessor directives (but macros are still expanded)
 * - If the next token starts with '"' or '<', parse it as a #include-string,
 *   with the token's start/end bounds pointing at the string's bounds. In
 *   this case, the token's ID (and return value) is:
 *   - TPP_TOK_INCPATH_DQUOTE  // For #include "foo.h"
 *   - TPP_TOK_INCPATH_LANGLE  // For #include <foo.h>
 * - WARNING: This function doesn't filter SPACE/LF/COMMENT tokens
 *   (behaves as though 'TPP_LEXER_STATE_FLAG_ALLTOKENS' was set)
 *
 * @return: * : Some other token encountered (token was parsed like tpp_lexer_yieldraw())
 * @return: TPP_TOK_INCPATH_DQUOTE: #include-string parsed: "foo.h"
 * @return: TPP_TOK_INCPATH_LANGLE: #include-string parsed: <foo.h>
 * @return: TPP_TOK_ENOMEM:      Out of memory
 * @return: TPP_TOK_EIO:         I/O error while trying to read from file
 * @return: TPP_TOK_EWOULDBLOCK: Current file uses "TPP_FILE_FLAGS_NONBLOCK" and operation would have blocked
 * @return: TPP_TOK_ELEXERROR:   Lexer error
 * @return: TPP_TOK_EWARNPRINT:  Error while printing a warning */
#if TPP_HAVE_CPP_MACROS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yield_include_string(tpp_lexer *tpp_restrict self);
#else /* TPP_HAVE_CPP_MACROS */
#define tpp_lexer_yield_include_string(self) tpp_lexer_yieldraw_include_string(self)
#endif /* !TPP_HAVE_CPP_MACROS */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_token_id TPPCALL
tpp_lexer_yieldraw_at_include_string(tpp_lexer *tpp_restrict self, tpp_char const **p_pos);
#if TPP_HAVE_FILE_NONBLOCK
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_token_id TPPCALL
tpp_lexer_yieldraw_at_include_string_blocking(tpp_lexer *tpp_restrict self, tpp_char const **p_pos);
#if TPP_HAVE_CPP_MACROS
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_yield_include_string_blocking(tpp_lexer *tpp_restrict self);
#else /* TPP_HAVE_CPP_MACROS */
#define tpp_lexer_yield_include_string_blocking(self) tpp_lexer_yieldraw_include_string_blocking(self)
#endif /* !TPP_HAVE_CPP_MACROS */
#else /* TPP_HAVE_FILE_NONBLOCK */
#define tpp_lexer_yieldraw_at_include_string_blocking(self, p_pos) tpp_lexer_yieldraw_at_include_string(self, p_pos)
#define tpp_lexer_yield_include_string_blocking(self)              tpp_lexer_yield_include_string(self)
#endif /* !TPP_HAVE_FILE_NONBLOCK */
#define tpp_lexer_yieldraw_include_string_blocking(self, p_pos) \
	tpp_lexer_yieldraw_at_include_string_blocking(self, &tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_end))
#define tpp_lexer_yieldraw_include_string(self) \
	tpp_lexer_yieldraw_at_include_string(self, &tpp_lexer_gettoken(self)->TPP_INTERNAL(tt_end))
#endif /* TPP_HAVE_LEXER_YIELD_INCLUDE_STRING */


#if TPP_HAVE_LEXER_DECODE_INCLUDE_STRING
/* Decode the current token as a #include-string. The caller is responsible to
 * ensure that the current token was loaded by `tpp_lexer_yield_include_string()'
 * and is either TPP_TOK_INCPATH_LANGLE or TPP_TOK_INCPATH_DQUOTE
 *
 * @return: * :  Sum of positive return values from printers
 * @return: < 0: First negative return value from printers */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_lexer_decode_include_string(tpp_lexer const *tpp_restrict self,
                                tpp_formatprinter printer, void *arg);

/* Same as `tpp_lexer_decode_include_string()', but the given "cb" is only
 * invoked once whilst being passed the *entire* (decoded) #include-string.
 *
 * @return: * : Return value of the (singular) invocation of "cb"
 * @return: TPP_ENOMEM: Out of memory */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_decode_include_string_cb(tpp_lexer const *tpp_restrict self,
                                   tpp_errno (TPPCALL *cb)(void *arg, char const *str, tpp_size length),
                                   void *arg);
#endif /* TPP_HAVE_LEXER_DECODE_INCLUDE_STRING */


#if TPP_HAVE_LEXER_OPEN_INCLUDE_STRING
#ifndef tpp_lexer_foreach_include_path_flags__PARAM
#if TPP_HAVE_FILE_SYSHDR
#define tpp_lexer_foreach_include_path_flags__PARAM  , tpp_file_flags flags
#define tpp_lexer_foreach_include_path_flags__ARG(x) , x
#else /* TPP_HAVE_FILE_SYSHDR */
#define tpp_lexer_foreach_include_path_flags__PARAM  /* nothing */
#define tpp_lexer_foreach_include_path_flags__ARG(x) /* nothing */
#endif /* !TPP_HAVE_FILE_SYSHDR */
#endif /* !tpp_lexer_foreach_include_path_flags__PARAM */

/* Enumerate #include-paths according to "mode"
 * @param: mode: #include-mode (either TPP_TOK_INCPATH_LANGLE or TPP_TOK_INCPATH_DQUOTE)
 * @param: cb:   Callback invoked for each available #include-path. The first time
 *               this callback returns something other than TPP_ENOENT, that return
 *               value is propagated.
 * @param: cb.flags: Either "TPP_FILE_FLAGS_NORMAL" or "TPP_FILE_FLAGS_SYSHDR",
 *                   possibly or'd with "TPP_FILE_FLAGS_EXTERN_C" depending on
 *                   where "relative_to" originates from, and how "self" has been
 *                   configured (see "TPP_HAVE_EXTERN_C_FOR_SYSHDR")
 * @param: arg:  Cookie for "cb"
 * @return: * :  The first non-TPP_ENOENT return value of "cb"
 * @return: TPP_ENOENT: Either "cb" was never invoked (no #include-paths), or all
 *                      invocations of "cb" returned "TPP_ENOENT". */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 3)) tpp_errno TPPCALL
tpp_lexer_foreach_include_path(tpp_lexer *tpp_restrict self, tpp_token_id mode,
                               tpp_errno (TPPCALL *cb)(void *arg, char const *relative_to
                                                       tpp_lexer_foreach_include_path_flags__PARAM),
                               void *arg);

/* Wrapper around `tpp_lexer_decode_include_string_cb()' that automatically
 * does the necessary calls to `tpp_lexer_openfile_ex()'. It also handles
 * the `TPP_ENOENT' (as far as possible) by continuing to search for other
 * matching files. The specified "mask_flags" should be set depending on
 * context like:
 * - #include ...             TPP_LEXER_OPENFILE_FLAG_HDR_ONCE | TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED
 * - __has_include(...)       TPP_LEXER_OPENFILE_FLAG_HDR_ONCE | TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED
 * - #include_next ...        TPP_LEXER_OPENFILE_FLAG_HDR_ONCE | TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED | TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT
 * - __has_include_next(...)  TPP_LEXER_OPENFILE_FLAG_HDR_ONCE | TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED | TPP_LEXER_OPENFILE_FLAG_INCLUDE_NEXT
 * - #import ...              TPP_LEXER_OPENFILE_FLAG_HDR_ONCE | TPP_LEXER_OPENFILE_FLAG_HDR_GUARDED | TPP_LEXER_OPENFILE_FLAG_HDR_IMPORTED
 * - #embed ...               TPP_LEXER_OPENFILE_FLAG_NORMAL
 * - __has_embed(...)         TPP_LEXER_OPENFILE_FLAG_NORMAL
 *
 * @return: TPP_EOK:     Success
 * @return: TPP_ENOMEM:  Insufficient memory
 * @return: TPP_ENOENT:  No such file (no warning printed, yet)
 * @return: TPP_EMASKED: (tpp_lexer_open_include_string_ex only): Flags
 *                       specified by "mask_flags" were already set. */
#if TPP_HAVE_LEXER_OPENFILE_EX
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_open_include_string_ex(tpp_lexer *tpp_restrict self,
                                 /*1..1*/ tpp_lexer_openfile_result *tpp_restrict result,
                                 tpp_lexer_openfile_flags mask_flags);
#define tpp_lexer_open_include_string(self, result) \
	tpp_lexer_open_include_string_ex(self, result, 0)
#else /* TPP_HAVE_LEXER_OPENFILE_EX */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_open_include_string(tpp_lexer *tpp_restrict self,
                              /*1..1*/ tpp_lexer_openfile_result *tpp_restrict result);
#endif /* !TPP_HAVE_LEXER_OPENFILE_EX */
#endif /* TPP_HAVE_LEXER_OPEN_INCLUDE_STRING */




#if TPP_HAVE_LEXER_SKIP
/* Check that the currently loaded token is 'tok'. If so, "tpp_lexer_yield_blocking()" to
 * the next token (which is also returned). Otherwise, trigger 'TPP_W_UNEXPECTED_TOKEN'
 * and (if that warning wasn't fatal), try to seek ahead to see if "tok" can be found
 * somewhere close by (depending on what 'tok' and what was actually loaded on entry)
 *
 * NOTE: This function automatically handles "TPP_TOK_EWOULDBLOCK"
 *
 * @return: * :                 The token that comes after the one that was just skipped
 * @return: TPP_TOK_ENOMEM:     Out of memory
 * @return: TPP_TOK_EIO:        I/O error while trying to read from file
 * @return: TPP_TOK_ELEXERROR:  Lexer error
 * @return: TPP_TOK_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_skip(tpp_lexer *tpp_restrict self, tpp_token_id tok);

/* Same as "tpp_lexer_skip()", but don't advance to the next token,
 * except in those cases where the requested "tok" could be found
 * a little further up ahead, and the implementation decided that
 * the tokens that lay in-between should be skipped.
 *
 * @return: * :                 The currently loaded token
 * @return: tok:                Success
 * @return: TPP_TOK_ENOMEM:     Out of memory
 * @return: TPP_TOK_EIO:        I/O error while trying to read from file
 * @return: TPP_TOK_ELEXERROR:  Lexer error
 * @return: TPP_TOK_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_require(tpp_lexer *tpp_restrict self, tpp_token_id tok);

#define tpp_lexer_require_number(self) tpp_lexer_require(self, TPP_TOK_C_INT) /* TODO: Must solve differently */
#endif /* TPP_HAVE_LEXER_SKIP */



#if TPP_HAVE_LEXER_TRYSKIP_RAW
#define TPP_LEXER_TRYSKIP_RAW_FLAG_NORMAL      0x0000 /* Normal flags */
#define TPP_LEXER_TRYSKIP_RAW_FLAG_STOPONSPACE 0x0001 /* Rollback if a NOLINE-COMMENT or SPACE token is hit */
#define TPP_LEXER_TRYSKIP_RAW_FLAG_STOPONLF    0x0002 /* Rollback if a LINE-COMMENT or LF token is hit */
#define TPP_LEXER_TRYSKIP_RAW_FLAG_INCLPREV    0x0004 /* On success, include the previous token in the selected text-area, too */

/* Make use of:
 * - tpp_lexer_seek_start()
 * - tpp_lexer_yieldraw_at()
 * - tpp_lexer_manualpopfile_start(self)
 * to seek ahead to the next token, skipping whitespace/line-feed (+resp. comments)
 * based on "flags", check if said "next token" is equal to "expected" (with some extra-
 * extra handling when "TPP_HAVE_ALTERNATIVE_MACRO_PARENTHESIS && expected == '<'").
 * If that is the case, commit the lexer such that it points at a token equal to
 * the specified "expected", truly disposing of any files popped in the mean-time.
 * Otherwise (the next token is "!= expected"), roll back any changes made, such
 * that "self" once again points at the same token it did upon entry. In either
 * case, return the ID of whatever token came next.
 *
 * NOTE: This function automatically handles "TPP_TOK_EWOULDBLOCK" by blocking!
 *
 * @return: * :                 The next token (rollback)
 * @return: expected:           The next token (commit)
 *                              When "TPP_LEXER_TRYSKIP_RAW_FLAG_INCLPREV" is set,
 *                              the text-range of "self" will actually include the
 *                              previous token as well.
 * @return: TPP_TOK_ENOMEM:     Out of memory
 * @return: TPP_TOK_EIO:        I/O error while trying to read from file
 * @return: TPP_TOK_ELEXERROR:  Lexer error
 * @return: TPP_TOK_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_tryskip_raw(tpp_lexer *tpp_restrict self, tpp_token_id expected,
                      unsigned int flags);
#endif /* TPP_HAVE_LEXER_TRYSKIP_RAW */



#if TPP_HAVE_LEXER_SEEKPP_RPAREN

#define TPP_LEXER_SEEK_RPAREN_FLAG_NORMAL     0x0000
#define TPP_LEXER_SEEK_RPAREN_FLAG_VARARGS    0x0001 /* Store varargs info in p_argv[IN(*p_argc) - 1] */
#if TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE)
#define TPP_LEXER_SEEK_RPAREN_FLAG_KEEPARGSPC 0x0002 /* Do not strip whitespace/comments around arguments */
#endif /* TPP_CONF_IS_RT(TPP_HAVE_MACRO_ARGUMENT_WHITESPACE) */
#if TPP_HAVE_LEXER_MANUALPOPFILE
#define TPP_LEXER_SEEK_RPAREN_FLAG_POPRLBK    0x0004 /* Use "tpp_lexer_manualpopfile_popfile()" to pop files */
#endif /* TPP_HAVE_LEXER_MANUALPOPFILE */
#define TPP_LEXER_SEEK_RPAREN_FLAG_NOWARNEOF  0x0008 /* Do not emit "TPP_W_EOF_IN_ARGUMENT_LIST" warnings */

typedef struct tpp_lexer_arginfo {
	/* NOTE: Leading/trailing whitespace in arguments is controlled by "TPP_LEXER_SEEK_RPAREN_FLAG_KEEPARGSPC" */
	tpp_char const     *tlai_start;  /* [1..1][<= tlai_end] Pointer to argument start text data */
	tpp_char const     *tlai_end;    /* [1..1][>= tlai_start] Pointer to argument end text data */
	TPP_REF tpp_string *tlai_chunk;  /* [0..1] Chunk of text containing [tlai_start,tlai_end), or "NULL" if statically allocated */
	/* XXX: Come up with a smart way of tracking debug info for custom printed arguments
	 *      -> need to be able to track lcinfo for custom char ranges (any range of chars
	 *         from this string must be able to map to its own file/line/col triple)
	 *      -> also must adjust tpp_file_getlcinfo() to support this, and somehow also
	 *         incorporate tpp_file_getrealfilename()/tpp_file_getfilename() to support
	 *         different filenames based on char position
	 * where this is necessary:
	 * >> #define foo(a) a a
	 * >> foo(
	 * >> #include "file1.txt"   // Contains 10
	 * >> #include "file2.txt"   // Contains 20
	 * >> )
	 *
	 * Must result in 4 tokens (not accounting for whitespace/linefeed tokens):
	 * - file1.txt:1:1: 10
	 * - file2.txt:1:1: 20
	 * - file1.txt:1:1: 10
	 * - file2.txt:1:1: 20
	 */
} tpp_lexer_arginfo;

#define tpp_lexer_arginfo_init_empty(self) \
	(void)((self)->tlai_chunk = NULL, (self)->tlai_start = (self)->tlai_end = NULL)
#define tpp_lexer_arginfo_fini(self)                                            \
	((void)(!(self)->tlai_chunk || (tpp_string_decref((self)->tlai_chunk), 0)), \
	 tpp_dbg_memset(self, sizeof(*(self))))
#define tpp_lexer_arginfo_copy(dst, src) \
	(void)(*(dst) = *(src), (!(self)->tlai_chunk || (tpp_string_incref((self)->tlai_chunk), 0)))
#define tpp_lexer_arginfo_move(dst, src) \
	(void)(*(dst) = *(src), tpp_dbg_memset(src, sizeof(*(src))))

/* Seek the first unmatched ')'-token, whilst collecting information
 * about every ','-separated text-area encountered until then.
 *
 * NOTES:
 *  - This function is used to parse the argument list for user-defined
 *    macros, as well as a couple of built-in macros.
 *  - This function preserves the effective "tf_tpos" (aka. tpp_token_getstart())
 *    of the final output file (and when using "tpp_lexer_manualpopfile_start":
 *    all intermediate popped files also)
 *
 * @param: p_argv: [out]    Output buffer for the bounds of macro
 *                          arguments encountered along the way.
 *                          The size of this buffer is IN(*p_argc)
 * @param: p_argc: [in/out] In:  Size of provided "p_argv" buffer (in elements)
 *                          Out: Number of arguments actually encountered. May
 *                               be set to a number greater tha IN(*p_argc), in
 *                               which case the last argument (IN(*p_argc) - 1)
 *                               is treated as a varargs argument. Unless the
 *                               `TPP_LEXER_SEEK_RPAREN_FLAG_VARARGS' flag is
 *                               given in this case, this also causes a warning
 *                               to be emitted.
 * @param: p_rollback_pos:  [out] Set to the position that the current file should
 *                                be rewound to for the sake of performing a rollback
 * @param: opt_function_name_for_messages:
 *                          Function name for warning messages
 * @param: flags:           Set of `TPP_LEXER_SEEK_RPAREN_FLAG_*'
 *
 * @return: TPP_TOK_EOF:         EOF was encountered before an unmatched ')' was found
 * @return: TPP_TOK_RPAREN:      Unmatched closing ')' was encountered
 * @return: TPP_TOK_ENOMEM:      Out of memory
 * @return: TPP_TOK_EIO:         I/O error while trying to read from file
 * @return: TPP_TOK_ELEXERROR:   Lexer error
 * @return: TPP_TOK_EWARNPRINT:  Error while printing a warning */
#if TPP_HAVE_LEXER_SEEKPP_RPAREN_EX
#define tpp_lexer_seekpp_rparen(self, p_argv, p_argc, p_rollback_pos, opt_function_name_for_messages, flags) \
	tpp_lexer_seekpp_rparen_ex(self, p_argv, p_argc, p_rollback_pos, opt_function_name_for_messages, flags, TPP_TOK_LPAREN)
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_token_id TPPCALL
tpp_lexer_seekpp_rparen_ex(tpp_lexer *tpp_restrict self,
                           tpp_lexer_arginfo *tpp_restrict p_argv,
                           tpp_size *tpp_restrict p_argc,
                           tpp_char const **p_rollback_pos,
                           char const *opt_function_name_for_messages,
                           unsigned int flags,
                           tpp_token_id lparen_kind);
#else /* TPP_HAVE_LEXER_SEEKPP_RPAREN_EX */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 4)) tpp_token_id TPPCALL
tpp_lexer_seekpp_rparen(tpp_lexer *tpp_restrict self,
                        tpp_lexer_arginfo *tpp_restrict p_argv,
                        tpp_size *tpp_restrict p_argc,
                        tpp_char const **p_rollback_pos,
                        char const *opt_function_name_for_messages,
                        unsigned int flags);
#endif /* !TPP_HAVE_LEXER_SEEKPP_RPAREN_EX */

/* Same as above, but always initializes *exactly* "argc" arguments,
 * and automatically emits "TPP_W_TOO_FEW_ARGUMENTS" when fewer were
 * parsed. */
#if TPP_HAVE_LEXER_SEEKPP_RPAREN_EX
#define tpp_lexer_seekpp_rparen_exact(self, p_argv, argc, opt_function_name_for_messages, flags) \
	tpp_lexer_seekpp_rparen_exact_ex(self, p_argv, argc, opt_function_name_for_messages, flags, TPP_TOK_LPAREN)
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_seekpp_rparen_exact_ex(tpp_lexer *tpp_restrict self,
                                 tpp_lexer_arginfo *tpp_restrict p_argv, tpp_size argc,
                                 char const *opt_function_name_for_messages,
                                 unsigned int flags, tpp_token_id lparen_kind);
#else /* TPP_HAVE_LEXER_SEEKPP_RPAREN_EX */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_token_id TPPCALL
tpp_lexer_seekpp_rparen_exact(tpp_lexer *tpp_restrict self,
                              tpp_lexer_arginfo *tpp_restrict p_argv, tpp_size argc,
                              char const *opt_function_name_for_messages,
                              unsigned int flags);
#endif /* !TPP_HAVE_LEXER_SEEKPP_RPAREN_EX */
#endif /* TPP_HAVE_LEXER_SEEKPP_RPAREN */





#if TPP_HAVE_KEYWORD_FLAGS
/* Return the effective set of flags for a given "kwd"
 * Since the effective flags for (certain) builtin keywords
 * can depend on active extensions/features, this can only
 * be done in the context of a specific lexer (rather than
 * stand-alone using only the "kwd")
 *
 * @return: * : Set of `TPP_KEYWORD_FLAG_*' */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_keyword_flags TPPCALL
tpp_lexer_getkeywordflags(tpp_lexer *tpp_restrict self,
                          tpp_keyword const *tpp_restrict kwd);
#endif /* TPP_HAVE_KEYWORD_FLAGS */

#if TPP_HAVE_LEXER_GETKEYWORDDEFINED
/* Returns true if "kwd" should be considered to be "#if defined()"
 * Since "builtin" keywords can be considered to be "defined", even
 * when `kwd->tk_macro == NULL', this function is needed to handle
 * such macros. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) bool TPPCALL
tpp_lexer_getkeyworddefined(tpp_lexer *tpp_restrict self,
                            tpp_keyword const *tpp_restrict kwd);
#elif TPP_HAVE_CPP_MACROS
#define tpp_lexer_getkeyworddefined(self, kwd) tpp_keyword_canundef(kwd)
#else /* ... */
#define tpp_lexer_getkeyworddefined(self, kwd) 0
#endif /* !... */


#if TPP_HAVE_LEXER_DECODEINT
/* Decode the current token (which should be `TPP_TOK_ISNUMBER`) into an integer
 * When the current token is `TPP_TOK_ISFLOAT`, it will be trimmed (i.e. decimal
 * and exponents will be removed from the token, such that the characters that
 * make up those parts of the token will be yielded next)
 *
 * @param: p_suffix_start: When non-NULL, store a pointer to the first character
 *                         of the int token's suffix (e.g. "ull" in "123ull").
 *                         Note that when `TPP_HAVE_BSE` is enabled, you will
 *                         have to skip over \-sequences yourself. However, TPP
 *                         will ensure that pointer written here points *after*
 *                         a potential BSE between the int and the suffix. The
 *                         suffix always ends at `tpp_lexer_gettokenend(self)',
 *                         and if there is no suffix, this function will store
 *                         a pointer to `tpp_lexer_gettokenend(self)' instead.
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Lexer error happened
 * @return: TPP_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_decodeint_ex(tpp_lexer *tpp_restrict self,
                       tpp_intmax *tpp_restrict result,
                       tpp_char const **p_suffix_start);
#define tpp_lexer_decodeint(self, result) \
	tpp_lexer_decodeint_ex(self, result, NULL)
#endif /* TPP_HAVE_LEXER_DECODEINT */

/* Decode the current token (which should be TPP_TOK_ISINT) into an integer
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Lexer error happened
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EWARNPRINT: Error while printing a warning */
#if TPP_HAVE_LEXER_DECODEINT_EXPR
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_decodeint_expr(tpp_lexer *tpp_restrict self,
                         tpp_expr_value *tpp_restrict result);
#endif /* TPP_HAVE_LEXER_DECODEINT_EXPR */


#if TPP_HAVE_LEXER_DECODEFLOAT
/* Decode the current token (which should be `TPP_TOK_ISNUMBER`) into a float.
 * When the current token is `TPP_TOK_ISINT`, it will be parsed as integer
 * first, and that integer will be converted into the equivalent `tpp_float`.
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Lexer error happened
 * @return: TPP_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_decodefloat_ex(tpp_lexer *tpp_restrict self,
                         tpp_float *tpp_restrict result,
                         tpp_char const **p_suffix_start);
#define tpp_lexer_decodefloat(self, result) \
	tpp_lexer_decodefloat_ex(self, result, NULL)
#endif /* TPP_HAVE_LEXER_DECODEFLOAT */

/* Decode the current token (which should be TPP_TOK_ISFLOAT) into a float
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Lexer error happened
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EWARNPRINT: Error while printing a warning */
#if TPP_HAVE_LEXER_DECODEFLOAT_EXPR
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_decodefloat_expr(tpp_lexer *tpp_restrict self,
                           tpp_expr_value *tpp_restrict result);
#endif /* TPP_HAVE_LEXER_DECODEFLOAT_EXPR */





#if TPP_HAVE_LEXER_DECODESTRING
typedef struct tpp_lexer_decodestring_config {
	tpp_formatprinter   tldsc_dataprinter; /* [1..1] Printer for 1-byte-per-character data.
	                                        * When output format has multiple bytes per character,
	                                        * every byte passed to this printer must result in 1
	                                        * character being appended to the output string:
	                                        * Input: `"foo"`
	                                        * -> `tldsc_dataprinter("foo")`
	                                        * -> `XCHAR[3]{ 0x66, 0x6f, 0x6f }`
	                                        *
	                                        * Input: `"\x12"`
	                                        * -> `tldsc_dataprinter("\x12")`
	                                        * -> `XCHAR[1]{ 0x12 }`
	                                        *
	                                        * If the input file is `!tpp_file_isutf8`, then this printer
	                                        * is also used for non-ASCII bytes. However, in this case any
	                                        * such non-ascii byte shouldn't be considered part of any sort
	                                        * of unicode sequence either, so that's intended:
	                                        * Input: `"Stra[C3,9F]e"`
	                                        * -> tldsc_dataprinter("Stra\xC3\x{9F}e")
	                                        * -> `XCHAR[7]{ 0x53, 0x74, 0x72, 0x61, 0xc3, 0x9f, 0x65 }`
	                                        */
#if TPP_HAVE_UNICODE
	tpp_formatprinter   tldsc_utf8printer; /* [1..1] Printer for utf-8 formatted input data.
	                                        * Very similar to `tldsc_dataprinter`, especially in that
	                                        * ASCII data may either be passed to `tldsc_dataprinter` or
	                                        * this callback (behavior in both cases must be the same),
	                                        * except that whereas `tldsc_dataprinter` must add 1 character
	                                        * to the output string for every byte in the given data-buffer,
	                                        * this function treats bytes in range [0x80,0xff] special, in
	                                        * that it must treat such bytes as initiating a utf-8 character
	                                        * sequences that may span multiple bytes.
	                                        *
	                                        * How exactly such a multi-byte utf-8 sequence is then encoded
	                                        * in the actual output string (i.e. in terms of `XCHAR`s) is
	                                        * not mandated, and is left up to the implementation. However,
	                                        * here are some suggestions:
	                                        * -> `tldsc_utf8printer("\xC3\x9F")`
	                                        *    -> `XCHAR[2]{ 0xC3, 0x9F }`  (Keep utf-8 encoding in output)
	                                        *    -> `XCHAR[1]{ 0x00DF }`      (Use UCS2 encoding in output)
	                                        *
	                                        * This printer is *always* for the following 2 cases:
	                                        * - Input: "Straße"    (when `tpp_file_isutf8()` and a non-ASCII sequence is encountered)
	                                        * - Input: "\u00DF"    (here, `tldsc_utf8printer("\xC3\x9F")` is called with the utf-8 representation)
	                                        *
	                                        * The implementation is however also allowed to use this callback
	                                        * for ASCII-only input data! */
#endif /* TPP_HAVE_UNICODE */
#if TPP_HAVE_STRING_ESCAPE_BIGCHAR
	tpp_ssize (TPPCALL *tldsc_bigprinter)(void *arg, tpp_lexer *tpp_restrict lexer, tpp_uintmax value);
	                                     /* [0..1] Printer for [2+]-byte-per-character data. When non-NULL,
	                                      * and `\x1234` is used, this printer is called with `0x1234` as
	                                      * value, and it should append `XCHAR[1]{0x1234}` to the output
	                                      * string. If the given `value` is too large to fit `XCHAR`, then
	                                      * this callback should emit a warning:
	                                      * >> tpp_errno error = tpp_lexer_warnf(lexer, TPP_W_CHARACTER_TOO_LARGE);
	                                      * >> return TPP_SSIZE_ASERR_OR_EOK(error); */
#endif /* TPP_HAVE_STRING_ESCAPE_BIGCHAR */
	void               *tldsc_arg;       /* [?..?] Cookie argument for other printers */
} tpp_lexer_decodestring_config;

/* Initialize a simple decodestring configuration (suitable for emitting utf-8 data) */
#define tpp_lexer_decodestring_config_init_simple(self, printer, arg)    \
	(_tpp_lexer_decodestring_config_init_simple_base(self, printer, arg) \
	 _tpp_lexer_decodestring_config_init_simple_big(self))
#if TPP_HAVE_UNICODE
#define _tpp_lexer_decodestring_config_init_simple_base(self, printer, arg) \
	(self)->tldsc_dataprinter = (self)->tldsc_utf8printer = (printer),      \
	(self)->tldsc_arg = (arg)
#else /* TPP_HAVE_UNICODE */
#define _tpp_lexer_decodestring_config_init_simple_base(self, printer, arg) \
	(self)->tldsc_dataprinter = (printer),                                  \
	(self)->tldsc_arg = (arg)
#endif /* !TPP_HAVE_UNICODE */
#if TPP_HAVE_STRING_ESCAPE_BIGCHAR
#define _tpp_lexer_decodestring_config_init_simple_big(self) , (self)->tldsc_bigprinter = NULL
#else /* TPP_HAVE_STRING_ESCAPE_BIGCHAR */
#define _tpp_lexer_decodestring_config_init_simple_big(self) /* nothing */
#endif /* !TPP_HAVE_STRING_ESCAPE_BIGCHAR */

/* Print the unescaped representation of the string-token described by "self"
 * The caller must ensure that `TPP_TOK_ISSTRING(tpp_lexer_gettoken(self)->tt_id)'
 *
 * @param: config: Printer configuration
 * @return: * :  Sum of positive return values from printers
 * @return: < 0: First negative return value from printers
 * @return: TPP_SSIZE_OFERR(TPP_ELEXERROR):  Either one of the printers returned this value, or
 *                                           a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_SSIZE_OFERR(TPP_ENOMEM):     Out of memory  (can only happen inside of `tpp_lexer_warnf()')
 * @return: TPP_SSIZE_OFERR(TPP_EWARNPRINT): Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_lexer_decodestring(tpp_lexer *tpp_restrict self,
                       tpp_lexer_decodestring_config const *tpp_restrict config);

/* Flags for `tpp_lexer_parsestring()' & friends. */
#define TPP_LEXER_PARSESTRING_FLAG_NORMAL      0x0000 /* Normal flags */
#if TPP_HAVE_STRING_AUTO_CONCAT
#define TPP_LEXER_PARSESTRING_FLAG_STOPONSPACE 0x0001 /* Stop if a NOLINE-COMMENT or SPACE token is hit */
#define TPP_LEXER_PARSESTRING_FLAG_STOPONLF    0x0002 /* Stop if a LINE-COMMENT or LF token is hit */
#endif /* TPP_HAVE_STRING_AUTO_CONCAT */
#if TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS
#define TPP_LEXER_PARSESTRING_FLAG_ALLOWTEMPS  0x0004 /* For "tpp_lexer_parsestring_cb()" only: allow "cb" to be called with a stack-allocated
                                                       * buffers (and a valid, but unrelated, possibly NULL "chunk" argument) when decoding a
                                                       * string like "\xFF". When this flag it's set, TPP will be forced to allocate a fresh
                                                       * heap-tpp_string for such tokens, which will be passed to "cb" instead.
                                                       *
                                                       * This flag may be set to speed up callbacks that don't "tpp_string_incref()" the given
                                                       * "chunk" argument, but is otherwise optional. */
#else /* TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS */
#define TPP_LEXER_PARSESTRING_FLAG_ALLOWTEMPS  0x0000 /* No-op */
#endif /* !TPP_HAVE_LEXER_PARSESTRING_FLAG_ALLOWTEMPS */

/* Same as "tpp_lexer_decodestring()", but also "tpp_lexer_yield()" to the next token.
 * Then, if that token is also string-like (TPP_TOK_ISSTRING()), decode it also,
 * then yield again, and so on, until a non-string-like token is encountered, an
 * error happens, or one of the printers returned a negative value.
 *
 * HINT: This function automatically handles "TPP_EWOULDBLOCK" during
 *       yield by trying again with TPP_FILE_FLAGS_NONBLOCK disabled.
 *
 * @param: flags: Set of `TPP_LEXER_PARSESTRING_FLAG_*'
 *
 * @return: * :  Sum of positive return values from printers
 * @return: < 0: First negative return value from printers
 * @return: TPP_SSIZE_OFERR(TPP_ELEXERROR):  Either one of the printers returned this value, or
 *                                           a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_SSIZE_OFERR(TPP_ENOMEM):     Out of memory
 * @return: TPP_SSIZE_OFERR(TPP_EIO):        I/O error while yielding to next token
 * @return: TPP_SSIZE_OFERR(TPP_EWARNPRINT): Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_lexer_parsestring_ex(tpp_lexer *tpp_restrict self,
                         tpp_lexer_decodestring_config const *tpp_restrict config,
                         unsigned int flags);

/* Convenience wrapper around `tpp_lexer_parsestring_ex()'
 * On success (!TPP_ISERR(return)), caller must "tpp_string_decref(*p_result)"
 *
 * @param: flags: Set of `TPP_LEXER_PARSESTRING_FLAG_*'
 *
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Either one of the printers returned this value, or
 *                          a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EIO:        I/O error while yielding to next token
 * @return: TPP_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_parsestring(tpp_lexer *tpp_restrict self,
                      /*out*/ TPP_REF tpp_string **tpp_restrict p_result,
                      unsigned int flags);

/* Wrapper around `tpp_lexer_parsestring()' that passes the actual string data
 * to a given callback. This function also enables some (optional) optimizations
 * for the most common case where the string token in "self" isn't followed by
 * another string token, and can be printed as a singular chunk. When this is
 * the case, no intermediate heap-buffer needs to be created, as "cb" can just
 * be invoked using the currently loaded file's content-buffer.
 *
 * @param: cb.arg:   Cookie argument (s.a. `arg')
 * @param: cb.chunk: The string-chunk containing "str" (or "NULL" if "str" is statically allocated)
 *                   NOTE: May be non-NULL, even if "str" is statically allocated!
 * @param: flags:    Set of `TPP_LEXER_PARSESTRING_FLAG_*'
 *
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Either one of the printers returned this value, or
 *                          a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EIO:        I/O error while yielding to next token
 * @return: TPP_EWARNPRINT: Error while printing a warning
 * @return: * :             Return value of given "cb" */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_parsestring_cb(tpp_lexer *self,
                         tpp_errno (TPPCALL *cb)(void *arg, tpp_string *chunk,
                                                 tpp_char const *str, tpp_size length),
                         void *arg, unsigned int flags);

#if TPP_HAVE_LEXER_PARSECHARACTER_LITERAL
/* Convenience wrapper to parse a character integer literal
 *
 * @param: flags: Set of `TPP_LEXER_PARSESTRING_FLAG_*'
 *
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Either one of the printers returned this value, or
 *                          a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EIO:        I/O error while yielding to next token
 * @return: TPP_EWARNPRINT: Error while printing a warning */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_parsecharacter_literal(tpp_lexer *tpp_restrict self,
                                 /*out*/ tpp_intmax *tpp_restrict p_result,
                                 unsigned int flags);
#endif /* TPP_HAVE_LEXER_PARSECHARACTER_LITERAL */
#endif /* TPP_HAVE_LEXER_DECODESTRING */

#undef TPP_HAVE_BUILTIN_LEXER_PARSESTRING_EXPR
#if TPP_HAVE_LEXER_PARSESTRING_EXPR
/* Convenience wrapper around `tpp_lexer_parsestring()'
 * On success (!TPP_ISERR(return)), caller must "tpp_expr_value_fini(result)"
 *
 * @param: flags: Set of `TPP_LEXER_PARSESTRING_FLAG_*'
 *
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Either one of the printers returned this value, or
 *                          a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EIO:        I/O error while yielding to next token
 * @return: TPP_EWARNPRINT: Error while printing a warning */
#ifndef tpp_lexer_parsestring_expr
#define tpp_lexer_parsestring_expr tpp_lexer_parsestring_expr
#define TPP_HAVE_BUILTIN_LEXER_PARSESTRING_EXPR 1
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_parsestring_expr(tpp_lexer *tpp_restrict self,
                           /*out*/ tpp_expr_value *tpp_restrict result,
                           unsigned int flags);
#endif /* !tpp_lexer_parsestring_expr */
#endif /* TPP_HAVE_LEXER_PARSESTRING_EXPR */
#ifndef TPP_HAVE_BUILTIN_LEXER_PARSESTRING_EXPR
#define TPP_HAVE_BUILTIN_LEXER_PARSESTRING_EXPR 0
#endif /* !TPP_HAVE_BUILTIN_LEXER_PARSESTRING_EXPR */



#undef TPP_HAVE_BUILTIN_LEXER_PARSECHARACTER_EXPR
#if TPP_HAVE_LEXER_PARSECHARACTER_EXPR
/* Convenience wrapper around `tpp_lexer_parsecharacter()'
 * On success (!TPP_ISERR(return)), caller must "tpp_expr_value_fini(result)"
 *
 * @param: flags: Set of `TPP_LEXER_PARSECHARACTER_FLAG_*'
 *
 * @return: TPP_EOK:        Success
 * @return: TPP_ELEXERROR:  Either one of the printers returned this value, or
 *                          a lexer error happened (s.a. `tpp_lexer_warnf()').
 * @return: TPP_ENOMEM:     Out of memory
 * @return: TPP_EIO:        I/O error while yielding to next token
 * @return: TPP_EWARNPRINT: Error while printing a warning */
#ifndef tpp_lexer_parsecharacter_expr
#define tpp_lexer_parsecharacter_expr tpp_lexer_parsecharacter_expr
#define TPP_HAVE_BUILTIN_LEXER_PARSECHARACTER_EXPR 1
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2)) tpp_errno TPPCALL
tpp_lexer_parsecharacter_expr(tpp_lexer *tpp_restrict self,
                              /*out*/ tpp_expr_value *tpp_restrict result,
                              unsigned int flags);
#endif /* !tpp_lexer_parsecharacter_expr */
#endif /* TPP_HAVE_LEXER_PARSECHARACTER_EXPR */
#ifndef TPP_HAVE_BUILTIN_LEXER_PARSECHARACTER_EXPR
#define TPP_HAVE_BUILTIN_LEXER_PARSECHARACTER_EXPR 0
#endif /* !TPP_HAVE_BUILTIN_LEXER_PARSECHARACTER_EXPR */



#if TPP_HAVE_WARNINGS
typedef struct tpp_lexer_printf_info {
	tpp_file       *tlpfi_file;     /* [0..1] Current file (source for filename, and basis for "tlpfi_pos") */
	tpp_char const *tlpfi_pos;      /* [0..1][valid_if(tlpfi_file != NULL)] Current position in "tlpfi_file" */
	char const     *tlpfi_filename; /* [0..1] Filename used by "%Pf", or "NULL" if "tlpfi_file" must be used */
	tpp_lcinfo      tlpfi_lc;       /* L/C info to use, or "TPP_LCINFO_INVALID" if "tlpfi_pos" must be used */
} tpp_lexer_printf_info;

#define tpp_lexer_printf_info_init_at(self, file, pos) \
	(void)((self)->tlpfi_file     = (file),            \
	       (self)->tlpfi_pos      = (pos),             \
	       (self)->tlpfi_filename = NULL,              \
	       tpp_lcinfo_init_invalid((self)->tlpfi_lc))
#define tpp_lexer_printf_info_init_lc(self, filename, lc) \
	(void)((self)->tlpfi_file     = NULL,                 \
	       (self)->tlpfi_filename = (filename),           \
	       (self)->tlpfi_lc       = (lc))

/* Interpret + print a warning-message "format" string.
 * The following %-encoded escape sequences are recognized:
 * - "%["    Start quoting text
 * - "%]"    Stop quoting text
 * - "%Pl"   1-based line described by "info"
 * - "%Pc"   1-based column described by "info"
 * - "%Pf"   Filename described by "info"
 * - "%Pt"   "%[current-token%]"   (based on tpp_lexer_gettoken(self))
 * - "%s"    As defined by stdc, using va_arg(args, char *)
 * - "%.*s"  As defined by stdc, using va_arg(args, int) + va_arg(args, char *)
 * - "%.Ns"  As defined by stdc, using va_arg(args, char *)
 * - "%.NPt" "%[<N bytes starting at "info->tlpfi_pos">%]"   (clamped if too big)
 * - "%d"    As defined by stdc, using va_arg(args, int)
 * - "%u"    As defined by stdc, using va_arg(args, unsigned int)
 * - "%c"    As defined by stdc, using va_arg(args, int)
 * - "%%"    "%" (emit a singular %-character)
 *
 * @param: info:    Information for special format descriptors
 *                  (unpopulated parts may be populated lazily)
 * @param: printer: Output printer for formatted text
 * @param: arg:     Cookie argument for "printer"
 * @param: format:  Format pattern (see above)
 * @param: args:    Extra varargs-arguments for "format"
 * @return: >= 0:   Sum of return values of "printer".
 * @return: < 0:    First negative return value of "printer". The more high-level
 *                  "tpp_lexer_warnf" API returns "TPP_EWARNPRINT" in this case. */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 5)) tpp_ssize TPPVCALL
tpp_lexer_printf_warning(tpp_lexer const *self, tpp_lexer_printf_info *info,
                         tpp_formatprinter printer, void *arg,
                         char const *format, ...);
TPP_DECL TPP_WUNUSED TPP_NONNULL((1, 2, 3, 5)) tpp_ssize TPPCALL
tpp_lexer_vprintf_warning(tpp_lexer const *self, tpp_lexer_printf_info *info,
                          tpp_formatprinter printer, void *arg,
                          char const *format, va_list args);

/* Print the actual warning message (and only the message, including
 * its trailing linefeed) to "printer". When "id" uses `TPP_WARNING_EX`,
 * the warning's printer callback is invoked with the relevant parameters
 *
 * @return: TPP_EOK:        Success (sum of return values of `printer' is stored in
 *                          `*p_printer_result', assuming that `p_printer_result != NULL')
 * @return: TPP_EWARNPRINT: An invocation of `*printer' returned a negative value
 *                          (that value was stored in `*p_printer_result', assuming
 *                          that `p_printer_result != NULL')
 * @return: TPP_ENOMEM:     A `TPP_WARNING_EX` returned with this error
 * @return: TPP_EIO:        A `TPP_WARNING_EX` returned with this error
 * @return: TPP_ELEXERROR:  A `TPP_WARNING_EX` returned with this error */
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_vwarnf_mesg(tpp_lexer *tpp_restrict self,
                      tpp_lexer_printf_info *tpp_restrict info,
                      tpp_formatprinter printer, void *arg,
                      tpp_warning_id id, va_list args,
                      /*0..1*/ tpp_ssize *p_printer_result);

/* Emits the specified lexer warning at the start of the current token.
 * @param: args: Format arguments specific to "id" (see '%'-sequences in warning expressions)
 * @return: TPP_EOK:        Warning was emitted, but you may proceed
 * @return: TPP_ELEXERROR:  Warning was emitted, but was configured as an error
 * @return: TPP_EWARNPRINT: Error while printing warning */
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_vwarnf(tpp_lexer *tpp_restrict self, tpp_warning_id id, va_list args);
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPVCALL
tpp_lexer_warnf(tpp_lexer *tpp_restrict self, tpp_warning_id id, ...);
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_vwarnf_at(tpp_lexer *tpp_restrict self, tpp_file *file,
                    tpp_char const *pos, tpp_warning_id id, va_list args);
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPVCALL
tpp_lexer_warnf_at(tpp_lexer *tpp_restrict self, tpp_file *file,
                   tpp_char const *pos, tpp_warning_id id, ...);
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_vwarnf_lc(tpp_lexer *tpp_restrict self, char const *filename,
                    tpp_lcinfo lc, tpp_warning_id id, va_list args);
TPP_DECL TPP_COLDCALL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPVCALL
tpp_lexer_warnf_lc(tpp_lexer *tpp_restrict self, char const *filename,
                   tpp_lcinfo lc, tpp_warning_id id, ...);
#else /* TPP_HAVE_WARNINGS */
#define tpp_lexer_vwarnf(self, id, args)                  TPP_EOK
#define tpp_lexer_vwarnf_at(self, file, pos, id, args)    TPP_EOK
#define tpp_lexer_vwarnf_lc(self, filename, lc, id, args) TPP_EOK
#if TPP_HOST_HAVE_PP_VARARGS
#define tpp_lexer_warnf(self, id, ...)                    TPP_EOK
#define tpp_lexer_warnf_at(self, file, pos, id, ...)      TPP_EOK
#define tpp_lexer_warnf_lc(self, filename, lc, id, ...)   TPP_EOK
#else /* TPP_HOST_HAVE_PP_VARARGS */
TPP_INLINE TPP_COLDCALL tpp_errno TPPVCALL
tpp_lexer_warnf(tpp_lexer *tpp_restrict self, tpp_warning_id id, ...) {
	(void)self;
	(void)id;
	return TPP_EOK;
}

TPP_INLINE TPP_COLDCALL tpp_errno TPPVCALL
tpp_lexer_warnf_at(tpp_lexer *tpp_restrict self, tpp_file *file,
                   tpp_char const *pos, tpp_warning_id id, ...) {
	(void)self;
	(void)file;
	(void)pos;
	(void)id;
	return TPP_EOK;
}

TPP_INLINE TPP_COLDCALL tpp_errno TPPVCALL
tpp_lexer_warnf_at(tpp_lexer *tpp_restrict self, char const *filename,
                   tpp_lcinfo lc, tpp_warning_id id, ...) {
	(void)self;
	(void)filename;
	(void)lc;
	(void)id;
	return TPP_EOK;
}
#endif /* !TPP_HOST_HAVE_PP_VARARGS */
#endif /* !TPP_HAVE_WARNINGS */


/* Warn if the current file's #ifdef-stack is non-empty.
 * @return: * : See `tpp_lexer_warnf()' */
#if TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) tpp_errno TPPCALL
tpp_lexer_warn_nonempty_ifdef(tpp_lexer *tpp_restrict self);
#else /* TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF */
#define tpp_lexer_warn_nonempty_ifdef(self) TPP_EOK
#endif /* !TPP_HAVE_TPP_W_EOF_BEFORE_ENDIF */


/* Return the (canonical) string-representation of a given token ID */
#if TPP_HAVE_LEXER_REPRTOKENID
TPP_DECL TPP_WUNUSED TPP_NONNULL((1)) char const *TPPCALL
tpp_lexer_reprtokenid(tpp_lexer const *tpp_restrict self, tpp_token_id tok);
#endif /* TPP_HAVE_LEXER_REPRTOKENID */



/* Dump all user-defined macros and assertions to "printer"
 * @param: what: Set of `TPP_LEXER_DUMP_DEFINITIONS_*'
 * @return: * :  Sum of return values of "printer"
 * @return: < 0: First negative return value of "printer" */
#if TPP_HAVE_LEXER_DUMP_DEFINITIONS
TPP_DECL TPP_NONNULL((1, 2)) tpp_ssize TPPCALL
tpp_lexer_dump_definitions(tpp_lexer const *tpp_restrict self,
                           tpp_formatprinter printer, void *arg,
                           unsigned int what);
#if TPP_HAVE_CPP_MACROS
#define TPP_LEXER_DUMP_DEFINITIONS_MACROS     0x0001 /* #define foo bar */
#else /* TPP_HAVE_CPP_MACROS */
#define TPP_LEXER_DUMP_DEFINITIONS_MACROS     0x0000 /* no-op */
#endif /* !TPP_HAVE_CPP_MACROS */
#if TPP_HAVE_CPP_ASSERT
#define TPP_LEXER_DUMP_DEFINITIONS_ASSERTS    0x0002 /* #assert foo(bar) */
#else /* TPP_HAVE_CPP_ASSERT */
#define TPP_LEXER_DUMP_DEFINITIONS_ASSERTS    0x0000 /* no-op */
#endif /* !TPP_HAVE_CPP_ASSERT */
#if TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION
#define TPP_LEXER_DUMP_DEFINITIONS_EXTENSIONS 0x0004 /* #pragma TPP extension("-ffoo") // Where different from default */
#else /* TPP_HAVE_PRAGMA_EXTENSION || TPP_HAVE_PRAGMA_TPP_EXTENSION */
#define TPP_LEXER_DUMP_DEFINITIONS_EXTENSIONS 0x0000 /* no-op */
#endif /* !TPP_HAVE_PRAGMA_EXTENSION && !TPP_HAVE_PRAGMA_TPP_EXTENSION */
#if TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING
#define TPP_LEXER_DUMP_DEFINITIONS_WARNINGS   0x0008 /* #pragma TPP warning("-Wfoo") // Where different from default */
#else /* TPP_HAVE_PRAGMA_WARNING || TPP_HAVE_PRAGMA_TPP_WARNING */
#define TPP_LEXER_DUMP_DEFINITIONS_WARNINGS   0x0000 /* no-op */
#endif /* !TPP_HAVE_PRAGMA_WARNING && !TPP_HAVE_PRAGMA_TPP_WARNING */
#if TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH
#define TPP_LEXER_DUMP_DEFINITIONS_INCLUDES   0x0010 /* #pragma TPP include_path("/usr/include") */
#else /* TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH */
#define TPP_LEXER_DUMP_DEFINITIONS_INCLUDES   0x0000 /* no-op */
#endif /* !TPP_HAVE_PRAGMA_TPP_INCLUDE_PATH */
#define TPP_LEXER_DUMP_DEFINITIONS_ALL        0x0fff

#if TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED && (TPP_HAVE_CPP_MACROS || TPP_HAVE_CPP_ASSERT)
#define TPP_LEXER_DUMP_DEFINITIONS_SORTED     0x1000 /* Sort macros/assertion-keys based on their name's first appearance */
#else /* TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED && (TPP_HAVE_CPP_MACROS || TPP_HAVE_CPP_ASSERT) */
#define TPP_LEXER_DUMP_DEFINITIONS_SORTED     0x0000 /* no-op */
#endif /* !TPP_HAVE_LEXER_DUMP_DEFINITIONS_SORTED || (!TPP_HAVE_CPP_MACROS && !TPP_HAVE_CPP_ASSERT) */
#if TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO
#define TPP_LEXER_DUMP_DEFINITIONS_EXTRAINFO  0x8000 /* Include comments containing some extra info on macro definitions */
#else /* TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO */
#define TPP_LEXER_DUMP_DEFINITIONS_EXTRAINFO  0x0000 /* no-op */
#endif /* !TPP_HAVE_LEXER_DUMP_DEFINITIONS_EXTRAINFO */
#endif /* TPP_HAVE_LEXER_DUMP_DEFINITIONS */

TPP_DECL_END

#endif /* !TPP_DEFS */
#endif /* !GUARD_TPP_AMALGAMATION_H */
/* clang-format on */
