#include #include #include #include #include #include "libucd_int.h" #include "gen/nametoucs_hash.h" 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; } /* This returns a candidate UCS for a given name. */ static int32_t name_lookup(const char *name) { int32_t ucs; uint32_t hash; if ( !strncmp(name, "CJK UNIFIED IDEOGRAPH-", 22) ) { char *q; ucs = strtol(name+22, &q, 16); if ( *q || q < name+26 || q > name+27 ) return -1; } else { hash = _libucd_nametoucs_hash(prehash(name)); if ( hash > PHASHNKEYS ) return -1; ucs = getint24(_libucd_nametoucs_tab[hash].ucs); } return ucs; } const struct unicode_character_data * unicode_character_lookup(const char *name) { int32_t ucs = name_lookup(name); const struct unicode_character_data *ucd = unicode_character_data(ucs); if ( !ucd ) return NULL; if ( !ucd->name || strcmp(name, ucd->name) ) { unicode_character_put(ucd); errno = EINVAL; return NULL; } return ucd; }