#include "../../libc.h" #include "../../compiler.h" #include #include #include #define MEM_SIZE (1 << 16) static size_t List_size(List *list) { size_t total = 0; Node *curr = list->head; while (curr) { total += curr->size; curr = curr->next; } return total; } static void list2buffer(List *list, char *buffer, size_t *offset) { Node *curr = list->head; while (curr) { char *tmp_str = node_value(curr); memcpy(buffer + *offset, tmp_str, curr->size); *offset += curr->size; curr = curr->next; } } EMSCRIPTEN_KEEPALIVE char *undar_compile(int emitter_type, char *source) { Emitter e; if (emitter_type == 0) { e = rer_emitter(); } else if (emitter_type == 1) { e = uxn_emitter(); } else { return NULL; } u8 tape[MEM_SIZE]; Arena a = {tape, 0, MEM_SIZE}; List *code = List_init(&a); List *memory = List_init(&a); compile(&a, code, memory, e, source); size_t code_size = List_size(code); size_t mem_size = List_size(memory); size_t total_size = code_size + mem_size + 1; char *result = (char *)malloc(total_size); if (result == NULL) return NULL; size_t offset = 0; list2buffer(code, result, &offset); list2buffer(memory, result, &offset); result[offset] = '\0'; afree(&a); return result; }