glsl: Rename sl_pp_context_add_str to sl_pp_context_add_unique_str.
authorMichal Krol <michal@vmware.com>
Sun, 21 Jun 2009 15:03:15 +0000 (17:03 +0200)
committerMichal Krol <michal@vmware.com>
Mon, 7 Sep 2009 08:11:46 +0000 (10:11 +0200)
Return the same offset for same strings. Allows to compare strings
by comparing their's offsets.

src/glsl/pp/sl_pp_context.c
src/glsl/pp/sl_pp_context.h
src/glsl/pp/sl_pp_token.c
src/glsl/pp/sl_pp_token.h

index 8722376ae52c1521058817c7d881780b6737dcb0..6d3076b8697008d27006d8242463c35fa9e26476 100644 (file)
@@ -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);
index cb81f73ab9e9c65986287eb072d5b9179e8c03cc..56f707775075c22ed50485287b3bf858a521148b 100644 (file)
@@ -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,
index e200b961aaf654eaa1b98c83b2b1cb314c65079d..68c8fbe2ec43d10d9ac7eaf5ce533063655b3b43 100644 (file)
@@ -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;
    }
index c801804ae6eef88f4247cee10623659043a67382..a53720be802c4a4132727732b24aec6f8f1a3783 100644 (file)
@@ -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,