[1/3] msi: Store string length in the string table.

Hans Leidekker hans at codeweavers.com
Tue Dec 1 04:40:13 CST 2009


See http://bugs.winehq.org/show_bug.cgi?id=14168
---
 dlls/msi/string.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/dlls/msi/string.c b/dlls/msi/string.c
index e5b5cc2..cfaf895 100644
--- a/dlls/msi/string.c
+++ b/dlls/msi/string.c
@@ -49,6 +49,7 @@ typedef struct _msistring
     UINT persistent_refcount;
     UINT nonpersistent_refcount;
     LPWSTR str;
+    UINT len;
 } msistring;
 
 struct string_table
@@ -60,10 +61,11 @@ struct string_table
     msistring *strings; /* an array of strings (in the tree) */
 };
 
-static UINT msistring_makehash( const WCHAR *str )
+static UINT msistring_makehash( const WCHAR *str, UINT *len )
 {
     UINT hash = 0;
 
+    *len = 0;
     if (str==NULL)
         return hash;
 
@@ -72,6 +74,7 @@ static UINT msistring_makehash( const WCHAR *str )
         hash ^= *str++;
         hash *= 53;
         hash = (hash<<5) | (hash>>27);
+        (*len)++;
     }
     return hash % HASH_SIZE;
 }
@@ -157,7 +160,7 @@ static int st_find_free_entry( string_table *st )
 
 static void set_st_entry( string_table *st, UINT n, LPWSTR str, UINT refcount, enum StringPersistence persistence )
 {
-    UINT hash = msistring_makehash( str );
+    UINT hash = msistring_makehash( str, &st->strings[n].len );
 
     if (persistence == StringPersistent)
     {
@@ -382,12 +385,12 @@ static UINT msi_id2stringA( const string_table *st, UINT id, LPSTR buffer, UINT
  */
 UINT msi_string2idW( const string_table *st, LPCWSTR str, UINT *id )
 {
-    UINT n, hash = msistring_makehash( str );
+    UINT n, len, hash = msistring_makehash( str, &len );
     msistring *se = st->strings;
 
     for (n = st->hash[hash]; n != -1; n = st->strings[n].hash_next )
     {
-        if ((str == se[n].str) || !lstrcmpW(str, se[n].str))
+        if ((str == se[n].str) || (len == se[n].len && !lstrcmpW(str, se[n].str)))
         {
             *id = n;
             return ERROR_SUCCESS;
-- 
1.6.3.3





More information about the wine-patches mailing list