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