3 * Library to deal with pinyin.
5 * Copyright (C) 2013 Peng Wu <alexepico@gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22 #include "table_info.h"
27 using namespace pinyin;
30 static const pinyin_table_info_t reserved_tables[] = {
31 {RESERVED, NULL, NULL, NULL, NOT_USED},
32 {GB_DICTIONARY, "gb_char.table", "gb_char.bin", "gb_char.dbin", SYSTEM_FILE},
33 {GBK_DICTIONARY, "gbk_char.table", "gbk_char.bin", "gbk_char.dbin", SYSTEM_FILE},
35 {MERGED_DICTIONARY, "merged.table", "merged.bin", "merged.dbin", SYSTEM_FILE},
37 {USER_DICTIONARY, NULL, NULL, "user.bin", USER_FILE}
41 SystemTableInfo::SystemTableInfo() {
42 m_binary_format_version = 0;
43 m_model_data_version = 0;
47 for (i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) {
48 pinyin_table_info_t * tableinfo = &m_table_info[i];
50 tableinfo->m_dict_index = i;
51 tableinfo->m_table_filename = NULL;
52 tableinfo->m_system_filename = NULL;
53 tableinfo->m_user_filename = NULL;
54 tableinfo->m_file_type = NOT_USED;
58 SystemTableInfo::~SystemTableInfo() {
62 void SystemTableInfo::reset() {
63 m_binary_format_version = 0;
64 m_model_data_version = 0;
68 for (i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) {
69 pinyin_table_info_t * tableinfo = &m_table_info[i];
71 g_free((gchar *)tableinfo->m_table_filename);
72 tableinfo->m_table_filename = NULL;
73 g_free((gchar *)tableinfo->m_system_filename);
74 tableinfo->m_system_filename = NULL;
75 g_free((gchar *)tableinfo->m_user_filename);
76 tableinfo->m_user_filename = NULL;
78 tableinfo->m_file_type = NOT_USED;
82 void SystemTableInfo::postfix_tables() {
84 for (i = 0; i < G_N_ELEMENTS(reserved_tables); ++i) {
85 const pinyin_table_info_t * postfix = &reserved_tables[i];
87 guint8 index = postfix->m_dict_index;
88 pinyin_table_info_t * tableinfo = &m_table_info[index];
89 assert(tableinfo->m_dict_index == index);
91 tableinfo->m_table_filename = g_strdup(postfix->m_table_filename);
92 tableinfo->m_system_filename = g_strdup(postfix->m_system_filename);
93 tableinfo->m_user_filename = g_strdup(postfix->m_user_filename);
94 tableinfo->m_file_type = postfix->m_file_type;
98 static gchar * to_string(const char * str) {
99 if (0 == strcmp(str, "NULL"))
102 return g_strdup(str);
105 static PHRASE_FILE_TYPE to_file_type(const char * str) {
106 #define HANDLE(x) { \
107 if (0 == strcmp(str, #x)) \
121 bool SystemTableInfo::load(const char * filename) {
124 FILE * input = fopen(filename, "r");
126 fprintf(stderr, "open %s failed.\n", filename);
130 int binver = 0, modelver = 0;
133 int num = fscanf(input, "binary format version:%d", &binver);
137 num = fscanf(input, "model data version:%d", &modelver);
141 num = fscanf(input, "lambda parameter:%f", &lambda);
146 printf("binver:%d modelver:%d lambda:%f\n", binver, modelver, lambda);
149 m_binary_format_version = binver;
150 m_model_data_version = modelver;
154 char tablefile[256], sysfile[256], userfile[256], filetype[256];
155 while (!feof(input)) {
156 num = fscanf(input, "%d %s %s %s %s",
157 &index, tablefile, sysfile, userfile, filetype);
162 if (!(0 <= index && index < PHRASE_INDEX_LIBRARY_COUNT))
165 /* save into m_table_info. */
166 pinyin_table_info_t * tableinfo = &m_table_info[index];
167 assert(index == tableinfo->m_dict_index);
169 tableinfo->m_table_filename = to_string(tablefile);
170 tableinfo->m_system_filename = to_string(sysfile);
171 tableinfo->m_user_filename = to_string(userfile);
173 tableinfo->m_file_type = to_file_type(filetype);
178 /* postfix reserved tables. */
183 const pinyin_table_info_t * SystemTableInfo::get_table_info() {
187 gfloat SystemTableInfo::get_lambda() {
192 UserTableInfo::UserTableInfo() {
193 m_binary_format_version = 0;
194 m_model_data_version = 0;
197 void UserTableInfo::reset() {
198 m_binary_format_version = 0;
199 m_model_data_version = 0;
202 bool UserTableInfo::load(const char * filename) {
205 FILE * input = fopen(filename, "r");
207 fprintf(stderr, "open %s failed.", filename);
211 int binver = 0, modelver = 0;
213 int num = fscanf(input, "binary format version:%d", &binver);
217 num = fscanf(input, "model data version:%d", &modelver);
222 printf("binver:%d modelver:%d\n", binver, modelver);
225 m_binary_format_version = binver;
226 m_model_data_version = modelver;
233 bool UserTableInfo::save(const char * filename) {
234 FILE * output = fopen(filename, "w");
235 if (NULL == output) {
236 fprintf(stderr, "write %s failed.\n", filename);
240 fprintf(output, "binary format version:%d\n", m_binary_format_version);
241 fprintf(output, "model data version:%d\n", m_model_data_version);
248 bool UserTableInfo::is_conform(const SystemTableInfo * sysinfo) {
249 if (sysinfo->m_binary_format_version != m_binary_format_version)
252 if (sysinfo->m_model_data_version != m_model_data_version)
258 bool UserTableInfo::make_conform(const SystemTableInfo * sysinfo) {
259 m_binary_format_version = sysinfo->m_binary_format_version;
260 m_model_data_version = sysinfo->m_model_data_version;