#ifndef CODEGEN_H #define CODEGEN_H #include "../aliases.h" #include "../mem_arena/arena.h" #include typedef enum { INCLUDE_TYPE_SYSTEM, INCLUDE_TYPE_USER, COUNT_INCLUDE_TYPES, } include_type; typedef struct { include_type type; const char *header; } include_header_t; typedef struct { const char *name; char short_name; char printf_spec; } type_info_t; typedef struct identifier_s identifier_t; typedef struct { const char *name; u64 mem_count; identifier_t *members; } struct_def_t; typedef enum { DATA_TYPE_NORMAL, DATA_TYPE_STRUCT, COUNT_DATA_TYPE, } data_type; typedef struct { data_type type; union { type_info_t type_info; struct_def_t struct_def; }; } data_type_t; struct identifier_s { data_type_t type; const char *name; }; typedef struct { data_type_t ret_type; const char *name; identifier_t *args; const char *body; } func_t; typedef struct { const char *base_name; u64 arg_count; const char **arg_names; func_t func; } func_data_t; void write_header_guard_open(arena_t *arena, FILE *fp, const char *header_id); void write_header_guard_close(arena_t *arena, FILE *fp, const char *header_id); void write_include(arena_t *arena, FILE *fp, const include_header_t *header); void write_data_type(char *dst, const data_type_t *data_type); void write_identifier(char *dst, const identifier_t *identifier); void write_struct(arena_t *arena, FILE *fp, const struct_def_t *struct_def); void write_func_prototype(char *dst, const func_data_t *func); void write_func_declaration(arena_t *arena, FILE *fp, const func_data_t *func); void write_func_defintion(arena_t *arena, FILE *fp, const func_data_t *func); void write_macro_func(arena_t *arena, FILE *fp, const func_data_t *func); #endif // !CODEGEN_H