aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emitc.c51
1 files changed, 23 insertions, 28 deletions
diff --git a/src/emitc.c b/src/emitc.c
index 832929e..afa8fe7 100644
--- a/src/emitc.c
+++ b/src/emitc.c
@@ -217,20 +217,20 @@ static void repeat_handler(void)
write_src("--repeats_left;\n");
write_src("if(repeats_left > 0)\n");
write_src("{\n");
- write_src("jump(repeat_line);\n");
+ write_src("{JUMP(repeat_line);\n");
write_src("}\n");
write_src("}\n");
write_src("else\n");
write_src("{\n");
write_src("repeat_line = pop();\n");
write_src("repeats_left = pop() - 1;\n");
- write_src("jump(repeat_line);\n");
+ write_src("JUMP(repeat_line);\n");
write_src("}\n");
}
-static void jump_handler(void)
+static void JUMP_handler(void)
{
- write_src("jump(pop());\n");
+ write_src("JUMP(pop());\n");
}
static void subcall_handler(void)
@@ -238,7 +238,7 @@ static void subcall_handler(void)
write_src("if(callstack_pointer < CALLSTACK_SZ)\n");
write_src("{\n");
write_src("callstack[callstack_pointer++] = vars[0].val + 1;\n");
- write_src("jump(pop());\n");
+ write_src("JUMP(pop());\n");
write_src("}\n");
write_src("else\n");
write_src("error(\"call stack overflow\");\n");
@@ -248,7 +248,7 @@ static void subret_handler(void)
{
write_src("if(callstack_pointer > 0)\n");
write_src("{\n");
- write_src("jump(callstack[--callstack_pointer]);\n");
+ write_src("JUMP(callstack[--callstack_pointer]);\n");
write_src("}\n");
write_src("else\n");
write_src("error(\"call stack underflow\");\n");
@@ -258,8 +258,9 @@ static void if_handler(void)
{
write_src("{\n");
write_src("imm_t line = pop();\n");
- write_src("if(!pop())\n");
- write_src("jump(line);\n");
+ write_src("imm_t truth = pop();\n");
+ write_src("if(!truth)\n");
+ write_src("JUMP(line);\n");
write_src("}\n");
}
@@ -511,7 +512,7 @@ static void (*instr_tab[0x100])(void) = {
decvar_handler, /* 0x5 */
writestr_handler, /* 0x6 */
repeat_handler, /* 0x7 */
- jump_handler, /* 0x8 */
+ JUMP_handler, /* 0x8 */
subcall_handler, /* 0x9 */
subret_handler, /* 0xa */
if_handler, /* 0xb */
@@ -784,6 +785,7 @@ void ducky_to_c(int fd, int out)
write_src("#include <stdio.h>\n");
write_src("#include <stdint.h>\n");
write_src("#include <stdlib.h>\n\n");
+ write_src("#include <math.h>\n\n");
write_src("#define CALLSTACK_SZ %d\n", CALLSTACK_SZ);
write_src("#define MAX_VARS %d\n", MAX_VARS);
write_src("#define STACK_SZ %d\n\n", STACK_SZ);
@@ -795,8 +797,6 @@ void ducky_to_c(int fd, int out)
write_src("imm_t stack_pointer, callstack_pointer;\n");
write_src("struct var_t { imm_t val; bool constant; };\n");
write_src("struct var_t vars[MAX_VARS];\n\n");
- write_src("/* this uses labels as values */\n");
- write_src("void *jump_table[%d];\n\n", num_lines + 1);
write_src("static void vid_write(const char *str)\n");
write_src("{\n");
@@ -826,17 +826,7 @@ void ducky_to_c(int fd, int out)
write_src("exit(EXIT_FAILURE);\n");
write_src("}\n");
- write_src("static inline void jump(imm_t line)\n");
- write_src("{\n");
- write_src("if(1 <= line && line <= %d)\n", num_lines);
- write_src("{\n");
- write_src("goto *jump_table[line];\n");
- write_src("}\n");
- write_src("else\n");
- write_src("error(\"jump target out of bounds %%d %%d\", line, vars[0].val);\n");
- write_src("}\n");
-
- write_src("static inline void push(imm_t n)\n");
+ write_src("static void push(imm_t n)\n");
write_src("{\n");
write_src("if(stack_pointer < STACK_SZ)\n");
write_src("stack[stack_pointer++] = n;\n");
@@ -844,7 +834,7 @@ void ducky_to_c(int fd, int out)
write_src("error(\"stack overflow\");\n");
write_src("}\n");
- write_src("static inline imm_t pop(void)\n");
+ write_src("static imm_t pop(void)\n");
write_src("{\n");
write_src("if(stack_pointer > 0)\n");
write_src("return stack[--stack_pointer];\n");
@@ -852,14 +842,15 @@ void ducky_to_c(int fd, int out)
write_src("error(\"stack underflow\");\n");
write_src("}\n");
-
- write_src("static inline vartype getvar(varid_t varid)\n");
+ write_src("static vartype getvar(varid_t varid)\n");
write_src("{\n");
write_src("if(varid < %d)\n", MAX_VARS);
write_src("return vars[varid].val;\n");
+ write_src("else\n");
+ write_src("error(\"cannot access variable\");\n");
write_src("}\n");
- write_src("static inline void setvar(varid_t varid, vartype val)\n");
+ write_src("static void setvar(varid_t varid, vartype val)\n");
write_src("{\n");
write_src("if(varid < %d && !vars[varid].constant)\n", MAX_VARS);
write_src("vars[varid].val = val;\n");
@@ -867,7 +858,7 @@ void ducky_to_c(int fd, int out)
write_src("error(\"cannot modify variable\");\n");
write_src("}\n");
- write_src("static inline void mkconst(varid_t varid)\n");
+ write_src("static void mkconst(varid_t varid)\n");
write_src("{\n");
write_src("if(varid < %d)\n", MAX_VARS);
write_src("vars[varid].constant = true;\n");
@@ -878,14 +869,18 @@ void ducky_to_c(int fd, int out)
write_src("return a2<0 ? 0 : (a2==0?1:a1*eval_exp(a1, a2-1));\n");
write_src("}\n");
+ write_src("#define JUMP(LINE) do{imm_t x = LINE; if(1 <= x && x <= %d) goto *jump_table[x]; else error(\"jump target out of range\");}while(0);\n\n", num_lines);
+
write_src("int main()\n");
write_src("{\n");
+ write_src("/* this uses labels as values */\n");
+ write_src("void *jump_table[%d];\n\n", num_lines + 1);
write_src("/* initialize the jump table */\n");
for(int i = 1; i <= num_lines; ++i)
{
write_src("jump_table[%d] = &&label_%d;\n", i, i);
}
- write_src("\n");
+ write_src_noindent("\n");
/* and... compile! */
while(!want_quit)