diff options
author | Brian Paul <[email protected]> | 2009-10-28 11:33:51 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-10-28 11:33:51 -0600 |
commit | 7d56caabe45e91a67096804c7e341d04d01db7aa (patch) | |
tree | 1632cea88f33bf4fe39d198185596d05d44d83bb /src/mesa/shader/program_lexer.l | |
parent | 182ff3e47a2d18917cdf3344c2ce95bd0a460784 (diff) | |
parent | 0219cd0961e6b47761fe6984dc6c0a8bfa6057d8 (diff) |
Merge branch 'mesa_7_6_branch'
Conflicts:
src/mesa/shader/lex.yy.c
src/mesa/shader/program_lexer.l
Diffstat (limited to 'src/mesa/shader/program_lexer.l')
-rw-r--r-- | src/mesa/shader/program_lexer.l | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/mesa/shader/program_lexer.l b/src/mesa/shader/program_lexer.l index e2acb3c0c96..b50fb3c7dc2 100644 --- a/src/mesa/shader/program_lexer.l +++ b/src/mesa/shader/program_lexer.l @@ -46,7 +46,8 @@ if (condition) { \ return token; \ } else { \ - return handle_ident(yyextra, yytext, yylval); \ + yylval->string = return_string(yyextra, yytext); \ + return IDENTIFIER; \ } \ } while (0) @@ -70,13 +71,53 @@ yylval->temp_inst.Opcode = OPCODE_ ## opcode; \ return token; \ } else { \ - return handle_ident(yyextra, yytext, yylval); \ + yylval->string = return_string(yyextra, yytext); \ + return IDENTIFIER; \ } \ } while (0) #define SWIZZLE_INVAL MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \ SWIZZLE_NIL, SWIZZLE_NIL) +/** + * Send a string to the parser using asm_parser_state::string_dumpster + * + * Sends a string to the parser using asm_parser_state::string_dumpster as a + * temporary storage buffer. Data previously stored in + * asm_parser_state::string_dumpster will be lost. If + * asm_parser_state::string_dumpster is not large enough to hold the new + * string, the buffer size will be increased. The buffer size is \b never + * decreased. + * + * \param state Assembler parser state tracking + * \param str String to be passed to the parser + * + * \return + * A pointer to asm_parser_state::string_dumpster on success or \c NULL on + * failure. Currently the only failure case is \c ENOMEM. + */ +static char * +return_string(struct asm_parser_state *state, const char *str) +{ + const size_t len = strlen(str); + + if (len >= state->dumpster_size) { + char *const dumpster = _mesa_realloc(state->string_dumpster, + state->dumpster_size, + len + 1); + if (dumpster == NULL) { + return NULL; + } + + state->string_dumpster = dumpster; + state->dumpster_size = len + 1; + } + + memcpy(state->string_dumpster, str, len + 1); + return state->string_dumpster; +} + + static unsigned mask_from_char(char c) { |