aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-11-20 20:14:00 -0500
committerFranklin Wei <git@fwei.tk>2015-11-20 20:14:00 -0500
commit5eb15b8054f378f628156bd5fbc8e1157bb25db9 (patch)
tree85d4dc1976029095f64a4aa3579282ca3132ea48 /src
parent8c45623dc3854f9bdabc8b79e75144efdd9cb910 (diff)
downloadducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.zip
ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.gz
ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.bz2
ducky-5eb15b8054f378f628156bd5fbc8e1157bb25db9.tar.xz
autoindentation
Diffstat (limited to 'src')
-rw-r--r--src/emitc.c72
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)