#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!", stderr); return (struct ReadSrcResult){ .success = false, }; } const long bufsize = ftell(fp); if (bufsize == -1) { fputs("Error getting file size!", 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!", stderr); return (struct ReadSrcResult){ .success = false, }; } fread(src, sizeof(char), bufsize, fp); if (ferror(fp) != 0) { fputs("Error reading file!", 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!", stderr); return 1; } FILE *fp = fopen(argv[1], "rb"); if (fp == NULL) { fputs("Error opening file!", 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_keys_max_len = 0, }; const bool run_res = hydroforth.run(&interpreter); free(res.src); if (!run_res) { return 1; } } else { free(res.src); return 1; } return 0; }