aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-12-04 21:12:39 +0800
committerMistivia <i@mistivia.com>2024-12-04 21:12:39 +0800
commitfb4dca6c42147cd1ce082636640b50b5fac8826f (patch)
tree06a9c15c5e16aab848a17d0da675c0999bdd13db /src
parent74f4561982a73374942bf7fbb66ee5367da535cc (diff)
finish fvm
Diffstat (limited to 'src')
-rw-r--r--src/fvm.c1
-rw-r--r--src/main.c28
2 files changed, 27 insertions, 2 deletions
diff --git a/src/fvm.c b/src/fvm.c
index 6326dc8..db4b04b 100644
--- a/src/fvm.c
+++ b/src/fvm.c
@@ -424,6 +424,7 @@ int64_t fvm_execute(struct fvm *vm) {
return vm->rv;
default:
fprintf(stderr, "unknown opcode.\n");
+ exit(-1);
break;
}
}
diff --git a/src/main.c b/src/main.c
index 62742b5..21b31c2 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,5 +1,29 @@
+#include <stdio.h>
+#include <stdlib.h>
+
#include "fvm.h"
-int main() {
- return 0;
+int main(int argc, char **argv) {
+ struct fvm vm;
+ if (argc < 2) {
+ fprintf(stderr, "Usage: fvm <program-file>\n");
+ return -1;
+ }
+ FILE* fp = fopen(argv[1], "rb");
+ if (fp == NULL) {
+ fprintf(stderr, "Failed to open file.\n");
+ return -1;
+ }
+ fseek(fp, 0, SEEK_END);
+ int64_t flen = ftell(fp);
+ char *code = malloc(flen);
+ fseek(fp, 0, SEEK_SET);
+ int n = fread(code, 1, flen, fp);
+ if (n != flen) {
+ fprintf(stderr, "Failed to read from file.\n");
+ exit(-1);
+ }
+ fvm_init(&vm, code, 2*1024*1024);
+ fvm_execute(&vm);
+ return vm.rv;
}