#include "vm_types.h" #include #include #include // Safe file reading static uint8_t* read_file(const char* filename, size_t* size) { FILE* file = fopen(filename, "rb"); if (!file) { fprintf(stderr, "Cannot open file: %s\n", filename); return NULL; } fseek(file, 0, SEEK_END); long file_size = ftell(file); fseek(file, 0, SEEK_SET); if (file_size <= 0 || file_size > 10 * 1024 * 1024) { // 10MB limit fclose(file); fprintf(stderr, "Invalid file size\n"); return NULL; } uint8_t* buffer = malloc(file_size); if (!buffer) { fclose(file); fprintf(stderr, "Memory allocation failed\n"); return NULL; } if (fread(buffer, 1, file_size, file) != (size_t)file_size) { fclose(file); free(buffer); fprintf(stderr, "File read error\n"); return NULL; } fclose(file); *size = file_size; return buffer; } int main(int argc, char* argv[]) { if (argc != 2) { printf("Usage: %s \n", argv[0]); return 1; } size_t file_size; uint8_t* bytecode = read_file(argv[1], &file_size); if (!bytecode) { return 1; } vm_t* vm = vm_create(bytecode, file_size); if (!vm) { fprintf(stderr, "Failed to create VM\n"); free(bytecode); return 1; } if (!vm_validate_bytecode(vm)) { fprintf(stderr, "Invalid bytecode file\n"); vm_destroy(vm); free(bytecode); return 1; } printf("Executing program...\n"); vm_execute(vm); printf("Program finished\n"); vm_destroy(vm); free(bytecode); return 0; }