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