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