From a6e65bacaf86ae80e7f9e1be8e6631bb78a2229e Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Wed, 27 Dec 2023 18:08:28 +0100 Subject: [PATCH] Fixed preproc recursive replacement in a better way --- src/test.c | 8 +++++--- src/ulas.c | 18 +++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/test.c b/src/test.c index 66091a2..1238ab6 100644 --- a/src/test.c +++ b/src/test.c @@ -87,6 +87,7 @@ void test_strbuf(void) { assert(ulas_preproc(dst, src) == (expect_ret)); \ fclose(src); \ fclose(dst); \ + puts(dstbuf); \ assert(strcmp(dstbuf, (expect_dst)) == 0); \ } @@ -104,9 +105,10 @@ void test_preproc(void) { assert_preproc("", -1, " #define\n"); assert_preproc("this is a 123 for defs", 0, " #define test 123\nthis is a test for defs"); - // define used inside define - assert_preproc("this is a 123 for defs", 0, - " #define ftest 123\n#define test ftest\nthis is a test for defs"); + // define used inside define + assert_preproc( + "this is a 123 for defs", 0, + " #define ftest 123\n#define test ftest\nthis is a test for defs"); // undefined assert_preproc("123\ntest", 0, diff --git a/src/ulas.c b/src/ulas.c index da38d98..c850bdf 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -707,23 +707,27 @@ char *ulas_preprocexpand(struct ulas_preproc *pp, const char *raw_line, int read = 0; int first_tok = 1; + int skip_next_tok = 0; // go through all tokens, see if a define matches the token, // if so expand it // only expand macros if they match toks[0] though! // otherwise memcpy the read bytes 1:1 into the new string while ((read = ulas_tok(&pp->tok, &praw_line, *n))) { + struct ulas_ppdef *def = + ulas_preprocgetdef(pp, pp->tok.buf, pp->tok.maxlen); + ; + // if it is the first token, and it begins with a # do not process at all! - // only apply this to certain preproc types such as #undefine, #ifdef and #ifndef - if (first_tok && pp->tok.buf[0] == ULAS_TOK_PREPROC_BEGIN && strcmp(ULAS_PPSTR_DEF, pp->tok.buf) != 0) { - ulas_strensr(&pp->line, (*n) + 1); - strncat(pp->line.buf, raw_line, *n); - break; + // if the first token is a # preproc directive skip the second token at all + // times + if ((first_tok && pp->tok.buf[0] == ULAS_TOK_PREPROC_BEGIN) || + skip_next_tok) { + def = NULL; + skip_next_tok = !skip_next_tok; } first_tok = 0; - struct ulas_ppdef *def = - ulas_preprocgetdef(pp, pp->tok.buf, pp->tok.maxlen); if (def) { // if so... expand now and leave switch (def->type) { -- 2.30.2