#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#include "gen/ucstoname_hash.h"

#define UCS_CNT 0x110000

const char *program;

void die(const char *msg)
{
  fprintf(stderr, "%s: %s\n", program, msg);
  exit(1);
}

static const char *int24str(int32_t n)
{
  static char str[17];

  sprintf(str, "{0x%02x,0x%02x,0x%02x}",
	  (n & 0xff),
	  ((n >> 8) & 0xff),
	  ((n >> 16) & 0xff));
  return str;
}

static int proparrayindex[UCS_CNT];
static void read_proparrayindex(void)
{
  FILE *f = fopen("gen/proparrayindex", "rt");
  if ( !f )
    die("could not open gen/proparrayindex");
  int last = 0, prev_ix = -1;
  int curr, i, ix;

  while ( fscanf(f, "%x %d\n", &curr, &ix) == 2 ) {
    for ( i = last ; i < curr ; i++ )
      proparrayindex[i] = prev_ix;
    last = curr;
    prev_ix = ix;
  }

  for ( i = last ; i < UCS_CNT ; i++ )
    proparrayindex[i] = prev_ix;

  fclose(f);
}


static int nameslistoffset[UCS_CNT];
static void read_nameslistoffset(void)
{
  FILE *f = fopen("gen/nameslist.offset", "rt");
  if ( !f )
    die("could not open gen/nameslist.offset");
  int curr, offset;
  int i;

  for ( i = 0 ; i < UCS_CNT ; i++ )
    nameslistoffset[i] = -1;

  while ( fscanf(f, "%x %d\n", &curr, &offset) == 2 )
    nameslistoffset[curr] = offset;
    
  fclose(f);
}
  

int32_t hash_to_ucs[PHASHNKEYS];
static void compute_hash_to_ucs(void)
{
  uint32_t hash;
  int i;

  for ( i = 0 ; i < PHASHNKEYS ; i++ )
    hash_to_ucs[i] = -1;

  for ( i = 0 ; i < UCS_CNT ; i++ ) {
    if ( nameslistoffset[i] != -1 ) {
      hash = _libucd_ucstoname_hash(i);

      if ( hash >= PHASHNKEYS )
	die("hash not minimal");

      if ( hash_to_ucs[hash] != -1 )
	die("hash collision");

      hash_to_ucs[hash] = i;
    }
  }
}


static void make_ucstoname_tab(void)
{
  FILE *f = fopen("gen/ucstoname_tab.c", "wt");
  if ( !f )
    die("could not create gen/ucstoname_tab.c");
  int i;
  int32_t ucs;

  fprintf(f,
	  "#include \"libucd_int.h\"\n"
	  "const struct _libucd_ucstoname_tab _libucd_ucstoname_tab[] =\n"
	  "{\n");

  for ( i = 0 ; i < PHASHNKEYS ; i++ ) {
    ucs = hash_to_ucs[i];
    fprintf(f, "\t{ %s, ", int24str(ucs));
    fprintf(f, "%s, ", int24str(nameslistoffset[ucs]));
    fprintf(f, "%d },\n", proparrayindex[ucs]);
  }
  fprintf(f, "};\n");
  fclose(f);
}


int main(void)
{
  read_proparrayindex();
  read_nameslistoffset();
  compute_hash_to_ucs();
  make_ucstoname_tab();

  return 0;
}

