]> git.mar77i.info Git - shitscript/commitdiff
specify fh in parser
authormar77i <mar77i@protonmail.ch>
Mon, 18 Nov 2024 17:36:49 +0000 (18:36 +0100)
committermar77i <mar77i@protonmail.ch>
Mon, 18 Nov 2024 17:36:49 +0000 (18:36 +0100)
parser.c
parser.h
shitscript.c

index d22a72f04e77f00ffe387078a980a9f46dce9083..e5d7d2d73c37c7088d57bc54a2d5ae56844167e4 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -8,10 +8,10 @@
 #include "growable.h"
 #include "parser.h"
 
-static inline int read_number(struct ast_item *ai) {
+static inline int read_number(FILE *fh, struct ast_item *ai) {
     int c;
     intmax_t new_value;
-    while (isdigit(c = getc(stdin))) {
+    while (isdigit(c = getc(fh))) {
         new_value = ai->u.i * 10 + c - '0';
         if (new_value / 10 != ai->u.i) {
             fprintf(stderr, "Error: Overflow.\n");
@@ -20,37 +20,41 @@ static inline int read_number(struct ast_item *ai) {
         ai->u.i = new_value;
     }
     if (c != EOF)
-        ungetc(c, stdin);
+        ungetc(c, fh);
     return 0;
 }
 
-static inline int read_ident_or_keyword(int c, struct ast_item *ai) {
-    struct growable s = EMPTY_GROWABLE(1);
+static inline int read_ident_or_keyword(
+    FILE *fh, struct growable *buffer, int c, struct ast_item *ai
+) {
+    buffer->len = 0;
     do {
-        if (growable_grow(&s, s.len + 1) < 0)
+        if (growable_grow(buffer, buffer->len + 1) < 0)
             return -1;
-        ((char*)s.data)[s.len++] = c;
-        c = getc(stdin);
+        ((char*)buffer->data)[buffer->len++] = c;
+        c = getc(fh);
     } while (isalnum(c) || c == '_');
     if (c != EOF)
-        ungetc(c, stdin);
-    if (growable_grow(&s, s.len + 1) < 0)
+        ungetc(c, fh);
+    if (growable_grow(buffer, buffer->len + 1) < 0)
         return -1;
-    ((char*)s.data)[s.len++] = '\0';
-    if (strcasecmp(s.data, "goto") == 0) {
+    if (buffer->len == 4 && strncasecmp(buffer->data, "goto", 4) == 0) {
         ai->type = AST_ITEM_GOTO;
-        growable_cleanup(s);
         return 0;
     }
     ai->type = AST_ITEM_IDENT;
-    ai->u.s = s.data;
+    ai->u.s = strndup(buffer->data, buffer->len);
+    if (ai->u.s == NULL) {
+        perror("strndup");
+        return -1;
+    }
     return 0;
 }
 
-int parse_input(struct program *p) {
+int parse_input(FILE *fh, struct program *p) {
     int c;
     struct ast_item ai;
-    while ((c = getc(stdin)) != EOF) {
+    while ((c = getc(fh)) != EOF) {
         memset(&ai.u, 0, sizeof ai.u);
         switch (c) {
         case '+':
@@ -91,11 +95,11 @@ int parse_input(struct program *p) {
         if (isdigit(c)) {
             ai.type = AST_ITEM_INT;
             ai.u.i = c - '0';
-            if (read_number(&ai) < 0)
+            if (read_number(fh, &ai) < 0)
                 return -1;
             goto add_item;
         } else if (isalpha(c) || c == '_') {
-            if (read_ident_or_keyword(c, &ai) < 0)
+            if (read_ident_or_keyword(fh, &p->buffer, c, &ai) < 0)
                 return -1;
             goto add_item;
         } else if (isspace(c))
@@ -107,7 +111,7 @@ add_item:
             return -1;
         memcpy(&GET_ITEM(*p, p->ast_items.len++), &ai, sizeof ai);
     }
-    if (ferror(stdin)) {
+    if (ferror(fh)) {
         fprintf(stderr, "Error: read error.\n");
         return -1;
     }
index 9189ab93bf129fc1cfe1b57bd4b284c8108292b0..0a33a982adc1148e7a857e8721dbf5436a676de4 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -6,6 +6,6 @@
 
 #include "shitscript.h"
 
-int parse_input(struct program *p);
+int parse_input(FILE *fh, struct program *p);
 
 #endif // PARSER_H
index 28d44780eecef3ed36ff44b95b4d2b8e2046e84e..e12882219194c238c9595264171628b946ecd821 100644 (file)
@@ -55,10 +55,9 @@ int main(void) {
         .buffer = EMPTY_GROWABLE(sizeof (char)),
     };
     int ret = EXIT_FAILURE;
-    if (parse_input(&p) < 0)
+    if (parse_input(stdin, &p) < 0)
         goto error;
     growable_cleanup(p.buffer);
-    // p.buffer = EMPTY_GROWABLE(sizeof char);
     if (run_ast_items(p) < 0)
         goto error;
     ret = EXIT_SUCCESS;