YREA-SLS/SLS_C/src/file.c

69 lines
2.0 KiB
C

// Kyler Olsen
// YREA SLS
// File
// November 2025
#include <stdio.h>
#include "sls/file.h"
#include "sls/bool.h"
#include "sls/string.h"
#include "sls/interpreter.h"
Boolean exec_file(InterpreterState *interpreter_state, SlsStr filename) {
FILE *file_o = fopen(filename.str, "r");
if (file_o == NULL) {
printf("Cannot read file: %s\n", filename.str);
return FALSE;
}
if (fseek(file_o, 0, SEEK_END)) return FALSE;
size_t file_length = ftell(file_o);
rewind(file_o);
LexerInfo lexer_info;
SlsStr code = sls_str_new(file_length);
for (size_t i = 0; i < file_length; i++) {
int character = fgetc(file_o);
if (character == EOF) return FALSE;
else code.str[i] = (char)character;
}
init_lexer(&lexer_info, filename, code);
LexerResult result = lexical_analysis(&lexer_info);
if (result.type == SLS_ERROR) {
printf("%s\n", result.error.message.str);
sls_str_free(&result.error.message);
return FALSE;
} else {
LexerTokenResult *head = result.result;
while (head) {
if (head->type == SLS_ERROR) {
printf("%s\n", head->error.message.str);
sls_str_free(&result.error.message);
clean_token_result(result.result);
return FALSE;
} else if (!execute(interpreter_state, head)) {
printf("A runtime error occurred!\n");
break;
}
head = head->next;
}
clean_token_result(result.result);
}
sls_str_free(&code);
if (fclose(file_o)) return FALSE;
else return TRUE;
}
int file(SlsStr filename) {
printf("Executing file: %s\n", filename.str);
InterpreterState *interpreter_state = interpreter_create();
if (interpreter_state == NULL) return 1;
Boolean success = exec_file(interpreter_state, filename);
interpreter_delete(interpreter_state);
if (success) return 0;
else return 1;
}