mirror of
https://github.com/Ryujinx/SDL.git
synced 2025-05-08 20:22:18 +00:00
only geniconv/iconv.h (was from LGPL libiconv) is replaced with a generic minimal iconv.h based on public knowledge.
384 lines
7.8 KiB
C
384 lines
7.8 KiB
C
#include "os2cp.h"
|
|
#define INCL_DOSNLS
|
|
#define INCL_DOSERRORS
|
|
#include <os2.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
typedef struct _CP2NAME {
|
|
ULONG ulCode;
|
|
PSZ pszName;
|
|
} CP2NAME;
|
|
|
|
typedef struct _NAME2CP {
|
|
PSZ pszName;
|
|
ULONG ulCode;
|
|
} NAME2CP;
|
|
|
|
static CP2NAME aCP2Name[] =
|
|
{
|
|
{367, "ANSI_X3.4-1968"},
|
|
{813, "ECMA-118"},
|
|
{819, "CP819"},
|
|
{850, "850"},
|
|
{862, "862"},
|
|
{866, "866"},
|
|
{874, "ISO-IR-166"},
|
|
{878, "KOI8-R"},
|
|
{896, "JISX0201-1976"},
|
|
{901, "ISO-8859-13"},
|
|
{912, "ISO-8859-2"},
|
|
{913, "ISO-8859-3"},
|
|
{914, "ISO-8859-4"},
|
|
{915, "CYRILLIC"},
|
|
{920, "ISO-8859-9"},
|
|
{923, "ISO-8859-15"},
|
|
{943, "MS_KANJI"},
|
|
{954, "EUC-JP"},
|
|
{964, "EUC-TW"},
|
|
{970, "EUC-KR"},
|
|
{1051, "HP-ROMAN8"},
|
|
{1089, "ARABIC"},
|
|
{1129, "VISCII"},
|
|
{1168, "KOI8-U"},
|
|
{1200, "ISO-10646-UCS-2"},
|
|
{1202, "UTF-16LE"},
|
|
{1204, "UCS-2BE"},
|
|
{1208, "UTF-8"},
|
|
{1232, "UTF-32BE"},
|
|
{1234, "UTF-32LE"},
|
|
{1236, "ISO-10646-UCS-4"},
|
|
{1250, "CP1250"},
|
|
{1251, "CP1251"},
|
|
{1252, "CP1252"},
|
|
{1253, "CP1253"},
|
|
{1254, "CP1254"},
|
|
{1255, "CP1255"},
|
|
{1256, "CP1256"},
|
|
{1257, "CP1257"},
|
|
{1275, "MAC"},
|
|
{1383, "CN-GB"},
|
|
{1386, "GBK"},
|
|
{1392, "GB18030"},
|
|
{62210, "HEBREW"}
|
|
};
|
|
|
|
static NAME2CP aName2CP[] =
|
|
{
|
|
{"850", 850},
|
|
{"862", 862},
|
|
{"866", 866},
|
|
{"ANSI_X3.4-1968", 367},
|
|
{"ANSI_X3.4-1986", 367},
|
|
{"ARABIC", 1089},
|
|
{"ASCII", 367},
|
|
{"ASMO-708", 1089},
|
|
{"CN-GB", 1383},
|
|
{"CP1250", 1250},
|
|
{"CP1251", 1251},
|
|
{"CP1252", 1252},
|
|
{"CP1253", 1253},
|
|
{"CP1254", 1254},
|
|
{"CP1255", 1255},
|
|
{"CP1256", 1256},
|
|
{"CP1257", 1257},
|
|
{"CP367", 367},
|
|
{"CP819", 819},
|
|
{"CP850", 850},
|
|
{"CP862", 862},
|
|
{"CP866", 866},
|
|
{"CP936", 1386},
|
|
{"CSASCII", 367},
|
|
{"CSEUCKR", 970},
|
|
{"CSEUCPKDFMTJAPANESE", 954},
|
|
{"CSEUCTW", 964},
|
|
{"CSGB2312", 1383},
|
|
{"CSHALFWIDTHKATAKANA", 896},
|
|
{"CSHPROMAN8", 1051},
|
|
{"CSIBM866", 866},
|
|
{"CSISOLATIN1", 819},
|
|
{"CSISOLATIN2", 912},
|
|
{"CSISOLATIN3", 913},
|
|
{"CSISOLATIN4", 914},
|
|
{"CSISOLATIN5", 920},
|
|
{"CSISOLATINARABIC", 1089},
|
|
{"CSISOLATINCYRILLIC", 915},
|
|
{"CSISOLATINGREEK", 813},
|
|
{"CSISOLATINHEBREW", 62210},
|
|
{"CSKOI8R", 878},
|
|
{"CSKSC56011987", 970},
|
|
{"CSMACINTOSH", 1275},
|
|
{"CSPC850MULTILINGUAL", 850},
|
|
{"CSPC862LATINHEBREW", 862},
|
|
{"CSSHIFTJIS", 943},
|
|
{"CSUCS4", 1236},
|
|
{"CSUNICODE", 1200},
|
|
{"CSUNICODE11", 1204},
|
|
{"CSVISCII", 1129},
|
|
{"CYRILLIC", 915},
|
|
{"ECMA-114", 1089},
|
|
{"ECMA-118", 813},
|
|
{"ELOT_928", 813},
|
|
{"EUC-CN", 1383},
|
|
{"EUC-JP", 954},
|
|
{"EUC-KR", 970},
|
|
{"EUC-TW", 964},
|
|
{"EUCCN", 1383},
|
|
{"EUCJP", 954},
|
|
{"EUCKR", 970},
|
|
{"EUCTW", 964},
|
|
{"EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", 954},
|
|
{"GB18030", 1392},
|
|
{"GB2312", 1383},
|
|
{"GBK", 1386},
|
|
{"GREEK", 813},
|
|
{"GREEK8", 813},
|
|
{"HEBREW", 62210},
|
|
{"HP-ROMAN8", 1051},
|
|
{"IBM367", 367},
|
|
{"IBM819", 819},
|
|
{"IBM850", 850},
|
|
{"IBM862", 862},
|
|
{"IBM866", 866},
|
|
{"ISO-10646-UCS-2", 1200},
|
|
{"ISO-10646-UCS-4", 1236},
|
|
{"ISO-8859-1", 819},
|
|
{"ISO-8859-13", 901},
|
|
{"ISO-8859-15", 923},
|
|
{"ISO-8859-2", 912},
|
|
{"ISO-8859-3", 913},
|
|
{"ISO-8859-4", 914},
|
|
{"ISO-8859-5", 915},
|
|
{"ISO-8859-6", 1089},
|
|
{"ISO-8859-7", 813},
|
|
{"ISO-8859-8", 62210},
|
|
{"ISO-8859-9", 920},
|
|
{"ISO-IR-100", 819},
|
|
{"ISO-IR-101", 912},
|
|
{"ISO-IR-109", 913},
|
|
{"ISO-IR-110", 914},
|
|
{"ISO-IR-126", 813},
|
|
{"ISO-IR-127", 1089},
|
|
{"ISO-IR-138", 62210},
|
|
{"ISO-IR-144", 915},
|
|
{"ISO-IR-148", 920},
|
|
{"ISO-IR-149", 970},
|
|
{"ISO-IR-166", 874},
|
|
{"ISO-IR-179", 901},
|
|
{"ISO-IR-203", 923},
|
|
{"ISO-IR-6", 367},
|
|
{"ISO646-US", 367},
|
|
{"ISO8859-1", 819},
|
|
{"ISO8859-13", 901},
|
|
{"ISO8859-15", 923},
|
|
{"ISO8859-2", 912},
|
|
{"ISO8859-3", 913},
|
|
{"ISO8859-4", 914},
|
|
{"ISO8859-5", 915},
|
|
{"ISO8859-6", 1089},
|
|
{"ISO8859-7", 813},
|
|
{"ISO8859-8", 62210},
|
|
{"ISO8859-9", 920},
|
|
{"ISO_646.IRV:1991", 367},
|
|
{"ISO_8859-1", 819},
|
|
{"ISO_8859-13", 901},
|
|
{"ISO_8859-15", 923},
|
|
{"ISO_8859-15:1998", 923},
|
|
{"ISO_8859-1:1987", 819},
|
|
{"ISO_8859-2", 912},
|
|
{"ISO_8859-2:1987", 912},
|
|
{"ISO_8859-3", 913},
|
|
{"ISO_8859-3:1988", 913},
|
|
{"ISO_8859-4", 914},
|
|
{"ISO_8859-4:1988", 914},
|
|
{"ISO_8859-5", 915},
|
|
{"ISO_8859-5:1988", 915},
|
|
{"ISO_8859-6", 1089},
|
|
{"ISO_8859-6:1987", 1089},
|
|
{"ISO_8859-7", 813},
|
|
{"ISO_8859-7:1987", 813},
|
|
{"ISO_8859-7:2003", 813},
|
|
{"ISO_8859-8", 62210},
|
|
{"ISO_8859-8:1988", 62210},
|
|
{"ISO_8859-9", 920},
|
|
{"ISO_8859-9:1989", 920},
|
|
{"JISX0201-1976", 896},
|
|
{"JIS_X0201", 896},
|
|
{"KOI8-R", 878},
|
|
{"KOI8-U", 1168},
|
|
{"KOREAN", 970},
|
|
{"KSC_5601", 970},
|
|
{"KS_C_5601-1987", 970},
|
|
{"KS_C_5601-1989", 970},
|
|
{"L1", 819},
|
|
{"L2", 912},
|
|
{"L3", 913},
|
|
{"L4", 914},
|
|
{"L5", 920},
|
|
{"L7", 901},
|
|
{"LATIN-9", 923},
|
|
{"LATIN1", 819},
|
|
{"LATIN2", 912},
|
|
{"LATIN3", 913},
|
|
{"LATIN4", 914},
|
|
{"LATIN5", 920},
|
|
{"LATIN7", 901},
|
|
{"MAC", 1275},
|
|
{"MACINTOSH", 1275},
|
|
{"MACROMAN", 1275},
|
|
{"MS-ANSI", 1252},
|
|
{"MS-ARAB", 1256},
|
|
{"MS-CYRL", 1251},
|
|
{"MS-EE", 1250},
|
|
{"MS-GREEK", 1253},
|
|
{"MS-HEBR", 1255},
|
|
{"MS-TURK", 1254},
|
|
{"MS936", 1386},
|
|
{"MS_KANJI", 943},
|
|
{"R8", 1051},
|
|
{"ROMAN8", 1051},
|
|
{"SHIFT-JIS", 943},
|
|
{"SHIFT_JIS", 943},
|
|
{"SJIS", 943},
|
|
{"TIS-620", 874},
|
|
{"TIS620", 874},
|
|
{"TIS620-0", 874},
|
|
{"TIS620.2529-1", 874},
|
|
{"TIS620.2533-0", 874},
|
|
{"TIS620.2533-1", 874},
|
|
{"UCS-2", 1200},
|
|
{"UCS-2BE", 1204},
|
|
{"UCS-4", 1236},
|
|
{"UNICODE-1-1", 1204},
|
|
{"UNICODEBIG", 1204},
|
|
{"US", 367},
|
|
{"US-ASCII", 367},
|
|
{"UTF-16", 1204},
|
|
{"UTF-16BE", 1200},
|
|
{"UTF-16LE", 1202},
|
|
{"UTF-32", 1236},
|
|
{"UTF-32BE", 1232},
|
|
{"UTF-32LE", 1234},
|
|
{"UTF-8", 1208},
|
|
{"VISCII", 1129},
|
|
{"VISCII1.1-1", 1129},
|
|
{"WINBALTRIM", 1257},
|
|
{"WINDOWS-1250", 1250},
|
|
{"WINDOWS-1251", 1251},
|
|
{"WINDOWS-1252", 1252},
|
|
{"WINDOWS-1253", 1253},
|
|
{"WINDOWS-1254", 1254},
|
|
{"WINDOWS-1255", 1255},
|
|
{"WINDOWS-1256", 1256},
|
|
{"WINDOWS-1257", 1257},
|
|
{"WINDOWS-936", 1386},
|
|
{"X0201", 896}
|
|
};
|
|
|
|
char * os2cpToName(unsigned long cp)
|
|
{
|
|
ULONG ulLo = 0;
|
|
ULONG ulHi = ( sizeof(aCP2Name) / sizeof(struct _CP2NAME) ) - 1;
|
|
ULONG ulNext;
|
|
LONG lFound = -1;
|
|
|
|
if ( cp == SYSTEM_CP )
|
|
{
|
|
ULONG aulCP[3];
|
|
ULONG cCP;
|
|
|
|
if ( DosQueryCp( sizeof(aulCP), &aulCP, &cCP ) != NO_ERROR )
|
|
return NULL;
|
|
|
|
cp = aulCP[0];
|
|
}
|
|
|
|
if ( ( aCP2Name[0].ulCode > cp ) || ( aCP2Name[ulHi].ulCode < cp ) )
|
|
return NULL;
|
|
|
|
if ( aCP2Name[0].ulCode == cp )
|
|
return aCP2Name[0].pszName;
|
|
|
|
if ( aCP2Name[ulHi].ulCode == cp )
|
|
return aCP2Name[ulHi].pszName;
|
|
|
|
while( ( ulHi - ulLo ) > 1 )
|
|
{
|
|
ulNext = ( ulLo + ulHi ) / 2;
|
|
|
|
if ( aCP2Name[ulNext].ulCode < cp )
|
|
ulLo = ulNext;
|
|
else if ( aCP2Name[ulNext].ulCode > cp )
|
|
ulHi = ulNext;
|
|
else
|
|
{
|
|
lFound = ulNext;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return lFound == -1 ? NULL : aCP2Name[lFound].pszName;
|
|
}
|
|
|
|
unsigned long os2cpFromName(char *cp)
|
|
{
|
|
ULONG ulLo = 0;
|
|
ULONG ulHi = ( sizeof(aName2CP) / sizeof(struct _NAME2CP) ) - 1;
|
|
ULONG ulNext;
|
|
LONG lFound = -1;
|
|
LONG lCmp;
|
|
PCHAR pcEnd;
|
|
CHAR acBuf[64];
|
|
|
|
if ( cp == NULL )
|
|
{
|
|
ULONG aulCP[3];
|
|
ULONG cCP;
|
|
|
|
return DosQueryCp( sizeof(aulCP), &aulCP, &cCP ) != NO_ERROR ? 0 : aulCP[0];
|
|
}
|
|
|
|
while( isspace( *cp ) ) cp++;
|
|
pcEnd = strchr( cp, ' ' );
|
|
if ( pcEnd == NULL )
|
|
pcEnd = strchr( cp, '\0' );
|
|
|
|
ulNext = pcEnd - cp;
|
|
if ( ulNext >= sizeof(acBuf) )
|
|
return 0;
|
|
|
|
memcpy( &acBuf, cp, ulNext );
|
|
acBuf[ulNext] = '\0';
|
|
strupr( &acBuf );
|
|
|
|
lCmp = strcmp( aName2CP[0].pszName, &acBuf );
|
|
if ( lCmp > 0 )
|
|
return 0;
|
|
else if ( lCmp == 0 )
|
|
return aName2CP[0].ulCode;
|
|
|
|
lCmp = strcmp( aName2CP[ulHi].pszName, &acBuf );
|
|
if ( lCmp < 0 )
|
|
return 0;
|
|
else if ( lCmp == 0 )
|
|
return aName2CP[ulHi].ulCode;
|
|
|
|
while( ( ulHi - ulLo ) > 1 )
|
|
{
|
|
ulNext = ( ulLo + ulHi ) / 2;
|
|
|
|
lCmp = strcmp( aName2CP[ulNext].pszName, &acBuf );
|
|
if ( lCmp < 0 )
|
|
ulLo = ulNext;
|
|
else if ( lCmp > 0 )
|
|
ulHi = ulNext;
|
|
else
|
|
{
|
|
lFound = ulNext;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return lFound == -1 ? 0 : aName2CP[lFound].ulCode;
|
|
}
|