Module: wine Branch: master Commit: fb8fa44bb91ecf89f6412fd9d026a715109021b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fb8fa44bb91ecf89f6412fd9d0...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun May 13 12:58:50 2012 +0400
msxml3: Store encoding-codepage mapping in a table.
---
dlls/msxml3/mxwriter.c | 55 ++++++++++++++++++++++++++++++++++++----------- 1 files changed, 42 insertions(+), 13 deletions(-)
diff --git a/dlls/msxml3/mxwriter.c b/dlls/msxml3/mxwriter.c index 07ff1ff..c5ecf37 100644 --- a/dlls/msxml3/mxwriter.c +++ b/dlls/msxml3/mxwriter.c @@ -39,18 +39,33 @@
WINE_DEFAULT_DEBUG_CHANNEL(msxml);
-static const WCHAR utf16W[] = {'U','T','F','-','1','6',0}; static const WCHAR emptyW[] = {0}; static const WCHAR spaceW[] = {' '}; static const WCHAR quotW[] = {'"'};
+/* should be ordered as encoding names are sorted */ typedef enum { + XmlEncoding_UTF16 = 0, XmlEncoding_UTF8, - XmlEncoding_UTF16, XmlEncoding_Unknown } xml_encoding;
+struct xml_encoding_data +{ + const WCHAR *encoding; + xml_encoding enc; + UINT cp; +}; + +static const WCHAR utf16W[] = {'U','T','F','-','1','6',0}; +static const WCHAR utf8W[] = {'U','T','F','-','8',0}; + +static const struct xml_encoding_data xml_encoding_map[] = { + { utf16W, XmlEncoding_UTF16, ~0 }, /* there's no codepage for this case */ + { utf8W, XmlEncoding_UTF8, CP_UTF8 } +}; + typedef enum { OutputBuffer_Native = 0x001, @@ -169,9 +184,25 @@ static HRESULT mxattributes_grow(mxattributes *This)
static xml_encoding parse_encoding_name(const WCHAR *encoding) { - static const WCHAR utf8W[] = {'U','T','F','-','8',0}; - if (!strcmpiW(encoding, utf8W)) return XmlEncoding_UTF8; - if (!strcmpiW(encoding, utf16W)) return XmlEncoding_UTF16; + int min, max, n, c; + + min = 0; + max = sizeof(xml_encoding_map)/sizeof(struct xml_encoding_data) - 1; + + while (min <= max) + { + n = (min+max)/2; + + c = strcmpiW(xml_encoding_map[n].encoding, encoding); + if (!c) + return xml_encoding_map[n].enc; + + if (c > 0) + max = n-1; + else + min = n+1; + } + return XmlEncoding_Unknown; }
@@ -195,19 +226,17 @@ static void free_encoded_buffer(encoded_buffer *buffer)
static HRESULT get_code_page(xml_encoding encoding, UINT *cp) { - switch (encoding) + const struct xml_encoding_data *data; + + if (encoding == XmlEncoding_Unknown) { - case XmlEncoding_UTF8: - *cp = CP_UTF8; - break; - case XmlEncoding_UTF16: - *cp = ~0; - break; - default: FIXME("unsupported encoding %d\n", encoding); return E_NOTIMPL; }
+ data = &xml_encoding_map[encoding]; + *cp = data->cp; + return S_OK; }