os2cp.c (9150B)
1 /* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> 4 5 This software is provided 'as-is', without any express or implied 6 warranty. In no event will the authors be held liable for any damages 7 arising from the use of this software. 8 9 Permission is granted to anyone to use this software for any purpose, 10 including commercial applications, and to alter it and redistribute it 11 freely, subject to the following restrictions: 12 13 1. The origin of this software must not be misrepresented; you must not 14 claim that you wrote the original software. If you use this software 15 in a product, an acknowledgment in the product documentation would be 16 appreciated but is not required. 17 2. Altered source versions must be plainly marked as such, and must not be 18 misrepresented as being the original software. 19 3. This notice may not be removed or altered from any source distribution. 20 */ 21 22 #define INCL_DOSNLS 23 #define INCL_DOSERRORS 24 #include <os2.h> 25 #include <string.h> 26 #include <ctype.h> 27 28 #include "os2cp.h" 29 30 typedef struct _CP2NAME { 31 ULONG ulCode; 32 PSZ pszName; 33 } CP2NAME; 34 35 typedef struct _NAME2CP { 36 PSZ pszName; 37 ULONG ulCode; 38 } NAME2CP; 39 40 static CP2NAME aCP2Name[] = { 41 {367, "ANSI_X3.4-1968"}, 42 {813, "ECMA-118"}, 43 {819, "CP819"}, 44 {850, "850"}, 45 {862, "862"}, 46 {866, "866"}, 47 {874, "ISO-IR-166"}, 48 {878, "KOI8-R"}, 49 {896, "JISX0201-1976"}, 50 {901, "ISO-8859-13"}, 51 {912, "ISO-8859-2"}, 52 {913, "ISO-8859-3"}, 53 {914, "ISO-8859-4"}, 54 {915, "CYRILLIC"}, 55 {920, "ISO-8859-9"}, 56 {923, "ISO-8859-15"}, 57 {943, "MS_KANJI"}, 58 {954, "EUC-JP"}, 59 {964, "EUC-TW"}, 60 {970, "EUC-KR"}, 61 {1051, "HP-ROMAN8"}, 62 {1089, "ARABIC"}, 63 {1129, "VISCII"}, 64 {1168, "KOI8-U"}, 65 {1200, "ISO-10646-UCS-2"}, 66 {1202, "UTF-16LE"}, 67 {1204, "UCS-2BE"}, 68 {1208, "UTF-8"}, 69 {1232, "UTF-32BE"}, 70 {1234, "UTF-32LE"}, 71 {1236, "ISO-10646-UCS-4"}, 72 {1250, "CP1250"}, 73 {1251, "CP1251"}, 74 {1252, "CP1252"}, 75 {1253, "CP1253"}, 76 {1254, "CP1254"}, 77 {1255, "CP1255"}, 78 {1256, "CP1256"}, 79 {1257, "CP1257"}, 80 {1275, "MAC"}, 81 {1383, "CN-GB"}, 82 {1386, "GBK"}, 83 {1392, "GB18030"}, 84 {62210, "HEBREW"} 85 }; 86 87 static NAME2CP aName2CP[] = { 88 {"850", 850}, 89 {"862", 862}, 90 {"866", 866}, 91 {"ANSI_X3.4-1968", 367}, 92 {"ANSI_X3.4-1986", 367}, 93 {"ARABIC", 1089}, 94 {"ASCII", 367}, 95 {"ASMO-708", 1089}, 96 {"CN-GB", 1383}, 97 {"CP1250", 1250}, 98 {"CP1251", 1251}, 99 {"CP1252", 1252}, 100 {"CP1253", 1253}, 101 {"CP1254", 1254}, 102 {"CP1255", 1255}, 103 {"CP1256", 1256}, 104 {"CP1257", 1257}, 105 {"CP367", 367}, 106 {"CP819", 819}, 107 {"CP850", 850}, 108 {"CP862", 862}, 109 {"CP866", 866}, 110 {"CP936", 1386}, 111 {"CSASCII", 367}, 112 {"CSEUCKR", 970}, 113 {"CSEUCPKDFMTJAPANESE", 954}, 114 {"CSEUCTW", 964}, 115 {"CSGB2312", 1383}, 116 {"CSHALFWIDTHKATAKANA", 896}, 117 {"CSHPROMAN8", 1051}, 118 {"CSIBM866", 866}, 119 {"CSISOLATIN1", 819}, 120 {"CSISOLATIN2", 912}, 121 {"CSISOLATIN3", 913}, 122 {"CSISOLATIN4", 914}, 123 {"CSISOLATIN5", 920}, 124 {"CSISOLATINARABIC", 1089}, 125 {"CSISOLATINCYRILLIC", 915}, 126 {"CSISOLATINGREEK", 813}, 127 {"CSISOLATINHEBREW", 62210}, 128 {"CSKOI8R", 878}, 129 {"CSKSC56011987", 970}, 130 {"CSMACINTOSH", 1275}, 131 {"CSPC850MULTILINGUAL", 850}, 132 {"CSPC862LATINHEBREW", 862}, 133 {"CSSHIFTJIS", 943}, 134 {"CSUCS4", 1236}, 135 {"CSUNICODE", 1200}, 136 {"CSUNICODE11", 1204}, 137 {"CSVISCII", 1129}, 138 {"CYRILLIC", 915}, 139 {"ECMA-114", 1089}, 140 {"ECMA-118", 813}, 141 {"ELOT_928", 813}, 142 {"EUC-CN", 1383}, 143 {"EUC-JP", 954}, 144 {"EUC-KR", 970}, 145 {"EUC-TW", 964}, 146 {"EUCCN", 1383}, 147 {"EUCJP", 954}, 148 {"EUCKR", 970}, 149 {"EUCTW", 964}, 150 {"EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE", 954}, 151 {"GB18030", 1392}, 152 {"GB2312", 1383}, 153 {"GBK", 1386}, 154 {"GREEK", 813}, 155 {"GREEK8", 813}, 156 {"HEBREW", 62210}, 157 {"HP-ROMAN8", 1051}, 158 {"IBM367", 367}, 159 {"IBM819", 819}, 160 {"IBM850", 850}, 161 {"IBM862", 862}, 162 {"IBM866", 866}, 163 {"ISO-10646-UCS-2", 1200}, 164 {"ISO-10646-UCS-4", 1236}, 165 {"ISO-8859-1", 819}, 166 {"ISO-8859-13", 901}, 167 {"ISO-8859-15", 923}, 168 {"ISO-8859-2", 912}, 169 {"ISO-8859-3", 913}, 170 {"ISO-8859-4", 914}, 171 {"ISO-8859-5", 915}, 172 {"ISO-8859-6", 1089}, 173 {"ISO-8859-7", 813}, 174 {"ISO-8859-8", 62210}, 175 {"ISO-8859-9", 920}, 176 {"ISO-IR-100", 819}, 177 {"ISO-IR-101", 912}, 178 {"ISO-IR-109", 913}, 179 {"ISO-IR-110", 914}, 180 {"ISO-IR-126", 813}, 181 {"ISO-IR-127", 1089}, 182 {"ISO-IR-138", 62210}, 183 {"ISO-IR-144", 915}, 184 {"ISO-IR-148", 920}, 185 {"ISO-IR-149", 970}, 186 {"ISO-IR-166", 874}, 187 {"ISO-IR-179", 901}, 188 {"ISO-IR-203", 923}, 189 {"ISO-IR-6", 367}, 190 {"ISO646-US", 367}, 191 {"ISO8859-1", 819}, 192 {"ISO8859-13", 901}, 193 {"ISO8859-15", 923}, 194 {"ISO8859-2", 912}, 195 {"ISO8859-3", 913}, 196 {"ISO8859-4", 914}, 197 {"ISO8859-5", 915}, 198 {"ISO8859-6", 1089}, 199 {"ISO8859-7", 813}, 200 {"ISO8859-8", 62210}, 201 {"ISO8859-9", 920}, 202 {"ISO_646.IRV:1991", 367}, 203 {"ISO_8859-1", 819}, 204 {"ISO_8859-13", 901}, 205 {"ISO_8859-15", 923}, 206 {"ISO_8859-15:1998", 923}, 207 {"ISO_8859-1:1987", 819}, 208 {"ISO_8859-2", 912}, 209 {"ISO_8859-2:1987", 912}, 210 {"ISO_8859-3", 913}, 211 {"ISO_8859-3:1988", 913}, 212 {"ISO_8859-4", 914}, 213 {"ISO_8859-4:1988", 914}, 214 {"ISO_8859-5", 915}, 215 {"ISO_8859-5:1988", 915}, 216 {"ISO_8859-6", 1089}, 217 {"ISO_8859-6:1987", 1089}, 218 {"ISO_8859-7", 813}, 219 {"ISO_8859-7:1987", 813}, 220 {"ISO_8859-7:2003", 813}, 221 {"ISO_8859-8", 62210}, 222 {"ISO_8859-8:1988", 62210}, 223 {"ISO_8859-9", 920}, 224 {"ISO_8859-9:1989", 920}, 225 {"JISX0201-1976", 896}, 226 {"JIS_X0201", 896}, 227 {"KOI8-R", 878}, 228 {"KOI8-U", 1168}, 229 {"KOREAN", 970}, 230 {"KSC_5601", 970}, 231 {"KS_C_5601-1987", 970}, 232 {"KS_C_5601-1989", 970}, 233 {"L1", 819}, 234 {"L2", 912}, 235 {"L3", 913}, 236 {"L4", 914}, 237 {"L5", 920}, 238 {"L7", 901}, 239 {"LATIN-9", 923}, 240 {"LATIN1", 819}, 241 {"LATIN2", 912}, 242 {"LATIN3", 913}, 243 {"LATIN4", 914}, 244 {"LATIN5", 920}, 245 {"LATIN7", 901}, 246 {"MAC", 1275}, 247 {"MACINTOSH", 1275}, 248 {"MACROMAN", 1275}, 249 {"MS-ANSI", 1252}, 250 {"MS-ARAB", 1256}, 251 {"MS-CYRL", 1251}, 252 {"MS-EE", 1250}, 253 {"MS-GREEK", 1253}, 254 {"MS-HEBR", 1255}, 255 {"MS-TURK", 1254}, 256 {"MS936", 1386}, 257 {"MS_KANJI", 943}, 258 {"R8", 1051}, 259 {"ROMAN8", 1051}, 260 {"SHIFT-JIS", 943}, 261 {"SHIFT_JIS", 943}, 262 {"SJIS", 943}, 263 {"TIS-620", 874}, 264 {"TIS620", 874}, 265 {"TIS620-0", 874}, 266 {"TIS620.2529-1", 874}, 267 {"TIS620.2533-0", 874}, 268 {"TIS620.2533-1", 874}, 269 {"UCS-2", 1200}, 270 {"UCS-2BE", 1204}, 271 {"UCS-4", 1236}, 272 {"UNICODE-1-1", 1204}, 273 {"UNICODEBIG", 1204}, 274 {"US", 367}, 275 {"US-ASCII", 367}, 276 {"UTF-16", 1204}, 277 {"UTF-16BE", 1200}, 278 {"UTF-16LE", 1202}, 279 {"UTF-32", 1236}, 280 {"UTF-32BE", 1232}, 281 {"UTF-32LE", 1234}, 282 {"UTF-8", 1208}, 283 {"VISCII", 1129}, 284 {"VISCII1.1-1", 1129}, 285 {"WINBALTRIM", 1257}, 286 {"WINDOWS-1250", 1250}, 287 {"WINDOWS-1251", 1251}, 288 {"WINDOWS-1252", 1252}, 289 {"WINDOWS-1253", 1253}, 290 {"WINDOWS-1254", 1254}, 291 {"WINDOWS-1255", 1255}, 292 {"WINDOWS-1256", 1256}, 293 {"WINDOWS-1257", 1257}, 294 {"WINDOWS-936", 1386}, 295 {"X0201", 896} 296 }; 297 298 char *os2cpToName(unsigned long cp) 299 { 300 ULONG ulLo = 0; 301 ULONG ulHi = (sizeof(aCP2Name) / sizeof(struct _CP2NAME)) - 1; 302 ULONG ulNext; 303 LONG lFound = -1; 304 305 if (cp == SYSTEM_CP) { 306 ULONG aulCP[3]; 307 ULONG cCP; 308 309 if (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR) 310 return NULL; 311 312 cp = aulCP[0]; 313 } 314 315 if (aCP2Name[0].ulCode > cp || aCP2Name[ulHi].ulCode < cp) 316 return NULL; 317 318 if (aCP2Name[0].ulCode == cp) 319 return aCP2Name[0].pszName; 320 321 if (aCP2Name[ulHi].ulCode == cp) 322 return aCP2Name[ulHi].pszName; 323 324 while ((ulHi - ulLo) > 1) { 325 ulNext = (ulLo + ulHi) / 2; 326 327 if (aCP2Name[ulNext].ulCode < cp) 328 ulLo = ulNext; 329 else if (aCP2Name[ulNext].ulCode > cp) 330 ulHi = ulNext; 331 else { 332 lFound = ulNext; 333 break; 334 } 335 } 336 337 return (lFound == -1)? NULL : aCP2Name[lFound].pszName; 338 } 339 340 unsigned long os2cpFromName(char *cp) 341 { 342 ULONG ulLo = 0; 343 ULONG ulHi = (sizeof(aName2CP) / sizeof(struct _NAME2CP)) - 1; 344 ULONG ulNext; 345 LONG lFound = -1; 346 LONG lCmp; 347 PCHAR pcEnd; 348 CHAR acBuf[64]; 349 350 if (cp == NULL) { 351 ULONG aulCP[3]; 352 ULONG cCP; 353 354 return (DosQueryCp(sizeof(aulCP), aulCP, &cCP) != NO_ERROR)? 0 : aulCP[0]; 355 } 356 357 while (isspace(*cp)) 358 cp++; 359 360 pcEnd = strchr(cp, ' '); 361 if (pcEnd == NULL) 362 pcEnd = strchr(cp, '\0'); 363 364 ulNext = pcEnd - cp; 365 if (ulNext >= sizeof(acBuf)) 366 return 0; 367 368 memcpy(acBuf, cp, ulNext); 369 acBuf[ulNext] = '\0'; 370 strupr(acBuf); 371 372 lCmp = strcmp(aName2CP[0].pszName, acBuf); 373 if (lCmp > 0) 374 return 0; 375 else if (lCmp == 0) 376 return aName2CP[0].ulCode; 377 378 lCmp = strcmp(aName2CP[ulHi].pszName, acBuf); 379 if (lCmp < 0) 380 return 0; 381 else if (lCmp == 0) 382 return aName2CP[ulHi].ulCode; 383 384 while ((ulHi - ulLo) > 1) { 385 ulNext = (ulLo + ulHi) / 2; 386 387 lCmp = strcmp(aName2CP[ulNext].pszName, acBuf); 388 if (lCmp < 0) 389 ulLo = ulNext; 390 else if (lCmp > 0) 391 ulHi = ulNext; 392 else { 393 lFound = ulNext; 394 break; 395 } 396 } 397 398 return (lFound == -1)? 0 : aName2CP[lFound].ulCode; 399 } 400 401 /* vi: set ts=4 sw=4 expandtab: */