1/*
2 * Copyright (C) 2008-2012  OMRON SOFTWARE Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "nj_lib.h"
18#include "nj_err.h"
19#include "nj_ext.h"
20#include "nj_dic.h"
21
22
23
24static NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result);
25static NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result);
26
27
28
29NJ_EXTERN NJ_INT16 njx_select(NJ_CLASS *iwnn, NJ_RESULT *r_result) {
30    NJ_INT16 ret;
31    NJ_DIC_SET *dics;
32
33
34    if (iwnn == NULL) {
35
36        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_PARAM_ENV_NULL);
37    }
38    dics = &(iwnn->dic_set);
39
40    if (dics->rHandle[NJ_MODE_TYPE_HENKAN] == NULL) {
41        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_NO_RULEDIC);
42    }
43
44
45    if ( r_result != NULL ) {
46
47        ret = set_previous_selection(iwnn, r_result);
48        if (ret < 0) {
49            return ret;
50        }
51    } else {
52
53        set_previous_selection(iwnn, NULL);
54    }
55    return 0;
56}
57
58NJ_EXTERN NJ_INT16 njx_init(NJ_CLASS *iwnn) {
59
60    if (iwnn == NULL) {
61
62        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_INIT, NJ_ERR_PARAM_ENV_NULL);
63    }
64
65
66    set_previous_selection(iwnn, NULL);
67    return 0;
68}
69
70NJ_EXTERN NJ_INT16 njx_get_candidate(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) {
71    NJ_INT16 ret;
72
73
74    if (iwnn == NULL) {
75
76        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_ENV_NULL);
77    }
78    if (result == NULL) {
79        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_RESULT_NULL);
80    }
81
82    if ((buf == NULL) || (buf_size == 0)) {
83        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_BUFFER_NOT_ENOUGH);
84    }
85
86    switch (NJ_GET_RESULT_OP(result->operation_id)) {
87    case NJ_OP_SEARCH:
88        ret = njd_get_candidate(iwnn, result, buf, buf_size);
89        break;
90
91    default:
92
93        ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_INVALID_RESULT);
94        break;
95    }
96
97    return ret;
98}
99
100NJ_EXTERN NJ_INT16 njx_get_stroke(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) {
101    NJ_INT16 ret;
102
103
104    if (iwnn == NULL) {
105
106        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_ENV_NULL);
107    }
108    if (result == NULL) {
109        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_RESULT_NULL);
110    }
111
112    if ((buf == NULL) || (buf_size == 0)) {
113        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH);
114    }
115
116    switch (NJ_GET_RESULT_OP(result->operation_id)) {
117    case NJ_OP_SEARCH:
118        ret = njd_get_stroke(iwnn, result, buf, buf_size);
119        break;
120
121    default:
122
123        ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_INVALID_RESULT);
124        break;
125    }
126    return ret;
127}
128
129
130static NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result) {
131    NJ_INT16   ret;
132    NJ_PREVIOUS_SELECTION_INFO *prev_info = &(iwnn->previous_selection);
133
134
135    if (result == NULL) {
136        prev_info->count = 0;
137   } else {
138        ret = set_learn_word_info(iwnn, &(prev_info->selection_data), result);
139        if (ret < 0) {
140
141            return ret;
142        }
143
144        prev_info->count = 1;
145    }
146
147    return 0;
148}
149
150static NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result)
151{
152    NJ_INT16 ret;
153    NJ_DIC_SET *dics = &(iwnn->dic_set);
154
155
156
157#if 0
158
159    ret = njx_get_stroke(iwnn, result, lword->yomi, sizeof(lword->yomi));
160    if (ret < 0) {
161        return ret;
162    }
163    lword->yomi_len = (NJ_UINT8)ret;
164    ret = njx_get_candidate(iwnn, result, lword->hyouki, sizeof(lword->hyouki));
165    if (ret < 0) {
166        return ret;
167    }
168    lword->hyouki_len = (NJ_UINT8)ret;
169#else
170    lword->yomi[0] = 0x0000;
171    lword->yomi_len = 0;
172    lword->hyouki[0] = 0x0000;
173    lword->hyouki_len = 0;
174#endif
175
176
177    lword->f_hinsi = NJ_GET_FPOS_FROM_STEM(&(result->word));
178    lword->stem_b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word));
179    lword->b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word));
180
181
182    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_F);
183    if ((ret != 0) && (lword->f_hinsi == (NJ_UINT16)ret)) {
184        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_F);
185        if (ret != 0) {
186            lword->f_hinsi = (NJ_UINT16)ret;
187        }
188    }
189
190
191    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B);
192    if ((ret != 0) && (lword->b_hinsi == (NJ_UINT16)ret)) {
193        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B);
194        if (ret != 0) {
195            lword->b_hinsi = (NJ_UINT16)ret;
196        }
197    }
198
199
200    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B);
201    if ((ret != 0) && (lword->stem_b_hinsi == (NJ_UINT16)ret)) {
202        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B);
203        if (ret != 0) {
204            lword->stem_b_hinsi = (NJ_UINT16)ret;
205        }
206    }
207
208    return 0;
209
210}
211