diff options
Diffstat (limited to 'bytecode/bytecode.c')
| -rw-r--r-- | bytecode/bytecode.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/bytecode/bytecode.c b/bytecode/bytecode.c new file mode 100644 index 0000000..a21231b --- /dev/null +++ b/bytecode/bytecode.c @@ -0,0 +1,71 @@ +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> + +#include "oper.h" +#include "panic.h" +#include "slice.h" + +static struct slice xmalloc(size_t size) +{ + void *p = malloc(size); + if (!p) { + panicf("Out of memory!\n"); + } + return (struct slice) { + .buf = p, + .size = size, + }; +} + +static struct slice xrealloc(void *ptr, size_t size) +{ + void *p = realloc(ptr, size); + if (!p) { + panicf("Out of memory!\n"); + } + return (struct slice) { + .buf = p, + .size = size, + }; +} + +void read_file(struct slice *out, char *filename) +{ + FILE *f = fopen(filename, "r"); + if (!f) { + panicf("File %s does not exit!\n", filename); + } + size_t offset = 0; + while (true) { + if (offset >= out->size) { + size_t new_size = 2 * out->size; + *out = xrealloc(out->buf, new_size); + } + size_t read_size = out->size - offset; + size_t n = fread(out->buf + offset, 1, read_size, f); + if (n < read_size) { + if (ferror(f)) { + panicf("Read error!\n"); + } + out->size = offset + n; + return; + } + offset += n; + } +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + printf("Usage error: need a filename.\n"); + return 1; + } + + struct slice program = xmalloc(1); + read_file(&program, argv[1]); + + run(program); + + free(program.buf); +} |
