fclose(inf); | fclose(inf); | ||||
if (do_print_bytecode) { | if (do_print_bytecode) { | ||||
l2_vm_print_bytecode((l2_word *)w.mem, w.len / sizeof(l2_word)); | |||||
l2_vm_print_bytecode(w.mem, w.len / sizeof(l2_word)); | |||||
} | } | ||||
if (do_print_bytecode || do_print_tokens) { | if (do_print_bytecode || do_print_tokens) { | ||||
} | } | ||||
struct l2_vm vm; | struct l2_vm vm; | ||||
l2_vm_init(&vm, (void *)w.mem, w.len / sizeof(l2_word)); | |||||
l2_vm_init(&vm, w.mem, w.len / sizeof(l2_word)); | |||||
if (do_step) { | if (do_step) { | ||||
step_through(&vm); | step_through(&vm); |
#define L2_IO_BUFSIZ 1024 | #define L2_IO_BUFSIZ 1024 | ||||
struct l2_io_reader { | struct l2_io_reader { | ||||
size_t (*read)(struct l2_io_reader *self, char *buf, size_t len); | |||||
size_t (*read)(struct l2_io_reader *self, void *buf, size_t len); | |||||
}; | }; | ||||
struct l2_io_writer { | struct l2_io_writer { | ||||
void (*write)(struct l2_io_writer *self, const char *buf, size_t len); | |||||
void (*write)(struct l2_io_writer *self, const void *buf, size_t len); | |||||
}; | }; | ||||
struct l2_bufio_reader { | struct l2_bufio_reader { | ||||
struct l2_io_reader r; | struct l2_io_reader r; | ||||
size_t idx; | size_t idx; | ||||
size_t len; | size_t len; | ||||
const char *mem; | |||||
const void *mem; | |||||
}; | }; | ||||
size_t l2_io_mem_read(struct l2_io_reader *self, char *buf, size_t len); | |||||
size_t l2_io_mem_read(struct l2_io_reader *self, void *buf, size_t len); | |||||
struct l2_io_file_reader { | struct l2_io_file_reader { | ||||
struct l2_io_reader r; | struct l2_io_reader r; | ||||
FILE *f; | FILE *f; | ||||
}; | }; | ||||
size_t l2_io_file_read(struct l2_io_reader *self, char *buf, size_t len); | |||||
size_t l2_io_file_read(struct l2_io_reader *self, void *buf, size_t len); | |||||
struct l2_io_mem_writer { | struct l2_io_mem_writer { | ||||
struct l2_io_writer w; | struct l2_io_writer w; | ||||
size_t len; | size_t len; | ||||
char *mem; | |||||
void *mem; | |||||
}; | }; | ||||
void l2_io_mem_write(struct l2_io_writer *self, const char *buf, size_t len); | |||||
void l2_io_mem_write(struct l2_io_writer *self, const void *buf, size_t len); | |||||
struct l2_io_file_writer { | struct l2_io_file_writer { | ||||
struct l2_io_writer w; | struct l2_io_writer w; | ||||
FILE *f; | FILE *f; | ||||
}; | }; | ||||
void l2_io_file_write(struct l2_io_writer *self, const char *buf, size_t len); | |||||
void l2_io_file_write(struct l2_io_writer *self, const void *buf, size_t len); | |||||
/* | /* | ||||
* Defined in the header to let the compiler inline | * Defined in the header to let the compiler inline |
b->idx = 0; | b->idx = 0; | ||||
} | } | ||||
size_t l2_io_mem_read(struct l2_io_reader *self, char *buf, size_t len) { | |||||
size_t l2_io_mem_read(struct l2_io_reader *self, void *buf, size_t len) { | |||||
struct l2_io_mem_reader *r = (struct l2_io_mem_reader *)self; | struct l2_io_mem_reader *r = (struct l2_io_mem_reader *)self; | ||||
if (len >= r->len - r->idx) { | if (len >= r->len - r->idx) { | ||||
len = r->len - r->idx; | len = r->len - r->idx; | ||||
return len; | return len; | ||||
} | } | ||||
size_t l2_io_file_read(struct l2_io_reader *self, char *buf, size_t len) { | |||||
size_t l2_io_file_read(struct l2_io_reader *self, void *buf, size_t len) { | |||||
struct l2_io_file_reader *r = (struct l2_io_file_reader *)self; | struct l2_io_file_reader *r = (struct l2_io_file_reader *)self; | ||||
return fread(buf, 1, len, r->f); | return fread(buf, 1, len, r->f); | ||||
} | } | ||||
void l2_io_mem_write(struct l2_io_writer *self, const char *buf, size_t len) { | |||||
void l2_io_mem_write(struct l2_io_writer *self, const void *buf, size_t len) { | |||||
struct l2_io_mem_writer *w = (struct l2_io_mem_writer *)self; | struct l2_io_mem_writer *w = (struct l2_io_mem_writer *)self; | ||||
size_t idx = w->len; | size_t idx = w->len; | ||||
w->len += len; | w->len += len; | ||||
w->mem = realloc(w->mem, w->len); | w->mem = realloc(w->mem, w->len); | ||||
memcpy(w->mem + idx, buf, len); | |||||
memcpy((char *)w->mem + idx, buf, len); | |||||
} | } | ||||
void l2_io_file_write(struct l2_io_writer *self, const char *buf, size_t len) { | |||||
void l2_io_file_write(struct l2_io_writer *self, const void *buf, size_t len) { | |||||
struct l2_io_file_writer *w = (struct l2_io_file_writer *)self; | struct l2_io_file_writer *w = (struct l2_io_file_writer *)self; | ||||
fwrite(buf, 1, len, w->f); | fwrite(buf, 1, len, w->f); | ||||
} | } |
return -1; | return -1; | ||||
} | } | ||||
l2_word *ops = (l2_word *)w.mem; | |||||
l2_word *ops = w.mem; | |||||
l2_word opcount = w.len / sizeof(l2_word); | l2_word opcount = w.len / sizeof(l2_word); | ||||
// Due to the earlier gen_rjmp, the second word will be the argument to RJMP. | // Due to the earlier gen_rjmp, the second word will be the argument to RJMP. |