#include "os2cp.h" #define INCL_DOSNLS #define INCL_DOSERRORS #include #include #include 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; }