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

//#include "splib.h"

FILE *markfile, *rootfile;

typedef long long NODE;

#define ROOT_NODE 1             /* Root of dag */

#define V_END_OF_WORD   33      /* Bit number of W */
#define M_END_OF_WORD   (1LL << V_END_OF_WORD)
#define V_END_OF_NODE   32      /* Bit number of N */
#define M_END_OF_NODE   (1LL << V_END_OF_NODE)

#define V_LETTER        24
#define M_LETTER        0xFF

#define M_NODE_POINTER  0xFFFFFFL       /* Bit mask for node pointer */

typedef int INDEX;
#define MAX_WORD_LEN 128



#include "FISE-ROOT.h"

static void regen_mark(char *word)
{
  char *s = strchr(word, '=');
  if (s) {
    *s++ = '\0';
    fprintf(markfile, "<TILE>\r\n%s\r\n<MARK>\r\n%s\r\n\r\n", word, s);
  } else {
    fprintf(markfile, "<TILE>\r\n%s\r\n\r\n", word);
  }
}

static void regen(char *word)
{
  if (*word == '~') regen_mark(word+1); else {
    char *s = strchr(word, '=');
    if (s) {
      *s++ = '\0';
      fprintf(rootfile, "<TILE>\r\n%s\r\n<ROOT>\r\n", word);    
      for (;;) {
        int c = *s++;
        if (c == '\0') break;
        if (c == ';') {
          fprintf(rootfile, "\r\n<ROOT>\r\n");
	} else {
          fprintf(rootfile, "%c", c);
	}
      }
      fprintf(rootfile, "\r\n\r\n", s);    
    } else {
      fprintf(rootfile, "<TILE>\r\n%s\r\n\r\n", word);
    }
  }
}

static void
dawg_pr(NODE *dawg, INDEX node, int len)
{
  static char word[MAX_WORD_LEN];
  static char result[MAX_WORD_LEN];
  NODE *edge;

  for (edge = (NODE *)&dawg[node]; ; edge++) {
    long c;
    c = *edge;           /* Don't rewrite this - its avoiding a MSC bug */
    c = c >> V_LETTER;
    c = c & M_LETTER;
    word[len] = (char)c;
    if ((*edge & M_END_OF_WORD) != 0) {
      word[len+1] = '\0';
      strcpy(result, word);
      regen(result);
    }
    c = *edge & M_NODE_POINTER;
    if ((*edge & M_NODE_POINTER) != 0)
      dawg_pr (dawg, c, len + 1);
    if ((*edge & M_END_OF_NODE) != 0) break; /* End of node */
  }
}

static void
dawg_regen(NODE *dawg, INDEX node)
{
  dawg_pr(dawg, node, 0);
}

int
main(int argc, char **argv)
{
    NODE           *dawg;
    INDEX           nedges;

    //    if (!dawg_init((argc == 1 ? "" : argv[1]), &dawg, &nedges))
    //        exit(EXIT_FAILURE);
    markfile = fopen("FISE-MARK.txt", "w");
    rootfile = fopen("FISE-ROOT.txt", "w");
    dawg_regen(_token, (INDEX) ROOT_NODE);
    fprintf(stderr, "Finished printing dawg\n");
    exit(0);
}
