#include #include #include #include #include #include int main (void) { int32_t table_size, hash, elem, second, idx = 0; const int32_t *symb_table; const unsigned char *extra, *collseqmb, *collseqwc; const unsigned char *elem_aa = "a-a"; char *cur_locale; cur_locale = setlocale (LC_ALL, "da_DK.ISO-8859-1"); if (cur_locale == NULL) { printf ("cannot set locale: %m\n"); return 1; } printf ("current locale : %s\n", cur_locale); if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) == 0) { printf("No rule\n"); return 1; } /* Lookup collation sequences for 'a'. */ collseqmb = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB); collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC); printf ("multibyte collation sequence for 'a': %d\n", collseqmb['a']); printf ("wide char collation sequence for 'a': %d\n", collseq_table_lookup (collseqwc, L'a')); /* Find index for 'a-a'. */ table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB); symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_TABLEMB); extra = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB); hash = elem_hash(elem_aa, strlen(elem_aa)); elem = hash % table_size; second = hash % (table_size - 2); while (symb_table[2 * elem] != 0) { if (symb_table[2 * elem] == hash && strlen(elem_aa) == extra[symb_table[2 * elem + 1]] && memcmp (elem_aa, &extra[symb_table[2 * elem + 1] + 1], strlen(elem_aa)) == 0) { idx = symb_table[2 * elem + 1]; break; } elem += second; } if (idx == 0) { printf("Not found %s.", elem_aa); return 1; } /* Lookup collation sequences for 'a-a'. */ idx += extra[idx] + 1; idx += extra[idx] + 1; idx = (idx + 3) & ~3; printf ("multibyte collation sequence for 'a-a': %d\n", *(uint32_t*)(extra + idx)); idx += sizeof(uint32_t); idx += sizeof(uint32_t) * (1 + *(uint32_t*)(extra + idx)); printf ("wide char collation sequence for 'a-a': %d\n", *(uint32_t*)(extra + idx)); return 0; }