diff options
| author | Franklin Wei <git@fwei.tk> | 2015-11-20 20:14:00 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-11-20 20:14:00 -0500 |
| commit | 5eb15b8054f378f628156bd5fbc8e1157bb25db9 (patch) | |
| tree | 85d4dc1976029095f64a4aa3579282ca3132ea48 /src | |
| parent | 8c45623dc3854f9bdabc8b79e75144efdd9cb910 (diff) | |
| download | ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.zip ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.gz ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.bz2 ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.xz | |
autoindentation
Diffstat (limited to 'src')
| -rw-r--r-- | src/emitc.c | 72 |
1 files changed, 51 insertions, 21 deletions
diff --git a/src/emitc.c b/src/emitc.c index 6d54ec5..832929e 100644 --- a/src/emitc.c +++ b/src/emitc.c @@ -58,29 +58,56 @@ static imm_t read_byte(void) return ret; } -void write_src(const char *fmt, ...) +void write_src_noindent(const char *fmt, ...) { - static int indent_depth = 0; va_list ap; va_start(ap, fmt); + vdprintf(out_fd, fmt, ap); + va_end(ap); +} + +void write_src(const char *fmt, ...) +{ + static bool possibly_oneline = false; + static int indent_depth = 0; + if(fmt[0] == '}') + { --indent_depth; + } + char space = ' '; for(int i = 0; i < INDENT_SPACES * indent_depth; ++i) write(out_fd, &space, 1); - vdprintf(out_fd, fmt, ap); - va_end(ap); - if(fmt[0] == '{') - ++indent_depth; -} - -void write_src_noindent(const char *fmt, ...) -{ va_list ap; va_start(ap, fmt); + vdprintf(out_fd, fmt, ap); + va_end(ap); + + if(possibly_oneline && fmt[0] != '{') + { + possibly_oneline = false; + --indent_depth; + } + + if(!indent_depth && fmt[0] == '}') + write_src_noindent("\n"); + + if(fmt[0] == '{') + { + if(!possibly_oneline) + ++indent_depth; + possibly_oneline = false; + } + + if(!strncmp(fmt, "if", 2) || !strncmp(fmt, "else", 4)) + { + ++indent_depth; + possibly_oneline = true; + } } static void vid_write(const char *str) @@ -471,8 +498,8 @@ static void inc_line_pointer(void) { ++current_line; - write_src("label_%d:\n", current_line); - write_src("vars[0].val = %d;\n", current_line); + write_src_noindent("label_%d:\n", current_line); + write_src("vars[0].val = %d;\n\n", current_line); } static void (*instr_tab[0x100])(void) = { @@ -750,25 +777,26 @@ void ducky_to_c(int fd, int out) read_imm(); } - write_src("/* Generated by ducky2c */\n"); + write_src("/* generated by ducky */\n\n"); + write_src("#include <stdarg.h>\n"); write_src("#include <stdbool.h>\n"); write_src("#include <stdio.h>\n"); write_src("#include <stdint.h>\n"); - write_src("#include <stdlib.h>\n"); - write_src("typedef int32_t imm_t;\n"); - write_src("typedef imm_t vartype;\n"); - write_src("typedef uint16_t varid_t;\n"); - write_src("#define STACK_SZ %d\n", STACK_SZ); + write_src("#include <stdlib.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); + write_src("typedef int32_t imm_t;\n"); + write_src("typedef imm_t vartype;\n"); + write_src("typedef uint16_t varid_t;\n\n"); write_src("imm_t stack[STACK_SZ];\n"); write_src("imm_t callstack[CALLSTACK_SZ];\n"); 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"); - write_src("/* this labels as values */\n"); - write_src("void *jump_table[%d];\n", num_lines + 1); + 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"); @@ -852,10 +880,12 @@ void ducky_to_c(int fd, int out) write_src("int main()\n"); write_src("{\n"); + 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"); /* and... compile! */ while(!want_quit) |