diff options
author | Michal Krol <[email protected]> | 2008-12-18 18:45:32 +0100 |
---|---|---|
committer | Brian Paul <[email protected]> | 2008-12-18 11:11:59 -0700 |
commit | d9b92b112fb64005c71edf1158f7dffabc4659bb (patch) | |
tree | dab8137ca3fb24ff45399dfb23ebc9d80e7e44f6 | |
parent | f43019b226b6fa896715f222f7b6bbe5dbccdb37 (diff) |
glsl: Fix handling of nested parens in macro actual arguments.
-rw-r--r-- | src/mesa/shader/slang/slang_preprocess.c | 17 |
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 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. */ |