From 046dfd9712b3b9e6554f8949b212a0f5eff70eae Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 18 Feb 2009 20:08:01 -0500 Subject: [PATCH] Fold predefined macros into a virtual #include at the start of input. This will let us reuse the #define parser for defines pushed through the public API. --- mojoshader_preprocessor.c | 41 ++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/mojoshader_preprocessor.c b/mojoshader_preprocessor.c index 734000ee..8e4d9b4f 100644 --- a/mojoshader_preprocessor.c +++ b/mojoshader_preprocessor.c @@ -595,6 +595,13 @@ static void pop_source(Context *ctx) } // pop_source +static void close_define_include(const char *data, MOJOSHADER_malloc m, + MOJOSHADER_free f, void *d) +{ + f((void *) data, d); +} // close_define_include + + Preprocessor *preprocessor_start(const char *fname, const char *source, unsigned int sourcelen, MOJOSHADER_includeOpen open_callback, @@ -623,18 +630,42 @@ Preprocessor *preprocessor_start(const char *fname, const char *source, ctx->open_callback = open_callback; ctx->close_callback = close_callback; - for (i = 0; i < define_count; i++) + // let the usual preprocessor parser sort these out. + char *define_include = NULL; + unsigned int define_include_len = 0; + if (define_count > 0) { - if (!add_define(ctx, defines[i]->identifier, defines[i]->definition, 1)) + for (i = 0; i < define_count; i++) { + define_include_len += strlen(defines[i]->identifier); + define_include_len += strlen(defines[i]->definition); + define_include_len += 10; // "#define" + } // for + define_include_len++; // for null terminator. + + define_include = (char *) Malloc(ctx, define_include_len); + if (define_include == NULL) okay = 0; - break; - } // if - } // for + else + { + char *ptr = define_include; + for (i = 0; i < define_count; i++) + { + ptr += sprintf(ptr, "#define %s %s\n", defines[i]->identifier, + defines[i]->definition); + } // for + } // else + } // if if ((okay) && (!push_source(ctx, fname, source, sourcelen, 1, NULL))) okay = 0; + if ((okay) && (define_include != NULL)) + { + okay = push_source(ctx, "", define_include, + define_include_len, 1, close_define_include); + } // if + if (!okay) { preprocessor_end((Preprocessor *) ctx);