#ifndef __MCPU_CPP_MACRO_H__ #define __MCPU_CPP_MACRO_H__ 1 #include #include #include #define MCPU_CPP_MACRO_BUCKETS 257 #define MCPU_CPP_MACRO_EXPANSION_LIMIT 400 enum mcpu_macro_origin { MCPU_MACRO_ORIGIN_SOURCE = 0, MCPU_MACRO_ORIGIN_BUILTIN, MCPU_MACRO_ORIGIN_COMMAND_LINE }; enum mcpu_macro_builtin { MCPU_MACRO_BUILTIN_NONE = 0, MCPU_MACRO_BUILTIN_FILE, MCPU_MACRO_BUILTIN_LINE, MCPU_MACRO_BUILTIN_DATE, MCPU_MACRO_BUILTIN_TIME, MCPU_MACRO_BUILTIN_BASE_FILE, MCPU_MACRO_BUILTIN_INCLUDE_LEVEL, MCPU_MACRO_BUILTIN_REAL_MAX, MCPU_MACRO_BUILTIN_REAL_MIN, MCPU_MACRO_BUILTIN_REAL_EPSILON, MCPU_MACRO_BUILTIN_REAL_MAX_EXP, MCPU_MACRO_BUILTIN_REAL_MIN_EXP, MCPU_MACRO_BUILTIN_REAL_MAX_10_EXP, MCPU_MACRO_BUILTIN_REAL_MIN_10_EXP }; typedef struct mcpp_options mcpp_options; typedef struct mcpu_macro_expansion_context mcpu_macro_expansion_context; struct mcpu_macro_expansion_context { const char *filename; const char *base_filename; unsigned line_number; size_t include_level; const char *date; const char *time; const mcpp_options *options; }; typedef struct mcpu_macro mcpu_macro; struct mcpu_macro { __mpu_char16_t *name; size_t name_length; int nargs; int variadic; __mpu_char16_t **argnames; size_t *argname_lengths; __mpu_char16_t *replacement; size_t replacement_length; enum mcpu_macro_builtin builtin; enum mcpu_macro_origin origin; unsigned builtin_bits; int expanding; mcpu_macro *next; }; typedef struct mcpu_macro_table mcpu_macro_table; struct mcpu_macro_table { mcpu_macro *bucket[MCPU_CPP_MACRO_BUCKETS]; }; void mcpu_macro_table_init( mcpu_macro_table *table ); void mcpu_macro_table_free( mcpu_macro_table *table ); mcpu_macro *mcpu_macro_find( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length ); int mcpu_macro_define_object( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length, const __mpu_char16_t *replacement, size_t replacement_length, enum mcpu_macro_origin origin ); int mcpu_macro_define_builtin( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length, enum mcpu_macro_builtin builtin ); int mcpu_macro_define_sized_builtin( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length, enum mcpu_macro_builtin builtin, unsigned bits ); int mcpu_macro_define_function( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length, const __mpu_char16_t *const *argnames, const size_t *argname_lengths, size_t nargs, int variadic, const __mpu_char16_t *replacement, size_t replacement_length, enum mcpu_macro_origin origin ); int mcpu_macro_definition_equal( const mcpu_macro *macro, int nargs, int variadic, const __mpu_char16_t *const *argnames, const size_t *argname_lengths, const __mpu_char16_t *replacement, size_t replacement_length ); int mcpu_macro_undef( mcpu_macro_table *table, const __mpu_char16_t *name, size_t name_length ); int mcpu_macro_dump( const mcpu_macro_table *table, FILE *stream, int include_predefined ); int mcpu_macro_dump_text( const mcpu_macro_table *table, mcpu_text *output, const char *line_filename ); int mcpu_macro_expand( mcpu_macro_table *table, const __mpu_char16_t *input, size_t length, enum mcpu_language language, const mcpu_macro_expansion_context *context, mcpu_text *output ); #endif /* __MCPU_CPP_MACRO_H__ */