#include "dawg.h"
#include "msq4.h"
#include "aoften.c"
#define n 6

unsigned char logtab[129];
/*
unsigned char logtab[] = { 0, 4, 8,24,12,44,28, 64, 16,56,48,84, 32,92, 68,104,
                         124,20,40,60,52,80,88,100,120,36,76,96,116,72,112,108};
*/

unsigned int first_node;
char *dawg;
FILE *ho;
TFeld *myfeld;

unsigned char fullstr[] = { 128,129,130,131,132,133,'\n',
129,135,136,137,138,139,'\n',
130,136,142,143,144,145,'\n',
131,137,143,149,150,151,'\n',
132,138,144,150,156,157,'\n',
133,139,145,151,157,163,'\n',0} ;
unsigned char partstr[] = { 128,' ',129,135,' ',130,0 } ;

void do_line()
{ unsigned int mask,maske;
  unsigned int log;
  TFeld *feld;
  char *rdawg;
  
  feld=myfeld;
  rdawg=dawg;
  feld[0].mask=feld[0].omask;
m0:
if((mask=feld[0].mask)==0) return;
  feld[0].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[1].wnode=rdawg+PTR(*(NODE *)(feld[0].wnode+log)));
  if((feld[1].omask=(*(unsigned int *)(feld[1].snode))&mask)==0) { goto m0; }
  feld[1].mask=feld[1].omask;
m1:
if((mask=feld[1].mask)==0) goto m0;
  feld[1].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[2].wnode=rdawg+PTR(*(NODE *)(feld[1].wnode+log)));
  if((feld[2].omask=(*(unsigned int *)(feld[2].snode))&mask)==0) { goto m1; }
  if((mask=*(unsigned int *)(feld[7].wnode=feld[7].snode=rdawg+PTR(*(NODE *)(feld[1].snode+log))))==0) { goto m1; }
  feld[7].mask=mask;
m2:
if((mask=feld[7].mask)==0) goto m1;
  feld[7].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[8].wnode=rdawg+PTR(*(NODE *)(feld[7].wnode+log)))==0) { goto m2; }
  feld[2].mask=feld[2].omask;
m3:
if((mask=feld[2].mask)==0) goto m2;
  feld[2].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[3].wnode=rdawg+PTR(*(NODE *)(feld[2].wnode+log)));
  if((feld[3].omask=(*(unsigned int *)(feld[3].snode))&mask)==0) { goto m3; }
  mask=*(unsigned int *)(feld[8].snode=rdawg+PTR(*(NODE *)(feld[2].snode+log)));
  if((mask=(*(unsigned int *)(feld[8].wnode))&mask)==0) { goto m3; }
  ausgabe(feld,partstr);
  feld[8].mask=mask;
m4:
if((mask=feld[8].mask)==0) goto m3;
  feld[8].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[9].wnode=rdawg+PTR(*(NODE *)(feld[8].wnode+log)))==0) { goto m4; }
  if((mask=*(unsigned int *)(feld[14].wnode=feld[14].snode=rdawg+PTR(*(NODE *)(feld[8].snode+log))))==0) { goto m4; }
  feld[14].mask=mask;
m5:
if((mask=feld[14].mask)==0) goto m4;
  feld[14].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[15].wnode=rdawg+PTR(*(NODE *)(feld[14].wnode+log)))==0) { goto m5; }
  feld[3].mask=feld[3].omask;
m6:
if((mask=feld[3].mask)==0) goto m5;
  feld[3].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[4].wnode=rdawg+PTR(*(NODE *)(feld[3].wnode+log)));
  if((feld[4].omask=(*(unsigned int *)(feld[4].snode))&mask)==0) { goto m6; }
  mask=*(unsigned int *)(feld[9].snode=rdawg+PTR(*(NODE *)(feld[3].snode+log)));
  if((mask=(*(unsigned int *)(feld[9].wnode))&mask)==0) { goto m6; }
  feld[9].mask=mask;
m7:
if((mask=feld[9].mask)==0) goto m6;
  feld[9].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[10].wnode=rdawg+PTR(*(NODE *)(feld[9].wnode+log)))==0) { goto m7; }
  mask=*(unsigned int *)(feld[15].snode=rdawg+PTR(*(NODE *)(feld[9].snode+log)));
  if((mask=(*(unsigned int *)(feld[15].wnode))&mask)==0) { goto m7; }
  feld[15].mask=mask;
m8:
if((mask=feld[15].mask)==0) goto m7;
  feld[15].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[16].wnode=rdawg+PTR(*(NODE *)(feld[15].wnode+log)))==0) { goto m8; }
  if((mask=*(unsigned int *)(feld[21].wnode=feld[21].snode=rdawg+PTR(*(NODE *)(feld[15].snode+log))))==0) { goto m8; }
  feld[21].mask=mask;
m9:
if((mask=feld[21].mask)==0) goto m8;
  feld[21].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[22].wnode=rdawg+PTR(*(NODE *)(feld[21].wnode+log)))==0) { goto m9; }
  feld[4].mask=feld[4].omask;
m10:
if((mask=feld[4].mask)==0) goto m9;
  feld[4].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[5].wnode=rdawg+PTR(*(NODE *)(feld[4].wnode+log)));
  if((feld[5].omask=(*(unsigned int *)(feld[5].snode))&mask)==0) { goto m10; }
  mask=*(unsigned int *)(feld[10].snode=rdawg+PTR(*(NODE *)(feld[4].snode+log)));
  if((mask=(*(unsigned int *)(feld[10].wnode))&mask)==0) { goto m10; }
  feld[10].mask=mask;
m11:
if((mask=feld[10].mask)==0) goto m10;
  feld[10].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[11].wnode=rdawg+PTR(*(NODE *)(feld[10].wnode+log)))==0) { goto m11; }
  mask=*(unsigned int *)(feld[16].snode=rdawg+PTR(*(NODE *)(feld[10].snode+log)));
  if((mask=(*(unsigned int *)(feld[16].wnode))&mask)==0) { goto m11; }
  feld[16].mask=mask;
m12:
if((mask=feld[16].mask)==0) goto m11;
  feld[16].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[17].wnode=rdawg+PTR(*(NODE *)(feld[16].wnode+log)))==0) { goto m12; }
  mask=*(unsigned int *)(feld[22].snode=rdawg+PTR(*(NODE *)(feld[16].snode+log)));
  if((mask=(*(unsigned int *)(feld[22].wnode))&mask)==0) { goto m12; }
  feld[22].mask=mask;
m13:
if((mask=feld[22].mask)==0) goto m12;
  feld[22].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[23].wnode=rdawg+PTR(*(NODE *)(feld[22].wnode+log)))==0) { goto m13; }
  if((mask=*(unsigned int *)(feld[28].wnode=feld[28].snode=rdawg+PTR(*(NODE *)(feld[22].snode+log))))==0) { goto m13; }
  feld[28].mask=mask;
m14:
if((mask=feld[28].mask)==0) goto m13;
  feld[28].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((feld[29].wnode=rdawg+PTR(*(NODE *)(feld[28].wnode+log)))==0) { goto m14; }
  feld[5].mask=feld[5].omask;
m15:
if((mask=feld[5].mask)==0) goto m14;
  feld[5].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[11].snode=rdawg+PTR(*(NODE *)(feld[5].snode+log)));
  if((mask=(*(unsigned int *)(feld[11].wnode))&mask)==0) { goto m15; }
  feld[11].mask=mask;
m16:
if((mask=feld[11].mask)==0) goto m15;
  feld[11].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[17].snode=rdawg+PTR(*(NODE *)(feld[11].snode+log)));
  if((mask=(*(unsigned int *)(feld[17].wnode))&mask)==0) { goto m16; }
  feld[17].mask=mask;
m17:
if((mask=feld[17].mask)==0) goto m16;
  feld[17].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[23].snode=rdawg+PTR(*(NODE *)(feld[17].snode+log)));
  if((mask=(*(unsigned int *)(feld[23].wnode))&mask)==0) { goto m17; }
  feld[23].mask=mask;
m18:
if((mask=feld[23].mask)==0) goto m17;
  feld[23].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  mask=*(unsigned int *)(feld[29].snode=rdawg+PTR(*(NODE *)(feld[23].snode+log)));
  if((mask=(*(unsigned int *)(feld[29].wnode))&mask)==0) { goto m18; }
  feld[29].mask=mask;
m19:
if((mask=feld[29].mask)==0) goto m18;
  feld[29].mask=maske=mask&(mask-1);
  maske^=mask;
  log=0; if(maske&0xffff0000) { log=64;maske>>=16;}
  if(maske&0xff00) { log+=32; maske>>=8;}
  log+=logtab[maske];
  if((mask=*(unsigned int *)(feld[35].wnode=feld[35].snode=rdawg+PTR(*(NODE *)(feld[29].snode+log))))==0) { goto m19; }
  feld[35].mask=mask;
m20:
if((mask=feld[35].mask)==0) goto m19;
  feld[35].mask=maske=mask&(mask-1);
  maske^=mask;
  ausgabe(feld,fullstr);
  goto m20;
}

void finish_word()
{ if(dawg!=NULL) free(dawg);
  cleanup_abc();
}

/* --------------------------------------------- 
                  Main
--------------------------------------------- */

main()
{ int i;
  myfeld=(TFeld *)malloc(n*n*sizeof(TFeld));
  init_word();
  for(i=0;i<n;i++) {
    myfeld[i].snode=dawg+first_node;
  }
  myfeld[0].wnode=dawg+first_node;
  myfeld[0].omask=*(unsigned int *)(dawg+first_node);
  ho=fopen("msqres6","wb");
  do_line();
  fclose(ho);
  finish_word();
  free(myfeld);
}

void init_word()
{ long info[4];
  if((dawg=(char *)load_pck2("../all6.pck2",info))!=NULL) {
    if(load_abc("")) {
      logtab[1]=0;logtab[2]=4;logtab[4]=8;logtab[8]=12;
      logtab[16]=16;logtab[32]=20;logtab[64]=24;logtab[128]=28;
      first_node=info[2];
    } else goto quitt;
  } else {
quitt:
    exit(1);
  }
}

void ausgabe(TFeld *feld,unsigned char *ctrl)
{ static unsigned char logs[16]={0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3};
  int zp;
  unsigned char zeile[(n+4)*n];
  unsigned int mask,log;
  TFeld *fp;
  unsigned char *octrl;

  zp=0; octrl=ctrl;
  while(*ctrl) {
    if(*ctrl>=128) {
      fp=&(feld[(*ctrl)-128]);
      mask=fp->mask^((*((NODE *)(fp->wnode)))&(*((NODE *)(fp->snode))));
      log=0;
      if(mask&0xffff0000) { log=16; mask>>=16; }
      if(mask&0xff00) { log+=8; mask>>=8; }
      if(mask&0xf0) { log+=4; mask>>=4; }
      log+=logs[mask];
      zp+=ch_scr2utf(log,zeile+zp);
    } else {
      zeile[zp++]=*ctrl;
    }
    ctrl++;
  }
  zeile[zp++]='\n';
  zeile[zp]=0;
  if(octrl==fullstr) {
    fprintf(ho,"%s\n",zeile);
  }
  printf("%s",zeile);
}

