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 DATA_SIZE (10)
24053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_FHINSI          (0)
25053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_BHINSI          (1)
26053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_HINDO           (2)
27053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_CANDIDATE       (3)
28053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_CANDIDATE_LEN   (5)
29053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_YOMI            (6)
30053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_OFFSET_YOMI_LEN        (9)
31053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
32053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define YOMINASI_DIC_FREQ_DIV 63
33053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
34053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_FHINSI(x)                                                  \
35053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ( (NJ_UINT16)(0x01FF &                                              \
36053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  (((NJ_UINT16)*((x)+DATA_OFFSET_FHINSI  ) << 1) |      \
37053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                   (           *((x)+DATA_OFFSET_FHINSI+1) >> 7))) )
38053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_BHINSI(x)                                                  \
39053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ( (NJ_UINT16)(0x01FF &                                              \
40053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  (((NJ_UINT16)*((x)+DATA_OFFSET_BHINSI  ) << 2) |      \
41053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                   (           *((x)+DATA_OFFSET_BHINSI+1) >> 6))) )
42053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_HINDO(x)                                                   \
43053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ((NJ_HINDO)(0x003F & ((NJ_UINT16)*((x)+DATA_OFFSET_HINDO))))
44053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_CANDIDATE(x)                                               \
45053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ((NJ_UINT32)(0x000FFFFF &                                           \
46053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                 (((NJ_UINT32)*((x)+DATA_OFFSET_CANDIDATE)   << 12) |   \
47053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  ((NJ_UINT32)*((x)+DATA_OFFSET_CANDIDATE+1) <<  4) |   \
48053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  (           *((x)+DATA_OFFSET_CANDIDATE+2) >>  4))))
49053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_CANDIDATE_SIZE(x)                                          \
50053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ((NJ_UINT8)((*((x)+DATA_OFFSET_CANDIDATE_LEN)   << 4) |             \
51053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                (*((x)+DATA_OFFSET_CANDIDATE_LEN+1) >> 4)))
52053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_YOMI(x) \
53053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ((NJ_UINT32)(0x000FFFFF &                                           \
54053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                 (((NJ_UINT32)*((x)+DATA_OFFSET_YOMI)   << 16) |        \
55053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  ((NJ_UINT32)*((x)+DATA_OFFSET_YOMI+1) <<  8) |        \
56053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                  (           *((x)+DATA_OFFSET_YOMI+2)      ))))
57053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define DATA_YOMI_SIZE(x)                       \
58053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ((NJ_UINT8)((*((x)+DATA_OFFSET_YOMI_LEN))))
59053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
60053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define YOMI_INDX_TOP_ADDR(h) ((NJ_UINT8*)((h)+NJ_INT32_READ((h)+0x1C)))
61053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define YOMI_INDX_CNT(h) ((NJ_UINT16)(NJ_INT16_READ((h)+0x20)))
62053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define YOMI_INDX_BYTE(h) ((NJ_UINT16)(NJ_INT16_READ((h)+0x22)))
63053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define STEM_AREA_TOP_ADDR(h) ((NJ_UINT8*)((h)+NJ_INT32_READ((h)+0x24)))
64053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define STRS_AREA_TOP_ADDR(h) ((NJ_UINT8*)((h)+NJ_INT32_READ((h)+0x28)))
65053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define YOMI_AREA_TOP_ADDR(h) ((NJ_UINT8*)((h)+NJ_INT32_READ((h)+0x2C)))
66053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
67053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define NO_CONV_FLG ((NJ_UINT32) 0x00080000L)
68053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
69053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define HINSI_OFFSET (7)
70053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
71053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project#define CURRENT_INFO_SET (NJ_UINT8)(0x10)
72053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
73053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 search_data(NJ_SEARCH_CONDITION *condition, NJ_SEARCH_LOCATION_SET *loctset);
74053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 convert_to_yomi(NJ_DIC_HANDLE hdl, NJ_UINT8 *index, NJ_UINT16 len, NJ_CHAR *yomi, NJ_UINT16 size);
75053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 yomi_strcmp_forward(NJ_DIC_HANDLE hdl, NJ_UINT8 *data, NJ_CHAR *yomi);
76053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
77053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 search_data(NJ_SEARCH_CONDITION *condition, NJ_SEARCH_LOCATION_SET *loctset)
78053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
79053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 offset;
80053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *data;
81053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 i, j;
82053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 hindo;
83053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 hit_flg;
84053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *tmp_hinsi = NULL;
85053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
86053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
87053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    offset = loctset->loct.current;
88053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    data = STEM_AREA_TOP_ADDR(loctset->loct.handle) + offset;
89053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
90053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (GET_LOCATION_STATUS(loctset->loct.status) != NJ_ST_SEARCH_NO_INIT) {
91053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        data += DATA_SIZE;
92053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        offset += DATA_SIZE;
93053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
94053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
95053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (data >= STRS_AREA_TOP_ADDR(loctset->loct.handle)) {
96053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
97053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
98053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
99053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
100053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
101053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
102053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
103053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    tmp_hinsi = condition->hinsi.fore;
104053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    condition->hinsi.fore = condition->hinsi.yominasi_fore;
105053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
106053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    i = (STRS_AREA_TOP_ADDR(loctset->loct.handle) - data) / DATA_SIZE;
107053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (j = 0; j < i; j++) {
108053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
109053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (njd_connect_test(condition, DATA_FHINSI(data), DATA_BHINSI(data))) {
110053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
111053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            hit_flg = 0;
112053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
113053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (condition->operation == NJ_CUR_OP_LINK) {
114053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
115053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                hit_flg = 1;
116053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            } else {
117053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
118053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
119053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
120053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                if (yomi_strcmp_forward(loctset->loct.handle, data, condition->yomi)) {
121053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
122053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                    hit_flg = 1;
123053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                }
124053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
125053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
126053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (hit_flg) {
127053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
128053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                loctset->loct.current_info = CURRENT_INFO_SET;
129053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                loctset->loct.current = offset;
130053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                loctset->loct.status = NJ_ST_SEARCH_READY;
131053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                hindo = DATA_HINDO(STEM_AREA_TOP_ADDR(loctset->loct.handle) + loctset->loct.current);
132053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                loctset->cache_freq = CALCULATE_HINDO(hindo, loctset->dic_freq.base,
133053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                                      loctset->dic_freq.high, YOMINASI_DIC_FREQ_DIV);
134053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
135053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
136053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                condition->hinsi.fore = tmp_hinsi;
137053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return 1;
138053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
139053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
140053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
141053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        data += DATA_SIZE;
142053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        offset += DATA_SIZE;
143053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
144053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
145053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loctset->loct.status = NJ_ST_SEARCH_END;
146053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
147053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    condition->hinsi.fore = tmp_hinsi;
148053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 0;
149053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
150053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
151053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 convert_to_yomi(NJ_DIC_HANDLE hdl, NJ_UINT8 *index, NJ_UINT16 len, NJ_CHAR *yomi, NJ_UINT16 size)
152053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
153053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8  *wkc;
154053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR   *wky;
155053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 i, idx, yib, ret;
156053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 j, char_len;
157053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
158053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
159053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
160053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    wkc = YOMI_INDX_TOP_ADDR(hdl);
161053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
162053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
163053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    yib = YOMI_INDX_BYTE(hdl);
164053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
165053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
166053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_CHAR_ILLEGAL_DIC_YINDEX(yib)) {
167053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
168053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
169053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
170053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
171053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
172053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ret = 0;
173053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    wky = yomi;
174053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    for (i = 0; i < len; i++) {
175053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        idx = (NJ_UINT16)((*index - 1) * yib);
176053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (yib == 2) {
177053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            char_len = UTL_CHAR(wkc + idx);
178053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
179053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (((ret + char_len + NJ_TERM_LEN) * sizeof(NJ_CHAR)) > size) {
180053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return (size / sizeof(NJ_CHAR));
181053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
182053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            for (j = 0; j < char_len; j++) {
183053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_CHAR_COPY(wky, wkc + idx + j);
184053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                wky++;
185053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                ret++;
186053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
187053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
188053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
189053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (((ret + 1 + NJ_TERM_LEN) * sizeof(NJ_CHAR)) > size) {
190053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return (size / sizeof(NJ_CHAR));
191053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
192053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            *wky++ = (NJ_CHAR)(*(wkc + idx));
193053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            ret++;
194053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
195053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        index++;
196053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
197053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    *wky = NJ_CHAR_NUL;
198053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return ret;
199053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
200053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
201053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Projectstatic NJ_UINT16 yomi_strcmp_forward(NJ_DIC_HANDLE hdl, NJ_UINT8 *data, NJ_CHAR *yomi)
202053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
203053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *area;
204053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR  *stroke;
205053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR   buf[NJ_MAX_LEN + NJ_TERM_LEN];
206053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 ylen, dic_ylen, j, size;
207053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
208053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
209053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
210053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    size = sizeof(buf);
211053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    stroke = buf;
212053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
213053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
214053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    area = YOMI_AREA_TOP_ADDR(hdl) + DATA_YOMI(data);
215053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
216053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (YOMI_INDX_CNT(hdl) == 0) {
217053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
218053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_ylen = DATA_YOMI_SIZE(data) / sizeof(NJ_CHAR);
219053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
220053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
221053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (size < ((dic_ylen + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
222053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
223053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
224053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for (j = 0; j < dic_ylen; j++) {
225053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_CHAR_COPY(stroke, area);
226053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            stroke++;
227053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            area += sizeof(NJ_CHAR);
228053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
229053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        *stroke = NJ_CHAR_NUL;
230053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
231053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
232053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        dic_ylen = convert_to_yomi(hdl, area, DATA_YOMI_SIZE(data), stroke, size);
233053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
234053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
235053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (size < ((dic_ylen + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
236053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
237053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
238053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
239053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
240053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
241053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    ylen = nj_strlen(yomi);
242053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
243053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
244053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (dic_ylen < ylen) {
245053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
246053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
247053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
248053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
249053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
250053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (nj_strncmp(yomi, buf, ylen) == 0) {
251053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
252053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 1;
253053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
254053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 0;
255053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
256053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
257053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_f_search_word(NJ_SEARCH_CONDITION *con, NJ_SEARCH_LOCATION_SET *loctset)
258053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
259053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 ret;
260053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
261053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    switch (con->operation) {
262053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_OP_LINK:
263053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
264053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
265053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((con->hinsi.yominasi_fore == NULL) ||
266053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            (con->hinsi.foreSize == 0)) {
267053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
268053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
269053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
270053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
271053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    case NJ_CUR_OP_FORE:
272053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
273053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
274053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (NJ_CHAR_STRLEN_IS_0(con->yomi)) {
275053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
276053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
277053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
278053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
279053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
280053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if ((con->hinsi.yominasi_fore == NULL) ||
281053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            (con->hinsi.foreSize == 0)) {
282053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
283053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return 0;
284053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
285053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        break;
286053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    default:
287053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
288053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset->loct.status = NJ_ST_SEARCH_END;
289053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
290053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
291053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
292053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
293053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (con->mode != NJ_CUR_MODE_FREQ) {
294053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
295053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset->loct.status = NJ_ST_SEARCH_END;
296053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
297053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
298053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
299053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
300053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if ((GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_NO_INIT)
301053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        || (GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_READY)) {
302053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
303053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        ret = search_data(con, loctset);
304053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (ret < 1) {
305053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
306053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            loctset->loct.status = NJ_ST_SEARCH_END;
307053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
308053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return ret;
309053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
310053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
311053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        loctset->loct.status = NJ_ST_SEARCH_END;
312053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
313053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
314053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
315053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
316053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_f_get_word(NJ_SEARCH_LOCATION_SET *loctset, NJ_WORD *word)
317053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
318053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *data;
319053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR  stroke[NJ_MAX_LEN + NJ_TERM_LEN];
320053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_INT16 yomilen, kouholen;
321053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
322053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
323053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
324053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (GET_LOCATION_STATUS(loctset->loct.status) == NJ_ST_SEARCH_END) {
325053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return 0;
326053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
327053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
328053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
329053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    data = STEM_AREA_TOP_ADDR(loctset->loct.handle) + loctset->loct.current;
330053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
331053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SET_YLEN_TO_STEM(word, 1);
332053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
333053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
334053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.loc = loctset->loct;
335053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    yomilen = njd_f_get_stroke(word, stroke, sizeof(stroke));
336053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (yomilen <= 0) {
337053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_WORD, NJ_ERR_INVALID_RESULT);
338053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
339053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info1 = yomilen;
340053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info1 |= (NJ_UINT16)(DATA_FHINSI(data) << HINSI_OFFSET);
341053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info2 = (NJ_UINT16)(DATA_BHINSI(data) << HINSI_OFFSET);
342053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    kouholen = (NJ_UINT16)DATA_CANDIDATE_SIZE(data)/sizeof(NJ_CHAR);
343053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (kouholen == 0) {
344053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
345053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        kouholen = yomilen;
346053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
347053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.info2 |= kouholen;
348053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.hindo = CALCULATE_HINDO(DATA_HINDO(data), loctset->dic_freq.base,
349053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                                       loctset->dic_freq.high, YOMINASI_DIC_FREQ_DIV);
350053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
351053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
352053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    word->stem.type = 0;
353053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
354053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return 1;
355053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
356053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
357053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_f_get_stroke(NJ_WORD *word, NJ_CHAR *stroke, NJ_UINT16 size) {
358053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_LOCATION *loc;
359053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *area, *data;
360053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 len;
361053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT32 j;
362053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
363053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (NJ_GET_YLEN_FROM_STEM(word) == 0) {
364053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_STROKE, NJ_ERR_INVALID_RESULT);
365053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
366053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
367053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
368053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
369053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loc = &word->stem.loc;
370053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    data = STEM_AREA_TOP_ADDR(loc->handle) + loc->current;
371053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
372053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
373053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    area = YOMI_AREA_TOP_ADDR(loc->handle) + DATA_YOMI(data);
374053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
375053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (YOMI_INDX_CNT(loc->handle) == 0) {
376053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
377053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        len = DATA_YOMI_SIZE(data)/sizeof(NJ_CHAR);
378053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
379053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
380053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
381053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH);
382053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
383053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
384053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for (j = 0; j < len; j++) {
385053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_CHAR_COPY(stroke, area);
386053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            stroke++;
387053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            area += sizeof(NJ_CHAR);
388053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
389053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        *stroke = NJ_CHAR_NUL;
390053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
391053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
392053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        len = convert_to_yomi(loc->handle, area, DATA_YOMI_SIZE(data), stroke, size);
393053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
394053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
395053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
396053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH);
397053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
398053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
399053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return len;
400053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
401053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
402053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source ProjectNJ_INT16 njd_f_get_candidate(NJ_WORD *word, NJ_CHAR *candidate, NJ_UINT16 size)
403053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project{
404053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_SEARCH_LOCATION *loc;
405053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT8 *data, *area;
406053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_CHAR   work[NJ_MAX_LEN + NJ_TERM_LEN];
407053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    NJ_UINT16 len, j;
408053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
409053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
410053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
411053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
412053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    loc = &word->stem.loc;
413053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    data = STEM_AREA_TOP_ADDR(loc->handle) + loc->current;
414053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
415053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
416053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    len = DATA_CANDIDATE_SIZE(data)/sizeof(NJ_CHAR);
417053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
418053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_CANDIDATE, NJ_ERR_BUFFER_NOT_ENOUGH);
419053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
420053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
421053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
422053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    if (len == 0) {
423053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
424053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        area = YOMI_AREA_TOP_ADDR(loc->handle) + DATA_YOMI(data);
425053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (YOMI_INDX_CNT(loc->handle) == 0) {
426053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
427053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            len = DATA_YOMI_SIZE(data)/sizeof(NJ_CHAR);
428053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
429053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
430053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
431053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH);
432053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
433053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            for (j = 0; j < len; j++) {
434053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                NJ_CHAR_COPY(candidate + j, area);
435053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                area += sizeof(NJ_CHAR);
436053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
437053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            candidate[len] = NJ_CHAR_NUL;
438053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            return len;
439053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
440053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
441053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            len = convert_to_yomi(loc->handle, area, DATA_YOMI_SIZE(data), work, size);
442053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
443053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
444053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            if (size < ((len + NJ_TERM_LEN) * sizeof(NJ_CHAR))) {
445053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                return NJ_SET_ERR_VAL(NJ_FUNC_NJD_F_GET_CANDIDATE, NJ_ERR_BUFFER_NOT_ENOUGH);
446053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
447053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
448053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
449053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        if (DATA_CANDIDATE(data) & NO_CONV_FLG) {
450053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            nje_convert_hira_to_kata(work, candidate, len);
451053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        } else {
452053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            for (j = 0; j < len; j++) {
453053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project                candidate[j] = work[j];
454053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            }
455053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
456053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    } else {
457053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
458053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        area = STRS_AREA_TOP_ADDR(loc->handle) + DATA_CANDIDATE(data);
459053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        for (j = 0; j < len; j++) {
460053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            NJ_CHAR_COPY(candidate + j, area);
461053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project            area += sizeof(NJ_CHAR);
462053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project        }
463053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    }
464053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project
465053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    candidate[len] = NJ_CHAR_NUL;
466053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project    return len;
467053d50935e0e311286543bd7c535ae2c863c0deThe Android Open Source Project}
468