#include #include #include #include #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; }