kernel32-UTF7_Support: Updated patches with recent changes.

This commit is contained in:
Sebastian Lackner 2014-10-18 21:56:58 +02:00
parent 07f9996abc
commit 09cb0884c5
5 changed files with 626 additions and 624 deletions

View File

@ -545,7 +545,7 @@ kernel32-Named_Pipe.ok:
# Patchset kernel32-UTF7_Support
# |
# | Included patches:
# | * Support for UTF7 encoding/decoding [rev 2, by Alex Henrie]
# | * Support for UTF7 encoding/decoding [rev 3, by Alex Henrie]
# |
# | This patchset fixes the following Wine bugs:
# | * [#27388] Support for UTF7 encoding/decoding
@ -559,7 +559,7 @@ kernel32-UTF7_Support.ok:
$(call APPLY_FILE,kernel32-UTF7_Support/0002-kernel32-Support-UTF-7-in-WideCharToMultiByte.patch)
$(call APPLY_FILE,kernel32-UTF7_Support/0003-kernel32-tests-Add-tests-for-UTF-7-conversion.patch)
@( \
echo '+ { "kernel32-UTF7_Support", "Alex Henrie", "Support for UTF7 encoding/decoding [rev 2]" },'; \
echo '+ { "kernel32-UTF7_Support", "Alex Henrie", "Support for UTF7 encoding/decoding [rev 3]" },'; \
) > kernel32-UTF7_Support.ok
# Patchset libs-Unicode_Collation

View File

@ -1,32 +1,32 @@
From 8e54f8c98655c08b09d3a5ce6a27d5e6a1c1c5e3 Mon Sep 17 00:00:00 2001
From a8bf53baa972197e228ea01701d5992a11151824 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Thu, 9 Oct 2014 14:13:00 -0600
Date: Fri, 17 Oct 2014 12:54:02 -0600
Subject: kernel32: Support UTF-7 in MultiByteToWideChar.
Portions of utf7_mbstowcs were written by Sebastian Lackner
<sebastian@fds-team.de>
---
dlls/kernel32/locale.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 156 insertions(+), 4 deletions(-)
dlls/kernel32/locale.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 150 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 730574b..6ccb799 100644
index 730574b..0123124 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -1954,6 +1954,159 @@ BOOL WINAPI EnumSystemCodePagesW( CODEPAGE_ENUMPROCW lpfnCodePageEnum, DWORD fla
@@ -1954,6 +1954,154 @@ BOOL WINAPI EnumSystemCodePagesW( CODEPAGE_ENUMPROCW lpfnCodePageEnum, DWORD fla
/***********************************************************************
+ * write_to_w_string
+ * utf7_write_w
+ *
+ * Helper for utf7_mbstowcs
+ *
+ * RETURNS
+ * TRUE on success, FALSE on error
+ */
+static inline BOOL write_to_w_string(WCHAR *dst, int dstlen, int *index, WCHAR character)
+static inline BOOL utf7_write_w(WCHAR *dst, int dstlen, int *index, WCHAR character)
+{
+ if (dst)
+ if (dstlen > 0)
+ {
+ if (*index >= dstlen)
+ return FALSE;
@ -50,39 +50,39 @@ index 730574b..6ccb799 100644
+ */
+static int utf7_mbstowcs(const char *src, int srclen, WCHAR *dst, int dstlen)
+{
+ static const WCHAR base64_decoding_table[] = {
+ /* \0 */ -1, /* \x01 */ -1, /* \x02 */ -1, /* \x03 */ -1,
+ /* \x04 */ -1, /* \x05 */ -1, /* \x06 */ -1, /* \a */ -1,
+ /* \b */ -1, /* \t */ -1, /* \n */ -1, /* \v */ -1,
+ /* \f */ -1, /* \r */ -1, /* \x0E */ -1, /* \x0F */ -1,
+ /* \x10 */ -1, /* \x11 */ -1, /* \x12 */ -1, /* \x13 */ -1,
+ /* \x14 */ -1, /* \x15 */ -1, /* \x16 */ -1, /* \x17 */ -1,
+ /* \x18 */ -1, /* \x19 */ -1, /* \x1A */ -1, /* \e */ -1,
+ /* \x1C */ -1, /* \x1D */ -1, /* \x1E */ -1, /* \x1F */ -1,
+ /* */ -1, /* ! */ -1, /* " */ -1, /* # */ -1,
+ /* $ */ -1, /* % */ -1, /* & */ -1, /* ' */ -1,
+ /* ( */ -1, /* ) */ -1, /* * */ -1, /* + */ 62,
+ /* , */ -1, /* - */ -1, /* . */ -1, /* / */ 63,
+ /* 0 */ 52, /* 1 */ 53, /* 2 */ 54, /* 3 */ 55,
+ /* 4 */ 56, /* 5 */ 57, /* 6 */ 58, /* 7 */ 59,
+ /* 8 */ 60, /* 9 */ 61, /* : */ -1, /* ; */ -1,
+ /* < */ -1, /* = */ -1, /* > */ -1, /* ? */ -1,
+ /* @ */ -1, /* A */ 0, /* B */ 1, /* C */ 2,
+ /* D */ 3, /* E */ 4, /* F */ 5, /* G */ 6,
+ /* H */ 7, /* I */ 8, /* J */ 9, /* K */ 10,
+ /* L */ 11, /* M */ 12, /* N */ 13, /* O */ 14,
+ /* P */ 15, /* Q */ 16, /* R */ 17, /* S */ 18,
+ /* T */ 19, /* U */ 20, /* V */ 21, /* W */ 22,
+ /* X */ 23, /* Y */ 24, /* Z */ 25, /* [ */ -1,
+ /* \ */ -1, /* ] */ -1, /* ^ */ -1, /* _ */ -1,
+ /* ` */ -1, /* a */ 26, /* b */ 27, /* c */ 28,
+ /* d */ 29, /* e */ 30, /* f */ 31, /* g */ 32,
+ /* h */ 33, /* i */ 34, /* j */ 35, /* k */ 36,
+ /* l */ 37, /* m */ 38, /* n */ 39, /* o */ 40,
+ /* p */ 41, /* q */ 42, /* r */ 43, /* s */ 44,
+ /* t */ 45, /* u */ 46, /* v */ 47, /* w */ 48,
+ /* x */ 49, /* y */ 50, /* z */ 51, /* { */ -1,
+ /* | */ -1, /* } */ -1, /* ~ */ -1, /* \x7F */ -1
+ static const signed char base64_decoding_table[] = {
+ /* \0 \x01 \x02 \x03 \x04 \x05 \x06 \a */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* \b \t \n \v \f \r \x0E \x0F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* \x18 \x19 \x1A \e \x1C \x1D \x1E \x1F */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* ! " # $ % & ' */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* ( ) * + , - . / */
+ -1, -1, -1, 62, -1, -1, -1, 63,
+ /* 0 1 2 3 4 5 6 7 */
+ 52, 53, 54, 55, 56, 57, 58, 59,
+ /* 8 9 : ; < = > ? */
+ 60, 61, -1, -1, -1, -1, -1, -1,
+ /* @ A B C D E F G */
+ -1, 0, 1, 2, 3, 4, 5, 6,
+ /* H I J K L M N O */
+ 7, 8, 9, 10, 11, 12, 13, 14,
+ /* P Q R S T U V W */
+ 15, 16, 17, 18, 19, 20, 21, 22,
+ /* X Y Z [ \ ] ^ _ */
+ 23, 24, 25, -1, -1, -1, -1, -1,
+ /* ` a b c d e f g */
+ -1, 26, 27, 28, 29, 30, 31, 32,
+ /* h i j k l m n o */
+ 33, 34, 35, 36, 37, 38, 39, 40,
+ /* p q r s t u v w */
+ 41, 42, 43, 44, 45, 46, 47, 48,
+ /* x y z { | } ~ \x7F */
+ 49, 50, 51, -1, -1, -1, -1, -1
+ };
+
+ const char *source_end = src + srclen;
@ -91,21 +91,18 @@ index 730574b..6ccb799 100644
+ DWORD byte_pair = 0;
+ short offset = 0;
+
+ if (!dstlen)
+ dst = NULL;
+
+ while (src < source_end)
+ {
+ if (*src == '+')
+ {
+ src++; /* skip the + sign */
+ src++;
+ if (src >= source_end)
+ break;
+
+ if (*src == '-')
+ {
+ /* just a plus sign escaped as +- */
+ if (!write_to_w_string(dst, dstlen, &dest_index, '+'))
+ if (!utf7_write_w(dst, dstlen, &dest_index, '+'))
+ return -1;
+ src++;
+ continue;
@ -113,7 +110,7 @@ index 730574b..6ccb799 100644
+
+ do
+ {
+ WCHAR sextet = *src;
+ signed char sextet = *src;
+ if (sextet == '-')
+ {
+ /* skip over the dash and end base64 decoding */
@ -122,45 +119,43 @@ index 730574b..6ccb799 100644
+ offset = 0;
+ break;
+ }
+ else if (sextet <= 127)
+ if (sextet < 0)
+ {
+ sextet = base64_decoding_table[sextet];
+ if (sextet == (WCHAR)-1)
+ {
+ /* -1 means that the next character of src is not part of a base64 sequence */
+ /* in other words, all sextets in this base64 sequence have been processed */
+ /* the current, unfinished byte pair is discarded */
+ offset = 0;
+ break;
+ }
+ }
+ else
+ {
+ /* the next character of src is > 127 and therefore not part of a base64 sequence */
+ /* the next character of src is < 0 and therefore not part of a base64 sequence */
+ /* the current, unfinished byte pair is NOT discarded in this case */
+ /* this is probably a bug in Windows */
+ break;
+ }
+
+ sextet = base64_decoding_table[sextet];
+ if (sextet == -1)
+ {
+ /* -1 means that the next character of src is not part of a base64 sequence */
+ /* in other words, all sextets in this base64 sequence have been processed */
+ /* the current, unfinished byte pair is discarded */
+ offset = 0;
+ break;
+ }
+
+ byte_pair = (byte_pair << 6) | sextet;
+ offset += 6;
+
+ if (offset >= 16)
+ {
+ /* this byte pair is done */
+ if (!write_to_w_string(dst, dstlen, &dest_index, (byte_pair >> (offset - 16)) & 0xFFFF))
+ if (!utf7_write_w(dst, dstlen, &dest_index, (byte_pair >> (offset - 16)) & 0xFFFF))
+ return -1;
+ offset -= 16;
+ }
+
+ /* this sextet is done */
+ src++;
+ } while (src < source_end);
+ }
+ while (src < source_end);
+ }
+ else
+ {
+ /* we have to convert to unsigned char in case *src > 127 */
+ if (!write_to_w_string(dst, dstlen, &dest_index, (unsigned char)*src))
+ /* we have to convert to unsigned char in case *src < 0 */
+ if (!utf7_write_w(dst, dstlen, &dest_index, (unsigned char)*src))
+ return -1;
+ src++;
+ }
@ -173,16 +168,7 @@ index 730574b..6ccb799 100644
* MultiByteToWideChar (KERNEL32.@)
*
* Convert a multibyte character string into a Unicode string.
@@ -1963,7 +2116,7 @@ BOOL WINAPI EnumSystemCodePagesW( CODEPAGE_ENUMPROCW lpfnCodePageEnum, DWORD fla
* flags [I] Character mapping flags
* src [I] Source string buffer
* srclen [I] Length of src (in bytes), or -1 if src is NUL terminated
- * dst [O] Destination buffer
+ * dst [O] Destination buffer, or NULL to compute the required length
* dstlen [I] Length of dst (in WCHARs), or 0 to compute the required length
*
* RETURNS
@@ -2006,9 +2159,8 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
@@ -2006,9 +2154,8 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
SetLastError( ERROR_INVALID_FLAGS );
return 0;
}

View File

@ -1,76 +1,77 @@
From 102cc040e57795ac5287e47194620db8419adcf4 Mon Sep 17 00:00:00 2001
From 02cb021277295aa3a2166e2497a686d2ebb32126 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Thu, 9 Oct 2014 14:07:39 -0600
Date: Fri, 17 Oct 2014 15:40:51 -0600
Subject: kernel32: Support UTF-7 in WideCharToMultiByte.
Portions of utf7_wcstombs were written by Sebastian Lackner
<sebastian@fds-team.de>
---
dlls/kernel32/locale.c | 147 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 143 insertions(+), 4 deletions(-)
dlls/kernel32/locale.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 145 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 6ccb799..b412851 100644
index 0123124..6c2b6e7 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -2200,6 +2200,146 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
@@ -2195,6 +2195,149 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
/***********************************************************************
+ * can_directly_encode
+ * utf7_can_directly_encode
+ *
+ * Helper for utf7_wcstombs
+ */
+static inline BOOL utf7_can_directly_encode(WCHAR codepoint)
+{
+ static const BOOL directly_encodable_table[] = {
+ /* \0 */ TRUE, /* \x01 */ FALSE, /* \x02 */ FALSE, /* \x03 */ FALSE,
+ /* \x04 */ FALSE, /* \x05 */ FALSE, /* \x06 */ FALSE, /* \a */ FALSE,
+ /* \b */ FALSE, /* \t */ TRUE, /* \n */ TRUE, /* \v */ FALSE,
+ /* \f */ FALSE, /* \r */ TRUE, /* \x0E */ FALSE, /* \x0F */ FALSE,
+ /* \x10 */ FALSE, /* \x11 */ FALSE, /* \x12 */ FALSE, /* \x13 */ FALSE,
+ /* \x14 */ FALSE, /* \x15 */ FALSE, /* \x16 */ FALSE, /* \x17 */ FALSE,
+ /* \x18 */ FALSE, /* \x19 */ FALSE, /* \x1A */ FALSE, /* \e */ FALSE,
+ /* \x1C */ FALSE, /* \x1D */ FALSE, /* \x1E */ FALSE, /* \x1F */ FALSE,
+ /* */ TRUE, /* ! */ FALSE, /* " */ FALSE, /* # */ FALSE,
+ /* $ */ FALSE, /* % */ FALSE, /* & */ FALSE, /* ' */ TRUE,
+ /* ( */ TRUE, /* ) */ TRUE, /* * */ FALSE, /* + */ TRUE,
+ /* , */ TRUE, /* - */ TRUE, /* . */ TRUE, /* / */ TRUE,
+ /* 0 */ TRUE, /* 1 */ TRUE, /* 2 */ TRUE, /* 3 */ TRUE,
+ /* 4 */ TRUE, /* 5 */ TRUE, /* 6 */ TRUE, /* 7 */ TRUE,
+ /* 8 */ TRUE, /* 9 */ TRUE, /* : */ TRUE, /* ; */ FALSE,
+ /* < */ FALSE, /* = */ FALSE, /* > */ FALSE, /* ? */ TRUE,
+ /* @ */ FALSE, /* A */ TRUE, /* B */ TRUE, /* C */ TRUE,
+ /* D */ TRUE, /* E */ TRUE, /* F */ TRUE, /* G */ TRUE,
+ /* H */ TRUE, /* I */ TRUE, /* J */ TRUE, /* K */ TRUE,
+ /* L */ TRUE, /* M */ TRUE, /* N */ TRUE, /* O */ TRUE,
+ /* P */ TRUE, /* Q */ TRUE, /* R */ TRUE, /* S */ TRUE,
+ /* T */ TRUE, /* U */ TRUE, /* V */ TRUE, /* W */ TRUE,
+ /* X */ TRUE, /* Y */ TRUE, /* Z */ TRUE, /* [ */ FALSE,
+ /* \ */ FALSE, /* ] */ FALSE, /* ^ */ FALSE, /* _ */ FALSE,
+ /* ` */ FALSE, /* a */ TRUE, /* b */ TRUE, /* c */ TRUE,
+ /* d */ TRUE, /* e */ TRUE, /* f */ TRUE, /* g */ TRUE,
+ /* h */ TRUE, /* i */ TRUE, /* j */ TRUE, /* k */ TRUE,
+ /* l */ TRUE, /* m */ TRUE, /* n */ TRUE, /* o */ TRUE,
+ /* p */ TRUE, /* q */ TRUE, /* r */ TRUE, /* s */ TRUE,
+ /* t */ TRUE, /* u */ TRUE, /* v */ TRUE, /* w */ TRUE,
+ /* x */ TRUE, /* y */ TRUE, /* z */ TRUE
+ /* \0 \x01 \x02 \x03 \x04 \x05 \x06 \a */
+ TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+ /* \b \t \n \v \f \r \x0E \x0F */
+ FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE,
+ /* \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 */
+ FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+ /* \x18 \x19 \x1A \e \x1C \x1D \x1E \x1F */
+ FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+ /* ! " # $ % & ' */
+ TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+ /* ( ) * + , - . / */
+ TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* 0 1 2 3 4 5 6 7 */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* 8 9 : ; < = > ? */
+ TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE,
+ /* @ A B C D E F G */
+ FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* H I J K L M N O */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* P Q R S T U V W */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* X Y Z [ \ ] ^ _ */
+ TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
+ /* ` a b c d e f g */
+ FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* h i j k l m n o */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* p q r s t u v w */
+ TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
+ /* x y z */
+ TRUE, TRUE, TRUE
+ };
+
+ return codepoint <= 'z' ? directly_encodable_table[codepoint] : FALSE;
+}
+
+/***********************************************************************
+ * write_to_c_string
+ * utf7_write_c
+ *
+ * Helper for utf7_wcstombs
+ *
+ * RETURNS
+ * TRUE on success, FALSE on error
+ */
+static inline BOOL write_to_c_string(char *dst, int dstlen, int *index, char character)
+static inline BOOL utf7_write_c(char *dst, int dstlen, int *index, char character)
+{
+ if (dst)
+ if (dstlen > 0)
+ {
+ if (*index >= dstlen)
+ return FALSE;
@ -99,22 +100,19 @@ index 6ccb799..b412851 100644
+ const WCHAR *source_end = src + srclen;
+ int dest_index = 0;
+
+ if (!dstlen)
+ dst = NULL;
+
+ while (src < source_end)
+ {
+ if (*src == '+')
+ {
+ if (!write_to_c_string(dst, dstlen, &dest_index, '+'))
+ if (!utf7_write_c(dst, dstlen, &dest_index, '+'))
+ return -1;
+ if (!write_to_c_string(dst, dstlen, &dest_index, '-'))
+ if (!utf7_write_c(dst, dstlen, &dest_index, '-'))
+ return -1;
+ src++;
+ }
+ else if (utf7_can_directly_encode(*src))
+ {
+ if (!write_to_c_string(dst, dstlen, &dest_index, *src))
+ if (!utf7_write_c(dst, dstlen, &dest_index, *src))
+ return -1;
+ src++;
+ }
@ -123,7 +121,7 @@ index 6ccb799..b412851 100644
+ unsigned int offset = 0;
+ DWORD byte_pair = 0;
+
+ if (!write_to_c_string(dst, dstlen, &dest_index, '+'))
+ if (!utf7_write_c(dst, dstlen, &dest_index, '+'))
+ return -1;
+
+ do
@ -132,7 +130,7 @@ index 6ccb799..b412851 100644
+ offset += 16;
+ while (offset >= 6)
+ {
+ if (!write_to_c_string(dst, dstlen, &dest_index, base64_encoding_table[(byte_pair >> (offset - 6)) & 0x3F]))
+ if (!utf7_write_c(dst, dstlen, &dest_index, base64_encoding_table[(byte_pair >> (offset - 6)) & 0x3F]))
+ return -1;
+ offset -= 6;
+ }
@ -142,13 +140,18 @@ index 6ccb799..b412851 100644
+
+ if (offset)
+ {
+ /* Windows won't create a padded base64 character if there's not room for the - sign too */
+ /* this is probably a bug in Windows */
+ if (dstlen > 0 && dest_index + 1 >= dstlen)
+ return -1;
+
+ byte_pair <<= (6 - offset);
+ if (!write_to_c_string(dst, dstlen, &dest_index, base64_encoding_table[byte_pair & 0x3F]))
+ if (!utf7_write_c(dst, dstlen, &dest_index, base64_encoding_table[byte_pair & 0x3F]))
+ return -1;
+ }
+
+ /* Windows always explicitly terminates the base64 sequence even though RFC 2152 (page 3, rule 2) does not require this */
+ if (!write_to_c_string(dst, dstlen, &dest_index, '-'))
+ if (!utf7_write_c(dst, dstlen, &dest_index, '-'))
+ return -1;
+ }
+ }
@ -160,16 +163,7 @@ index 6ccb799..b412851 100644
* WideCharToMultiByte (KERNEL32.@)
*
* Convert a Unicode character string into a multibyte string.
@@ -2209,7 +2349,7 @@ INT WINAPI MultiByteToWideChar( UINT page, DWORD flags, LPCSTR src, INT srclen,
* flags [I] Mapping Flags (MB_ constants from "winnls.h").
* src [I] Source string buffer
* srclen [I] Length of src (in WCHARs), or -1 if src is NUL terminated
- * dst [O] Destination buffer
+ * dst [O] Destination buffer, or NULL to compute the required length
* dstlen [I] Length of dst (in bytes), or 0 to compute the required length
* defchar [I] Default character to use for conversion if no exact
* conversion can be made
@@ -2266,9 +2406,8 @@ INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen,
@@ -2261,9 +2404,8 @@ INT WINAPI WideCharToMultiByte( UINT page, DWORD flags, LPCWSTR src, INT srclen,
SetLastError( ERROR_INVALID_FLAGS );
return 0;
}

View File

@ -1,4 +1,4 @@
Author: Alex Henrie
Subject: Support for UTF7 encoding/decoding
Revision: 2
Revision: 3
Fixes: [27388] Support for UTF7 encoding/decoding