#include "../inc/swilib.h"
#include "strings.h"

char *MakeGlobalString(const char *first, int breakchar, const char *last)
{
  int l;
  char *p;
  p=malloc((l=strlen(first))+strlen(last)+2);
  strcpy(p,first);
  if (breakchar)
    p[l++]=breakchar;
  strcpy(p+l,last);
  return p;
}

int strcmp_nocase(const char *s, const char *d)
{
  int cs;
  int ds;
  do
  {
    cs=*s++;
    if (cs&0x40) cs&=0xDF;
    ds=*d++;
    if (ds&0x40) ds&=0xDF;
    cs-=ds;
    if (cs) break;
  }
  while(ds);
  return(cs);
}

typedef struct
{
  unsigned short u;
  char dos;
} TUNICODE2CHAR;

const TUNICODE2CHAR unicode2char[]=
  {
  0x0A4, 0xA4,  //  164   -  // CZ part
  0x0A6, 0xA6,  //  166   -
  0x0A7, 0xA7,  //  167   -
  0x0A8, 0xA8,  //  168   -
  0x0A9, 0xA9,  //  169   -
  0x0AB, 0xAB,  //  171   
  0x0AC, 0xAC,  //  172   -
  0x0AD, 0x96,  //  150   
  0x0AE, 0xAE,  //  174   -
  0x0B0, 0xB0,  //  176   
  0x0B1, 0xB1,  //  177   -
  0x0B4, 0xB4,  //  180   
  0x0B5, 0xB5,  //  181   //  0 32  64  96  128  160  192  224   - tema zacina
  0x0B6, 0xB6,  //  182   
  0x0B7, 0xB7,  //  183   
  0x0B8, 0xB8,  //  184   
  0x0BB, 0xBB,  //  187   
  0x0C1, 0xC1,  //  193   -
  0x0C2, 0xC2,  //  194   
  0x0C4, 0xC4,  //  196   
  0x0C7, 0xC7,  //  199   
  0x0C9, 0xC9,  //  201   -
  0x0CB, 0xCB,  //  203   
  0x0CE, 0xCD,  //  205   -
  0x0CF, 0xCE,  //  206   
  0x0D3, 0xD3,  //  211   -
  0x0D4, 0xD4,  //  212   
  0x0D5, 0xD5,  //  213   
  0x0D6, 0xD6,  //  214   
  0x0D7, 0xD7,  //  215   -
  0x0DA, 0xDA,  //  218   -
  0x0DC, 0xDC,  //  220   
  0x0DD, 0xDD,  //  221   -
  0x0DF, 0xDF,  //  223   
  0x0E1, 0xE1,  //  225   -
  0x0E2, 0xE2,  //  226   
  0x0E4, 0xE4,  //  228   
  0x0E7, 0xE7,  //  231   
  0x0E9, 0xE9,  //  233   -
  0x0EB, 0xEB,  //  235   
  0x0ED, 0xED,  //  237   -
  0x0EE, 0xEE,  //  238   
  0x0F3, 0xF3,  //  243   -
  0x0F4, 0xF4,  //  244   
  0x0F5, 0xF5,  //  245   
  0x0F6, 0xF6,  //  246   
  0x0F7, 0xF7,  //  247   -
  0x0FA, 0xFA,  //  250   -
  0x0FB, 0xFB,  //  186  ^u 
  0x0FC, 0xFC,  //  252   
  0x0FD, 0xFD,  //  253   -
  0x102, 0xC3,  //  195    
  0x103, 0xE3,  //  227   
  0x104, 0xA5,  //  165   
  0x105, 0xB9,  //  185   
  0x106, 0xC6,  //  198   
  0x107, 0xE6,  //  230   
  0x10C, 0xC8,  //  200   -
  0x10D, 0xE8,  //  232   -
  0x10E, 0xCF,  //  207   -
  0x10F, 0xEF,  //  239   -
  0x110, 0xD0,  //  208   
  0x111, 0xF0,  //  240   
  0x118, 0xCA,  //  202   
  0x119, 0xEA,  //  234   //  
  0x11A, 0xCC,  //  204   -
  0x11B, 0xEC,  //  236   -
  0x139, 0xC5,  //  197   
  0x13A, 0xE5,  //  229   
  0x13D, 0xBC,  //  188   
  0x13E, 0xBE,  //  190   
  0x141, 0xA3,  //  163   
  0x142, 0xB3,  //  179   
  0x143, 0xD1,  //  209   
  0x144, 0xF1,  //  241   
  0x147, 0xD2,  //  210   -
  0x148, 0xF2,  //  242   -
  0x154, 0xC0,  //  192   
  0x155, 0xE0,  //  224   
  0x158, 0xD8,  //  216   -
  0x159, 0xF8,  //  248   -
  0x15A, 0x8C,  //  140   
  0x15B, 0x9C,  //  156   
  0x15E, 0xAA,  //  170   
  0x160, 0x8A,  //  138   -
  0x161, 0x9A,  //  154   -
  0x162, 0xDE,  //  222   
  0x163, 0xFE,  //  254   
  0x164, 0x8D,  //  141   -
  0x165, 0x9D,  //  157   -
  0x168, 0xDB,  //  219   
  0x169, 0xFB,  //  251   
  0x16E, 0xD9,  //  217   -
  0x16F, 0xF9,  //  249   -
  0x179, 0x8F,  //  143   
  0x17A, 0x9F,  //  159   
  0x17B, 0xAF,  //  175   
  0x17C, 0xBF,  //  191   
  0x17D, 0x8E,  //  142   -
  0x17E, 0x9E,  //  158   -
  0x000,0
  
};

 const unsigned short dos2unicode[128]=
{

  0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F,0x005F, // 7  // CZ part
  0x005F,0x005F,0x0160,0x003C,0x015A,0x0164,0x017D,0x0179, // 15
  0x005F,0x0027,0x0027,0x0022,0x0022,0x005F,0x00AD,0x005F, // 23
  0x005F,0x005F,0x0161,0x003E,0x015B,0x0165,0x017E,0x017A, // 31
  0x005F,0x005F,0x005F,0x0141,0x00A4,0x0104,0x00A5,0x00A7, // 39
  0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x0020,0x00AE,0x017B, // 47
  0x00B0,0x00B1,0x005F,0x0142,0x00B4,0x00B5,0x00B6,0x00B7, // 55
  0x00B8,0x0105,0x00FB,0x00BB,0x013D,0x007E,0x013E,0x017C, // 63
  0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, // 71
  0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CE,0x00CF,0x010E, // 79
  0x0110,0x0143,0x0147,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, // 87
  0x0158,0x016E,0x00DA,0x0168,0x00DC,0x00DD,0x0162,0x00DF, // 95
  0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, // 103
  0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, // 111
  0x0111,0x0144,0x0148,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, // 119
  0x0159,0x016F,0x00FA,0x0169,0x00FC,0x00FD,0x0163,0x005F  // 127

};


unsigned int char8to16(int c)
{
  if (c>=128)
  {
    //Win->Dos
    return(dos2unicode[c-128]);
  }
  return(c);
}

void ascii2ws(WSHDR *ws, const char *s)
{
  char c;
  CutWSTR(ws,0);
  while((c=*s++))
  {
    wsAppendChar(ws,char8to16(c));
  }
}

unsigned int char16to8(unsigned int c)
{
  const TUNICODE2CHAR *p=unicode2char;
  unsigned int i;
  if (c<128) return(c);
  while((i=p->u))
  {
    if (c==i)
    {
      return(p->dos);
    }
    p++;
  }
//  c&=0xFF;
  if (c<32) return(' ');
  return(c);
}

int convWS_to_ANSI(WSHDR *ws, char *buf)
{
  unsigned int sWs=ws->wsbody[0];
  int p=0;
  unsigned int cWs;
  while((p<255)&&(p<sWs))
  {
    cWs=ws->wsbody[p+1];
    buf[p]=char16to8(cWs);
    p++;
  }
  buf[p] = 0;
  return p;
}

