* be used for encoding validation purpose.\r
*/\r
\r
+/* for WC_NO_BEST_FIT_CHARS */\r
+#ifndef WINVER\r
+# define WINVER 0x0500\r
+#endif\r
+\r
+#define STRICT\r
#include <windows.h>\r
#include <errno.h>\r
#include <string.h>\r
\r
#define MB_CHAR_MAX 16\r
\r
-#define UNICODE_MODE_BOM_DONE 1\r
-#define UNICODE_MODE_SWAPPED 2\r
+#define UNICODE_MODE_BOM_DONE 1\r
+#define UNICODE_MODE_SWAPPED 2\r
\r
-#define UNICODE_FLAG_USE_BOM_ENDIAN 1\r
+#define FLAG_USE_BOM_ENDIAN 1\r
+#define FLAG_TRANSLIT 2 /* //TRANSLIT */\r
+#define FLAG_IGNORE 4 /* //IGNORE (not implemented) */\r
\r
#define return_error(code) \\r
do { \\r
CPINFOEX cpinfoex;\r
csconv_t cv;\r
int use_compat = TRUE;\r
+ int flag = 0;\r
char name[128];\r
char *p;\r
\r
{\r
if (_stricmp(p + 2, "nocompat") == 0)\r
use_compat = FALSE;\r
+ else if (_stricmp(p + 2, "translit") == 0)\r
+ flag |= FLAG_TRANSLIT;\r
+ else if (_stricmp(p + 2, "ignore") == 0)\r
+ flag |= FLAG_IGNORE;\r
*p = 0;\r
}\r
\r
cv.mode = 0;\r
- cv.flags = 0;\r
+ cv.flags = flag;\r
cv.mblen = NULL;\r
cv.flush = NULL;\r
cv.compat = NULL;\r
if (_stricmp(name, "UTF-16") == 0 ||\r
_stricmp(name, "UTF16") == 0 ||\r
_stricmp(name, "UCS-2") == 0)\r
- cv.flags |= UNICODE_FLAG_USE_BOM_ENDIAN;\r
+ cv.flags |= FLAG_USE_BOM_ENDIAN;\r
}\r
else if (cv.codepage == 12000 || cv.codepage == 12001)\r
{\r
cv.mbtowc = utf32_mbtowc;\r
cv.wctomb = utf32_wctomb;\r
if (_stricmp(name, "UTF-32") == 0 || _stricmp(name, "UTF32") == 0)\r
- cv.flags |= UNICODE_FLAG_USE_BOM_ENDIAN;\r
+ cv.flags |= FLAG_USE_BOM_ENDIAN;\r
}\r
else if (cv.codepage == 65001)\r
{\r
check_utf_bom(rec_iconv_t *cd, ushort *wbuf, int *wbufsize)\r
{\r
/* If we have a BOM, trust it, despite what the caller said */\r
- if (wbuf[0] == 0xFFFE && (cd->from.flags & UNICODE_FLAG_USE_BOM_ENDIAN))\r
+ if (wbuf[0] == 0xFFFE && (cd->from.flags & FLAG_USE_BOM_ENDIAN))\r
{\r
/* swap endian: 1200 <-> 1201 or 12000 <-> 12001 */\r
cd->from.codepage ^= 1;\r
kernel_wctomb(csconv_t *cv, ushort *wbuf, int wbufsize, uchar *buf, int bufsize)\r
{\r
BOOL usedDefaultChar = 0;\r
+ BOOL *p = NULL;\r
+ int flags = 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
- must_use_null_useddefaultchar(cv->codepage) ? NULL : &usedDefaultChar);\r
+ if (!must_use_null_useddefaultchar(cv->codepage))\r
+ {\r
+ p = &usedDefaultChar;\r
+#ifdef WC_NO_BEST_FIT_CHARS\r
+ if (!(cv->flags & FLAG_TRANSLIT))\r
+ flags |= WC_NO_BEST_FIT_CHARS;\r
+#endif\r
+ }\r
+ len = WideCharToMultiByte(cv->codepage, flags,\r
+ (const wchar_t *)wbuf, wbufsize, (char *)buf, bufsize, NULL, p);\r
if (len == 0)\r
{\r
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r