#include <ctype.h>
#include <string.h>

#include "iso2scr.c"

#define BSwap(x) (((x&0xff)<<24)|((x&0xff00)<<8)|((x&0xff0000)>>8)|((x&0xff000000)>>24))

NODE *load_dawg(char *name, long *info,long mark);
NODE *load_dwg(char *name, long *info);
NODE *load_pck(char *name, long *info);
NODE *load_pck2(char *name, long *info);
int load_abc(char *name);
int get_char_utf(uchar **str);
uchar get_char_scr(uchar **str);
int ch_scr2utf(uchar nr,uchar *utfstr);
void str_scr2utf(uchar *scrstr,uchar *utfstr);
void cleanup_abc();

NODE *load_dawg(char *name, long *info,long mark)
{ FILE *h;
  NODE *ptr,*pp;
  long i,l;

  if((h=fopen(name,"rb"))!=NULL) {
    fread(info,sizeof(long),4,h);
    if(info[0]==mark) {
      if((ptr=(NODE *)malloc(info[1]))!=NULL) {
        fread(ptr,1,info[1],h);
      }
    } else {
      if(BSwap(info[0])==mark) {
        if((ptr=(NODE *)malloc((int)BSwap(info[1])))!=NULL) {
          l=BSwap(info[1]);
          fread(ptr,1,l,h);
          for(i=0;i<4;i++) {
            info[i]=BSwap(info[i]);
          }
          for(i=0;i<l;i+=sizeof(NODE)) {
            *((NODE *)((char *)ptr+i))=BSwap(*((NODE *)((char *)ptr+i)));
          }
        }
      } else ptr=NULL;
    }
    fclose(h);
    return(ptr);
  } else return(NULL);
}

NODE *load_dwg(char *name, long *info)
{ return(load_dawg(name,info,DAWG_MAGIC)); }
NODE *load_pck(char *name, long *info)
{ return(load_dawg(name,info,PACK_MAGIC)); }
NODE *load_pck2(char *name, long *info)
{ return(load_dawg(name,info,PACK2_MAGIC)); }

int sflag;

int load_abc(char *name)
{ sflag=0;
  return(TRUE);
}

void cleanup_abc()
{ 
}

int get_char_utf(uchar **str)
{
  return(*(*str++));
}

uchar get_char_scr(uchar **str)
{ uchar c;
  if(sflag) { sflag=0; (*str)++; return(0x13); }
  if(**str==' ') return(0);
  if(c=xlat[**str]) {
    (*str)++;
  } else {
    if(**str==0xdf) {
      c=0x13;
      sflag=1;
    }
  }
  return(c);
}

int ch_scr2utf(uchar nr,uchar *utfstr)
{ 
  *utfstr=xlat[nr];
  return(1);
}

void str_scr2utf(uchar *scrstr,uchar *utfstr)
{ uchar *pscr;
  uchar *putf;
  pscr=scrstr;putf=utfstr;
  while(*pscr) putf+=ch_scr2utf(*(pscr++),putf);
  *putf=0; }
