Moved preprocessor definition to ulas struct
authorLukas Krickl <lukas@krickl.dev>
Wed, 29 Nov 2023 16:44:43 +0000 (17:44 +0100)
committerLukas Krickl <lukas@krickl.dev>
Wed, 29 Nov 2023 16:44:43 +0000 (17:44 +0100)
include/ulas.h
src/test.c
src/ulas.c

index 9e4698acc6b01a6dfe37a5031ace6afc82ed4874..307cb14c0e0ce098eecc99e9fe905e966ec84e42 100644 (file)
@@ -186,7 +186,21 @@ enum ulas_pass {
   ULAS_PASS_RESOLVE = 1,
 };
 
+struct ulas_preproc {
+  struct ulas_ppdef *defs;
+  unsigned long defslen;
+
+  struct ulas_str tok;
+  struct ulas_str line;
+
+  // macro parameter buffers
+  struct ulas_str macroparam[ULAS_MACROPARAMMAX];
+  // macro expansion buffer
+  struct ulas_str macrobuf;
+};
+
 struct ulas {
+  struct ulas_preproc pp;
   char *filename;
   char *initial_filename;
   unsigned long line;
@@ -257,19 +271,6 @@ struct ulas_ppdef {
   int undef;
 };
 
-struct ulas_preproc {
-  struct ulas_ppdef *defs;
-  unsigned long defslen;
-
-  struct ulas_str tok;
-  struct ulas_str line;
-
-  // macro parameter buffers
-  struct ulas_str macroparam[ULAS_MACROPARAMMAX];
-  // macro expansion buffer
-  struct ulas_str macrobuf;
-};
-
 /**
  * Expressions
  *
@@ -448,6 +449,7 @@ void ulas_strfree(struct ulas_str *s);
  */
 
 struct ulas_preproc ulas_preprocinit(void);
+void ulas_preprocclear(struct ulas_preproc *pp);
 void ulas_preprocfree(struct ulas_preproc *pp);
 
 /**
index d5e2bd987141e7c15428e3bc8f0a25931412ba26..6f23ad3e92ec935e7514d2337a13226b87831cb8 100644 (file)
@@ -79,6 +79,7 @@ void test_strbuf(void) {
 
 #define assert_preproc(expect_dst, expect_ret, input)                          \
   {                                                                            \
+    ulas_preprocclear(&ulas.pp);                                               \
     ulas.pass = ULAS_PASS_RESOLVE;                                             \
     char dstbuf[ULAS_LINEMAX];                                                 \
     memset(dstbuf, 0, ULAS_LINEMAX);                                           \
index dad70051ae4729ae2efd87c8473679412f0111c3..68a4e3c366fdbeab27050e5d35e3ab6db4696744 100644 (file)
@@ -41,6 +41,7 @@ void ulas_init(struct ulas_config cfg) {
   ulas.toks = ulas_tokbuf();
   ulas.exprs = ulas_exprbuf();
   ulas.syms = ulas_symbuf();
+  ulas.pp = ulas_preprocinit();
 }
 
 void ulas_nextpass(void) {
@@ -56,6 +57,7 @@ void ulas_free(void) {
   ulas_tokbuffree(&ulas.toks);
   ulas_exprbuffree(&ulas.exprs);
   ulas_symbuffree(&ulas.syms);
+  ulas_preprocfree(&ulas.pp);
 }
 
 int ulas_icntr(void) { return ulas.icntr++; }
@@ -902,10 +904,7 @@ struct ulas_preproc ulas_preprocinit(void) {
   return pp;
 }
 
-void ulas_preprocfree(struct ulas_preproc *pp) {
-  ulas_strfree(&pp->line);
-  ulas_strfree(&pp->tok);
-
+void ulas_preprocclear(struct ulas_preproc *pp) {
   for (unsigned long i = 0; i < pp->defslen; i++) {
     if (pp->defs[i].name) {
       free(pp->defs[i].name);
@@ -915,6 +914,15 @@ void ulas_preprocfree(struct ulas_preproc *pp) {
     }
   }
 
+  pp->defslen = 0;
+}
+
+void ulas_preprocfree(struct ulas_preproc *pp) {
+  ulas_strfree(&pp->line);
+  ulas_strfree(&pp->tok);
+
+  ulas_preprocclear(pp);
+
   for (unsigned long i = 0; i < ULAS_MACROPARAMMAX; i++) {
     ulas_strfree(&pp->macroparam[i]);
   }
@@ -932,11 +940,10 @@ int ulas_preproc(FILE *dst, FILE *src) {
   int rc = 0;
 
   // init
-  struct ulas_preproc pp = ulas_preprocinit();
 
   long prevseek = ftell(asmsrc);
   // preproc
-  while ((rc = ulas_preprocnext(&pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
+  while ((rc = ulas_preprocnext(&ulas.pp, dst, src, buf, ULAS_LINEMAX)) > 0) {
     if (ulascfg.preproc_only) {
       continue;
     }
@@ -951,9 +958,6 @@ int ulas_preproc(FILE *dst, FILE *src) {
   }
 
 fail:
-  // cleanup
-  ulas_preprocfree(&pp);
-
   return rc;
 }