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_USERDICT_H__ 187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define PINYINIME_INCLUDE_USERDICT_H__ 197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define ___CACHE_ENABLED___ 217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define ___SYNC_ENABLED___ 227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define ___PREDICT_ENABLED___ 237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// Debug performance for operations 257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project// #define ___DEBUG_PERF___ 267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include <pthread.h> 287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#include "atomdictbase.h" 297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectnamespace ime_pinyin { 317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Projectclass UserDict : public AtomDictBase { 337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project public: 347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project UserDict(); 357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ~UserDict(); 367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool load_dict(const char *file_name, LemmaIdType start_id, 387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType end_id); 397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool close_dict(); 417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t number_of_lemmas(); 437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void reset_milestones(uint16 from_step, MileStoneHandle from_handle); 457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project MileStoneHandle extend_dict(MileStoneHandle from_handle, 477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const DictExtPara *dep, LmaPsbItem *lpi_items, 487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lpi_max, size_t *lpi_num); 497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_lpis(const uint16 *splid_str, uint16 splid_str_len, 517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaPsbItem *lpi_items, size_t lpi_max); 527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_lemma_str(LemmaIdType id_lemma, char16* str_buf, 547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 str_max); 557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 get_lemma_splids(LemmaIdType id_lemma, uint16 *splids, 577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splids_max, bool arg_valid); 587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t predict(const char16 last_hzs[], uint16 hzs_len, 607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project NPredictItem *npre_items, size_t npre_max, 617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t b4_used); 627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Full spelling ids are required 647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType put_lemma(char16 lemma_str[], uint16 splids[], 657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len, uint16 count); 667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType update_lemma(LemmaIdType lemma_id, int16 delta_count, 687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool selected); 697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType get_lemma_id(char16 lemma_str[], uint16 splids[], 717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len); 727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaScoreType get_lemma_score(LemmaIdType lemma_id); 747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaScoreType get_lemma_score(char16 lemma_str[], uint16 splids[], 767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len); 777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool remove_lemma(LemmaIdType lemma_id); 797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t get_total_lemma_count(); 817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void set_total_lemma_count_of_others(size_t count); 827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void flush_cache(); 847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void set_limit(uint32 max_lemma_count, uint32 max_lemma_size, 867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 reclaim_ratio); 877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void reclaim(); 897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void defragment(); 917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void clear_sync_lemmas(unsigned int start, unsigned int end); 947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int get_sync_count(); 967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType put_lemma_no_sync(char16 lemma_str[], uint16 splids[], 987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len, uint16 count, uint64 lmt); 997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Add lemmas encoded in UTF-16LE into dictionary without adding sync flag. 1017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 1027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @param lemmas in format of 'wo men,WM,0.32;da jia,DJ,0.12' 1037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @param len length of lemmas string in UTF-16LE 1047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @return newly added lemma count 1057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int put_lemmas_no_sync_from_utf16le_string(char16 * lemmas, int len); 1077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project /** 1097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Get lemmas need sync to a UTF-16LE string of above format. 1107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * Note: input buffer (str) must not be too small. If str is too small to 1117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * contain single one lemma, there might be a dead loop. 1127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * 1137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @param str buffer to write lemmas 1147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @param size buffer size in UTF-16LE 1157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @param count output value of lemma returned 1167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project * @return UTF-16LE string length 1177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project */ 1187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int get_sync_lemmas_in_utf16le_string_from_beginning( 1197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char16 * str, int size, int * count); 1207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 1227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictStat { 1247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 version; 1257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const char * file_name; 1267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct timeval load_time; 1277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct timeval last_update; 1287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 disk_size; 1297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 lemma_count; 1307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 lemma_size; 1317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 delete_count; 1327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 delete_size; 1337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 1347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 sync_count; 1357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 1367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 reclaim_ratio; 1377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 limit_lemma_count; 1387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 limit_lemma_size; 1397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project }; 1407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool state(UserDictStat * stat); 1427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project private: 1447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 total_other_nfreq_; 1457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct timeval load_time_; 1467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType start_id_; 1477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 version_; 1487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint8 * lemmas_; 1497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // In-Memory-Only flag for each lemma 1517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint8 kUserDictLemmaFlagRemove = 1; 1527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Inuse lemmas' offset 1537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * offsets_; 1547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Highest bit in offset tells whether corresponding lemma is removed 1557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictOffsetFlagRemove = (1 << 31); 1567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Maximum possible for the offset 1577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictOffsetMask = ~(kUserDictOffsetFlagRemove); 1587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Bit width for last modified time, from 1 to 16 1597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictLMTBitWidth = 16; 1607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Granularity for last modified time in second 1617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictLMTGranularity = 60 * 60 * 24 * 7; 1627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Maximum frequency count 1637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint16 kUserDictMaxFrequency = 0xFFFF; 1647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#define COARSE_UTC(year, month, day, hour, minute, second) \ 1667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ( \ 1677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (year - 1970) * 365 * 24 * 60 * 60 + \ 1687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (month - 1) * 30 * 24 * 60 * 60 + \ 1697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (day - 1) * 24 * 60 * 60 + \ 1707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (hour - 0) * 60 * 60 + \ 1717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (minute - 0) * 60 + \ 1727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project (second - 0) \ 1737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project ) 1747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint64 kUserDictLMTSince = COARSE_UTC(2009, 1, 1, 0, 0, 0); 1757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Correspond to offsets_ 1777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * scores_; 1787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Following two fields are only valid in memory 1797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * ids_; 1807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___PREDICT_ENABLED___ 1817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * predicts_; 1827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 1837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 1847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * syncs_; 1857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t sync_count_size_; 1867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 1877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 * offsets_by_id_; 1887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lemma_count_left_; 1907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t lemma_size_left_; 1917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const char * dict_file_; 1937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 1947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Be sure size is 4xN 1957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictInfo { 1967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // When limitation reached, how much percentage will be reclaimed (1 ~ 100) 1977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 reclaim_ratio; 1987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // maximum lemma count, 0 means no limitation 1997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 limit_lemma_count; 2007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Maximum lemma size, it's different from 2017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // whole disk file size or in-mem dict size 2027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // 0 means no limitation 2037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 limit_lemma_size; 2047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Total lemma count including deleted and inuse 2057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Also indicate offsets_ size 2067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 lemma_count; 2077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Total size of lemmas including used and freed 2087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 lemma_size; 2097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Freed lemma count 2107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 free_count; 2117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Freed lemma size in byte 2127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 free_size; 2137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 2147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 sync_count; 2157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 2167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int32 total_nfreq; 2177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } dict_info_; 2187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictVersion = 0x0ABCDEF0; 2207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictPreAlloc = 32; 2227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const uint32 kUserDictAverageNchar = 8; 2237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project enum UserDictState { 2257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Keep in order 2267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_NONE = 0, 2277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_SYNC, 2287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 2297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_SYNC_DIRTY, 2307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 2317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_SCORE_DIRTY, 2327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_OFFSET_DIRTY, 2337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_LEMMA_DIRTY, 2347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_DEFRAGMENTED, 2367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } state_; 2377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictSearchable { 2397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splids_len; 2407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splid_start[kMaxLemmaSize]; 2417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splid_count[kMaxLemmaSize]; 2427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Compact inital letters for both FuzzyCompareSpellId and cache system 2437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 signature[kMaxLemmaSize / 4]; 2447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project }; 2457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___CACHE_ENABLED___ 2477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project enum UserDictCacheType { 2487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_CACHE, 2497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project USER_DICT_MISS_CACHE, 2507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project }; 2517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const int kUserDictCacheSize = 4; 2537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project static const int kUserDictMissCacheSize = kMaxLemmaSize - 1; 2547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictMissCache { 2567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 signatures[kUserDictMissCacheSize][kMaxLemmaSize / 4]; 2577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 head, tail; 2587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } miss_caches_[kMaxLemmaSize]; 2597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictCache { 2617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 signatures[kUserDictCacheSize][kMaxLemmaSize / 4]; 2627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 offsets[kUserDictCacheSize]; 2637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 lengths[kUserDictCacheSize]; 2647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Ring buffer 2657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 head, tail; 2667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project } caches_[kMaxLemmaSize]; 2677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void cache_init(); 2697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void cache_push(UserDictCacheType type, 2717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project UserDictSearchable *searchable, 2727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 offset, uint32 length); 2737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool cache_hit(UserDictSearchable *searchable, 2757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 *offset, uint32 *length); 2767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool load_cache(UserDictSearchable *searchable, 2787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 *offset, uint32 *length); 2797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void save_cache(UserDictSearchable *searchable, 2817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 offset, uint32 length); 2827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void reset_cache(); 2847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool load_miss_cache(UserDictSearchable *searchable); 2867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void save_miss_cache(UserDictSearchable *searchable); 2887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void reset_miss_cache(); 2907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 2917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaScoreType translate_score(int f); 2937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int extract_score_freq(int raw_score); 2957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint64 extract_score_lmt(int raw_score); 2977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 2987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project inline int build_score(uint64 lmt, int freq); 2997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project inline int64 utf16le_atoll(uint16 *s, int len); 3017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project inline int utf16le_lltoa(int64 v, uint16 *s, int size); 3037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType _put_lemma(char16 lemma_str[], uint16 splids[], 3057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len, uint16 count, uint64 lmt); 3067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project size_t _get_lpis(const uint16 *splid_str, uint16 splid_str_len, 3087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LmaPsbItem *lpi_items, size_t lpi_max, bool * need_extend); 3097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int _get_lemma_score(char16 lemma_str[], uint16 splids[], uint16 lemma_len); 3117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int _get_lemma_score(LemmaIdType lemma_id); 3137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int is_fuzzy_prefix_spell_id(const uint16 * id1, uint16 len1, 3157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const UserDictSearchable *searchable); 3167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool is_prefix_spell_id(const uint16 * fullids, 3187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 fulllen, const UserDictSearchable *searchable); 3197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 get_dict_file_size(UserDictInfo * info); 3217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool reset(const char *file); 3237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool validate(const char *file); 3257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool load(const char *file, LemmaIdType start_id); 3277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool is_valid_state(); 3297898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3307898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool is_valid_lemma_id(LemmaIdType id); 3317898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3327898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType get_max_lemma_id(); 3337898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3347898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void set_lemma_flag(uint32 offset, uint8 flag); 3357898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3367898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char get_lemma_flag(uint32 offset); 3377898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3387898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project char get_lemma_nchar(uint32 offset); 3397898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3407898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 * get_lemma_spell_ids(uint32 offset); 3417898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3427898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 * get_lemma_word(uint32 offset); 3437898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3447898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Prepare searchable to fasten locate process 3457898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void prepare_locate(UserDictSearchable *searchable, 3467898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const uint16 * splids, uint16 len); 3477898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3487898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Compare initial letters only 3497898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int32 fuzzy_compare_spell_id(const uint16 * id1, uint16 len1, 3507898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project const UserDictSearchable *searchable); 3517898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3527898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Compare exactly two spell ids 3537898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // First argument must be a full id spell id 3547898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool equal_spell_id(const uint16 * fullids, 3557898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 fulllen, const UserDictSearchable *searchable); 3567898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3577898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Find first item by initial letters 3587898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int32 locate_first_in_offsets(const UserDictSearchable *searchable); 3597898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3607898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project LemmaIdType append_a_lemma(char16 lemma_str[], uint16 splids[], 3617898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 lemma_len, uint16 count, uint64 lmt); 3627898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3637898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // Check if a lemma is in dictionary 3647898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int32 locate_in_offsets(char16 lemma_str[], 3657898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint16 splid_str[], uint16 lemma_len); 3667898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3677898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project bool remove_lemma_by_offset_index(int offset_index); 3687898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___PREDICT_ENABLED___ 3697898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 locate_where_to_insert_in_predicts(const uint16 * words, 3707898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int lemma_len); 3717898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3727898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int32 locate_first_in_predicts(const uint16 * words, int lemma_len); 3737898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3747898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void remove_lemma_from_predict_list(uint32 offset); 3757898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 3767898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 3777898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void queue_lemma_for_sync(LemmaIdType id); 3787898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3797898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void remove_lemma_from_sync_list(uint32 offset); 3807898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3817898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back_sync(int fd); 3827898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 3837898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back_score(int fd); 3847898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back_offset(int fd); 3857898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back_lemma(int fd); 3867898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back_all(int fd); 3877898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void write_back(); 3887898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3897898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project struct UserDictScoreOffsetPair { 3907898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project int score; 3917898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project uint32 offset_index; 3927898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project }; 3937898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3947898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project inline void swap(UserDictScoreOffsetPair * sop, int i, int j); 3957898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3967898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project void shift_down(UserDictScoreOffsetPair * sop, int i, int n); 3977898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 3987898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // On-disk format for each lemma 3997898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-------------+ 4007898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Version (4) | 4017898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-------------+ 4027898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-----------+-----------+--------------------+-------------------+ 4037898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Spare (1) | Nchar (1) | Splids (2 x Nchar) | Lemma (2 x Nchar) | 4047898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-----------+-----------+--------------------+-------------------+ 4057898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // ... 4067898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-----------------------+ +-------------+ <---Offset of offset 4077898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Offset1 by_splids (4) | ... | OffsetN (4) | 4087898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-----------------------+ +-------------+ 4097898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___PREDICT_ENABLED___ 4107898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +----------------------+ +-------------+ 4117898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Offset1 by_lemma (4) | ... | OffsetN (4) | 4127898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +----------------------+ +-------------+ 4137898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 4147898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +------------+ +------------+ 4157898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Score1 (4) | ... | ScoreN (4) | 4167898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +------------+ +------------+ 4177898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#ifdef ___SYNC_ENABLED___ 4187898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-------------+ +-------------+ 4197898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | NewAdd1 (4) | ... | NewAddN (4) | 4207898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +-------------+ +-------------+ 4217898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 4227898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +----------------+ 4237898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // | Dict Info (4x) | 4247898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project // +----------------+ 4257898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project}; 4267898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project} 4277898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project 4287898d76cc005bbe1c5893a9f57439561e0771ccThe Android Open Source Project#endif 429