feat: implement vm
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <vm/fzl_vm.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *filepath;
|
||||
bool help;
|
||||
} run_args_t;
|
||||
|
||||
void print_hint()
|
||||
{
|
||||
printf("Usage: fz [flags] <file path>\n");
|
||||
printf("Flags:\n");
|
||||
printf("\tno flags available yet :(\n");
|
||||
}
|
||||
|
||||
// Parse passed arguments and build args setup structure
|
||||
run_args_t *parse_args(int argc, char **argv)
|
||||
{
|
||||
if (argc < 2)
|
||||
{
|
||||
print_hint();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
run_args_t *args = malloc(sizeof(run_args_t));
|
||||
args->filepath = NULL;
|
||||
args->help = false;
|
||||
|
||||
for (size_t i = 0; i < argc; i++)
|
||||
{
|
||||
if (argv[i][0] != '-')
|
||||
continue;
|
||||
|
||||
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
|
||||
{
|
||||
args->help = true;
|
||||
return args;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Error: unknown flag '%s'.\n", argv[i]);
|
||||
printf("Use 'fz --help' to read the usage\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (argv[argc - 1][0] == '-')
|
||||
{
|
||||
printf("Error: last argument MUST be a file path\n");
|
||||
printf("Use 'fz --help' for help\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
args->filepath = argv[argc - 1];
|
||||
|
||||
return args;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
run_args_t *args = parse_args(argc, argv);
|
||||
if (!args)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
fzl_vm_t *vm = fzl_mkvm(args->filepath);
|
||||
if (!vm)
|
||||
{
|
||||
printf("Error: %s\n", fzl_vm_geterror());
|
||||
return -1;
|
||||
}
|
||||
|
||||
int result = fzl_vm_run(vm);
|
||||
if (result != 0)
|
||||
{
|
||||
printf("Error: %s\n", fzl_vm_geterror());
|
||||
return -1;
|
||||
}
|
||||
|
||||
free(args);
|
||||
fzl_freevm(vm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user