static int bsearch_char(icode_t *ic1, icode_t *ic2, icode_t icode1, icode_t icode2, int size, int mode, int wild, int *end_idx) { int head, middle, end, ret; head = 0; middle = size / 2; end = size; while ((ret=cmp_icvalue(ic1, ic2, middle, icode1, icode2, mode))) { if (ret > 0) end = middle; else head = middle + 1; middle = (end + head) / 2; if (middle == head && middle == end) break; } if (ret == 0) { int last_idx = middle; /* 找該組字的一筆索引 */ while(middle > 0 && ! cmp_icvalue(ic1, ic2, middle-1, icode1, icode2, mode)) { middle --; } /* 找最後一筆索引 */ if (end_idx) { while(last_idx > 0 && ! cmp_icvalue(ic1, ic2, last_idx+1, icode1, icode2, mode)) { last_idx++; } *end_idx = last_idx; } return middle; } else return (wild) ? middle : -1; }
static int bsearch_char(icode_t icode1, icode_t icode2, int size, int *homophone_flag) { int head, middle, end, ret; unsigned char homophone_temp[4], middle_temp[4]; head = 0; middle = size / 2; end = size; while ( ( ret = cmp_icvalue(middle, icode1) ) ) { if (ret > 0) end = middle; else head = middle + 1; middle = (end + head) / 2; if (middle == head && middle == end) break; } if (ret == 0) { /* while(middle > 0 && ! cmp_icvalue(ic1, middle-1, icode1)) remark by zhanglei middle --; return middle; */ Readic1_num_4(homophone_temp, middle+1); *homophone_flag = (int)homophone_temp[2]<<8 | (int)homophone_temp[3]; Readic1_num_4(middle_temp, middle); middle = (int)middle_temp[2]<<8 | (int)middle_temp[3]; /**(临时)补丁代码:使六拼音的字可正常查找,该疏漏是早期代码考虑的不周。add by zhanglei**/ if (icode2==0x11000000) { #ifdef GB18030_LIB if (icode1==0x2449f2d8) //zhuang { middle = middle+54; } else if (icode1==0x0d49f2d8) //chuang { middle = middle+38; } else if (icode1==0x1d49f2d8) //shuang { middle = middle+11; } else if (icode1==0x178cf658) //myeong { middle = middle+1; } else if (icode1==0x1a48e3d8) //phdeng { middle = middle; } else { *homophone_flag = 0; return -1; } #endif #ifdef GB2312_LIB if (icode1==0x2449f2d8) //zhuang { middle = middle+11; } else if (icode1==0x0d49f2d8) //chuang { middle = middle+13; } else if (icode1==0x1d49f2d8) //shuang { middle = middle+4; } else { *homophone_flag = 0; return -1; } #endif } else if (icode2!=0x0) { *homophone_flag = 0; return -1; } /***********************(临时)补丁代码结束***************************************/ return middle; } else return -1; }