#include #include #include #include "hydroforth/hydroforth.h" struct ReadSrcResult { bool success; char *const src; }; struct ReadSrcResult read_src(FILE *fp) { if (fseek(fp, 0L, SEEK_END) != 0) { fputs("Error seeking to file end!\n", stderr); return (struct ReadSrcResult){ .success = false, }; } const long bufsize = ftell(fp); if (bufsize == -1) { fputs("Error getting file size!\n", stderr); return (struct ReadSrcResult){ .success = false, }; } char *const src = malloc(sizeof(char) * bufsize); if (fseek(fp, 0L, SEEK_SET) != 0) { fputs("Error rewinding file to start!\n", stderr); return (struct ReadSrcResult){ .success = false, }; } fread(src, sizeof(char), bufsize, fp); if (ferror(fp) != 0) { fputs("Error reading file!\n", stderr); return (struct ReadSrcResult){ .success = false, }; } return (struct ReadSrcResult){ .success = true, .src = src, }; } int main(int argc, char *argv[]) { if (argc < 2) { fputs("No source file specified!\n", stderr); return 1; } FILE *fp = fopen(argv[1], "r"); if (fp == NULL) { fputs("Error opening file!\n", stderr); return 1; } const struct ReadSrcResult res = read_src(fp); fclose(fp); if (res.success) { HYDROFORTH__INTERPRETER interpreter = { .src = res.src, .pos = 0, .single_char_word_keys_len = 0, .word_keys_len = 0, .word_definitions_len = 0, }; HYDROFORTH__RESULT result = {.error = OK, .backtrace_len = 0}; hydroforth.run(&result, &interpreter); free(interpreter.src); if (result.error) { hydroforth__add_func_backtrace(&result); return hydroforth.result.unwrap(&result, 1); } } else { free(res.src); return 1; } return 0; }