Adam Martinson : msxml3: Add XDR datatypes enum and string table.

Alexandre Julliard julliard at winehq.org
Tue Nov 16 12:45:45 CST 2010


Module: wine
Branch: master
Commit: 4ec6da6ef195a339939e8aedbdcb3f458ebb2143
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ec6da6ef195a339939e8aedbdcb3f458ebb2143

Author: Adam Martinson <amartinson at codeweavers.com>
Date:   Mon Nov 15 18:16:10 2010 -0600

msxml3: Add XDR datatypes enum and string table.

---

 dlls/msxml3/msxml_private.h |   48 +++++++++
 dlls/msxml3/schema.c        |  240 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 288 insertions(+), 0 deletions(-)

diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index f6d8355..15c8b94 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -68,6 +68,51 @@ typedef enum tid_t {
     LAST_tid
 } tid_t;
 
+/* The XDR datatypes (urn:schemas-microsoft-com:datatypes)
+ * These are actually valid for XSD schemas as well
+ * See datatypes.xsd
+ */
+typedef enum _XDR_DT {
+    DT_INVALID = -1,
+    DT_BIN_BASE64,
+    DT_BIN_HEX,
+    DT_BOOLEAN,
+    DT_CHAR,
+    DT_DATE,
+    DT_DATE_TZ,
+    DT_DATETIME,
+    DT_DATETIME_TZ,
+    DT_ENTITY,
+    DT_ENTITIES,
+    DT_ENUMERATION,
+    DT_FIXED_14_4,
+    DT_FLOAT,
+    DT_I1,
+    DT_I2,
+    DT_I4,
+    DT_I8,
+    DT_ID,
+    DT_IDREF,
+    DT_IDREFS,
+    DT_INT,
+    DT_NMTOKEN,
+    DT_NMTOKENS,
+    DT_NOTATION,
+    DT_NUMBER,
+    DT_R4,
+    DT_R8,
+    DT_STRING,
+    DT_TIME,
+    DT_TIME_TZ,
+    DT_UI1,
+    DT_UI2,
+    DT_UI4,
+    DT_UI8,
+    DT_URI,
+    DT_UUID
+} XDR_DT;
+#define DT__N_TYPES  (DT_UUID+1)
+
 extern HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo);
 extern void release_typelib(void);
 
@@ -222,6 +267,9 @@ extern HRESULT node_get_base_name(xmlnode*,BSTR*);
 extern HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument3 **document);
 extern HRESULT SchemaCache_validate_tree(IXMLDOMSchemaCollection2* iface, xmlNodePtr tree);
 
+extern XDR_DT dt_get_type(xmlChar const* str, int len /* calculated if -1 */);
+extern xmlChar const* dt_get_str(XDR_DT dt);
+
 extern BSTR EnsureCorrectEOL(BSTR);
 
 static inline BSTR bstr_from_xmlChar(const xmlChar *str)
diff --git a/dlls/msxml3/schema.c b/dlls/msxml3/schema.c
index f3fd7a9..b931295 100644
--- a/dlls/msxml3/schema.c
+++ b/dlls/msxml3/schema.c
@@ -101,6 +101,246 @@ typedef struct _cache_index_data
     BSTR* out;
 } cache_index_data;
 
+/* datatypes lookup stuff
+ * generated with help from gperf */
+#define DT_MIN_STR_LEN 2
+#define DT_MAX_STR_LEN 11
+#define DT_MIN_HASH_VALUE 2
+#define DT_MAX_HASH_VALUE 115
+
+static const xmlChar DT_bin_base64[] = "bin.base64";
+static const xmlChar DT_bin_hex[] = "bin.hex";
+static const xmlChar DT_boolean[] = "boolean";
+static const xmlChar DT_char[] = "char";
+static const xmlChar DT_date[] = "date";
+static const xmlChar DT_date_tz[] = "date.tz";
+static const xmlChar DT_dateTime[] = "dateTime";
+static const xmlChar DT_dateTime_tz[] = "dateTime.tz";
+static const xmlChar DT_entity[] = "entity";
+static const xmlChar DT_entities[] = "entities";
+static const xmlChar DT_enumeration[] = "enumeration";
+static const xmlChar DT_fixed_14_4[] = "fixed.14.4";
+static const xmlChar DT_float[] = "float";
+static const xmlChar DT_i1[] = "i1";
+static const xmlChar DT_i2[] = "i2";
+static const xmlChar DT_i4[] = "i4";
+static const xmlChar DT_i8[] = "i8";
+static const xmlChar DT_id[] = "id";
+static const xmlChar DT_idref[] = "idref";
+static const xmlChar DT_idrefs[] = "idrefs";
+static const xmlChar DT_int[] = "int";
+static const xmlChar DT_nmtoken[] = "nmtoken";
+static const xmlChar DT_nmtokens[] = "nmtokens";
+static const xmlChar DT_notation[] = "notation";
+static const xmlChar DT_number[] = "number";
+static const xmlChar DT_r4[] = "r4";
+static const xmlChar DT_r8[] = "r8";
+static const xmlChar DT_string[] = "string";
+static const xmlChar DT_time[] = "time";
+static const xmlChar DT_time_tz[] = "time.tz";
+static const xmlChar DT_ui1[] = "ui1";
+static const xmlChar DT_ui2[] = "ui2";
+static const xmlChar DT_ui4[] = "ui4";
+static const xmlChar DT_ui8[] = "ui8";
+static const xmlChar DT_uri[] = "uri";
+static const xmlChar DT_uuid[] = "uuid";
+
+static DWORD dt_hash( xmlChar const* str, int len /* calculated if -1 */)
+{
+    static const BYTE assoc_values[] =
+    {
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116,  10, 116, 116,  55,
+         45, 116,   5, 116,   0, 116,   0, 116, 116, 116,
+        116, 116, 116, 116, 116,   5,   0,   0,  20,   0,
+          0,  10,   0,   0, 116,   0,   0,   0,  15,   5,
+        116, 116,  10,   0,   0,   0, 116, 116,   0,   0,
+         10, 116, 116, 116, 116, 116, 116,   5,   0,   0,
+         20,   0,   0,  10,   0,   0, 116,   0,   0,   0,
+         15,   5, 116, 116,  10,   0,   0,   0, 116, 116,
+          0,   0,  10, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
+        116, 116, 116, 116, 116, 116
+    };
+    DWORD hval = (len == -1)? xmlStrlen(str) : len;
+
+    switch (hval)
+    {
+        default:
+            hval += assoc_values[str[10]];
+            /*FALLTHROUGH*/
+        case 10:
+            hval += assoc_values[str[9]];
+            /*FALLTHROUGH*/
+        case 9:
+            hval += assoc_values[str[8]];
+            /*FALLTHROUGH*/
+        case 8:
+            hval += assoc_values[str[7]];
+            /*FALLTHROUGH*/
+        case 7:
+            hval += assoc_values[str[6]];
+            /*FALLTHROUGH*/
+        case 6:
+            hval += assoc_values[str[5]];
+            /*FALLTHROUGH*/
+        case 5:
+            hval += assoc_values[str[4]];
+            /*FALLTHROUGH*/
+        case 4:
+            hval += assoc_values[str[3]];
+            /*FALLTHROUGH*/
+        case 3:
+            hval += assoc_values[str[2]];
+            /*FALLTHROUGH*/
+        case 2:
+            hval += assoc_values[str[1]];
+            /*FALLTHROUGH*/
+        case 1:
+            hval += assoc_values[str[0]];
+            break;
+    }
+    return hval;
+}
+
+static const xmlChar const* DT_string_table[DT__N_TYPES] =
+{
+    DT_bin_base64,
+    DT_bin_hex,
+    DT_boolean,
+    DT_char,
+    DT_date,
+    DT_date_tz,
+    DT_dateTime,
+    DT_dateTime_tz,
+    DT_entity,
+    DT_entities,
+    DT_enumeration,
+    DT_fixed_14_4,
+    DT_float,
+    DT_i1,
+    DT_i2,
+    DT_i4,
+    DT_i8,
+    DT_id,
+    DT_idref,
+    DT_idrefs,
+    DT_int,
+    DT_nmtoken,
+    DT_nmtokens,
+    DT_notation,
+    DT_number,
+    DT_r4,
+    DT_r8,
+    DT_string,
+    DT_time,
+    DT_time_tz,
+    DT_ui1,
+    DT_ui2,
+    DT_ui4,
+    DT_ui8,
+    DT_uri,
+    DT_uuid
+};
+
+static const XDR_DT DT_lookup_table[] =
+{
+    -1, -1,
+    DT_I8,
+    DT_UI8,
+    DT_TIME,
+    -1, -1,
+    DT_I4,
+    DT_UI4,
+    -1, -1, -1,
+    DT_R8,
+    DT_URI,
+    -1,
+    DT_FLOAT,
+    -1,
+    DT_R4,
+    DT_INT,
+    DT_CHAR,
+    -1,
+    DT_ENTITY,
+    DT_ID,
+    DT_ENTITIES,
+    DT_UUID,
+    -1, -1,
+    DT_TIME_TZ,
+    -1,
+    DT_DATE,
+    -1,
+    DT_NUMBER,
+    DT_BIN_HEX,
+    DT_DATETIME,
+    -1,
+    DT_IDREF,
+    DT_IDREFS,
+    DT_BOOLEAN,
+    -1, -1, -1,
+    DT_STRING,
+    DT_NMTOKEN,
+    DT_NMTOKENS,
+    -1,
+    DT_BIN_BASE64,
+    -1,
+    DT_I2,
+    DT_UI2,
+    -1, -1, -1,
+    DT_DATE_TZ,
+    DT_NOTATION,
+    -1, -1,
+    DT_DATETIME_TZ,
+    DT_I1,
+    DT_UI1,
+    -1, -1,
+    DT_ENUMERATION,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    DT_FIXED_14_4
+};
+
+XDR_DT dt_get_type(xmlChar const* str, int len /* calculated if -1 */)
+{
+    DWORD hash = dt_hash(str, len);
+    XDR_DT dt = DT_INVALID;
+
+    if (hash <= DT_MAX_HASH_VALUE)
+        dt = DT_lookup_table[hash];
+
+    if (dt != DT_INVALID && xmlStrcasecmp(str, DT_string_table[dt]) == 0)
+        return dt;
+
+    return DT_INVALID;
+}
+
+xmlChar const* dt_get_str(XDR_DT dt)
+{
+    if (dt == DT_INVALID)
+        return NULL;
+
+    return DT_string_table[dt];
+}
+
 xmlExternalEntityLoader _external_entity_loader = NULL;
 
 static xmlParserInputPtr external_entity_loader(const char *URL, const char *ID,




More information about the wine-cvs mailing list