diff options
author | Michal Krol <[email protected]> | 2009-06-21 17:03:15 +0200 |
---|---|---|
committer | Michal Krol <[email protected]> | 2009-09-07 10:11:46 +0200 |
commit | 5e8e3cddae9b2797cfa525c643c701debe2f4c04 (patch) | |
tree | 8eeb6a4d1a2e72251d483620c73c5f2cc6b5d5b6 /src | |
parent | fd991d845a5f639b9b675a4840ad234c151d56b4 (diff) |
glsl: Rename sl_pp_context_add_str to sl_pp_context_add_unique_str.
Return the same offset for same strings. Allows to compare strings
by comparing their's offsets.
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/pp/sl_pp_context.c | 20 | ||||
-rw-r--r-- | src/glsl/pp/sl_pp_context.h | 4 | ||||
-rw-r--r-- | src/glsl/pp/sl_pp_token.c | 4 | ||||
-rw-r--r-- | src/glsl/pp/sl_pp_token.h | 2 |
4 files changed, 23 insertions, 7 deletions
diff --git a/src/glsl/pp/sl_pp_context.c b/src/glsl/pp/sl_pp_context.c index 8722376ae52..6d3076b8697 100644 --- a/src/glsl/pp/sl_pp_context.c +++ b/src/glsl/pp/sl_pp_context.c @@ -43,14 +43,28 @@ sl_pp_context_destroy(struct sl_pp_context *context) } int -sl_pp_context_add_str(struct sl_pp_context *context, - const char *str) +sl_pp_context_add_unique_str(struct sl_pp_context *context, + const char *str) { unsigned int size; - unsigned int offset; + unsigned int offset = 0; size = strlen(str) + 1; + /* Find out if this is a unique string. */ + while (offset < context->cstr_pool_len) { + const char *str2; + unsigned int size2; + + str2 = &context->cstr_pool[offset]; + size2 = strlen(str2) + 1; + if (size == size2 && !memcmp(str, str2, size - 1)) { + return offset; + } + + offset += size2; + } + if (context->cstr_pool_len + size > context->cstr_pool_max) { context->cstr_pool_max = (context->cstr_pool_len + size + 0xffff) & ~0xffff; context->cstr_pool = realloc(context->cstr_pool, context->cstr_pool_max); diff --git a/src/glsl/pp/sl_pp_context.h b/src/glsl/pp/sl_pp_context.h index cb81f73ab9e..56f70777507 100644 --- a/src/glsl/pp/sl_pp_context.h +++ b/src/glsl/pp/sl_pp_context.h @@ -46,8 +46,8 @@ void sl_pp_context_destroy(struct sl_pp_context *context); int -sl_pp_context_add_str(struct sl_pp_context *context, - const char *str); +sl_pp_context_add_unique_str(struct sl_pp_context *context, + const char *str); const char * sl_pp_context_cstr(const struct sl_pp_context *context, diff --git a/src/glsl/pp/sl_pp_token.c b/src/glsl/pp/sl_pp_token.c index e200b961aaf..68c8fbe2ec4 100644 --- a/src/glsl/pp/sl_pp_token.c +++ b/src/glsl/pp/sl_pp_token.c @@ -53,7 +53,7 @@ _tokenise_identifier(struct sl_pp_context *context, } identifier[i++] = '\0'; - info->data.identifier = sl_pp_context_add_str(context, identifier); + info->data.identifier = sl_pp_context_add_unique_str(context, identifier); if (info->data.identifier == -1) { return -1; } @@ -91,7 +91,7 @@ _tokenise_number(struct sl_pp_context *context, } number[i++] = '\0'; - info->data.number = sl_pp_context_add_str(context, number); + info->data.number = sl_pp_context_add_unique_str(context, number); if (info->data.number == -1) { return -1; } diff --git a/src/glsl/pp/sl_pp_token.h b/src/glsl/pp/sl_pp_token.h index c801804ae6e..a53720be802 100644 --- a/src/glsl/pp/sl_pp_token.h +++ b/src/glsl/pp/sl_pp_token.h @@ -28,6 +28,8 @@ #ifndef SL_PP_TOKEN_H #define SL_PP_TOKEN_H +#include "sl_pp_context.h" + enum sl_pp_token { SL_PP_WHITESPACE, |