#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;
}

