diff options
Diffstat (limited to 'src/glsl/pp/sl_pp_context.c')
-rw-r--r-- | src/glsl/pp/sl_pp_context.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/glsl/pp/sl_pp_context.c b/src/glsl/pp/sl_pp_context.c index afc1b84d16..74a9bdddfd 100644 --- a/src/glsl/pp/sl_pp_context.c +++ b/src/glsl/pp/sl_pp_context.c @@ -32,7 +32,8 @@ struct sl_pp_context * -sl_pp_context_create(void) +sl_pp_context_create(const char *input, + const struct sl_pp_purify_options *options) { struct sl_pp_context *context; @@ -46,19 +47,30 @@ sl_pp_context_create(void) return NULL; } - context->getc_buf = malloc(64 * sizeof(char)); + context->getc_buf_capacity = 64; + context->getc_buf = malloc(context->getc_buf_capacity * sizeof(char)); if (!context->getc_buf) { sl_pp_context_destroy(context); return NULL; } + if (sl_pp_token_buffer_init(&context->tokens, context)) { + sl_pp_context_destroy(context); + return NULL; + } + context->macro_tail = &context->macro; context->if_ptr = SL_PP_MAX_IF_NESTING; context->if_value = 1; memset(context->error_msg, 0, sizeof(context->error_msg)); + context->error_line = 1; context->line = 1; context->file = 0; + sl_pp_purify_state_init(&context->pure, input, options); + + memset(&context->process_state, 0, sizeof(context->process_state)); + return context; } @@ -69,6 +81,8 @@ sl_pp_context_destroy(struct sl_pp_context *context) free(context->cstr_pool); sl_pp_macro_free(context->macro); free(context->getc_buf); + sl_pp_token_buffer_destroy(&context->tokens); + free(context->process_state.out); free(context); } } @@ -79,6 +93,19 @@ sl_pp_context_error_message(const struct sl_pp_context *context) return context->error_msg; } +void +sl_pp_context_error_position(const struct sl_pp_context *context, + unsigned int *file, + unsigned int *line) +{ + if (file) { + *file = 0; + } + if (line) { + *line = context->error_line; + } +} + int sl_pp_context_add_predefined(struct sl_pp_context *context, const char *name, |