Improving multimedia, trying to add a single c library mode

This commit is contained in:
Krzosa Karol
2022-10-02 12:53:29 +02:00
parent 5baff3585e
commit e098663d82
9 changed files with 152 additions and 100 deletions

View File

@@ -63,7 +63,7 @@ get_ctype_name_for_type(Ast_Type *type){
switch(type->kind){
case TYPE_VOID: return "void";
case TYPE_BOOL: return "bool";
case TYPE_STRING: return "String";
case TYPE_STRING: return "CORE_String";
case TYPE_CHAR: return "char";
case TYPE_F32: return "float";
case TYPE_F64: return "double";
@@ -224,7 +224,7 @@ gen_value(Token *pos, Value a){
}break;
case TYPE_STRING:{
int length = 0;
gen("(String){(uint8_t *)\"");
gen("(CORE_String){(uint8_t *)\"");
for(int i = 0; i < a.intern_val.len; i++){
if(a.intern_val.str[i] == '\n'){length += 2; gen("\\n");}
else if(a.intern_val.str[i] == '\r'){length += 2; gen("\\r");}
@@ -789,10 +789,10 @@ compile_to_c_code(){
#define CORE_AssertMessage(x,...) CORE_Assert(x)
#define CORE_BufferSize(x) (sizeof(x)/sizeof((x)[0]))
typedef struct String{
typedef struct CORE_String{
uint8_t *str;
int64_t len;
}String;
}CORE_String;
static void
CORE_MemoryCopy(void *dst, void *src, size_t size){
@@ -873,55 +873,59 @@ CORE_MemoryCopy(void *dst, void *src, size_t size){
compiler_error(0, "Entry point is not defined! Try main or WinMain");
}
// Generate language.core
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
Ast_Decl *it = get(&pctx->ordered_decls, i);
genln("");
gen_ast(it);
}
// Generate type info
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
genln("Type_Info *type_infos = (Type_Info[]){");
global_indent++;
Iter(&pctx->all_types){
Ast_Type *t = it.item[0];
genln("{/*%Q*/.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type = %d, ", typestring(t),
(S32)t->kind, (S32)t->size, (S32)t->align, t->is_unsigned ? "true" : "false", t->type_id);
switch(t->kind){
case TYPE_POINTER:
case TYPE_SLICE: {
gen(".base_type = %d", t->base->type_id);
} break;
case TYPE_ARRAY: {
gen(".base_type = %d, ", t->base->type_id);
gen(".array_size = %d", t->arr.size);
}break;
case TYPE_LAMBDA: {
gen(".lambda_return = %d, ", t->func.ret->type_id);
gen(".lambda_argument_count = %d, ", t->func.args.len);
gen(".lambda_arguments = (Type_Info[%d]){", t->func.args.len);
For_Named(t->func.args, arg){
gen("{.type = %d}, ", arg->type_id);
}
gen("}");
} break;
case TYPE_STRUCT:{
gen(".struct_member_count = %d, ", t->agg.members.len);
gen(".struct_members = (Type_Info_Struct_Member[]){");
For_Named(t->agg.members, m){
gen("{.name = (String){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
}
gen("}");
}break;
default: {}
// invalid_default_case;
if(emit_type_info){
// Generate language.core
for(S32 i = 0; i < pctx->base_language_ordered_decl_len; i++){
Ast_Decl *it = get(&pctx->ordered_decls, i);
genln("");
gen_ast(it);
}
gen("},");
// Generate type info
genln("int64_t type_infos_len = %d;", length(&pctx->all_types));
genln("Type_Info *type_infos = (Type_Info[]){");
global_indent++;
Iter(&pctx->all_types){
Ast_Type *t = it.item[0];
genln("{/*%Q*/.kind = %d, .size = %d, .align = %d, .is_unsigned = %s, .type = %d, ", typestring(t),
(S32)t->kind, (S32)t->size, (S32)t->align, t->is_unsigned ? "true" : "false", t->type_id);
switch(t->kind){
case TYPE_POINTER:
case TYPE_SLICE: {
gen(".base_type = %d", t->base->type_id);
} break;
case TYPE_ARRAY: {
gen(".base_type = %d, ", t->base->type_id);
gen(".array_size = %d", t->arr.size);
}break;
case TYPE_LAMBDA: {
gen(".lambda_return = %d, ", t->func.ret->type_id);
gen(".lambda_argument_count = %d, ", t->func.args.len);
gen(".lambda_arguments = (Type_Info[%d]){", t->func.args.len);
For_Named(t->func.args, arg){
gen("{.type = %d}, ", arg->type_id);
}
gen("}");
} break;
case TYPE_STRUCT:{
gen(".struct_member_count = %d, ", t->agg.members.len);
gen(".struct_members = (Type_Info_Struct_Member[]){");
For_Named(t->agg.members, m){
gen("{.name = (CORE_String){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", m.name, m.name.len, m.type->type_id, m.offset);
}
gen("}");
}break;
default: {}
// invalid_default_case;
}
gen("},");
}
global_indent--;
gen("};");
}
global_indent--;
gen("};");
// Generate actual code
Iter(&pctx->ordered_decls){