1d522f475Smrg};
2d522f475Smrg
3d522f475Smrg#define UNICODE_SHIFT 21
4d522f475Smrg
5d522f475Smrgint do_precomposition(int base, int comb) {
6d522f475Smrg  int min = 0;
7d522f475Smrg  int max = sizeof(precompositions) / sizeof(precompositions[0]) - 1;
8d522f475Smrg  unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb;
9d522f475Smrg
10d522f475Smrg  /* binary search */
11d522f475Smrg  while (max >= min) {
122e4f8982Smrg    int mid = (min + max) / 2;
132e4f8982Smrg    unsigned long that = ((unsigned long) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb);
14d522f475Smrg    if (that < sought) {
15d522f475Smrg      min = mid + 1;
16d522f475Smrg    } else if (that > sought) {
17d522f475Smrg      max = mid - 1;
18d522f475Smrg    } else {
19d522f475Smrg      return precompositions[mid].replacement;
20d522f475Smrg    }
21d522f475Smrg  }
22d522f475Smrg  /* no match */
23d522f475Smrg  return -1;
24d522f475Smrg}
25