Home | History | Annotate | Download | only in xmlwf
      1 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
      2    See the file COPYING for copying permission.
      3 */
      4 
      5 #include "codepage.h"
      6 
      7 #if (defined(WIN32) || (defined(__WATCOMC__) && defined(__NT__)))
      8 #define STRICT 1
      9 #define WIN32_LEAN_AND_MEAN 1
     10 
     11 #include <windows.h>
     12 
     13 int
     14 codepageMap(int cp, int *map)
     15 {
     16   int i;
     17   CPINFO info;
     18   if (!GetCPInfo(cp, &info) || info.MaxCharSize > 2)
     19     return 0;
     20   for (i = 0; i < 256; i++)
     21     map[i] = -1;
     22   if (info.MaxCharSize > 1) {
     23     for (i = 0; i < MAX_LEADBYTES; i+=2) {
     24       int j, lim;
     25       if (info.LeadByte[i] == 0 && info.LeadByte[i + 1] == 0)
     26         break;
     27       lim = info.LeadByte[i + 1];
     28       for (j = info.LeadByte[i]; j <= lim; j++)
     29         map[j] = -2;
     30     }
     31   }
     32   for (i = 0; i < 256; i++) {
     33    if (map[i] == -1) {
     34      char c = (char)i;
     35      unsigned short n;
     36      if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
     37                              &c, 1, &n, 1) == 1)
     38        map[i] = n;
     39    }
     40   }
     41   return 1;
     42 }
     43 
     44 int
     45 codepageConvert(int cp, const char *p)
     46 {
     47   unsigned short c;
     48   if (MultiByteToWideChar(cp, MB_PRECOMPOSED|MB_ERR_INVALID_CHARS,
     49                           p, 2, &c, 1) == 1)
     50     return c;
     51   return -1;
     52 }
     53 
     54 #else /* not WIN32 */
     55 
     56 int
     57 codepageMap(int cp, int *map)
     58 {
     59   return 0;
     60 }
     61 
     62 int
     63 codepageConvert(int cp, const char *p)
     64 {
     65   return -1;
     66 }
     67 
     68 #endif /* not WIN32 */
     69