1
0
Fork 0
mirror of https://github.com/pnx/m16vm synced 2026-06-16 03:44:55 +02:00
This commit is contained in:
Henrik Hautakoski 2018-10-26 14:48:48 +02:00
parent c3a1d3fe77
commit 9efedf4471

78
cc/compiler.c Normal file
View file

@ -0,0 +1,78 @@
#include <stdio.h>
void forward(FILE *fd, char ch) {
for(;;) {
char c = getc(fd);
if (c == EOF)
break;
if (c == ch) {
getc(fd);
break;
}
}
}
void execute(FILE *fd) {
unsigned char mem[2048] = { 0 }; /* Memory block */
unsigned char *ptr = mem;
long int jmpaddr = -1;
while(!feof(fd)) {
char ch = getc(fd);
switch(ch) {
case '<':
ptr--;
break;
case '>':
ptr++;
break;
case '+':
(*ptr)++;
break;
case '-':
(*ptr)--;
break;
case '.':
putchar(*ptr);
break;
case '[':
if (*ptr == 0) {
forward(fd, ']');
jmpaddr = -1;
} else {
jmpaddr = ftell(fd) - 1;
}
break;
case ']':
if (jmpaddr > 0) {
fseek(fd, jmpaddr, SEEK_SET);
}
break;
}
}
}
int main(int argc, char **argv) {
FILE *fd;
if (argc < 2) {
fprintf(stderr, "usage: %s <inputfile>\n", argv[0]);
return 1;
}
fd = fopen(argv[1], "r");
if (!fd) {
return 1;
}
execute(fd);
fclose(fd);
return 0;
}