#include <stdio.h>
#include <stdlib.h>

static unsigned char *buffer;
static int buflen, bpnt;

static int lyn()
{
  int c;
  if(bpnt>=buflen) return -1;
  c = buffer[bpnt++];
  c = ((c&0xe0)>>1) | (c&0x0f);
  return c;
}

main(int argc, char **argv)
{
  FILE *fh;
  int c,i;
  int nnormal,nrepeat,ndestination,nend,lrepeat;

  fh = fopen(argv[1], "r");
  fseek(fh, 0, SEEK_END);
  buflen = ftell(fh);
  printf("buflen: %d\n", buflen);
  rewind(fh);
  buffer = malloc(buflen);
  fread(buffer, buflen, 1, fh);
  fclose(fh);

  while(lyn()!=13);

  nnormal=0;
  nrepeat=0;
  lrepeat=0;
  ndestination=0;
  nend=0;

  while((c=lyn())>=0)
  {
    if(c < 64)
    {
      nnormal++;
      for(i=0;i<6*c;i++) lyn();
    }
    else if(c==64)
    {
      nrepeat++;
      i = lyn();
      i += lyn()*128;
      i += lyn()*128*128;
      printf("Repeated %d\n", i);
      lrepeat += i;
    }
    else if(c==65)
    {
      ndestination++;
      i = lyn();
      i += lyn()*128;
      i += lyn()*128*128;
      printf("New destination: %d\n", i);
    }
    else if(c==66)
    {
      nend++;
      i = lyn();
      i += lyn()*128;
      i += lyn()*128*128;
      printf("End: %d %d\n", i/1024, i%1024);
      break;
    }
    else
    {
      fprintf(stderr, "Unknown label: %d\n", c);
    }
  }
  printf("Normal segments: %d\n", nnormal);
  printf("Repeat segments: %d\n", nrepeat);
  printf("Repeated words: %d\n", lrepeat);
  printf("Destination segments: %d\n", ndestination);
  printf("End segments: %d\n", nend);
}

