72 lines
1.2 KiB
C
72 lines
1.2 KiB
C
#include "../../libc.h"
|
|
#include "../../compiler.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <emscripten.h>
|
|
|
|
#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;
|
|
} |