From d52563eb53e3fd0bce0146a5d56fb3d07c74879c Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Mon, 13 Nov 2023 05:37:33 +0100 Subject: [PATCH] Pulled preproc init and free into their own function so that recrusive preproc parses may initialize their own buffers if needed --- include/ulas.h | 4 ++++ src/ulas.c | 53 +++++++++++++++++++++++++++++--------------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/ulas.h b/include/ulas.h index fc6738d..6fe20a9 100644 --- a/include/ulas.h +++ b/include/ulas.h @@ -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); diff --git a/src/ulas.c b/src/ulas.c index 94037d2..10851b6 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -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; } -- 2.30.2