76 lines
1.7 KiB
C
76 lines
1.7 KiB
C
#include "vm_types.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
// 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 <file.popclass>\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;
|
|
} |