1053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project/*
259aefa242169b7a51c2381daee58ff22fd1834ceJunichi Monma * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
4053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * you may not use this file except in compliance with the License.
6053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * You may obtain a copy of the License at
7053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
8053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project *
10053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * See the License for the specific language governing permissions and
14053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project * limitations under the License.
15053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project */
16053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
17053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_lib.h"
18053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_err.h"
19053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_ext.h"
20053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "nj_dic.h"
21053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#include "njd.h"
22053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
23053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define NJ_DIC_UNCOMP_EXT_HEADER_SIZE   0x002C
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define CREATE_DIC_TYPE_USER            0
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define GET_HYOKI_INDEX_OFFSET(cnt)                             \
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    (NJ_LEARN_DIC_HEADER_SIZE + NJ_INDEX_SIZE * ((cnt)+1))
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define GET_DATA_AREA_OFFSET(cnt)                               \
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    (NJ_LEARN_DIC_HEADER_SIZE + NJ_INDEX_SIZE * ((cnt)+1) * 2)
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define GET_EXT_DATA_AREA_OFFSET(cnt)                                   \
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    (NJ_LEARN_DIC_HEADER_SIZE + NJ_INDEX_SIZE * ((cnt)+1) * 2 + LEARN_DIC_QUE_SIZE * (cnt))
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define MIN_SIZE_OF_USER_DIC                                            \
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    (NJ_LEARN_DIC_HEADER_SIZE + NJ_USER_QUE_SIZE + 2 * (NJ_INDEX_SIZE * (1+1)) + 4)
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define GET_MAX_WORD_NUM_IN_USER_DIC(size)                              \
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    (((size) - NJ_LEARN_DIC_HEADER_SIZE - (2 * NJ_INDEX_SIZE) - 4)      \
38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project     / (NJ_USER_QUE_SIZE + 2 * NJ_INDEX_SIZE))
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 check_search_cursor(NJ_CLASS *iwnn, NJ_CURSOR *cursor);
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 search_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_UINT8 comp_flg, NJ_UINT8 *exit_flag);
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic void set_operation_id(NJ_SEARCH_LOCATION *dicinfo, NJ_UINT8 reverse, NJ_RESULT *result);
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 get_word_and_search_next_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_RESULT *result, NJ_UINT8 comp_flg);
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 njd_check_dic(NJ_CLASS *iwnn, NJ_DIC_HANDLE handle);
47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 check_search_cursor(NJ_CLASS *iwnn, NJ_CURSOR *cursor) {
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 i;
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_DIC_INFO *dicinfo;
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_LOCATION_SET *loctset;
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.ds == NULL) {
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_DIC_NULL);
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (i = 0; i < NJ_MAX_DIC; i++) {
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset = &(cursor->loctset[i]);
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dicinfo = &(cursor->cond.ds->dic[i]);
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_init_search_location_set(loctset);
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (dicinfo->handle != NULL) {
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (dicinfo->dic_freq[NJ_MODE_TYPE_HENKAN].high > DIC_FREQ_HIGH) ) {
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_DIC_FREQ_INVALID);
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.handle        = dicinfo->handle;
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.type          = dicinfo->type;
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.current_info  = 0x10;
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status        = NJ_ST_SEARCH_NO_INIT;
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->dic_freq           = dicinfo->dic_freq[NJ_MODE_TYPE_HENKAN];
81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.yomi == NULL) {
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_YOMI_NULL);
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.ylen > NJ_MAX_LEN) {
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_YOMI_TOO_LONG);
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.operation == NJ_CUR_OP_LINK) {
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else if (cursor->cond.kanji != NULL) {
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (nj_strlen(cursor->cond.kanji) > NJ_MAX_RESULT_LEN) {
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CANDIDATE_TOO_LONG);
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (cursor->cond.operation) {
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_OP_COMP:
105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_OP_FORE:
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_OP_LINK:
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_OPERATION);
110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (cursor->cond.mode) {
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_MODE_FREQ:
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_MODE_YOMI:
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_MODE);
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 0;
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 search_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_UINT8 comp_flg,
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                            NJ_UINT8 *exit_flag) {
125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 dic_type;
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 i;
127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 ret = 0;
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 flag = 0;
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_LOCATION_SET *loctset;
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    *exit_flag = 1;
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (i = 0; i < NJ_MAX_DIC; i++) {
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset = &(cursor->loctset[i]);
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (loctset->loct.handle == NULL) {
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            continue;
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_type = NJ_GET_DIC_TYPE_EX(loctset->loct.type, loctset->loct.handle);
141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#ifdef IWNN_ERR_CHECK
142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (iwnn->err_check_flg == 12) {
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            dic_type = 0x11111111;
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#endif
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (dic_type) {
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_JIRITSU:
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FZK:
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_TANKANJI:
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_STDFORE:
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_CUSTOM_COMPRESS:
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FORECONV:
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_b_search_word(&cursor->cond, loctset);
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_USER:
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_l_search_word(iwnn, &cursor->cond, loctset, comp_flg);
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_YOMINASHI:
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_f_search_word(&cursor->cond, loctset);
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_SEARCH_WORD, NJ_ERR_DIC_TYPE_INVALID);
166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ret < 0) {
168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return ret;
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ret == 0) {
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_END)
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                && (*exit_flag == 1)) {
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                *exit_flag = 0;
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            flag = 1;
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            *exit_flag = 0;
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return flag;
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 get_word_and_search_next_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_RESULT *result,
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                              NJ_UINT8 comp_flg) {
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16  ret = -1;
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT32  i, next, first;
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_WORD   tmp_word;
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_RESULT tmp_result;
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR   tmp_stroke[NJ_MAX_LEN + NJ_TERM_LEN];
193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR   result_stroke[NJ_MAX_LEN + NJ_TERM_LEN];
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT32  j, max_len = 0;
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 dic_type;
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_LOCATION_SET *loctset;
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    next = -1;
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    first= 0;
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    njd_init_word(&tmp_word);
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    result->word = tmp_word;
205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    tmp_result.word = tmp_word;
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (i = 0; i < NJ_MAX_DIC; i++) {
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset = &(cursor->loctset[i]);
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((loctset->loct.handle == NULL) ||
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            (GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_END) ||
211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            (GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_END_EXT)) {
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            continue;
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_type = NJ_GET_DIC_TYPE_EX(loctset->loct.type, loctset->loct.handle);
216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (dic_type) {
218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_JIRITSU:
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FZK:
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_TANKANJI:
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_STDFORE:
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_CUSTOM_COMPRESS:
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FORECONV:
224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            tmp_word.yomi = cursor->cond.yomi;
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            tmp_word.stem.info1 = cursor->cond.ylen;
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            tmp_result.word.yomi = cursor->cond.yomi;
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            tmp_result.word.stem.info1 = cursor->cond.ylen;
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset->loct.status |= SET_LOCATION_OPERATION(cursor->cond.operation);
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (cursor->cond.mode == NJ_CUR_MODE_FREQ) {
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((cursor->cond.ds->mode & (NJ_CACHE_MODE_VALID)) &&
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (cursor->cond.ds->dic[i].srhCache != NULL) &&
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (NJ_GET_AIMAI_FROM_SCACHE(cursor->cond.ds->dic[i].srhCache)) &&
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (cursor->cond.operation == NJ_CUR_OP_FORE)) {
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                first = 1;
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = njd_get_word_data(iwnn, cursor->cond.ds, loctset, (NJ_UINT16)i, &tmp_result.word);
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (ret < 0) {
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return ret;
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = njd_get_stroke(iwnn, &tmp_result, tmp_stroke, sizeof(tmp_stroke));
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (ret <= 0) {
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if ((ret == 0) || (NJ_GET_ERR_CODE(ret) == NJ_ERR_BUFFER_NOT_ENOUGH)) {
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return NJ_SET_ERR_VAL(NJ_FUNC_GET_WORD_AND_SEARCH_NEXT_WORD, NJ_ERR_INVALID_RESULT);
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    } else {
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return ret;
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (j = 0; j < cursor->cond.ylen; j++) {
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (cursor->cond.yomi[j] != tmp_stroke[j]) {
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        break;
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                switch (dic_type) {
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_JIRITSU:
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_FZK:
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_TANKANJI:
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_STDFORE:
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_CUSTOM_COMPRESS:
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_FORECONV:
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    ret = njd_b_search_word(&cursor->cond, loctset);
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_USER:
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    ret = njd_l_search_word(iwnn, &cursor->cond, loctset, comp_flg);
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    break;
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                default:
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return NJ_SET_ERR_VAL(NJ_FUNC_GET_WORD_AND_SEARCH_NEXT_WORD, NJ_ERR_DIC_TYPE_INVALID);
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (ret < 0) {
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return ret;
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret = njd_get_word_data(iwnn, cursor->cond.ds, loctset, (NJ_UINT16)i, &tmp_result.word);
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (ret < 0) {
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return ret;
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                j = cursor->cond.ylen;
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((j > max_len) ||
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ((j == max_len) && (loctset->cache_freq > result->word.stem.hindo)) ||
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (next == -1)) {
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                set_operation_id(&(loctset->loct), 0, result);
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                result->word = tmp_result.word;
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                next = i;
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                max_len = j;
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_get_word_data(iwnn, cursor->cond.ds, loctset, (NJ_UINT16)i, &(tmp_result.word));
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (ret < 0) {
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return ret;
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_get_stroke(iwnn, &tmp_result, tmp_stroke, sizeof(tmp_stroke));
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (ret <= 0) {
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if ((ret == 0) || (NJ_GET_ERR_CODE(ret) == NJ_ERR_BUFFER_NOT_ENOUGH)) {
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return NJ_SET_ERR_VAL(NJ_FUNC_GET_WORD_AND_SEARCH_NEXT_WORD, NJ_ERR_INVALID_RESULT);
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return ret;
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((next == -1) || (nj_strcmp(result_stroke, tmp_stroke) > 0)) {
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                set_operation_id(&(loctset->loct), 0, result);
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                result->word = tmp_result.word;
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                next = i;
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                nj_strcpy(result_stroke, tmp_stroke);
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (next == -1) {
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset = &(cursor->loctset[next]);
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if ((!first) ||
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ((loctset->loct.handle != NULL) &&
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project         (cursor->cond.ds->dic[next].srhCache == NULL))) {
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_type = NJ_GET_DIC_TYPE_EX(loctset->loct.type, loctset->loct.handle);
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        switch (dic_type) {
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_JIRITSU:
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FZK:
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_TANKANJI:
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_STDFORE:
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_CUSTOM_COMPRESS:
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_FORECONV:
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_b_search_word(&cursor->cond, loctset);
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_USER:
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_l_search_word(iwnn, &cursor->cond, loctset, comp_flg);
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        case NJ_DIC_TYPE_YOMINASHI:
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_f_search_word(&cursor->cond, loctset);
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        default:
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_GET_WORD_AND_SEARCH_NEXT_WORD, NJ_ERR_DIC_TYPE_INVALID);
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (ret < 0) {
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 1;
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_get_word_data(NJ_CLASS *iwnn, NJ_DIC_SET *dicset, NJ_SEARCH_LOCATION_SET *loctset, NJ_UINT16 dic_idx, NJ_WORD *word) {
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 ret = 0;
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 dic_type;
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_END) {
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (loctset->loct.handle == NULL) {
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_WORD_DATA, NJ_ERR_DIC_TYPE_INVALID);
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dic_type = NJ_GET_DIC_TYPE_EX(loctset->loct.type, loctset->loct.handle);
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (dic_type) {
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_JIRITSU:
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FZK:
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_TANKANJI:
392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_STDFORE:
393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_COMPRESS:
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FORECONV:
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_b_get_word(loctset, word);
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_USER:
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_l_get_word(iwnn, loctset, word);
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_YOMINASHI:
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_f_get_word(loctset, word);
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_WORD_DATA, NJ_ERR_DIC_TYPE_INVALID);
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic void set_operation_id(NJ_SEARCH_LOCATION *dicinfo, NJ_UINT8 reverse, NJ_RESULT *result) {
414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 dictype;
415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 type;
416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (dicinfo->handle == NULL) {
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dictype = NJ_DIC_STATIC;
420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return;
421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    type = NJ_GET_DIC_TYPE_EX(NJ_GET_DIC_INFO(dicinfo), dicinfo->handle);
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (type) {
427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_JIRITSU:
428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FZK:
429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_TANKANJI:
430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_STDFORE:
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_YOMINASHI:
432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FORECONV:
434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dictype = NJ_DIC_STATIC;
435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_COMPRESS:
439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dictype = NJ_DIC_CUSTOMIZE;
440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_USER:
443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dictype = NJ_DIC_USER;
444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dictype = NJ_DIC_STATIC;
449053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
450053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
451053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    result->operation_id =
453053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        (NJ_UINT16)((NJ_UINT16)NJ_OP_SEARCH | (NJ_UINT16)NJ_FUNC_SEARCH | dictype);
454053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 njd_search_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_UINT8 comp_flg,
457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                         NJ_UINT8 *exit_flag) {
458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 ret;
459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ret = check_search_cursor(iwnn, cursor);
462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (ret != 0) {
463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return search_word(iwnn, cursor, comp_flg, exit_flag);
467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
468053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
469053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 njd_get_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_RESULT *result,
470053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                      NJ_UINT8 comp_flg) {
471053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
472053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16    ret;
473053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
474053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
475053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ret = get_word_and_search_next_word(iwnn, cursor, result, comp_flg);
476053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
477053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
478053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
479053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
480053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_get_stroke(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *stroke, NJ_UINT16 size) {
481053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 ret = 0;
482053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 len;
483053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 dictype;
484053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
485053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
486053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (result->word.stem.loc.handle == NULL) {
487053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_STROKE, NJ_ERR_INVALID_RESULT);
488053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
489053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
490053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dictype = NJ_GET_DIC_TYPE_EX(result->word.stem.loc.type, result->word.stem.loc.handle);
491053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
492053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (dictype) {
493053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_JIRITSU:
494053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FZK:
495053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_TANKANJI:
496053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_STDFORE:
497053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_COMPRESS:
498053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FORECONV:
499053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (GET_LOCATION_OPERATION(result->word.stem.loc.status) != NJ_CUR_OP_COMP) {
500053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret = njd_b_get_stroke(&result->word, stroke, size);
501053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
502053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            len = NJ_GET_YLEN_FROM_STEM(&result->word);
503053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
504053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
505053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_STROKE,
506053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                      NJ_ERR_BUFFER_NOT_ENOUGH);
507053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
508053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (len == 0) {
509053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_STROKE,
510053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                      NJ_ERR_INVALID_RESULT);
511053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
512053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            nj_strncpy(stroke, result->word.yomi, len);
513053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            *(stroke + len) = NJ_CHAR_NUL;
514053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return len;
515053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
516053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
517053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
518053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_USER:
519053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
520053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_l_get_stroke(iwnn, &result->word, stroke, size);
521053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
522053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
523053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_YOMINASHI:
524053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_f_get_stroke(&result->word, stroke, size);
525053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
526053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
527053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
528053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_STROKE, NJ_ERR_DIC_TYPE_INVALID);
529053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
530053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
531053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (ret == 0) {
532053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_STROKE, NJ_ERR_INVALID_RESULT);
533053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
534053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
535053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
536053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
537053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
538053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_get_candidate(NJ_CLASS *iwnn, NJ_RESULT *result,
539053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                           NJ_CHAR *candidate, NJ_UINT16 size) {
540053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 ret = 0;
541053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 dictype;
542053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
543053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
544053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (result->word.stem.loc.handle == NULL) {
545053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_CANDIDATE, NJ_ERR_INVALID_RESULT);
546053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
547053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
548053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    dictype = NJ_GET_DIC_TYPE_EX(result->word.stem.loc.type, result->word.stem.loc.handle);
549053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
550053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (dictype) {
551053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_JIRITSU:
552053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FZK:
553053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_TANKANJI:
554053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_STDFORE:
555053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_COMPRESS:
556053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FORECONV:
557053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_b_get_candidate(&result->word, candidate, size);
558053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
559053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
560053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_USER:
561053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_INCOMPRESS:
562053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_l_get_candidate(iwnn, &result->word, candidate, size);
563053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
564053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
565053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_YOMINASHI:
566053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = njd_f_get_candidate(&result->word, candidate, size);
567053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
568053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
569053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
570053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_CANDIDATE, NJ_ERR_DIC_TYPE_INVALID);
571053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
572053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
573053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (ret == 0) {
574053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_GET_CANDIDATE, NJ_ERR_INVALID_RESULT);
575053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
576053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
577053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
578053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
579053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
580053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_INT16 njd_check_dic(NJ_CLASS *iwnn, NJ_DIC_HANDLE handle) {
581053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *addr;
582053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 datasize, extsize;
583053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 version;
584053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 type;
585053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
586053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
587053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr = handle;
588053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
589053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
590053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_INT32_READ(addr) != NJ_DIC_IDENTIFIER) {
591053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
592053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
593053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
594053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
595053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
596053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    version = NJ_INT32_READ(addr);
597053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if ((version != NJ_DIC_VERSION1) && (version != NJ_DIC_VERSION2) &&
598053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        (version != NJ_DIC_VERSION2_1) && (version != NJ_DIC_VERSION3)) {
599053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
600053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
601053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
602053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
603053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
604053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    type = NJ_INT32_READ(addr);
605053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
606053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
607053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
608053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    datasize = NJ_INT32_READ(addr);
609053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
610053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
611053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
612053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    extsize = NJ_INT32_READ(addr);
613053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
614053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
615053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
616053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_INT32_READ(addr) > (NJ_MAX_LEN * sizeof(NJ_CHAR))) {
617053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
618053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
619053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += sizeof(NJ_UINT32);
620053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
621053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
622053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_INT32_READ(addr) > (NJ_MAX_RESULT_LEN * sizeof(NJ_CHAR))) {
623053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
624053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
625053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
626053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
627053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    addr += (extsize + datasize);
628053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_INT32_READ(addr) != NJ_DIC_IDENTIFIER) {
629053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
630053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
631053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
632053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
633053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (type) {
634053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
635053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_JIRITSU:
636053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_FZK:
637053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_TANKANJI:
638053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_CUSTOM_COMPRESS:
639053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_STDFORE:
640053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
641053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (version != (NJ_UINT32)NJ_DIC_VERSION2) {
642053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
643053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
644053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
645053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
646053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_RULE:
647053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
648053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (version != (NJ_UINT32)NJ_DIC_VERSION2_1) {
649053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
650053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
651053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
652053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
653053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_YOMINASHI:
654053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
655053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (version != (NJ_UINT32)NJ_DIC_VERSION1) {
656053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
657053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
658053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
659053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
660053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_DIC_TYPE_USER:
661053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
662053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (version != (NJ_UINT32)NJ_DIC_VERSION2) {
663053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_FORMAT_INVALID);
664053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
665053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return njd_l_check_dic(iwnn, handle);
666053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
667053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
668053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_CHECK_DIC, NJ_ERR_DIC_TYPE_INVALID);
669053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
670053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 0;
671053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
672053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
673053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
674053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_search_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor) {
675053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
676053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_CACHE     *pCache;
677053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR             *p_yomi, *p_key;
678053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16           initst, inited;
679053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16           clrcnt, diccnt;
680053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16           kw_len;
681053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16           cacheOverKeyPtr;
682053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
683053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 exit_flag;
684053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 cnt;
685053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_DIC_HANDLE dhdl;
686053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_PREVIOUS_SELECTION_INFO *prev_info = &(iwnn->previous_selection);
687053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
688053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
689053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (iwnn == NULL) {
690053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SEARCH_WORD, NJ_ERR_PARAM_ENV_NULL);
691053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
692053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor == NULL) {
693053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SEARCH_WORD, NJ_ERR_PARAM_CURSOR_NULL);
694053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
695053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
696053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
697053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.fore = NULL;
698053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.foreSize = 0;
699053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.foreFlag = 0;
700053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.rear = NULL;
701053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.rearSize = 0;
702053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.hinsi.rearFlag = 0;
703053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
704053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
705053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.yomi == NULL) {
706053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_YOMI_NULL);
707053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
708053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.ylen = nj_strlen(cursor->cond.yomi);
709053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.yclen = nj_charlen(cursor->cond.yomi);
710053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
711053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
712053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor->cond.ds == NULL) {
713053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_PARAM_DIC_NULL);
714053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
715053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
716053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
717053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    cursor->cond.ds->mode = NJ_CACHE_MODE_VALID;
718053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
719053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    p_yomi = cursor->cond.yomi;
720053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    p_key  = cursor->cond.ds->keyword;
721053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
722053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (clrcnt = 0; clrcnt < cursor->cond.yclen; clrcnt++) {
723053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (nj_charncmp(p_yomi, p_key, 1) != 0) {
724053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            break;
725053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
726053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        p_yomi += NJ_CHAR_LEN(p_yomi);
727053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        p_key  += NJ_CHAR_LEN(p_key);
728053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
729053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (clrcnt != 0) {
730053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        initst = clrcnt + 1;
731053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
732053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        initst = 0;
733053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
734053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
735053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    kw_len = nj_charlen(cursor->cond.ds->keyword);
736053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (kw_len >= cursor->cond.yclen) {
737053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project      inited = kw_len + 1;
738053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
739053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project      inited = cursor->cond.yclen + 1;
740053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
741053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
742053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (diccnt = 0; diccnt < NJ_MAX_DIC; diccnt++) {
743053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        pCache = cursor->cond.ds->dic[diccnt].srhCache;
744053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (pCache != NULL) {
745053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
746053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (NJ_GET_CACHEOVER_FROM_SCACHE(pCache)) {
747053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
748053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (cacheOverKeyPtr = 0; cacheOverKeyPtr < kw_len; cacheOverKeyPtr++) {
749053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if (pCache->keyPtr[cacheOverKeyPtr] == pCache->keyPtr[cacheOverKeyPtr + 1] ) {
750053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        break;
751053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
752053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
753053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                cacheOverKeyPtr++;
754053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
755053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
756053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (cacheOverKeyPtr < initst) {
757053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    clrcnt = cacheOverKeyPtr;
758053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                } else {
759053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    clrcnt = initst;
760053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
761053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (; clrcnt < inited; clrcnt++) {
762053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    pCache->keyPtr[clrcnt] = 0x0000;
763053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
764053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
765053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (clrcnt = 1; clrcnt < inited; clrcnt++ ) {
766053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if ((pCache->keyPtr[clrcnt - 1] > pCache->keyPtr[clrcnt]) &&
767053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        (pCache->keyPtr[clrcnt] != 0)) {
768053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CACHE_BROKEN);
769053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
770053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
771053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_UNSET_CACHEOVER_TO_SCACHE(pCache);
772053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
773053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (clrcnt = initst; clrcnt < inited; clrcnt++) {
774053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    pCache->keyPtr[clrcnt] = 0x0000;
775053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
776053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
777053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                for (clrcnt = 1; clrcnt < inited; clrcnt++ ) {
778053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    if ((pCache->keyPtr[clrcnt - 1] > pCache->keyPtr[clrcnt]) &&
779053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        (pCache->keyPtr[clrcnt] != 0)) {
780053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_CACHE_BROKEN);
781053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    }
782053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
783053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
784053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
785053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
786053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
787053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
788053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    nj_strcpy(cursor->cond.ds->keyword, cursor->cond.yomi);
789053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
790053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (cnt = 0; cnt < NJ_MAX_DIC; cnt++) {
791053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dhdl = cursor->cond.ds->dic[cnt].handle;
792053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
793053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (dhdl != NULL) {
794053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if ((cursor->cond.ds->dic[cnt].dic_freq[NJ_MODE_TYPE_HENKAN].base
795053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                 > cursor->cond.ds->dic[cnt].dic_freq[NJ_MODE_TYPE_HENKAN].high)) {
796053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    return NJ_SET_ERR_VAL(NJ_FUNC_CHECK_SEARCH_CURSOR, NJ_ERR_DIC_FREQ_INVALID);
797053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
798053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
799053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
800053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
801053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if( prev_info->count == 0 ) {
802053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        cursor->cond.hinsi.yominasi_fore = NULL;
803053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
804053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        int prev_hinsi = prev_info->selection_data.b_hinsi;
805053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
806053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
807053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_r_get_connect(cursor->cond.ds->rHandle[NJ_MODE_TYPE_HENKAN], prev_hinsi,
808053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                          0, &(cursor->cond.hinsi.yominasi_fore));
809053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        njd_r_get_count(cursor->cond.ds->rHandle[NJ_MODE_TYPE_HENKAN],
810053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                        &(cursor->cond.hinsi.foreSize), &(cursor->cond.hinsi.rearSize));
811053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
812053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
813053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return njd_search_word(iwnn, cursor, 0, &exit_flag);
814053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
815053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
816053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
817053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_get_word(NJ_CLASS *iwnn, NJ_CURSOR *cursor, NJ_RESULT *result) {
818053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16  ret;
819053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
820053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
821053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
822053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (iwnn == NULL) {
823053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_WORD, NJ_ERR_PARAM_ENV_NULL);
824053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
825053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (cursor == NULL) {
826053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_WORD, NJ_ERR_PARAM_CURSOR_NULL);
827053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
828053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (result == NULL) {
829053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_WORD, NJ_ERR_PARAM_RESULT_NULL);
830053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
831053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
832053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ret = njd_get_word(iwnn, cursor, result, 0);
833053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
834053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
835053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
836053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
837053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
838053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
839053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_EXTERN NJ_INT16 njx_check_dic(NJ_CLASS *iwnn, NJ_DIC_HANDLE handle, NJ_UINT8 restore, NJ_UINT32 size) {
840053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
841053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
842053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (iwnn == NULL) {
843053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_CHECK_DIC, NJ_ERR_PARAM_ENV_NULL);
844053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
845053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
846053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (handle == NULL) {
847053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_CHECK_DIC, NJ_ERR_DIC_HANDLE_NULL);
848053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
849053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
850053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
851053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
852053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (size <= NJ_DIC_COMMON_HEADER_SIZE) {
853053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_CHECK_DIC, NJ_ERR_AREASIZE_INVALID);
854053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
855053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
856053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
857053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
858053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (size != (NJ_DIC_COMMON_HEADER_SIZE
859053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                 + NJ_INT32_READ(handle + NJ_DIC_POS_DATA_SIZE)
860053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                 + NJ_INT32_READ(handle + NJ_DIC_POS_EXT_SIZE))) {
861053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_CHECK_DIC, NJ_ERR_AREASIZE_INVALID);
862053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
863053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
864053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return njd_check_dic(iwnn, handle);
865053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
866053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
867053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_init_search_location_set(NJ_SEARCH_LOCATION_SET* loctset)
868053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
869053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
870053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->cache_freq         = 0;
871053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->dic_freq.base      = 0;
872053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->dic_freq.high      = 0;
873053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.type          = NJ_DIC_H_TYPE_NORMAL;
874053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.handle        = NULL;
875053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.current_info  = 0x10;
876053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.current       = 0;
877053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.top           = 0;
878053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.bottom        = 0;
879053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.current_cache = 0;
880053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.status        = NJ_ST_SEARCH_NO_INIT;
881053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
882053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 1;
883053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
884053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
885053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_init_word(NJ_WORD* word)
886053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
887053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
888053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->yomi                  = NULL;
889053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info1            = 0;
890053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info2            = 0;
891053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.hindo            = 0;
892053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->fzk.info1             = 0;
893053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->fzk.info2             = 0;
894053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->fzk.hindo             = 0;
895053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
896053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.handle       = NULL;
897053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.type         = NJ_DIC_H_TYPE_NORMAL;
898053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.current      = 0;
899053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.top          = 0;
900053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.bottom       = 0;
901053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.current_cache= 0;
902053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.current_info = 0x10;
903053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc.status       = NJ_ST_SEARCH_NO_INIT;
904053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
905053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 1;
906053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
907