summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Krol <michal@tungstengraphics.com>2008-12-18 18:45:32 +0100
committerBrian Paul <brian.paul@tungstengraphics.com>2008-12-18 14:17:06 -0700
commita795e79f87909f687dba9ddd09c5bc46cc6e9228 (patch)
tree1fe8c7a16e1cd58e5da7d36979bfa06bfa0333c9
parent6c14bdc72fd033356cc94633622f1360591d565d (diff)
glsl: Fix handling of nested parens in macro actual arguments.
-rw-r--r--src/mesa/shader/slang/slang_preprocess.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c
index 786f6467c9..7d971627f5 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. */