Added support for WC_NO_BEST_FIT_CHAR and default char parameters in
cp_wcstombs. Minor cosmetic fixes.
This commit is contained in:
parent
70b699a1a1
commit
6659308fe9
|
@ -12,7 +12,7 @@ struct cp_info
|
|||
{
|
||||
unsigned int codepage; /* codepage id */
|
||||
unsigned int char_size; /* char size (1 or 2 bytes) */
|
||||
char def_char[2]; /* default char value */
|
||||
unsigned short def_char; /* default char value (can be double-byte) */
|
||||
unsigned short def_unicode_char; /* default Unicode char value */
|
||||
const char *name; /* code page name */
|
||||
};
|
||||
|
@ -50,11 +50,30 @@ extern int cp_mbstowcs( const union cptable *table, int flags,
|
|||
unsigned short *dst, int dstlen );
|
||||
extern int cp_wcstombs( const union cptable *table, int flags,
|
||||
const unsigned short *src, int srclen,
|
||||
char *dst, int dstlen );
|
||||
char *dst, int dstlen, const char *defchar, int *used );
|
||||
|
||||
|
||||
static inline int is_dbcs_leadbyte( const union cptable *table, unsigned char ch )
|
||||
{
|
||||
return (table->info.char_size == 2) && (table->dbcs.cp2uni_leadbytes[ch]);
|
||||
}
|
||||
|
||||
static inline unsigned int strlenW( const unsigned short *str )
|
||||
{
|
||||
#if defined(__i386__) && defined(__GNUC__)
|
||||
int dummy, res;
|
||||
__asm__( "cld\n\t"
|
||||
"repne\n\t"
|
||||
"scasw\n\t"
|
||||
"notl %0"
|
||||
: "=c" (res), "=&D" (dummy)
|
||||
: "0" (0xffffffff), "1" (str), "a" (0) );
|
||||
return res - 1;
|
||||
#else
|
||||
const unsigned short *s = str;
|
||||
while (*s) s++;
|
||||
return s - str;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __WINE_UNICODE_H */
|
||||
|
|
|
@ -153,11 +153,11 @@
|
|||
#define CP_UTF7 65000
|
||||
#define CP_UTF8 65001
|
||||
|
||||
#define WC_DEFAULTCHECK 0x00000100
|
||||
#define WC_COMPOSITECHECK 0x00000200
|
||||
#define WC_DISCARDNS 0x00000010
|
||||
#define WC_SEPCHARS 0x00000020
|
||||
#define WC_DEFAULTCHAR 0x00000040
|
||||
#define WC_DISCARDNS 0x00000010
|
||||
#define WC_SEPCHARS 0x00000020
|
||||
#define WC_DEFAULTCHAR 0x00000040
|
||||
#define WC_COMPOSITECHECK 0x00000200
|
||||
#define WC_NO_BEST_FIT_CHARS 0x00000400
|
||||
|
||||
#define MAKELCID(l, s) (MAKELONG(l, s))
|
||||
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_037 =
|
||||
{
|
||||
{ 37, 1, { 0x3f, 0x00 }, 0x003f, "IBM EBCDIC US Canada" },
|
||||
{ 37, 1, 0x003f, 0x003f, "IBM EBCDIC US Canada" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10000 =
|
||||
{
|
||||
{ 10000, 1, { 0x3f, 0x00 }, 0x003f, "Mac Roman" },
|
||||
{ 10000, 1, 0x003f, 0x003f, "Mac Roman" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10006 =
|
||||
{
|
||||
{ 10006, 1, { 0x3f, 0x00 }, 0x003f, "Mac Greek" },
|
||||
{ 10006, 1, 0x003f, 0x003f, "Mac Greek" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10007 =
|
||||
{
|
||||
{ 10007, 1, { 0x3f, 0x00 }, 0x003f, "Mac Cyrillic" },
|
||||
{ 10007, 1, 0x003f, 0x003f, "Mac Cyrillic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10029 =
|
||||
{
|
||||
{ 10029, 1, { 0x3f, 0x00 }, 0x003f, "Mac Latin 2" },
|
||||
{ 10029, 1, 0x003f, 0x003f, "Mac Latin 2" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1006 =
|
||||
{
|
||||
{ 1006, 1, { 0x3f, 0x00 }, 0x003f, "IBM Arabic" },
|
||||
{ 1006, 1, 0x003f, 0x003f, "IBM Arabic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10079 =
|
||||
{
|
||||
{ 10079, 1, { 0x3f, 0x00 }, 0x003f, "Mac Icelandic" },
|
||||
{ 10079, 1, 0x003f, 0x003f, "Mac Icelandic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_10081 =
|
||||
{
|
||||
{ 10081, 1, { 0x3f, 0x00 }, 0x003f, "Mac Turkish" },
|
||||
{ 10081, 1, 0x003f, 0x003f, "Mac Turkish" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1026 =
|
||||
{
|
||||
{ 1026, 1, { 0x3f, 0x00 }, 0x003f, "IBM EBCDIC Latin 5 Turkish" },
|
||||
{ 1026, 1, 0x003f, 0x003f, "IBM EBCDIC Latin 5 Turkish" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1250 =
|
||||
{
|
||||
{ 1250, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Eastern Europe" },
|
||||
{ 1250, 1, 0x003f, 0x003f, "ANSI Eastern Europe" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1251 =
|
||||
{
|
||||
{ 1251, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Cyrillic" },
|
||||
{ 1251, 1, 0x003f, 0x003f, "ANSI Cyrillic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1252 =
|
||||
{
|
||||
{ 1252, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Latin 1" },
|
||||
{ 1252, 1, 0x003f, 0x003f, "ANSI Latin 1" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1253 =
|
||||
{
|
||||
{ 1253, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Greek" },
|
||||
{ 1253, 1, 0x003f, 0x003f, "ANSI Greek" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1254 =
|
||||
{
|
||||
{ 1254, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Turkish" },
|
||||
{ 1254, 1, 0x003f, 0x003f, "ANSI Turkish" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1255 =
|
||||
{
|
||||
{ 1255, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Hebrew" },
|
||||
{ 1255, 1, 0x003f, 0x003f, "ANSI Hebrew" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1256 =
|
||||
{
|
||||
{ 1256, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Arabic" },
|
||||
{ 1256, 1, 0x003f, 0x003f, "ANSI Arabic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1257 =
|
||||
{
|
||||
{ 1257, 1, { 0x3f, 0x00 }, 0x003f, "ANSI Baltic" },
|
||||
{ 1257, 1, 0x003f, 0x003f, "ANSI Baltic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_1258 =
|
||||
{
|
||||
{ 1258, 1, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Viet Nam" },
|
||||
{ 1258, 1, 0x003f, 0x003f, "ANSI/OEM Viet Nam" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_20866 =
|
||||
{
|
||||
{ 20866, 1, { 0x3f, 0x00 }, 0x003f, "Russian KOI8" },
|
||||
{ 20866, 1, 0x003f, 0x003f, "Russian KOI8" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28591 =
|
||||
{
|
||||
{ 28591, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-1 Latin 1" },
|
||||
{ 28591, 1, 0x003f, 0x003f, "ISO 8859-1 Latin 1" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28592 =
|
||||
{
|
||||
{ 28592, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-2 Eastern Europe" },
|
||||
{ 28592, 1, 0x003f, 0x003f, "ISO 8859-2 Eastern Europe" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28593 =
|
||||
{
|
||||
{ 28593, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-3 Turkish" },
|
||||
{ 28593, 1, 0x003f, 0x003f, "ISO 8859-3 Turkish" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28594 =
|
||||
{
|
||||
{ 28594, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-4 Baltic" },
|
||||
{ 28594, 1, 0x003f, 0x003f, "ISO 8859-4 Baltic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28595 =
|
||||
{
|
||||
{ 28595, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-5 Cyrillic" },
|
||||
{ 28595, 1, 0x003f, 0x003f, "ISO 8859-5 Cyrillic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28596 =
|
||||
{
|
||||
{ 28596, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-6 Arabic" },
|
||||
{ 28596, 1, 0x003f, 0x003f, "ISO 8859-6 Arabic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28597 =
|
||||
{
|
||||
{ 28597, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-7 Greek" },
|
||||
{ 28597, 1, 0x003f, 0x003f, "ISO 8859-7 Greek" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28598 =
|
||||
{
|
||||
{ 28598, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-8 Hebrew" },
|
||||
{ 28598, 1, 0x003f, 0x003f, "ISO 8859-8 Hebrew" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_28599 =
|
||||
{
|
||||
{ 28599, 1, { 0x3f, 0x00 }, 0x003f, "ISO 8859-9 Latin 5" },
|
||||
{ 28599, 1, 0x003f, 0x003f, "ISO 8859-9 Latin 5" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_424 =
|
||||
{
|
||||
{ 424, 1, { 0x3f, 0x00 }, 0x003f, "IBM EBCDIC Hebrew" },
|
||||
{ 424, 1, 0x003f, 0x003f, "IBM EBCDIC Hebrew" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_437 =
|
||||
{
|
||||
{ 437, 1, { 0x3f, 0x00 }, 0x003f, "OEM United States" },
|
||||
{ 437, 1, 0x003f, 0x003f, "OEM United States" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_500 =
|
||||
{
|
||||
{ 500, 1, { 0x3f, 0x00 }, 0x003f, "IBM EBCDIC International" },
|
||||
{ 500, 1, 0x003f, 0x003f, "IBM EBCDIC International" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_737 =
|
||||
{
|
||||
{ 737, 1, { 0x3f, 0x00 }, 0x003f, "OEM Greek 437G" },
|
||||
{ 737, 1, 0x003f, 0x003f, "OEM Greek 437G" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_775 =
|
||||
{
|
||||
{ 775, 1, { 0x3f, 0x00 }, 0x003f, "OEM Baltic" },
|
||||
{ 775, 1, 0x003f, 0x003f, "OEM Baltic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_850 =
|
||||
{
|
||||
{ 850, 1, { 0x3f, 0x00 }, 0x003f, "OEM Multilingual Latin 1" },
|
||||
{ 850, 1, 0x003f, 0x003f, "OEM Multilingual Latin 1" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_852 =
|
||||
{
|
||||
{ 852, 1, { 0x3f, 0x00 }, 0x003f, "OEM Slovak Latin 2" },
|
||||
{ 852, 1, 0x003f, 0x003f, "OEM Slovak Latin 2" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_855 =
|
||||
{
|
||||
{ 855, 1, { 0x3f, 0x00 }, 0x003f, "OEM Cyrillic" },
|
||||
{ 855, 1, 0x003f, 0x003f, "OEM Cyrillic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_856 =
|
||||
{
|
||||
{ 856, 1, { 0x3f, 0x00 }, 0x003f, "Hebrew PC" },
|
||||
{ 856, 1, 0x003f, 0x003f, "Hebrew PC" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_857 =
|
||||
{
|
||||
{ 857, 1, { 0x3f, 0x00 }, 0x003f, "OEM Turkish" },
|
||||
{ 857, 1, 0x003f, 0x003f, "OEM Turkish" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_860 =
|
||||
{
|
||||
{ 860, 1, { 0x3f, 0x00 }, 0x003f, "OEM Portuguese" },
|
||||
{ 860, 1, 0x003f, 0x003f, "OEM Portuguese" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_861 =
|
||||
{
|
||||
{ 861, 1, { 0x3f, 0x00 }, 0x003f, "OEM Icelandic" },
|
||||
{ 861, 1, 0x003f, 0x003f, "OEM Icelandic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_862 =
|
||||
{
|
||||
{ 862, 1, { 0x3f, 0x00 }, 0x003f, "OEM Hebrew" },
|
||||
{ 862, 1, 0x003f, 0x003f, "OEM Hebrew" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_863 =
|
||||
{
|
||||
{ 863, 1, { 0x3f, 0x00 }, 0x003f, "OEM Canadian French" },
|
||||
{ 863, 1, 0x003f, 0x003f, "OEM Canadian French" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_864 =
|
||||
{
|
||||
{ 864, 1, { 0x3f, 0x00 }, 0x003f, "OEM Arabic" },
|
||||
{ 864, 1, 0x003f, 0x003f, "OEM Arabic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_865 =
|
||||
{
|
||||
{ 865, 1, { 0x3f, 0x00 }, 0x003f, "OEM Nordic" },
|
||||
{ 865, 1, 0x003f, 0x003f, "OEM Nordic" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_866 =
|
||||
{
|
||||
{ 866, 1, { 0x3f, 0x00 }, 0x003f, "OEM Russian" },
|
||||
{ 866, 1, 0x003f, 0x003f, "OEM Russian" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_869 =
|
||||
{
|
||||
{ 869, 1, { 0x3f, 0x00 }, 0x003f, "OEM Greek" },
|
||||
{ 869, 1, 0x003f, 0x003f, "OEM Greek" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_874 =
|
||||
{
|
||||
{ 874, 1, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Thai" },
|
||||
{ 874, 1, 0x003f, 0x003f, "ANSI/OEM Thai" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -643,7 +643,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_875 =
|
||||
{
|
||||
{ 875, 1, { 0x3f, 0x00 }, 0x003f, "IBM EBCDIC Greek" },
|
||||
{ 875, 1, 0x003f, 0x003f, "IBM EBCDIC Greek" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -676,7 +676,7 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct sbcs_table cptable_878 =
|
||||
{
|
||||
{ 878, 1, { 0x3f, 0x00 }, 0x003f, "Russian KOI8" },
|
||||
{ 878, 1, 0x003f, 0x003f, "Russian KOI8" },
|
||||
cp2uni,
|
||||
uni2cp_low,
|
||||
uni2cp_high
|
||||
|
|
|
@ -5200,10 +5200,10 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct dbcs_table cptable_932 =
|
||||
{
|
||||
{ 932, 2, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Japanese Shift-JIS" },
|
||||
{ 932, 2, 0x003f, 0x003f, "ANSI/OEM Japanese Shift-JIS" },
|
||||
cp2uni,
|
||||
cp2uni_leadbytes,
|
||||
uni2cp_low,
|
||||
uni2cp_high,
|
||||
{ 0x81, 0x9f, 0xe0, 0xfc, }
|
||||
{ 0x81, 0x9f, 0xe0, 0xfc, 0x00, 0x00 }
|
||||
};
|
||||
|
|
|
@ -7840,10 +7840,10 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct dbcs_table cptable_936 =
|
||||
{
|
||||
{ 936, 2, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Simplified Chinese GBK" },
|
||||
{ 936, 2, 0x003f, 0x003f, "ANSI/OEM Simplified Chinese GBK" },
|
||||
cp2uni,
|
||||
cp2uni_leadbytes,
|
||||
uni2cp_low,
|
||||
uni2cp_high,
|
||||
{ 0x81, 0xfe, }
|
||||
{ 0x81, 0xfe, 0x00, 0x00 }
|
||||
};
|
||||
|
|
|
@ -9259,10 +9259,10 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct dbcs_table cptable_949 =
|
||||
{
|
||||
{ 949, 2, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Korean Unified Hangul" },
|
||||
{ 949, 2, 0x003f, 0x003f, "ANSI/OEM Korean Unified Hangul" },
|
||||
cp2uni,
|
||||
cp2uni_leadbytes,
|
||||
uni2cp_low,
|
||||
uni2cp_high,
|
||||
{ 0x81, 0xfe, }
|
||||
{ 0x81, 0xfe, 0x00, 0x00 }
|
||||
};
|
||||
|
|
|
@ -6553,10 +6553,10 @@ static const unsigned short uni2cp_high[256] =
|
|||
|
||||
const struct dbcs_table cptable_950 =
|
||||
{
|
||||
{ 950, 2, { 0x3f, 0x00 }, 0x003f, "ANSI/OEM Traditional Chinese Big5" },
|
||||
{ 950, 2, 0x003f, 0x003f, "ANSI/OEM Traditional Chinese Big5" },
|
||||
cp2uni,
|
||||
cp2uni_leadbytes,
|
||||
uni2cp_low,
|
||||
uni2cp_high,
|
||||
{ 0x81, 0xfe, }
|
||||
{ 0x81, 0xfe, 0x00, 0x00 }
|
||||
};
|
||||
|
|
|
@ -328,7 +328,7 @@ sub DUMP_SBCS_TABLE
|
|||
# output the code page descriptor
|
||||
|
||||
printf OUTPUT "const struct sbcs_table cptable_%03d =\n{\n", $codepage;
|
||||
printf OUTPUT " { %d, 1, { 0x%02x, 0x00 }, 0x%04x, \"%s\" },\n",
|
||||
printf OUTPUT " { %d, 1, 0x%04x, 0x%04x, \"%s\" },\n",
|
||||
$codepage, $DEF_CHAR, $DEF_CHAR, $name;
|
||||
printf OUTPUT " cp2uni,\n";
|
||||
printf OUTPUT " uni2cp_low,\n";
|
||||
|
@ -471,7 +471,7 @@ sub DUMP_DBCS_TABLE
|
|||
# output the code page descriptor
|
||||
|
||||
printf OUTPUT "const struct dbcs_table cptable_%03d =\n{\n", $codepage;
|
||||
printf OUTPUT " { %d, 2, { 0x%02x, 0x00 }, 0x%04x, \"%s\" },\n",
|
||||
printf OUTPUT " { %d, 2, 0x%04x, 0x%04x, \"%s\" },\n",
|
||||
$codepage, $DEF_CHAR, $DEF_CHAR, $name;
|
||||
printf OUTPUT " cp2uni,\n";
|
||||
printf OUTPUT " cp2uni_leadbytes,\n";
|
||||
|
@ -503,7 +503,7 @@ sub DUMP_LB_RANGES
|
|||
}
|
||||
}
|
||||
if ($on) { printf OUTPUT "0xff, "; }
|
||||
printf OUTPUT "}\n";
|
||||
printf OUTPUT "0x00, 0x00 }\n";
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ static inline int check_invalid_chars_sbcs( const struct sbcs_table *table,
|
|||
const unsigned short * const cp2uni = table->cp2uni;
|
||||
while (srclen)
|
||||
{
|
||||
if (cp2uni[*src] == table->info.def_unicode_char && *src != table->info.def_char[0])
|
||||
if (cp2uni[*src] == table->info.def_unicode_char && *src != table->info.def_char)
|
||||
break;
|
||||
src++;
|
||||
srclen--;
|
||||
|
@ -102,13 +102,12 @@ static inline int check_invalid_chars_dbcs( const struct dbcs_table *table,
|
|||
{
|
||||
if (srclen == 1) break; /* partial char, error */
|
||||
if (cp2uni[(off << 8) + src[1]] == table->info.def_unicode_char &&
|
||||
(src[0] != table->info.def_char[0] || src[1] != table->info.def_char[1]))
|
||||
break;
|
||||
((src[0] << 8) | src[1]) != table->info.def_char) break;
|
||||
src++;
|
||||
srclen--;
|
||||
}
|
||||
else if (cp2uni[*src] == table->info.def_unicode_char &&
|
||||
(*src != table->info.def_char[0] || table->info.def_char[1])) break;
|
||||
*src != table->info.def_char) break;
|
||||
src++;
|
||||
srclen--;
|
||||
}
|
||||
|
|
102
unicode/wctomb.c
102
unicode/wctomb.c
|
@ -55,6 +55,44 @@ static inline int wcstombs_sbcs( const struct sbcs_table *table,
|
|||
}
|
||||
}
|
||||
|
||||
/* slow version of wcstombs_sbcs that handles the various flags */
|
||||
static int wcstombs_sbcs_slow( const struct sbcs_table *table, int flags,
|
||||
const unsigned short *src, unsigned int srclen,
|
||||
char *dst, unsigned int dstlen,
|
||||
const char *defchar, int *used )
|
||||
{
|
||||
const unsigned short * const cp2uni = table->cp2uni;
|
||||
const unsigned char * const uni2cp_low = table->uni2cp_low;
|
||||
const unsigned short * const uni2cp_high = table->uni2cp_high;
|
||||
const unsigned char table_default = table->info.def_char & 0xff;
|
||||
int ret = srclen, tmp;
|
||||
|
||||
if (dstlen < srclen)
|
||||
{
|
||||
/* buffer too small: fill it up to dstlen and return error */
|
||||
srclen = dstlen;
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
if (!defchar) defchar = &table_default;
|
||||
if (!used) used = &tmp; /* avoid checking on every char */
|
||||
|
||||
while (srclen)
|
||||
{
|
||||
unsigned char ch = uni2cp_low[uni2cp_high[*src >> 8] + (*src & 0xff)];
|
||||
if (((flags & WC_NO_BEST_FIT_CHARS) && (cp2uni[ch] != *src)) ||
|
||||
(ch == table_default && *src != table->info.def_unicode_char))
|
||||
{
|
||||
ch = *defchar;
|
||||
*used = 1;
|
||||
}
|
||||
*dst++ = ch;
|
||||
src++;
|
||||
srclen--;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* query necessary dst length for src string */
|
||||
static inline int get_length_dbcs( const struct dbcs_table *table,
|
||||
const unsigned short *src, unsigned int srclen )
|
||||
|
@ -94,20 +132,82 @@ static inline int wcstombs_dbcs( const struct dbcs_table *table,
|
|||
return dstlen - len;
|
||||
}
|
||||
|
||||
/* slow version of wcstombs_dbcs that handles the various flags */
|
||||
static int wcstombs_dbcs_slow( const struct dbcs_table *table, int flags,
|
||||
const unsigned short *src, unsigned int srclen,
|
||||
char *dst, unsigned int dstlen,
|
||||
const char *defchar, int *used )
|
||||
{
|
||||
const unsigned short * const uni2cp_low = table->uni2cp_low;
|
||||
const unsigned short * const uni2cp_high = table->uni2cp_high;
|
||||
const unsigned short * const cp2uni = table->cp2uni;
|
||||
const unsigned char * const cp2uni_lb = table->cp2uni_leadbytes;
|
||||
unsigned short defchar_value = table->info.def_char;
|
||||
int len, tmp;
|
||||
|
||||
if (defchar) defchar_value = defchar[1] ? ((defchar[0] << 8) | defchar[1]) : defchar[0];
|
||||
if (!used) used = &tmp; /* avoid checking on every char */
|
||||
|
||||
for (len = dstlen; srclen && len; len--, srclen--, src++)
|
||||
{
|
||||
unsigned short res = uni2cp_low[uni2cp_high[*src >> 8] + (*src & 0xff)];
|
||||
|
||||
if (res == table->info.def_char && *src != table->info.def_unicode_char)
|
||||
{
|
||||
res = defchar_value;
|
||||
*used = 1;
|
||||
}
|
||||
else if (flags & WC_NO_BEST_FIT_CHARS)
|
||||
{
|
||||
/* check if char maps back to the same Unicode value */
|
||||
if (res & 0xff00)
|
||||
{
|
||||
unsigned char off = cp2uni_lb[res >> 8];
|
||||
if (cp2uni[(off << 8) + (res & 0xff)] != *src)
|
||||
{
|
||||
res = defchar_value;
|
||||
*used = 1;
|
||||
}
|
||||
}
|
||||
else if (cp2uni[res & 0xff] != *src)
|
||||
{
|
||||
res = defchar_value;
|
||||
*used = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (res & 0xff00)
|
||||
{
|
||||
if (len == 1) break; /* do not output a partial char */
|
||||
len--;
|
||||
*dst++ = res >> 8;
|
||||
}
|
||||
*dst++ = (char)res;
|
||||
}
|
||||
if (srclen) return -1; /* overflow */
|
||||
return dstlen - len;
|
||||
}
|
||||
|
||||
/* wide char to multi byte string conversion */
|
||||
/* return -1 on dst buffer overflow */
|
||||
int cp_wcstombs( const union cptable *table, int flags,
|
||||
const unsigned short *src, int srclen,
|
||||
char *dst, int dstlen )
|
||||
char *dst, int dstlen, const char *defchar, int *used )
|
||||
{
|
||||
if (table->info.char_size == 1)
|
||||
{
|
||||
if (!dstlen) return srclen;
|
||||
if (flags || defchar || used)
|
||||
return wcstombs_sbcs_slow( &table->sbcs, flags, src, srclen,
|
||||
dst, dstlen, defchar, used );
|
||||
return wcstombs_sbcs( &table->sbcs, src, srclen, dst, dstlen );
|
||||
}
|
||||
else /* mbcs */
|
||||
{
|
||||
if (!dstlen) return get_length_dbcs( &table->dbcs, src, srclen );
|
||||
if (flags || defchar || used)
|
||||
return wcstombs_dbcs_slow( &table->dbcs, flags, src, srclen,
|
||||
dst, dstlen, defchar, used );
|
||||
return wcstombs_sbcs( &table->sbcs, src, srclen, dst, dstlen );
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue