diff options
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 8722376ae5..6d3076b869 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 cb81f73ab9..56f7077750 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 e200b961aa..68c8fbe2ec 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 c801804ae6..a53720be80 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, | 
