17898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project/* 27898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Copyright (C) 2009 The Android Open Source Project 37898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 47898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 57898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * you may not use this file except in compliance with the License. 67898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * You may obtain a copy of the License at 77898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 87898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 97898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * See the License for the specific language governing permissions and 147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * limitations under the License. 157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifndef PINYINIME_INCLUDE_DICTLIST_H__ 187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define PINYINIME_INCLUDE_DICTLIST_H__ 197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <stdlib.h> 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <stdio.h> 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./dictdef.h" 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./searchutility.h" 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./spellingtrie.h" 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "./utf16char.h" 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectnamespace ime_pinyin { 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectclass DictList { 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private: 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool initialized_; 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const SpellingTrie *spl_trie_; 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Number of SingCharItem. The first is blank, because id 0 is invalid. 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t scis_num_; 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *scis_hz_; 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project SpellingId *scis_splid_; 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // The large memory block to store the word list. 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 *buf_; 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Starting position of those words whose lengths are i+1, counted in 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // char16 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t start_pos_[kMaxLemmaSize + 1]; 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t start_id_[kMaxLemmaSize + 1]; 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int (*cmp_func_[kMaxLemmaSize])(const void *, const void *); 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool alloc_resource(size_t buf_size, size_t scim_num); 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void free_resource(); 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___BUILD_MODEL___ 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Calculate the requsted memory, including the start_pos[] buffer. 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t calculate_size(const LemmaEntry *lemma_arr, size_t lemma_num); 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void fill_scis(const SingleCharItem *scis, size_t scis_num); 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Copy the related content to the inner buffer 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // It should be called after calculate_size() 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void fill_list(const LemmaEntry *lemma_arr, size_t lemma_num); 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Find the starting position for the buffer of those 2-character Chinese word 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // whose first character is the given Chinese character. 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16* find_pos2_startedbyhz(char16 hz_char); 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Find the starting position for the buffer of those words whose lengths are 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // word_len. The given parameter cmp_func decides how many characters from 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // beginning will be used to compare. 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16* find_pos_startedbyhzs(const char16 last_hzs[], 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t word_Len, 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int (*cmp_func)(const void *, const void *)); 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public: 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project DictList(); 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ~DictList(); 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool save_list(FILE *fp); 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool load_list(FILE *fp); 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___BUILD_MODEL___ 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Init the list from the LemmaEntry array. 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // lemma_arr should have been sorted by the hanzi_str, and have been given 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // ids from 1 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool init_list(const SingleCharItem *scis, size_t scis_num, 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const LemmaEntry *lemma_arr, size_t lemma_num); 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Get the hanzi string for the given id 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_lemma_str(LemmaIdType id_hz, char16 *str_buf, uint16 str_max); 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void convert_to_hanzis(char16 *str, uint16 str_len); 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void convert_to_scis_ids(char16 *str, uint16 str_len); 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // last_hzs stores the last n Chinese characters history, its length should be 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // less or equal than kMaxPredictSize. 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // hzs_len specifies the length(<= kMaxPredictSize). 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // predict_buf is used to store the result. 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // buf_len specifies the buffer length. 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // b4_used specifies how many items before predict_buf have been used. 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Returned value is the number of newly added items. 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t predict(const char16 last_hzs[], uint16 hzs_len, 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NPredictItem *npre_items, size_t npre_max, 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t b4_used); 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // If half_splid is a valid half spelling id, return those full spelling 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // ids which share this half id. 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_splids_for_hanzi(char16 hanzi, uint16 half_splid, 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 *splids, uint16 max_splids); 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType get_lemma_id(const char16 *str, uint16 str_len); 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}; 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif // PINYINIME_INCLUDE_DICTLIST_H__ 121