#include "../../libc.h" #include "../../compiler.h" #include #include #include #define MEM_SIZE (1 << 16) size_t List_size(List *list) { size_t total = 0; Node *curr = list->head; while(curr) { total += curr->size; curr = curr->next; } return total; } 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) { u8 tape[MEM_SIZE]; Arena a = {tape, 0, MEM_SIZE}; Emitter e; switch(emitter_type) { case 0: e = rer_emitter(); break; case 1: e = uxn_emitter(); break; default: return NULL; } 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; }