[1/2] webservices: Allow the dictionary functions to be used with any dictionary.

Hans Leidekker hans at codeweavers.com
Thu Jun 22 03:43:10 CDT 2017


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/webservices/reader.c              |  4 +-
 dlls/webservices/string.c              | 98 +++++++++++++++++-----------------
 dlls/webservices/webservices_private.h | 10 +++-
 3 files changed, 58 insertions(+), 54 deletions(-)

diff --git a/dlls/webservices/reader.c b/dlls/webservices/reader.c
index 798bd4f..787f75b 100644
--- a/dlls/webservices/reader.c
+++ b/dlls/webservices/reader.c
@@ -5870,8 +5870,8 @@ HRESULT WINAPI WsSetInput( WS_XML_READER *handle, const WS_XML_READER_ENCODING *
         WS_XML_READER_BINARY_ENCODING *bin = (WS_XML_READER_BINARY_ENCODING *)encoding;
         reader->input_enc     = WS_XML_READER_ENCODING_TYPE_BINARY;
         reader->input_charset = 0;
-        reader->dict_static   = bin->staticDictionary ? bin->staticDictionary : &dict_builtin_static;
-        reader->dict          = bin->dynamicDictionary ? bin->dynamicDictionary : &dict_builtin;
+        reader->dict_static   = bin->staticDictionary ? bin->staticDictionary : &dict_builtin_static.dict;
+        reader->dict          = bin->dynamicDictionary ? bin->dynamicDictionary : &dict_builtin.dict;
         break;
     }
     default:
diff --git a/dlls/webservices/string.c b/dlls/webservices/string.c
index a2e8685..f9df48f 100644
--- a/dlls/webservices/string.c
+++ b/dlls/webservices/string.c
@@ -44,10 +44,9 @@ static CRITICAL_SECTION_DEBUG dict_cs_debug =
 };
 static CRITICAL_SECTION dict_cs = { &dict_cs_debug, -1, 0, 0, 0, 0 };
 
-static ULONG dict_size, *dict_sorted;
-WS_XML_DICTIONARY dict_builtin =
+struct dictionary dict_builtin =
 {
-    {0x82704485,0x222a,0x4f7c,{0xb9,0x7b,0xe9,0xa4,0x62,0xa9,0x66,0x2b}}
+    {{0x82704485,0x222a,0x4f7c,{0xb9,0x7b,0xe9,0xa4,0x62,0xa9,0x66,0x2b}}}
 };
 
 static inline int cmp_string( const unsigned char *str, ULONG len, const unsigned char *str2, ULONG len2 )
@@ -63,22 +62,21 @@ static inline int cmp_string( const unsigned char *str, ULONG len, const unsigne
 }
 
 /* return -1 and string id if found, sort index if not found */
-static int find_string( const unsigned char *data, ULONG len, ULONG *id )
+static int find_string( const WS_XML_DICTIONARY *dict, const ULONG *sorted, const unsigned char *data,
+                        ULONG len, ULONG *ret_id )
 {
-    int i, c, min = 0, max = dict_builtin.stringCount - 1;
+    int i, c, min = 0, max = dict->stringCount - 1;
     while (min <= max)
     {
         i = (min + max) / 2;
-        c = cmp_string( data, len,
-                        dict_builtin.strings[dict_sorted[i]].bytes,
-                        dict_builtin.strings[dict_sorted[i]].length );
+        c = cmp_string( data, len, dict->strings[sorted[i]].bytes, dict->strings[sorted[i]].length );
         if (c < 0)
             max = i - 1;
         else if (c > 0)
             min = i + 1;
         else
         {
-            *id = dict_builtin.strings[dict_sorted[i]].id;
+            *ret_id = dict->strings[sorted[i]].id;
             return -1;
         }
     }
@@ -88,50 +86,50 @@ static int find_string( const unsigned char *data, ULONG len, ULONG *id )
 #define MIN_DICTIONARY_SIZE 256
 #define MAX_DICTIONARY_SIZE 2048
 
-static BOOL grow_dict( ULONG size )
+static BOOL grow_dict( struct dictionary *dict, ULONG size )
 {
     WS_XML_STRING *tmp;
     ULONG new_size, *tmp_sorted;
 
-    if (dict_size >= dict_builtin.stringCount + size) return TRUE;
-    if (dict_size + size > MAX_DICTIONARY_SIZE) return FALSE;
+    if (dict->size >= dict->dict.stringCount + size) return TRUE;
+    if (dict->size + size > MAX_DICTIONARY_SIZE) return FALSE;
 
-    if (!dict_builtin.strings)
+    if (!dict->dict.strings)
     {
         new_size = max( MIN_DICTIONARY_SIZE, size );
-        if (!(dict_builtin.strings = heap_alloc( new_size * sizeof(WS_XML_STRING) ))) return FALSE;
-        if (!(dict_sorted = heap_alloc( new_size * sizeof(ULONG) )))
+        if (!(dict->dict.strings = heap_alloc( new_size * sizeof(*dict->dict.strings) ))) return FALSE;
+        if (!(dict->sorted = heap_alloc( new_size * sizeof(*dict->sorted) )))
         {
-            heap_free( dict_builtin.strings );
-            dict_builtin.strings = NULL;
+            heap_free( dict->dict.strings );
+            dict->dict.strings = NULL;
             return FALSE;
         }
-        dict_size = new_size;
+        dict->size = new_size;
         return TRUE;
     }
 
-    new_size = max( dict_size * 2, size );
-    if (!(tmp = heap_realloc( dict_builtin.strings, new_size * sizeof(*tmp) ))) return FALSE;
-    dict_builtin.strings = tmp;
-    if (!(tmp_sorted = heap_realloc( dict_sorted, new_size * sizeof(*tmp_sorted) ))) return FALSE;
-    dict_sorted = tmp_sorted;
+    new_size = max( dict->size * 2, size );
+    if (!(tmp = heap_realloc( dict->dict.strings, new_size * sizeof(*tmp) ))) return FALSE;
+    dict->dict.strings = tmp;
+    if (!(tmp_sorted = heap_realloc( dict->sorted, new_size * sizeof(*tmp_sorted) ))) return FALSE;
+    dict->sorted = tmp_sorted;
 
-    dict_size = new_size;
+    dict->size = new_size;
     return TRUE;
 }
 
-static BOOL insert_string( unsigned char *data, ULONG len, int i, ULONG *ret_id )
+static BOOL insert_string( struct dictionary *dict, unsigned char *data, ULONG len, int i, ULONG *ret_id )
 {
-    ULONG id = dict_builtin.stringCount;
-    if (!grow_dict( 1 )) return FALSE;
-    memmove( &dict_sorted[i] + 1, &dict_sorted[i], (dict_builtin.stringCount - i) * sizeof(WS_XML_STRING *) );
-    dict_sorted[i] = id;
-
-    dict_builtin.strings[id].length     = len;
-    dict_builtin.strings[id].bytes      = data;
-    dict_builtin.strings[id].dictionary = &dict_builtin;
-    dict_builtin.strings[id].id         = id;
-    dict_builtin.stringCount++;
+    ULONG id = dict->dict.stringCount;
+    if (!grow_dict( dict, 1 )) return FALSE;
+    memmove( &dict->sorted[i] + 1, &dict->sorted[i], (dict->dict.stringCount - i) * sizeof(*dict->sorted) );
+    dict->sorted[i] = id;
+
+    dict->dict.strings[id].length     = len;
+    dict->dict.strings[id].bytes      = data;
+    dict->dict.strings[id].dictionary = &dict->dict;
+    dict->dict.strings[id].id         = id;
+    dict->dict.stringCount++;
     *ret_id = id;
     return TRUE;
 }
@@ -144,16 +142,16 @@ HRESULT add_xml_string( WS_XML_STRING *str )
     if (str->dictionary) return S_OK;
 
     EnterCriticalSection( &dict_cs );
-    if ((index = find_string( str->bytes, str->length, &id )) == -1)
+    if ((index = find_string( &dict_builtin.dict, dict_builtin.sorted, str->bytes, str->length, &id )) == -1)
     {
         heap_free( str->bytes );
-        *str = dict_builtin.strings[id];
+        *str = dict_builtin.dict.strings[id];
         LeaveCriticalSection( &dict_cs );
         return S_OK;
     }
-    if (insert_string( str->bytes, str->length, index, &id ))
+    if (insert_string( &dict_builtin, str->bytes, str->length, index, &id ))
     {
-        *str = dict_builtin.strings[id];
+        *str = dict_builtin.dict.strings[id];
         LeaveCriticalSection( &dict_cs );
         return S_OK;
     }
@@ -201,9 +199,9 @@ WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src )
     }
 
     EnterCriticalSection( &dict_cs );
-    if ((index = find_string( src->bytes, src->length, &id )) == -1)
+    if ((index = find_string( &dict_builtin.dict, dict_builtin.sorted, src->bytes, src->length, &id )) == -1)
     {
-        *ret = dict_builtin.strings[id];
+        *ret = dict_builtin.dict.strings[id];
         LeaveCriticalSection( &dict_cs );
         return ret;
     }
@@ -214,9 +212,9 @@ WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src )
         return NULL;
     }
     memcpy( data, src->bytes, src->length );
-    if (insert_string( data, src->length, index, &id ))
+    if (insert_string( &dict_builtin, data, src->length, index, &id ))
     {
-        *ret = dict_builtin.strings[id];
+        *ret = dict_builtin.dict.strings[id];
         LeaveCriticalSection( &dict_cs );
         return ret;
     }
@@ -230,10 +228,10 @@ WS_XML_STRING *dup_xml_string( const WS_XML_STRING *src )
     return ret;
 }
 
-const WS_XML_DICTIONARY dict_builtin_static;
+const struct dictionary dict_builtin_static;
 static const WS_XML_STRING dict_strings[] =
 {
-#define X(str, id) { sizeof(str) - 1, (BYTE *)(str), (WS_XML_DICTIONARY *)&dict_builtin_static, id },
+#define X(str, id) { sizeof(str) - 1, (BYTE *)(str), (WS_XML_DICTIONARY *)&dict_builtin_static.dict, id },
     X("mustUnderstand", 0)
     X("Envelope", 1)
     X("http://www.w3.org/2003/05/soap-envelope", 2)
@@ -725,12 +723,12 @@ static const WS_XML_STRING dict_strings[] =
 #undef X
 };
 
-const WS_XML_DICTIONARY dict_builtin_static =
+const struct dictionary dict_builtin_static =
 {
-    {0xf93578f8,0x5852,0x4eb7,{0xa6,0xfc,0xe7,0x2b,0xb7,0x1d,0xb6,0x22}},
-    (WS_XML_STRING *)dict_strings,
-    sizeof(dict_strings) / sizeof(dict_strings[0]),
-    TRUE
+    {{0xf93578f8,0x5852,0x4eb7,{0xa6,0xfc,0xe7,0x2b,0xb7,0x1d,0xb6,0x22}},
+     (WS_XML_STRING *)dict_strings,
+     sizeof(dict_strings) / sizeof(dict_strings[0]),
+     TRUE}
 };
 
 /**************************************************************************
diff --git a/dlls/webservices/webservices_private.h b/dlls/webservices/webservices_private.h
index 28bc6fb..cf6e1c4 100644
--- a/dlls/webservices/webservices_private.h
+++ b/dlls/webservices/webservices_private.h
@@ -35,8 +35,14 @@ void ws_free( WS_HEAP *, void *, SIZE_T ) DECLSPEC_HIDDEN;
 struct xmlbuf *alloc_xmlbuf( WS_HEAP *, WS_XML_WRITER_ENCODING_TYPE, WS_CHARSET ) DECLSPEC_HIDDEN;
 void free_xmlbuf( struct xmlbuf * ) DECLSPEC_HIDDEN;
 
-WS_XML_DICTIONARY dict_builtin DECLSPEC_HIDDEN;
-const WS_XML_DICTIONARY dict_builtin_static DECLSPEC_HIDDEN;
+struct dictionary
+{
+    WS_XML_DICTIONARY  dict;
+    ULONG              size;
+    ULONG             *sorted;
+};
+struct dictionary dict_builtin DECLSPEC_HIDDEN;
+const struct dictionary dict_builtin_static DECLSPEC_HIDDEN;
 
 ULONG format_bool( const BOOL *, unsigned char * ) DECLSPEC_HIDDEN;
 ULONG format_int8( const INT8 *, unsigned char * ) DECLSPEC_HIDDEN;
-- 
2.1.4




More information about the wine-patches mailing list