properly fail on nonexistent file
authorcassowarii <2374677+cassowarii@users.noreply.github.com>
Fri, 19 Jun 2026 06:13:38 +0000 (23:13 -0700)
committercassowarii <2374677+cassowarii@users.noreply.github.com>
Fri, 19 Jun 2026 06:13:38 +0000 (23:13 -0700)
src/main.c
src/parse/filereader.c
src/parse/filereader.h

index edcc69f..b91319e 100644 (file)
@@ -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;
index 4f18799..579e5dc 100644 (file)
@@ -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);
 }
index 145ac6d..06ba22b 100644 (file)
@@ -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);