Remove _mesa_strlen in favor of plain strlen.
[mesa.git] / src / mesa / shader / slang / slang_utility.c
index 28837248df58319c4ae905ff2e0a115aa2315e83..e3b0491d97f34837aef4b2f5a0d706ac113b4765 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.6
+ * Version:  6.5.3
  *
- * Copyright (C) 2005-2006  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * \author Michal Krol
  */
 
-#include "imports.h"
+#include "main/imports.h"
 #include "slang_utility.h"
+#include "slang_mem.h"
 
-char *slang_string_concat (char *dst, const char *src)
+char *
+slang_string_concat (char *dst, const char *src)
 {
-       return _mesa_strcpy (dst + _mesa_strlen (dst), src);
+   return strcpy (dst + strlen (dst), src);
 }
 
+
 /* slang_string */
 
 GLvoid
@@ -131,80 +134,95 @@ slang_string_cstr (slang_string *self)
 
 /* slang_atom_pool */
 
-void slang_atom_pool_construct (slang_atom_pool *pool)
+void
+slang_atom_pool_construct(slang_atom_pool * pool)
 {
-       GLuint i;
+   GLuint i;
 
-       for (i = 0; i < SLANG_ATOM_POOL_SIZE; i++)
-               pool->entries[i] = NULL;
+   for (i = 0; i < SLANG_ATOM_POOL_SIZE; i++)
+      pool->entries[i] = NULL;
 }
 
-void slang_atom_pool_destruct (slang_atom_pool *pool)
+void
+slang_atom_pool_destruct (slang_atom_pool * pool)
 {
-       GLuint i;
+   GLuint i;
 
-       for (i = 0; i < SLANG_ATOM_POOL_SIZE; i++)
-       {
-               slang_atom_entry *entry;
+   for (i = 0; i < SLANG_ATOM_POOL_SIZE; i++) {
+      slang_atom_entry * entry;
                
-               entry = pool->entries[i];
-               while (entry != NULL)
-               {
-                       slang_atom_entry *next;
-
-                       next = entry->next;
-                       slang_alloc_free (entry->id);
-                       slang_alloc_free (entry);
-                       entry = next;
-               }
-       }
+      entry = pool->entries[i];
+      while (entry != NULL) {
+         slang_atom_entry *next = entry->next;
+         _slang_free(entry->id);
+         _slang_free(entry);
+         entry = next;
+      }
+   }
 }
 
-/**
- * Search atom pool for atom with the given name.
- * If name is not found, create new atom (but don't insert into pool?)
+/*
+ * Search the atom pool for an atom with a given name.
+ * If atom is not found, create and add it to the pool.
+ * Returns ATOM_NULL if the atom was not found and the function failed
+ * to create a new atom.
  */
-slang_atom slang_atom_pool_atom (const slang_atom_pool *pool, const char *id)
+slang_atom
+slang_atom_pool_atom(slang_atom_pool * pool, const char * id)
 {
-       GLuint hash;
-       const char *p = id;
-       slang_atom_entry * const * entry;
-       slang_atom_entry **newEntry = NULL;
-
-       hash = 0;
-       while (*p != '\0')
-       {
-               GLuint g;
-
-               hash = (hash << 4) + (GLuint) *p++;
-               g = hash & 0xf0000000;
-               if (g != 0)
-                       hash ^= g >> 24;
-               hash &= ~g;
-       }
-       hash %= SLANG_ATOM_POOL_SIZE;
-
-       entry = &pool->entries[hash];
-       while (*entry != NULL)
-       {
-               if (slang_string_compare ((**entry).id, id) == 0)
-                       return (slang_atom) (**entry).id;
-               entry = &(**entry).next;
-       }
-
-       *newEntry = (slang_atom_entry *) slang_alloc_malloc (sizeof (slang_atom_entry));
-       if (*newEntry == NULL)
-               return SLANG_ATOM_NULL;
-
-       (**newEntry).next = NULL;
-       (**newEntry).id = slang_string_duplicate (id);
-       if ((**newEntry).id == NULL)
-               return SLANG_ATOM_NULL;
-       return (slang_atom) (**newEntry).id;
+   GLuint hash;
+   const char * p = id;
+   slang_atom_entry ** entry;
+
+   /* Hash a given string to a number in the range [0, ATOM_POOL_SIZE). */
+   hash = 0;
+   while (*p != '\0') {
+      GLuint g;
+
+      hash = (hash << 4) + (GLuint) (*p++);
+      g = hash & 0xf0000000;
+      if (g != 0)
+         hash ^= g >> 24;
+      hash &= ~g;
+   }
+   hash %= SLANG_ATOM_POOL_SIZE;
+
+   /* Now the hash points to a linked list of atoms with names that
+    * have the same hash value.  Search the linked list for a given
+    * name.
+    */
+   entry = &pool->entries[hash];
+   while (*entry != NULL) {
+      /* If the same, return the associated atom. */
+      if (slang_string_compare((**entry).id, id) == 0)
+         return (slang_atom) (**entry).id;
+      /* Grab the next atom in the linked list. */
+      entry = &(**entry).next;
+   }
+
+   /* Okay, we have not found an atom. Create a new entry for it.
+    * Note that the <entry> points to the last entry's <next> field.
+    */
+   *entry = (slang_atom_entry *) _slang_alloc(sizeof(slang_atom_entry));
+   if (*entry == NULL)
+      return SLANG_ATOM_NULL;
+
+   /* Initialize a new entry. Because we'll need the actual name of
+    * the atom, we use the pointer to this string as an actual atom's
+    * value.
+    */
+   (**entry).next = NULL;
+   (**entry).id = _slang_strdup(id);
+   if ((**entry).id == NULL)
+      return SLANG_ATOM_NULL;
+   return (slang_atom) (**entry).id;
 }
 
-const char *slang_atom_pool_id (slang_atom_pool *pool, slang_atom atom)
+/**
+ * Return the name of a given atom.
+ */
+const char *
+slang_atom_pool_id(slang_atom_pool * pool, slang_atom atom)
 {
-       return (const char *) atom;
+   return (const char *) (atom);
 }
-