summaryrefslogtreecommitdiffstats
path: root/utils/utils_helper.h
diff options
context:
space:
mode:
Diffstat (limited to 'utils/utils_helper.h')
-rw-r--r--utils/utils_helper.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/utils/utils_helper.h b/utils/utils_helper.h
new file mode 100644
index 0000000..b91067b
--- /dev/null
+++ b/utils/utils_helper.h
@@ -0,0 +1,147 @@
+/*
+ * libpinyin
+ * Library to deal with pinyin.
+ *
+ * Copyright (C) 2012 Peng Wu <alexepico@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef UTILS_HELPER_H
+#define UTILS_HELPER_H
+
+
+#define TAGLIB_GET_TOKEN(var, index) \
+ phrase_token_t var = null_token; \
+ { \
+ const char * string = (const char *) g_ptr_array_index \
+ (values, index); \
+ var = atoi(string); \
+ }
+
+#define TAGLIB_GET_PHRASE_STRING(var, index) \
+ const char * var = NULL; \
+ { \
+ var = (const char *) g_ptr_array_index \
+ (values, index); \
+ }
+
+#define TAGLIB_GET_TAGVALUE(type, var, conv) \
+ type var; \
+ { \
+ gpointer value = NULL; \
+ assert(g_hash_table_lookup_extended \
+ (required, #var, NULL, &value)); \
+ var = conv((const char *)value); \
+ }
+
+#define TAGLIB_PARSE_SEGMENTED_LINE(phrase_index, var, line) \
+ phrase_token_t var = null_token; \
+ do { \
+ if (0 == strlen(line)) \
+ break; \
+ \
+ gchar ** strs = g_strsplit_set(line, " \t", 2); \
+ if (2 != g_strv_length(strs)) \
+ assert(false); \
+ \
+ phrase_token_t _token = atoi(strs[0]); \
+ const char * phrase = strs[1]; \
+ if (null_token != _token) \
+ assert(taglib_validate_token_with_string \
+ (phrase_index, _token, phrase)); \
+ \
+ var = _token; \
+ \
+ g_strfreev(strs); \
+ } while(false);
+
+
+static bool load_phrase_index(const pinyin_table_info_t * phrase_files,
+ FacadePhraseIndex * phrase_index) {
+ MemoryChunk * chunk = NULL;
+ for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) {
+ const pinyin_table_info_t * table_info = phrase_files + i;
+
+ if (SYSTEM_FILE != table_info->m_file_type)
+ continue;
+
+ const char * binfile = table_info->m_system_filename;
+
+ chunk = new MemoryChunk;
+ bool retval = chunk->load(binfile);
+ if (!retval) {
+ fprintf(stderr, "load %s failed!\n", binfile);
+ delete chunk;
+ return false;
+ }
+
+ phrase_index->load(i, chunk);
+ }
+ return true;
+}
+
+static bool save_phrase_index(const pinyin_table_info_t * phrase_files,
+ FacadePhraseIndex * phrase_index) {
+ MemoryChunk * new_chunk = NULL;
+ for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) {
+ const pinyin_table_info_t * table_info = phrase_files + i;
+
+ if (SYSTEM_FILE != table_info->m_file_type)
+ continue;
+
+ const char * binfile = table_info->m_system_filename;
+
+ new_chunk = new MemoryChunk;
+ phrase_index->store(i, new_chunk);
+ bool retval = new_chunk->save(binfile);
+ if (!retval) {
+ fprintf(stderr, "save %s failed.", binfile);
+ delete new_chunk;
+ return false;
+ }
+
+ phrase_index->load(i, new_chunk);
+ }
+ return true;
+}
+
+static bool save_dictionary(const pinyin_table_info_t * phrase_files,
+ FacadePhraseIndex * phrase_index) {
+ MemoryChunk * new_chunk = NULL;
+ for (size_t i = 0; i < PHRASE_INDEX_LIBRARY_COUNT; ++i) {
+ const pinyin_table_info_t * table_info = phrase_files + i;
+
+ if (DICTIONARY != table_info->m_file_type)
+ continue;
+
+ const char * binfile = table_info->m_system_filename;
+
+ new_chunk = new MemoryChunk;
+ phrase_index->store(i, new_chunk);
+ bool retval = new_chunk->save(binfile);
+ if (!retval) {
+ fprintf(stderr, "save %s failed.", binfile);
+ delete new_chunk;
+ return false;
+ }
+
+ phrase_index->load(i, new_chunk);
+ }
+ return true;
+}
+
+#endif