#define INCL_DOSNLS
#define INCL_DOSERRORS
#include <os2.h>
#include <string.h>
#include <ctype.h>

#include "os2cp.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;
}
