c-metprogramming-exploration/04_codegen/codegen.h

78 lines
1.7 KiB
C

#ifndef CODEGEN_H
#define CODEGEN_H
#include "../aliases.h"
#include "../mem_arena/arena.h"
#include <stdio.h>
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