summaryrefslogtreecommitdiff
path: root/cgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgen.c')
-rw-r--r--cgen.c80
1 files changed, 77 insertions, 3 deletions
diff --git a/cgen.c b/cgen.c
index 7f1d323..21baef7 100644
--- a/cgen.c
+++ b/cgen.c
@@ -1,6 +1,8 @@
typedef struct {
FILE *outc;
- long ident_counter;
+ unsigned long ident_counter;
+ ParsedFile *file;
+ Block *block;
} CGenerator;
static void cgen_create(CGenerator *g, FILE *out) {
@@ -8,6 +10,29 @@ static void cgen_create(CGenerator *g, FILE *out) {
g->ident_counter = 0;
}
+static void cgen_block_enter(CGenerator *g, Block *b) {
+ g->block = b;
+ Statement *stmts;
+ if (b == NULL) {
+ stmts = g->file->stmts;
+ } else {
+ stmts = b->stmts;
+ }
+ block_enter(b, stmts);
+}
+
+static void cgen_block_exit(CGenerator *g, Block *into) {
+ Block *b = g->block;
+ Statement *stmts;
+ if (b == NULL) {
+ stmts = g->file->stmts;
+ } else {
+ stmts = b->stmts;
+ }
+ block_exit(b, stmts);
+ g->block = into;
+}
+
static inline FILE *cgen_writing_to(CGenerator *g) {
return g->outc; /* for now */
}
@@ -19,9 +44,58 @@ static void cgen_write(CGenerator *g, const char *fmt, ...) {
va_end(args);
}
-static void cgen_decls_file(CGenerator *g, ParsedFile *f);
-static void cgen_file(CGenerator *g, ParsedFile *f) {
+static bool cgen_type_post(CGenerator *g, Type *t, Location where);
+static bool cgen_type_pre(CGenerator *g, Type *t, Location where) {
+ switch (t->kind) {
+ case TYPE_BUILTIN:
+ switch (t->builtin) {
+ case BUILTIN_I8: cgen_write(g, "i8"); break;
+ case BUILTIN_I16: cgen_write(g, "i16"); break;
+ case BUILTIN_I32: cgen_write(g, "i32"); break;
+ case BUILTIN_I64: cgen_write(g, "i64"); break;
+ case BUILTIN_U8: cgen_write(g, "u8"); break;
+ case BUILTIN_U16: cgen_write(g, "u16"); break;
+ case BUILTIN_U32: cgen_write(g, "u32"); break;
+ case BUILTIN_U64: cgen_write(g, "u64"); break;
+ case BUILTIN_CHAR: cgen_write(g, "char"); break;
+ case BUILTIN_BOOL: cgen_write(g, "bool"); break;
+ case BUILTIN_F32: cgen_write(g, "f32"); break;
+ case BUILTIN_F64: cgen_write(g, "f64"); break;
+ }
+ case TYPE_VOID: cgen_write(g, "void"); break;
+ case TYPE_UNKNOWN:
+ err_print(t->where, "Can't determine type.");
+ break;
+ }
+}
+
+static bool cgen_type_post(CGenerator *g, Type *t, Location where) {
+}
+
+static bool cgen_fn_header(CGenerator *g, FnExpr *f, Identifier name, long id) {
+}
+
+static bool cgen_decls_file(CGenerator *g, ParsedFile *f);
+
+static bool cgen_file(CGenerator *g, ParsedFile *f) {
+ g->file = f;
+ cgen_write(g, "#include <stdint.h>\n"
+ "typedef int8_t i8;\n"
+ "typedef int16_t i16;\n"
+ "typedef int32_t i32;\n"
+ "typedef int64_t i64;\n"
+ "typedef uint8_t u8;\n"
+ "typedef uint16_t u16;\n"
+ "typedef uint32_t u32;\n"
+ "typedef uint64_t u64;\n"
+ "typedef float f32;\n"
+ "typedef double f64;\n"
+ "typedef unsigned char bool;\n"
+ "#define false ((bool)0)\n"
+ "#define true ((bool)1)\n\n\n");
+ cgen_block_enter(g, NULL);
cgen_decls_file(g, f);
cgen_write(g, "/* code */\n");
+ cgen_block_exit(g, NULL);
}