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; }