Pulled preproc init and free into their own function so that
authorLukas Krickl <lukas@krickl.dev>
Mon, 13 Nov 2023 04:37:33 +0000 (05:37 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 13 Nov 2023 04:37:33 +0000 (05:37 +0100)
recrusive preproc parses may initialize their own buffers if needed

include/ulas.h
src/ulas.c

index fc6738d8828af81a6e7ea48a515ef7e3cd539507..6fe20a95b3debc1863751343a3d7c4d2ec626dbd 100644 (file)
@@ -256,6 +256,9 @@ void ulas_strfree(struct ulas_str *s);
  * Preprocessor
  */
 
+struct ulas_preproc ulas_preprocinit(void);
+void ulas_preprocfree(struct ulas_preproc *pp);
+
 /**
  * Tokenize and apply the preprocessor
  * returns 0: no error
@@ -278,6 +281,7 @@ int ulas_preprocnext(struct ulas_preproc *pp, FILE *dst, FILE *src, char *buf,
 //          -1 on error
 //  Warning: calling this recursively may clobber pp buffers and those should
 //  not be used in the caller after recursvion finishes!
+//  or initialize a new preproc object if the old state is important! (preprocinit and preprocfree)
 int ulas_preprocline(struct ulas_preproc *pp, FILE *dst, FILE *src,
                      const char *raw_line, size_t n);
 
index 94037d20c3d4f47915dad0b9217ea53d3b67973a..10851b6593865ea09ab81d1c36f95099ffb56e42 100644 (file)
@@ -634,43 +634,52 @@ int ulas_preprocnext(struct ulas_preproc *pp, FILE *dst, FILE *src, char *buf,
   return rc;
 }
 
-int ulas_preproc(FILE *dst, FILE *src) {
-  char buf[ULAS_LINEMAX];
-  memset(buf, 0, ULAS_LINEMAX);
-  int rc = 0;
-
-  // init
+struct ulas_preproc ulas_preprocinit(void) {
   struct ulas_preproc pp = {NULL, 0, ulas_str(1), ulas_str(1)};
   for (size_t i = 0; i < ULAS_MACROPARAMMAX; i++) {
     pp.macroparam[i] = ulas_str(8);
   }
   pp.macrobuf = ulas_str(8);
+  return pp;
+}
 
-  // preproc
-  while ((rc = ulas_preprocnext(&pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
-  }
-
-  // cleanup
-  ulas_strfree(&pp.line);
-  ulas_strfree(&pp.tok);
+void ulas_preprocfree(struct ulas_preproc *pp) {
+  ulas_strfree(&pp->line);
+  ulas_strfree(&pp->tok);
 
-  for (size_t i = 0; i < pp.defslen; i++) {
-    if (pp.defs[i].name) {
-      free(pp.defs[i].name);
+  for (size_t i = 0; i < pp->defslen; i++) {
+    if (pp->defs[i].name) {
+      free(pp->defs[i].name);
     }
-    if (pp.defs[i].value) {
-      free(pp.defs[i].value);
+    if (pp->defs[i].value) {
+      free(pp->defs[i].value);
     }
   }
 
   for (size_t i = 0; i < ULAS_MACROPARAMMAX; i++) {
-    ulas_strfree(&pp.macroparam[i]);
+    ulas_strfree(&pp->macroparam[i]);
   }
-  ulas_strfree(&pp.macrobuf);
+  ulas_strfree(&pp->macrobuf);
 
-  if (pp.defs) {
-    free(pp.defs);
+  if (pp->defs) {
+    free(pp->defs);
   }
+}
+
+int ulas_preproc(FILE *dst, FILE *src) {
+  char buf[ULAS_LINEMAX];
+  memset(buf, 0, ULAS_LINEMAX);
+  int rc = 0;
+
+  // init
+  struct ulas_preproc pp = ulas_preprocinit();
+
+  // preproc
+  while ((rc = ulas_preprocnext(&pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
+  }
+
+  // cleanup
+  ulas_preprocfree(&pp);
 
   return rc;
 }