#ifndef UNDAR_EMIT_H #define UNDAR_EMIT_H #include "libc.h" typedef enum notation_type_e { PREFIX, INFIX, POSTFIX } NotationType; typedef enum output_type_e { BINARY, TEXT } OutputType; typedef void (*VoidArgEmit)(); typedef void (*StrArgEmit)(const char *str, i32 length); typedef struct emitter_s Emitter; struct emitter_s { NotationType notation; OutputType output; VoidArgEmit prolog; VoidArgEmit epilogue; VoidArgEmit emit_add; VoidArgEmit emit_sub; VoidArgEmit emit_mul; VoidArgEmit emit_div; VoidArgEmit emit_lt; VoidArgEmit emit_le; VoidArgEmit emit_gt; VoidArgEmit emit_ge; VoidArgEmit emit_ne; VoidArgEmit emit_eq; VoidArgEmit emit_false; VoidArgEmit emit_true; VoidArgEmit emit_nil; VoidArgEmit emit_void; StrArgEmit emit_int; StrArgEmit emit_nat; StrArgEmit emit_real; StrArgEmit emit_byte; StrArgEmit emit_str; VoidArgEmit emit_bool_type; VoidArgEmit emit_byte_type; VoidArgEmit emit_int_type; VoidArgEmit emit_nat_type; VoidArgEmit emit_real_type; VoidArgEmit emit_str_type; VoidArgEmit emit_u8_type; VoidArgEmit emit_i8_type; VoidArgEmit emit_i16_type; VoidArgEmit emit_u16_type; VoidArgEmit emit_i32_type; VoidArgEmit emit_u32_type; VoidArgEmit emit_f32_type; VoidArgEmit emit_array; VoidArgEmit emit_function; VoidArgEmit emit_plex; VoidArgEmit emit_method; VoidArgEmit emit_trait; VoidArgEmit emit_const; VoidArgEmit emit_print; VoidArgEmit emit_neg; VoidArgEmit emit_not; VoidArgEmit emit_open_paren; VoidArgEmit emit_close_paren; }; Emitter c_emitter(); Emitter uxn_emitter(); #endif