| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <inttypes.h> |
| #include "gen/nametoucs_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 uint32_t prehash(const char *str) |
| { |
| uint32_t hash = PHASHSALT; |
| const uint8_t *p = (const uint8_t *)str; |
| |
| while ( *p ) |
| hash = (hash ^ *p++) + ((hash << 27)+(hash >> 5)); |
| |
| return hash; |
| } |
| |
| static int32_t hash_to_ucs[PHASHNKEYS]; |
| static void read_nametoucs_tab(void) |
| { |
| char line[256], *p; |
| FILE *f = fopen("gen/nametoucs.tab", "rt"); |
| if ( !f ) |
| die("could not open gen/nametoucs.tab"); |
| int32_t ucs; |
| uint32_t hash; |
| int i; |
| |
| for ( i = 0 ; i < PHASHNKEYS ; i++ ) |
| hash_to_ucs[i] = -1; |
| |
| while ( fgets(line, sizeof line, f) ) { |
| if ( (p = strchr(line, '\n')) ) |
| *p = '\0'; |
| |
| ucs = strtol(line, NULL, 16); |
| hash = _libucd_nametoucs_hash(prehash(line+6)); |
| |
| if ( hash >= PHASHNKEYS ) |
| die("hash not minimal"); |
| |
| if ( hash_to_ucs[hash] != -1 ) |
| die("hash collision"); |
| |
| hash_to_ucs[hash] = ucs; |
| } |
| |
| fclose(f); |
| } |
| |
| static void make_nametoucs_tab(void) |
| { |
| FILE *f = fopen("gen/nametoucs_tab.c", "wt"); |
| if ( !f ) |
| die("could not create gen/nametoucs_tab.c"); |
| int i; |
| int32_t ucs; |
| |
| fprintf(f, |
| "#include \"libucd_int.h\"\n" |
| "const struct _libucd_nametoucs_tab _libucd_nametoucs_tab[] =\n" |
| "{\n"); |
| |
| for ( i = 0 ; i < PHASHNKEYS ; i++ ) { |
| ucs = hash_to_ucs[i]; |
| fprintf(f, "\t{ %s },\n", int24str(ucs)); |
| } |
| fprintf(f, "};\n"); |
| fclose(f); |
| } |
| |
| |
| int main(void) |
| { |
| read_nametoucs_tab(); |
| make_nametoucs_tab(); |
| |
| return 0; |
| } |
| |