}; #define UNICODE_SHIFT 21 int do_precomposition(int base, int comb) { int min = 0; int max = sizeof(precompositions) / sizeof(precompositions[0]) - 1; int mid; unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb; unsigned long that; /* binary search */ while (max >= min) { mid = (min + max) / 2; that = ((unsigned) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb); if (that < sought) { min = mid + 1; } else if (that > sought) { max = mid - 1; } else { return precompositions[mid].replacement; } } /* no match */ return -1; }