summaryrefslogtreecommitdiff
path: root/src/mesa/shader/program_lexer.l
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2009-10-28 11:33:51 -0600
committerBrian Paul <brianp@vmware.com>2009-10-28 11:33:51 -0600
commit7d56caabe45e91a67096804c7e341d04d01db7aa (patch)
tree1632cea88f33bf4fe39d198185596d05d44d83bb /src/mesa/shader/program_lexer.l
parent182ff3e47a2d18917cdf3344c2ce95bd0a460784 (diff)
parent0219cd0961e6b47761fe6984dc6c0a8bfa6057d8 (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.l45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/mesa/shader/program_lexer.l b/src/mesa/shader/program_lexer.l
index e2acb3c0c9..b50fb3c7dc 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)
{