precompose.c.tail revision d522f475
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  int mid;
9d522f475Smrg  unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb;
10d522f475Smrg  unsigned long that;
11d522f475Smrg
12d522f475Smrg  /* binary search */
13d522f475Smrg  while (max >= min) {
14d522f475Smrg    mid = (min + max) / 2;
15d522f475Smrg    that = ((unsigned) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb);
16d522f475Smrg    if (that < sought) {
17d522f475Smrg      min = mid + 1;
18d522f475Smrg    } else if (that > sought) {
19d522f475Smrg      max = mid - 1;
20d522f475Smrg    } else {
21d522f475Smrg      return precompositions[mid].replacement;
22d522f475Smrg    }
23d522f475Smrg  }
24d522f475Smrg  /* no match */
25d522f475Smrg  return -1;
26d522f475Smrg}
27