66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
/* spl_cli.c — SIR VM launcher
|
|
*
|
|
* Loads a compiled .sir binary and runs it via the SIR VM.
|
|
* Built-in syscalls are auto-registered via spl_syscall_register().
|
|
*
|
|
* Usage:
|
|
* spl_cli [-d] <file.sir> [entry_point]
|
|
*/
|
|
|
|
#include "spl_mcode.h"
|
|
#include "spl_syscall.h"
|
|
#include "spl_vm.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
int main(int argc, const char **argv) {
|
|
int debug_mode = 0;
|
|
int arg_idx = 1;
|
|
|
|
if (argc >= 2 && strcmp(argv[1], "-d") == 0) {
|
|
debug_mode = 1;
|
|
arg_idx = 2;
|
|
}
|
|
|
|
if (arg_idx >= argc) {
|
|
fprintf(stderr, "Usage: spl_cli [-d] <file.sir> [entry_point]\n");
|
|
return 1;
|
|
}
|
|
|
|
const char *path = argv[arg_idx];
|
|
const char *entry = argc >= arg_idx + 2 ? argv[arg_idx + 1] : "main";
|
|
|
|
spl_prog_t prog;
|
|
if (spl_prog_load_from_file(path, &prog) != 0) {
|
|
fprintf(stderr, "spl_cli: cannot load '%s'\n", path);
|
|
return 1;
|
|
}
|
|
|
|
spl_syscall_register(&prog);
|
|
|
|
spl_vm_t vm;
|
|
spl_vm_init(&vm);
|
|
if (debug_mode) spl_vm_set_debug(&vm, 1);
|
|
if (spl_vm_load_prog(&vm, &prog) != 0) {
|
|
fprintf(stderr, "vm: prog '%s' not found\n", entry);
|
|
spl_prog_drop(&prog);
|
|
return 1;
|
|
}
|
|
if (spl_vm_prepare(&vm, entry, argc, argv, NULL) != 0) {
|
|
fprintf(stderr, "vm: entry point '%s' not found\n", entry);
|
|
spl_prog_drop(&prog);
|
|
return 1;
|
|
}
|
|
|
|
int ret = spl_vm_run_until(&vm, 0);
|
|
spl_vm_drop(&vm);
|
|
spl_prog_drop(&prog);
|
|
|
|
if (ret < 0) {
|
|
fprintf(stderr, "spl_cli: VM error (exit_code=%d)\n", vm.exit_code);
|
|
return (int)vm.exit_code;
|
|
}
|
|
return (int)vm.exit_code;
|
|
}
|