Пример #1
0
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;
}
Пример #2
0
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;	
}