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