94 lines
1.8 KiB
C
94 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <malloc.h>
|
|
|
|
#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;
|
|
}
|