2006-11-26 04:11:12 -07:00
|
|
|
};
|
|
|
|
|
2007-06-15 13:29:55 -06:00
|
|
|
#define UNICODE_SHIFT 21
|
|
|
|
|
2006-11-26 04:11:12 -07:00
|
|
|
int do_precomposition(int base, int comb) {
|
|
|
|
int min = 0;
|
|
|
|
int max = sizeof(precompositions) / sizeof(precompositions[0]) - 1;
|
|
|
|
int mid;
|
2007-06-15 13:29:55 -06:00
|
|
|
unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb;
|
|
|
|
unsigned long that;
|
2006-11-26 04:11:12 -07:00
|
|
|
|
|
|
|
/* binary search */
|
|
|
|
while (max >= min) {
|
|
|
|
mid = (min + max) / 2;
|
2007-06-15 13:29:55 -06:00
|
|
|
that = ((unsigned) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb);
|
2006-11-26 04:11:12 -07:00
|
|
|
if (that < sought) {
|
|
|
|
min = mid + 1;
|
|
|
|
} else if (that > sought) {
|
|
|
|
max = mid - 1;
|
|
|
|
} else {
|
|
|
|
return precompositions[mid].replacement;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* no match */
|
|
|
|
return -1;
|
|
|
|
}
|