Added 2-pass code when stdin is not stin
authorLukas Krickl <lukas@krickl.dev>
Wed, 29 Nov 2023 14:31:32 +0000 (15:31 +0100)
committerLukas Krickl <lukas@krickl.dev>
Wed, 29 Nov 2023 14:31:32 +0000 (15:31 +0100)
include/ulas.h
src/ulas.c

index ad09376ada1b660df4ac68dca23eb06959945537..ea501184f5973a390363d06adbc7ef22ef0f0ae6 100644 (file)
@@ -174,9 +174,8 @@ struct ulas_symbuf {
  */
 
 enum ulas_pass {
-  ULAS_PASS_END = 0,
-  ULAS_PASS_FINAL = 1,
-  ULAS_PASS_RESOLVE = 2,
+  ULAS_PASS_FINAL = 0,
+  ULAS_PASS_RESOLVE = 1,
 };
 
 struct ulas {
index 49eae6c496b60cd3bec7b8d41b9bbddcb5b0aed4..3df363147b270fe16825a08bdef3092511ed9199 100644 (file)
@@ -4,7 +4,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
-#include <unistd.h>
 
 FILE *ulasin = NULL;
 FILE *ulasout = NULL;
@@ -112,25 +111,41 @@ int ulas_main(struct ulas_config cfg) {
     ulasin = ulas_fopen(cfg.argv[0], "re", stdin);
   }
 
+  // only do 2 pass if we have a file as input
+  // because  we cannot really rewind stdout
+  if (!cfg.preproc_only && ulasin != stdin) {
+    ulas.pass = ULAS_PASS_RESOLVE;
+  }
+
   FILE *preprocdst = NULL;
+  while (ulas.pass >= 0) {
+    if (ulascfg.verbose) {
+      fprintf(ulaserr, "[Pass %d]\n", ulas.pass);
+    }
 
-  if (cfg.preproc_only) {
-    preprocdst = ulasout;
-  } else {
-    preprocdst = tmpfile();
-  }
+    // FIXME: it would be nice if we could do the 2 pass by clearing the
+    // tmpfile instead of making an entierly new one
+    if (cfg.preproc_only) {
+      preprocdst = ulasout;
+    } else {
+      preprocdst = tmpfile();
+    }
 
-  if (ulas_preproc(preprocdst, ulasin) == -1) {
-    rc = -1;
-    goto cleanup;
-  }
+    if (ulas_preproc(preprocdst, ulasin) == -1) {
+      rc = -1;
+      goto cleanup;
+    }
 
-  if (cfg.preproc_only) {
-    goto cleanup;
+    if (ulas.pass > ULAS_PASS_FINAL) {
+      fclose(preprocdst);
+      preprocdst = NULL;
+      rewind(ulasin);
+    }
+    ulas.pass -= 1;
   }
 
 cleanup:
-  if (!cfg.preproc_only) {
+  if (!cfg.preproc_only && preprocdst) {
     ulas_fclose(preprocdst);
   }