[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