/* Zeta API - Z/inspection/language.h ______ ______________ ___ |__ / | ___|___ ___|/ \ / /__| __| | | / - \ /______|_____| |__| /__/ \__\ Copyright (C) 2006-2025 Manuel Sainz de Baranda y Goñi. Released under the terms of the GNU Lesser General Public License v3. */ #ifndef Z_inspection_language_H #define Z_inspection_language_H #include #include #include #if defined(__OBJC__) || defined(__OBJC2__) # ifdef __cplusplus # include # define Z_LANGUAGE Z_LANGUAGE_OBJECTIVE_CPP # else # define Z_LANGUAGE Z_LANGUAGE_OBJECTIVE_C # endif #elif defined(__cplusplus) # include # define Z_LANGUAGE Z_LANGUAGE_CPP #else # define Z_LANGUAGE Z_LANGUAGE_C #endif #define Z_LANGUAGE_INCLUDES(LANGUAGE) \ ((Z_LANGUAGE & Z_LANGUAGE_##LANGUAGE) == Z_LANGUAGE_##LANGUAGE) #define Z_C_FLAG(FLAG) Z_IS_TRUE(FLAG) #if Z_LANGUAGE_INCLUDES(CPP) # define Z_CPP_FLAG(FLAG) Z_IS_TRUE(FLAG) #else # define Z_CPP_FLAG(FLAG) 0 #endif #if Z_LANGUAGE_INCLUDES(OBJECTIVE_C) # define Z_OBJECTIVE_C_FLAG(FLAG) Z_IS_TRUE(FLAG) #else # define Z_OBJECTIVE_C_FLAG(FLAG) 0 #endif #if defined(Z_USE_LANGUAGE_STD) || Z_COMPILER == Z_COMPILER_UNKNOWN # define Z_DIALECT_HAS(LANGUAGE, FEATURE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_##FEATURE) # define Z_DIALECT_HAS_ATTRIBUTE(LANGUAGE, ATTRIBUTE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_ATTRIBUTE_##ATTRIBUTE) # define Z_DIALECT_HAS_ESCAPE_SEQUENCE(LANGUAGE, ESCAPE_SEQUENCE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_ESCAPE_SEQUENCE_##ESCAPE_SEQUENCE) # define Z_DIALECT_HAS_IDENTIFIER(LANGUAGE, IDENTIFIER) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_IDENTIFIER_##IDENTIFIER) # define Z_DIALECT_HAS_LITERAL(LANGUAGE, LITERAL) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_LITERAL_##LITERAL) # define Z_DIALECT_HAS_OPERATOR(LANGUAGE, OPERATOR) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_OPERATOR_##OPERATOR) # define Z_DIALECT_HAS_OPERATOR_CASE(LANGUAGE, OPERATOR_CASE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_OPERATOR_CASE_##OPERATOR_CASE) # define Z_DIALECT_HAS_PREPROCESSOR_DIRECTIVE(LANGUAGE, PREPROCESSOR_DIRECTIVE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_PREPROCESSOR_DIRECTIVE_##PREPROCESSOR_DIRECTIVE) # define Z_DIALECT_HAS_PREPROCESSOR_IDENTIFIER(LANGUAGE, PREPROCESSOR_IDENTIFIER) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_PREPROCESSOR_IDENTIFIER_##PREPROCESSOR_IDENTIFIER) # define Z_DIALECT_HAS_PREPROCESSOR_OPERATOR(LANGUAGE, PREPROCESSOR_OPERATOR) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_PREPROCESSOR_OPERATOR_##PREPROCESSOR_OPERATOR) # define Z_DIALECT_HAS_SPECIFIER(LANGUAGE, SPECIFIER) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_SPECIFIER_##SPECIFIER) # define Z_DIALECT_HAS_SPECIFIER_CASE(LANGUAGE, SPECIFIER_CASE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_SPECIFIER_CASE_##SPECIFIER_CASE) # define Z_DIALECT_HAS_STD_PRAGMA(LANGUAGE, STD_PRAGMA) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_STD_PRAGMA_##STD_PRAGMA) # define Z_DIALECT_HAS_STORAGE_CLASS(LANGUAGE, STORAGE_CLASS) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_STORAGE_CLASS_##STORAGE_CLASS) # define Z_DIALECT_HAS_TYPE(LANGUAGE, TYPE) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_TYPE_##TYPE) # define Z_DIALECT_HAS_TYPE_MODIFIER(LANGUAGE, TYPE_MODIFIER) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_TYPE_MODIFIER_##TYPE_MODIFIER) # define Z_DIALECT_HAS_TYPE_QUALIFIER(LANGUAGE, TYPE_QUALIFIER) \ Z_IS_TRUE(Z_COMPILER_HAS_##LANGUAGE##_TYPE_QUALIFIER_##TYPE_QUALIFIER) #elif defined(Z_USE_SUPPORTED_LANGUAGE_STD) # define Z_DIALECT_HAS(LANGUAGE, FEATURE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_##FEATURE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_##FEATURE)) # define Z_DIALECT_HAS_ATTRIBUTE(LANGUAGE, ATTRIBUTE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_ATTRIBUTE_##ATTRIBUTE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_ATTRIBUTE_##ATTRIBUTE)) # define Z_DIALECT_HAS_ESCAPE_SEQUENCE(LANGUAGE, ESCAPE_SEQUENCE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_ESCAPE_SEQUENCE_##ESCAPE_SEQUENCE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_ESCAPE_SEQUENCE_##ESCAPE_SEQUENCE)) # define Z_DIALECT_HAS_IDENTIFIER(LANGUAGE, IDENTIFIER) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_IDENTIFIER_##IDENTIFIER) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_IDENTIFIER_##IDENTIFIER)) # define Z_DIALECT_HAS_LITERAL(LANGUAGE, LITERAL) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_LITERAL_##LITERAL) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_LITERAL_##LITERAL)) # define Z_DIALECT_HAS_OPERATOR(LANGUAGE, OPERATOR) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_OPERATOR_##OPERATOR) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_OPERATOR_##OPERATOR)) # define Z_DIALECT_HAS_OPERATOR_CASE(LANGUAGE, OPERATOR, CASE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_OPERATOR_CASE_##OPERATOR##_##CASE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_OPERATOR_CASE_##OPERATOR##_##CASE)) # define Z_DIALECT_HAS_PREPROCESSOR_DIRECTIVE(LANGUAGE, PREPROCESSOR_DIRECTIVE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_PREPROCESSOR_DIRECTIVE_##PREPROCESSOR_DIRECTIVE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_PREPROCESSOR_DIRECTIVE_##PREPROCESSOR_DIRECTIVE)) # define Z_DIALECT_HAS_PREPROCESSOR_IDENTIFIER(LANGUAGE, PREPROCESSOR_IDENTIFIER) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_PREPROCESSOR_IDENTIFIER_##PREPROCESSOR_IDENTIFIER) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_PREPROCESSOR_IDENTIFIER_##PREPROCESSOR_IDENTIFIER)) # define Z_DIALECT_HAS_PREPROCESSOR_OPERATOR(LANGUAGE, PREPROCESSOR_OPERATOR) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_PREPROCESSOR_OPERATOR_##PREPROCESSOR_OPERATOR) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_PREPROCESSOR_OPERATOR_##PREPROCESSOR_OPERATOR)) # define Z_DIALECT_HAS_SPECIFIER(LANGUAGE, SPECIFIER) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_SPECIFIER_##SPECIFIER) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_SPECIFIER_##SPECIFIER)) # define Z_DIALECT_HAS_SPECIFIER_CASE(LANGUAGE, SPECIFIER, CASE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_SPECIFIER_CASE_##SPECIFIER##_##CASE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_SPECIFIER_CASE_##SPECIFIER##_##CASE)) # define Z_DIALECT_HAS_STD_PRAGMA(LANGUAGE, STD_PRAGMA) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_STD_PRAGMA_##STD_PRAGMA) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_STD_PRAGMA_##STD_PRAGMA)) # define Z_DIALECT_HAS_STORAGE_CLASS(LANGUAGE, STORAGE_CLASS) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_STORAGE_CLASS_##STORAGE_CLASS) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_STORAGE_CLASS_##STORAGE_CLASS)) # define Z_DIALECT_HAS_TYPE(LANGUAGE, TYPE) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_TYPE_##TYPE) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_TYPE_##TYPE)) # define Z_DIALECT_HAS_TYPE_MODIFIER(LANGUAGE, TYPE_MODIFIER) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_TYPE_MODIFIER_##TYPE_MODIFIER) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_TYPE_MODIFIER_##TYPE_MODIFIER)) # define Z_DIALECT_HAS_TYPE_QUALIFIER(LANGUAGE, TYPE_QUALIFIER) ( \ Z_##LANGUAGE##_FLAG(Z_##LANGUAGE##_HAS_TYPE_QUALIFIER_##TYPE_QUALIFIER) && \ Z_##LANGUAGE##_FLAG(Z_COMPILER_##LANGUAGE##_HAS_TYPE_QUALIFIER_##TYPE_QUALIFIER)) #else # define Z_DIALECT_HAS Z_COMPILER_DIALECT_HAS # define Z_DIALECT_HAS_ATTRIBUTE Z_COMPILER_DIALECT_HAS_ATTRIBUTE # define Z_DIALECT_HAS_ESCAPE_SEQUENCE Z_COMPILER_DIALECT_HAS_ESCAPE_SEQUENCE # define Z_DIALECT_HAS_IDENTIFIER Z_COMPILER_DIALECT_HAS_IDENTIFIER # define Z_DIALECT_HAS_LITERAL Z_COMPILER_DIALECT_HAS_LITERAL # define Z_DIALECT_HAS_OPERATOR Z_COMPILER_DIALECT_HAS_OPERATOR # define Z_DIALECT_HAS_OPERATOR_CASE Z_COMPILER_DIALECT_HAS_OPERATOR_CASE # define Z_DIALECT_HAS_PREPROCESSOR_DIRECTIVE Z_COMPILER_DIALECT_HAS_PREPROCESSOR_DIRECTIVE # define Z_DIALECT_HAS_PREPROCESSOR_IDENTIFIER Z_COMPILER_DIALECT_HAS_PREPROCESSOR_IDENTIFIER # define Z_DIALECT_HAS_PREPROCESSOR_OPERATOR Z_COMPILER_DIALECT_HAS_PREPROCESSOR_OPERATOR # define Z_DIALECT_HAS_SPECIFIER Z_COMPILER_DIALECT_HAS_SPECIFIER # define Z_DIALECT_HAS_SPECIFIER_CASE Z_COMPILER_DIALECT_HAS_SPECIFIER_CASE # define Z_DIALECT_HAS_STD_PRAGMA Z_COMPILER_DIALECT_HAS_STD_PRAGMA # define Z_DIALECT_HAS_STORAGE_CLASS Z_COMPILER_DIALECT_HAS_STORAGE_CLASS # define Z_DIALECT_HAS_TYPE Z_COMPILER_DIALECT_HAS_TYPE # define Z_DIALECT_HAS_TYPE_MODIFIER Z_COMPILER_DIALECT_HAS_TYPE_MODIFIER # define Z_DIALECT_HAS_TYPE_QUALIFIER Z_COMPILER_DIALECT_HAS_TYPE_QUALIFIER #endif #endif /* Z_inspection_language_H */