Compiling with MSVC, Using raylib! Cleanup

This commit is contained in:
Krzosa Karol
2023-04-05 21:49:05 +02:00
parent d7c96b0ebc
commit fb9c8728ea
14 changed files with 8864 additions and 143 deletions

View File

@@ -228,7 +228,7 @@ gen_value(Token *pos, Value a) {
default: {
if (is_string(type)) {
int length = 0;
gen("(%QString){(uint8_t *)\"", pctx->symbol_prefix);
gen("{(uint8_t *)\"");
for (int i = 0; i < a.intern_val.len; i++) {
if (a.intern_val.str[i] == '\n') {
length += 2;
@@ -328,7 +328,7 @@ gen_var(Ast_Decl *decl, B32 emit_value, B32 scope_names) {
gen(" = 0");
}
else {
gen(" = {}");
gen(" = {0}");
}
}
}
@@ -484,9 +484,12 @@ gen_expr(Ast_Expr *ast) {
}
CASE(COMPOUND, Call) {
gen("(");
gen_simple_decl(node->resolved_type);
gen(")");
bool is_global_variable = node->parent_scope->kind == AST_FILE;
if (!is_global_variable) {
gen("(");
gen_simple_decl(node->resolved_type);
gen(")");
}
gen("{");
// We need to double wrap it because Any is a pointer
@@ -530,8 +533,8 @@ gen_ast(Ast *ast) {
switch (ast->kind) {
CASE(RUNTIME_ASSERT, Builtin) {
if (node->assert_message.len == 0) gen("%QAssert", pctx->symbol_prefix);
else gen("%QAssertMessage", pctx->symbol_prefix);
if (node->assert_message.len == 0) gen("Assert");
else gen("AssertMessage");
gen("(");
gen_expr(node->expr);
if (node->assert_message.len) {
@@ -554,7 +557,7 @@ gen_ast(Ast *ast) {
// We cant assign to array in C so we need a special case
if (is_array(it->resolved_type)) {
genln("%QMemoryCopy(&%Q.m%d, ", pctx->symbol_prefix, tuple_name, i);
genln("MemoryCopy(&%Q.m%d, ", tuple_name, i);
gen_expr(it);
gen(", sizeof(%Q.m%d));", tuple_name, i);
}
@@ -650,12 +653,11 @@ gen_ast(Ast *ast) {
}
CASE(FOR, For) {
// Array iter
if (node->is_array_traversal) {
gen("for(int64_t _i%d = 0; _i%d < ", node->pos->line, node->pos->line);
if (is_array(node->cond->resolved_type)) {
gen("%QBufferSize(", pctx->symbol_prefix);
gen("BufferSize(");
gen_expr(node->cond);
gen(")");
}
@@ -792,7 +794,7 @@ gen_ast(Ast *ast) {
int i = 0;
For(node->vars) {
gen("%QMemoryCopy((void *)&%Q, (void *)&%Q.m%d, sizeof(%Q));", pctx->symbol_prefix, it->name, var_name, i++, it->name);
gen("MemoryCopy((void *)&%Q, (void *)&%Q.m%d, sizeof(%Q));", it->name, var_name, i++, it->name);
}
BREAK();
}
@@ -812,78 +814,7 @@ CORE_Static String
compile_to_c_code() {
pctx->time.code_generation = os_time();
#if 0
String core_stringify(Ast *);
For(pctx->ordered_decls) {
Ast *copy = ast_copy(it, 0);
String r = core_stringify(it);
printf("\n-----REAL!!!------\n");
printf("%s\n", r.str);
r = core_stringify(copy);
printf("\n-----COPY!!!------\n");
printf("%s\n", r.str);
}
pctx->gen.reset();
#endif
#if 0
int di = 0;
For(pctx->ordered_decls) {
for (Ast_Iter iter = iterate_depth_first(pctx->heap, it); iter.ast; next(&iter)) {
Ast_Decl *decl = (Ast_Decl *)iter.ast;
Ast *ast = iter.ast;
Ast_Atom *atom = (Ast_Atom *)iter.ast;
switch (iter.kind) {
case AST_STRUCT: {
genln("%Q :: struct", decl->name);
global_indent += 1;
} break;
case AST_STRUCT + AST_NODE_END: {
global_indent -= 1;
} break;
case AST_LAMBDA: {
Ast_Lambda *lambda = decl->lambda;
genln("%Q :: (", decl->name);
For(lambda->args) {
gen("%Q: %Q, ", it->name, core_type_to_string(it->type));
}
gen(")");
// @cleanup @refactor: return value shouldn't be a array of expressions.
// It should be a single expression. So probably need a special type
// for that.
if (lambda->args.len) {
gen(": ");
For(lambda->args) {
gen("%Q ", core_type_to_string(it->type));
}
}
iter.skip_children = true;
iter.stack.add(decl);
if (lambda->scope) iter.stack.add(lambda->scope);
global_indent += 1;
} break;
case AST_LAMBDA + AST_NODE_END: {
global_indent -= 1;
} break;
case AST_VAR: {
genln("%Q: %Q", decl->name, core_type_to_string(decl->type));
} break;
case AST_VAR + AST_NODE_END: {
} break;
}
}
String str = string_flatten(pctx->perm, &pctx->gen);
printf("%s", str.str);
pctx->gen.reset();
di += 1;
}
printf("\n");
#endif
prefixed_string_type = string_fmt(pctx->perm, "%QString", pctx->symbol_prefix);
prefixed_string_type = string_fmt(pctx->perm, "String");
if (pctx->single_header_library_mode) {
gen(R"(
/*
@@ -898,13 +829,12 @@ compile_to_c_code() {
#define %Q_IMPLEMENTATION
#include "%Q.h"
You can #define %QAssert(x) to avoid using default assert
You can #define %QAssertMessage(x) to get more comprehensive error info
You can #define %QMemoryCopy(x) to avoid using default memory copy
You can #define Assert(x) to avoid using default assert
You can #define AssertMessage(x) to get more comprehensive error info
You can #define MemoryCopy(x) to avoid using default memory copy
*/
)",
pctx->single_header_library_name, pctx->single_header_library_name, pctx->single_header_library_name,
pctx->symbol_prefix, pctx->symbol_prefix, pctx->symbol_prefix);
pctx->single_header_library_name, pctx->single_header_library_name, pctx->single_header_library_name);
genln("#ifndef %Q_LIBRARY_HEADER ", pctx->single_header_library_name);
genln("#define %Q_LIBRARY_HEADER ", pctx->single_header_library_name);
}
@@ -1023,43 +953,58 @@ compile_to_c_code() {
global_indent++;
For2(pctx->all_types, t) {
if (t->kind == TYPE_POLYMORPH) continue;
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);
genln("{/*%Q*/", typestring(t));
global_indent += 1;
genln(".kind = %d, ", (S32)t->kind);
genln(".size = %d, ", (S32)t->size);
genln(".align = %d, ", (S32)t->align);
genln(".is_unsigned = %s, ", t->is_unsigned ? "true" : "false");
genln(".type = %d, ", t->type_id);
switch (t->kind) {
case TYPE_POINTER:
case TYPE_SLICE: {
gen(".base_type = %d", t->base->type_id);
genln(".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);
genln(".base_type = %d, ", t->base->type_id);
genln(".array_size = %d", t->arr.size);
} break;
case TYPE_LAMBDA: {
gen(".lambda_return = %d, ", t->func.ret->type_id);
gen(".lambda_arguments.len = %d, ", t->func.args.len);
gen(".lambda_arguments.data = (Type_Info[%d]){", t->func.args.len);
if (t->func.args.len == 0) goto end_of_switch;
genln(".lambda_return = %d, ", t->func.ret->type_id);
genln(".lambda_arguments.len = %d, ", t->func.args.len);
genln(".lambda_arguments.data = (Type_Info[%d]){", t->func.args.len);
global_indent += 1;
For2(t->func.args, arg) {
gen("{.type = %d}, ", arg->type_id);
genln("{.type = %d}, ", arg->type_id);
}
gen("}");
global_indent -= 1;
genln("}");
} break;
case TYPE_UNION:
case TYPE_STRUCT: {
gen(".struct_members.len = %d, ", t->agg.members.len);
gen(".struct_members.data = (Type_Info_Struct_Member[]){");
if (t->agg.members.len == 0) goto end_of_switch;
genln(".struct_members.len = %d, ", t->agg.members.len);
genln(".struct_members.data = (Type_Info_Struct_Member[%d]){", t->agg.members.len);
global_indent += 1;
For2(t->agg.members, m) {
gen("{.name = (%Q){(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", prefixed_string_type, m.name, m.name.len, m.type->type_id, m.offset);
genln("{.name = {(uint8_t *)\"%Q\", %d}, .type = %d, .offset = %d}, ", prefixed_string_type, m.name, m.name.len, m.type->type_id, m.offset);
}
gen("}");
global_indent -= 1;
genln("}");
} break;
default: {
}
// invalid_default_case;
}
gen("},");
end_of_switch:;
global_indent -= 1;
genln("},");
}
global_indent--;
gen("};");
genln("};");
}
if (pctx->single_header_library_mode) {