Example #1
0
static NJ_UINT16 yomi_strcmp_forward(NJ_DIC_HANDLE hdl, NJ_UINT8 *data, NJ_CHAR *yomi)
{
    NJ_UINT8 *area;
    NJ_CHAR  *stroke;
    NJ_CHAR   buf[NJ_MAX_LEN + NJ_TERM_LEN];
    NJ_UINT16 ylen, dic_ylen, j, size;


    
    size = sizeof(buf);
    stroke = buf;

    
    area = YOMI_AREA_TOP_ADDR(hdl) + DATA_YOMI(data);

    if (YOMI_INDX_CNT(hdl) == 0) {      
        
        dic_ylen = DATA_YOMI_SIZE(data) / sizeof(NJ_CHAR);

        
        if (size < ((dic_ylen + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
            return 0;
        }
        for (j = 0; j < dic_ylen; j++) {
            NJ_CHAR_COPY(stroke, area); 
            stroke++;
            area += sizeof(NJ_CHAR);
        }
        *stroke = NJ_CHAR_NUL;
    } else {                            
        
        dic_ylen = convert_to_yomi(hdl, area, DATA_YOMI_SIZE(data), stroke, size);

        
        if (size < ((dic_ylen + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
            return 0;
        }
    }

    
    ylen = nj_strlen(yomi);

    
    if (dic_ylen < ylen) {
        
        return 0;
    }

    
    if (nj_strncmp(yomi, buf, ylen) == 0) {
        
        return 1;
    }
    return 0;
}
NJ_EXTERN NJ_INT16 njx_search_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor) {

    NJ_SEARCH_CACHE     *pCache;
    NJ_CHAR             *p_yomi, *p_key;
    NJ_UINT16           initst, inited;
    NJ_UINT16           clrcnt, diccnt;
    NJ_UINT16           kw_len;
    NJ_UINT16           cacheOverKeyPtr;

    NJ_UINT8 exit_flag;                         
    NJ_UINT8 cnt;
    NJ_DIC_HANDLE dhdl;
    NJ_PREVIOUS_SELECTION_INFO *prev_info = &(iwnn->previous_selection);


    if (iwnn == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SEARCH_WORD, NJ_ERR_PARAM_ENV_NULL);
    }
    if (cursor == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SEARCH_WORD, NJ_ERR_PARAM_CURSOR_NULL);
    }

    
    cursor->cond.hinsi.fore = NULL;
    cursor->cond.hinsi.foreSize = 0;
    cursor->cond.hinsi.foreFlag = 0;
    cursor->cond.hinsi.rear = NULL;
    cursor->cond.hinsi.rearSize = 0;
    cursor->cond.hinsi.rearFlag = 0;

    
    if (cursor->cond.yomi == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_YOMI_NULL);
    }
    cursor->cond.ylen = nj_strlen(cursor->cond.yomi);
    cursor->cond.yclen = nj_charlen(cursor->cond.yomi);

    
    if (cursor->cond.ds == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_DIC_NULL);
    }

    
    cursor->cond.ds->mode = NJ_CACHE_MODE_VALID;

    p_yomi = cursor->cond.yomi;
    p_key  = cursor->cond.ds->keyword;

    for (clrcnt = 0; clrcnt < cursor->cond.yclen; clrcnt++) {
        if (nj_charncmp(p_yomi, p_key, 1) != 0) {
            break;
        }
        p_yomi += NJ_CHAR_LEN(p_yomi);
        p_key  += NJ_CHAR_LEN(p_key);
    }
    if (clrcnt != 0) {
        initst = clrcnt + 1;
    } else {
        initst = 0;
    }

    kw_len = nj_charlen(cursor->cond.ds->keyword);
    if (kw_len >= cursor->cond.yclen) {
      inited = kw_len + 1;
    } else {
      inited = cursor->cond.yclen + 1;
    }

    for (diccnt = 0; diccnt < NJ_MAX_DIC; diccnt++) {
        pCache = cursor->cond.ds->dic[diccnt].srhCache;
        if (pCache != NULL) {
            
            if (NJ_GET_CACHEOVER_FROM_SCACHE(pCache)) {
                
                for (cacheOverKeyPtr = 0; cacheOverKeyPtr < kw_len; cacheOverKeyPtr++) {
                    if (pCache->keyPtr[cacheOverKeyPtr] == pCache->keyPtr[cacheOverKeyPtr + 1] ) {
                        break;
                    }
                }
                cacheOverKeyPtr++;

                
                if (cacheOverKeyPtr < initst) {
                    clrcnt = cacheOverKeyPtr;
                } else {
                    clrcnt = initst;
                }
                for (; clrcnt < inited; clrcnt++) {
                    pCache->keyPtr[clrcnt] = 0x0000;
                }
                
                for (clrcnt = 1; clrcnt < inited; clrcnt++ ) {
                    if ((pCache->keyPtr[clrcnt - 1] > pCache->keyPtr[clrcnt]) &&
                        (pCache->keyPtr[clrcnt] != 0)) {
                        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CACHE_BROKEN); 
                    }
                }
                NJ_UNSET_CACHEOVER_TO_SCACHE(pCache);
            } else {
                for (clrcnt = initst; clrcnt < inited; clrcnt++) {
                    pCache->keyPtr[clrcnt] = 0x0000;
                }
                
                for (clrcnt = 1; clrcnt < inited; clrcnt++ ) {
                    if ((pCache->keyPtr[clrcnt - 1] > pCache->keyPtr[clrcnt]) &&
                        (pCache->keyPtr[clrcnt] != 0)) {
                        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CACHE_BROKEN);
                    }
                }
            }
        }
    }

    
    nj_strcpy(cursor->cond.ds->keyword, cursor->cond.yomi);

    for (cnt = 0; cnt < NJ_MAX_DIC; cnt++) {
        dhdl = cursor->cond.ds->dic[cnt].handle;
        
        if (dhdl != NULL) {
            if ((cursor->cond.ds->dic[cnt].dic_freq[NJ_MODE_TYPE_HENKAN].base
                 > cursor->cond.ds->dic[cnt].dic_freq[NJ_MODE_TYPE_HENKAN].high)) {
                    return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_DIC_FREQ_INVALID);
                }
        }
    }

    if( prev_info->count == 0 ) {
        cursor->cond.hinsi.yominasi_fore = NULL;
    } else {
        int prev_hinsi = prev_info->selection_data.b_hinsi;

        
        njd_r_get_connect(cursor->cond.ds->rHandle[NJ_MODE_TYPE_HENKAN], prev_hinsi,
                          0, &(cursor->cond.hinsi.yominasi_fore));
        njd_r_get_count(cursor->cond.ds->rHandle[NJ_MODE_TYPE_HENKAN],
                        &(cursor->cond.hinsi.foreSize), &(cursor->cond.hinsi.rearSize));
    }

    return njd_search_word(iwnn, cursor, 0, &exit_flag);
}
static NJ_INT16 check_search_cursor(NJ_CLASS *iwnn, NJ_CURSOR *cursor) {
    NJ_UINT16 i;
    NJ_DIC_INFO *dicinfo;
    NJ_SEARCH_LOCATION_SET *loctset;


    if (cursor->cond.ds == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_DIC_NULL);
    }


    for (i = 0; i < NJ_MAX_DIC; i++) {
        loctset = &(cursor->loctset[i]);
        dicinfo = &(cursor->cond.ds->dic[i]);
        
        
        njd_init_search_location_set(loctset);

        if (dicinfo->handle != NULL) {
            
            
            
            if (
                (dicinfo->dic_freq[NJ_MODE_TYPE_HENKAN].high > DIC_FREQ_HIGH) ) {
                return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_DIC_FREQ_INVALID);
            }

            
            loctset->loct.handle        = dicinfo->handle;
            loctset->loct.type          = dicinfo->type;
            loctset->loct.current_info  = 0x10;  
            loctset->loct.status        = NJ_ST_SEARCH_NO_INIT;
            loctset->dic_freq           = dicinfo->dic_freq[NJ_MODE_TYPE_HENKAN];
        }
    }

    if (cursor->cond.yomi == NULL) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_YOMI_NULL);
    } 

    if (cursor->cond.ylen > NJ_MAX_LEN) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_YOMI_TOO_LONG);
    }

    if (cursor->cond.operation == NJ_CUR_OP_LINK) {
        
    } else if (cursor->cond.kanji != NULL) {
        
        if (nj_strlen(cursor->cond.kanji) > NJ_MAX_RESULT_LEN) {
            return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CANDIDATE_TOO_LONG);
        }
    }

    switch (cursor->cond.operation) {
    case NJ_CUR_OP_COMP:
    case NJ_CUR_OP_FORE:
    case NJ_CUR_OP_LINK:
        break;
    default:
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_OPERATION);
    }

    switch (cursor->cond.mode) {
    case NJ_CUR_MODE_FREQ:
    case NJ_CUR_MODE_YOMI:
        break;
    default:
        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_MODE);
    }

    return 0;
}