From: cassowarii <2374677+cassowarii@users.noreply.github.com> Date: Fri, 19 Jun 2026 06:13:38 +0000 (-0700) Subject: properly fail on nonexistent file X-Git-Url: https://www.git.cassowary.me/gitweb.cgi?a=commitdiff_plain;h=6f68189e567e9554b538187d2f003c22a1e36654;p=sarabande.git properly fail on nonexistent file --- diff --git a/src/main.c b/src/main.c index edcc69f..b91319e 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,11 @@ int main(int argc, char **argv) { if (argc == 2) { hFileReader fr = sbFileReader_open(argv[1]); + if (!sbFileReader_ok(fr)) { + fprintf(stderr, "Error getting input stream.\n"); + return -1; + } + hScanner sc = sbScanner_create(fr); sbLexToken t; diff --git a/src/parse/filereader.c b/src/parse/filereader.c index 4f18799..579e5dc 100644 --- a/src/parse/filereader.c +++ b/src/parse/filereader.c @@ -6,33 +6,49 @@ * we may also want to have multiple files open for imports and stuff... */ struct sbFileReader { + flag valid; FILE *file; }; hFileReader sbFileReader_open(const char *filename) { - hFileReader fr = malloc(sizeof(struct sbFileReader)); - fr->file = fopen(filename, "r"); - if (!fr->file) { - perror("Error opening file for reading:"); + hFileReader r = malloc(sizeof(struct sbFileReader)); + r->file = fopen(filename, "r"); + if (!r->file) { + perror("Error opening file for reading"); + r->valid = 0; } else { - return fr; + r->valid = 1; } - return fr; + return r; } -char sbFileReader_next(hFileReader r) { - char c = fgetc(r->file); - return c; +flag sbFileReader_ok(hFileReader r) { + return r->valid; } -char sbFileReader_peek(hFileReader r) { - char c = fgetc(r->file); - ungetc(c, r->file); - return c; +int sbFileReader_next(hFileReader r) { + if (r->valid) { + char c = fgetc(r->file); + return c; + } else { + return EOF; + } +} + +int sbFileReader_peek(hFileReader r) { + if (r->valid) { + char c = fgetc(r->file); + ungetc(c, r->file); + return c; + } else { + return EOF; + } } void sbFileReader_close(hFileReader r) { - fclose(r->file); + if (r->valid) { + fclose(r->file); + } free(r); } diff --git a/src/parse/filereader.h b/src/parse/filereader.h index 145ac6d..06ba22b 100644 --- a/src/parse/filereader.h +++ b/src/parse/filereader.h @@ -4,8 +4,10 @@ typedef struct sbFileReader *hFileReader; hFileReader sbFileReader_open(const char *filename); -char sbFileReader_next(hFileReader r); +flag sbFileReader_ok(hFileReader r); -char sbFileReader_peek(hFileReader r); +int sbFileReader_next(hFileReader r); + +int sbFileReader_peek(hFileReader r); void sbFileReader_close(hFileReader r);