From a795e79f87909f687dba9ddd09c5bc46cc6e9228 Mon Sep 17 00:00:00 2001 From: Michal Krol Date: Thu, 18 Dec 2008 18:45:32 +0100 Subject: [PATCH] glsl: Fix handling of nested parens in macro actual arguments. --- src/mesa/shader/slang/slang_preprocess.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c index 786f6467c93..7d971627f57 100644 --- a/src/mesa/shader/slang/slang_preprocess.c +++ b/src/mesa/shader/slang/slang_preprocess.c @@ -641,8 +641,10 @@ expand_symbol (expand_state *e, pp_symbol *symbol) SKIP_WHITE(e->input); /* Parse macro actual parameters. This can be anything, separated by a colon. - * TODO: What about nested/grouped parameters by parenthesis? */ + */ for (i = 0; i < symbol->parameters.count; i++) { + GLuint nested_paren_count = 0; /* track number of nested parentheses */ + if (*e->input == ')') { slang_info_log_error (e->state->elog, "preprocess error: unexpected ')'."); return GL_FALSE; @@ -650,8 +652,19 @@ expand_symbol (expand_state *e, pp_symbol *symbol) /* Eat all characters up to the comma or closing parentheses. */ pp_symbol_reset (&symbol->parameters.symbols[i]); - while (!IS_NULL(*e->input) && *e->input != ',' && *e->input != ')') + while (!IS_NULL(*e->input)) { + /* Exit loop only when all nested parens have been eaten. */ + if (nested_paren_count == 0 && (*e->input == ',' || *e->input == ')')) + break; + + /* Actually count nested parens here. */ + if (*e->input == '(') + nested_paren_count++; + else if (*e->input == ')') + nested_paren_count--; + slang_string_pushc (&symbol->parameters.symbols[i].replacement, *e->input++); + } /* If it was not the last paremeter, skip the comma. Otherwise, skip the * closing parentheses. */ -- 2.30.2