1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include "oper.h"
#include "panic.h"
#include "byte_slice.h"
static uint8_t_slice xrealloc(void *ptr, size_t size)
{
void *p = realloc(ptr, size);
if (!p) {
panicf("Out of memory!\n");
}
return (uint8_t_slice) {
.buf = p,
.size = size,
};
}
static uint8_t_slice read_file(char *filename)
{
FILE *f = fopen(filename, "r");
if (!f) {
panicf("File %s does not exit!\n", filename);
}
uint8_t_slice out = { .size = 0, .buf = NULL };
size_t offset = 0;
while (true) {
if (offset >= out.size) {
size_t new_size = 2 * out.size + 1;
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");
}
return uint8_t_slice2(out, 0, offset + n);
}
offset += n;
}
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("Usage error: need a filename.\n");
return 1;
}
uint8_t_slice program = read_file(argv[1]);
run(program);
// run never returns. I'm just putting this here to taunt you:
free(program.buf);
}
|