Some improvements, being upstreamed. (must_use_null_useddefaultchar): New
authorTor Lillqvist <tml@novell.com>
Mon, 26 Nov 2007 22:49:43 +0000 (22:49 +0000)
committerTor Lillqvist <tml@src.gnome.org>
Mon, 26 Nov 2007 22:49:43 +0000 (22:49 +0000)
2007-11-27  Tor Lillqvist  <tml@novell.com>

* glib/win_iconv.c: Some improvements, being upstreamed.
(must_use_null_useddefaultchar): New function, checks for those
codepages for which one must pass a NULL lpUsedDefaultChar pointer
to WideCharToMultiByte().
(kernel_wctomb): Use it.
(kernel_wctomb): Return with E2BIG immediately if bufsize is zero.

svn path=/trunk/; revision=5945

ChangeLog
glib/win_iconv.c

index 384503b..f7e25bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 2007-11-27  Tor Lillqvist  <tml@novell.com>
 
+       * glib/win_iconv.c: Some improvements, being upstreamed.
+       (must_use_null_useddefaultchar): New function, checks for those
+       codepages for which one must pass a NULL lpUsedDefaultChar pointer
+       to WideCharToMultiByte().
+       (kernel_wctomb): Use it.
+       (kernel_wctomb): Return with E2BIG immediately if bufsize is zero.
+
+2007-11-27  Tor Lillqvist  <tml@novell.com>
+
        * glib/gutils.c (_glib_get_locale_dir) [Win32]: Use either
        lib/locale or share/locale depending on which one is in
        GLIB_LOCALE_DIR. When the configury recognizes GNU gettext (based
index e61eb0d..7fb1da2 100644 (file)
@@ -137,6 +137,7 @@ static int name_to_codepage(const char *name);
 static uint utf16_to_ucs4(const ushort *wbuf);\r
 static void ucs4_to_utf16(uint wc, ushort *wbuf, int *wbufsize);\r
 static int is_unicode(int codepage);\r
+static int must_use_null_useddefaultchar(int codepage);\r
 static void check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize);\r
 static char *strrstr(const char *str, const char *token);\r
 \r
@@ -1001,6 +1002,18 @@ is_unicode(int codepage)
             codepage == 65000 || codepage == 65001);\r
 }\r
 \r
+static int\r
+must_use_null_useddefaultchar(int codepage)\r
+{\r
+    return (codepage == 65000 || codepage == 65001 ||\r
+            codepage == 50220 || codepage == 50221 ||\r
+            codepage == 50222 || codepage == 50225 ||\r
+            codepage == 50227 || codepage == 50229 ||\r
+            codepage == 52936 || codepage == 54936 ||\r
+            (codepage >= 57002 && codepage <= 57011) ||\r
+            codepage == 42);\r
+}\r
+\r
 static void\r
 check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize)\r
 {\r
@@ -1269,9 +1282,11 @@ kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)
     BOOL usedDefaultChar = 0;\r
     int len;\r
 \r
+    if (bufsize == 0)\r
+        return_error(E2BIG);\r
     len = WideCharToMultiByte(cv->codepage, 0,\r
             (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL,\r
-            (cv->codepage == 65000 || cv->codepage == 65001) ? NULL : &usedDefaultChar);\r
+            must_use_null_useddefaultchar(cv->codepage) ? NULL : &usedDefaultChar);\r
     if (len == 0)\r
     {\r
         if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r