From 7b5a3538d5cffbeea5088338270bf07f1a4c9632 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Wed, 29 Nov 2023 17:44:43 +0100 Subject: [PATCH] Moved preprocessor definition to ulas struct --- include/ulas.h | 28 +++++++++++++++------------- src/test.c | 1 + src/ulas.c | 22 +++++++++++++--------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/include/ulas.h b/include/ulas.h index 9e4698a..307cb14 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -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); /** diff --git a/src/test.c b/src/test.c index d5e2bd9..6f23ad3 100644 --- a/src/test.c +++ b/src/test.c @@ -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); \ diff --git a/src/ulas.c b/src/ulas.c index dad7005..68a4e3c 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -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; } -- 2.30.2