519 lines
16 KiB
Text
519 lines
16 KiB
Text
diff --git a/Android.mk b/Android.mk
|
|
index 9da2083..9d5fc12 100644
|
|
--- a/Android.mk
|
|
+++ b/Android.mk
|
|
@@ -16,11 +16,9 @@ LOCAL_PATH := $(call my-dir)
|
|
|
|
include $(CLEAR_VARS)
|
|
|
|
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/lib/marisa
|
|
-LOCAL_CFLAGS += -fexceptions
|
|
-LOCAL_CPP_EXTENSION := .cc
|
|
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/lib/marisa external/stlport
|
|
|
|
-LOCAL_NDK_STL_VARIANT := gnustl_static
|
|
+LOCAL_CPP_EXTENSION := .cc
|
|
|
|
LOCAL_SRC_FILES := lib/marisa/base.cc \
|
|
lib/marisa/intvector.cc \
|
|
@@ -36,7 +34,7 @@ LOCAL_SRC_FILES := lib/marisa/base.cc \
|
|
lib/marisa/writer.cc
|
|
|
|
LOCAL_MODULE := libmarisa-trie
|
|
+LOCAL_MODULE_TAGS := optional
|
|
|
|
-LOCAL_SDK_VERSION := 14
|
|
-
|
|
+include external/stlport/libstlport.mk
|
|
include $(BUILD_STATIC_LIBRARY)
|
|
diff --git a/lib/marisa/base.h b/lib/marisa/base.h
|
|
index c2b2b07..731b24a 100644
|
|
--- a/lib/marisa/base.h
|
|
+++ b/lib/marisa/base.h
|
|
@@ -13,6 +13,10 @@
|
|
#include <stddef.h>
|
|
#endif // __cplusplus
|
|
|
|
+#if defined(__ANDROID__)
|
|
+#include <android/log.h>
|
|
+#endif // __ANDROID__
|
|
+
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
@@ -183,8 +187,22 @@ class Exception {
|
|
};
|
|
|
|
// MARISA_THROW adds a filename and a line number to an exception.
|
|
+#if !defined(__ANDROID__)
|
|
#define MARISA_THROW(status) \
|
|
(throw Exception(__FILE__, __LINE__, status))
|
|
+#else
|
|
+
|
|
+inline int android_log_exception(int status) {
|
|
+ char tmpbuf[100];
|
|
+ snprintf(tmpbuf, sizeof(tmpbuf), "marisa exception: %d", status);
|
|
+ __android_log_write(ANDROID_LOG_ERROR, "marisa-trie", tmpbuf);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+#define MARISA_THROW(status) \
|
|
+ (android_log_exception(status))
|
|
+
|
|
+#endif // __ANDROID__
|
|
|
|
// MARISA_THROW_IF throws an exception with `status' if `cond' is true.
|
|
#define MARISA_THROW_IF(cond, status) \
|
|
diff --git a/lib/marisa/reader.cc b/lib/marisa/reader.cc
|
|
index 6ecc797..df144ef 100644
|
|
--- a/lib/marisa/reader.cc
|
|
+++ b/lib/marisa/reader.cc
|
|
@@ -80,11 +80,7 @@ void Reader::read_data(void *buf, std::size_t size) {
|
|
MARISA_THROW(MARISA_IO_ERROR);
|
|
}
|
|
} else if (stream_ != NULL) {
|
|
- try {
|
|
- if (!stream_->read(static_cast<char *>(buf), size)) {
|
|
- MARISA_THROW(MARISA_IO_ERROR);
|
|
- }
|
|
- } catch (const std::ios_base::failure &) {
|
|
+ if (!stream_->read(static_cast<char *>(buf), size)) {
|
|
MARISA_THROW(MARISA_IO_ERROR);
|
|
}
|
|
} else {
|
|
diff --git a/lib/marisa/trie-build.cc b/lib/marisa/trie-build.cc
|
|
index 4421432..fb7f072 100644
|
|
--- a/lib/marisa/trie-build.cc
|
|
+++ b/lib/marisa/trie-build.cc
|
|
@@ -63,15 +63,9 @@ void Trie::build_trie(Vector<Key<String> > &keys,
|
|
build_trie(keys, static_cast<UInt32 *>(NULL), flags);
|
|
return;
|
|
}
|
|
- try {
|
|
- std::vector<UInt32> temp_key_ids(keys.size());
|
|
- build_trie(keys, temp_key_ids.empty() ? NULL : &temp_key_ids[0], flags);
|
|
- key_ids->swap(temp_key_ids);
|
|
- } catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
- } catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
- }
|
|
+ std::vector<UInt32> temp_key_ids(keys.size());
|
|
+ build_trie(keys, temp_key_ids.empty() ? NULL : &temp_key_ids[0], flags);
|
|
+ key_ids->swap(temp_key_ids);
|
|
}
|
|
|
|
void Trie::build_trie(Vector<Key<String> > &keys,
|
|
@@ -168,7 +162,7 @@ void Trie::build_trie(Vector<Key<T> > &keys,
|
|
|
|
template <typename T>
|
|
void Trie::build_cur(Vector<Key<T> > &keys,
|
|
- Vector<UInt32> *terminals, Progress &progress) try {
|
|
+ Vector<UInt32> *terminals, Progress &progress) {
|
|
num_keys_ = sort_keys(keys);
|
|
louds_.push_back(true);
|
|
louds_.push_back(false);
|
|
@@ -261,10 +255,6 @@ void Trie::build_cur(Vector<Key<T> > &keys,
|
|
|
|
build_terminals(keys, terminals);
|
|
keys.swap(&rest_keys);
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
void Trie::build_next(Vector<Key<String> > &keys,
|
|
diff --git a/lib/marisa/trie-c.cc b/lib/marisa/trie-c.cc
|
|
index 00ebe80..9e11405 100644
|
|
--- a/lib/marisa/trie-c.cc
|
|
+++ b/lib/marisa/trie-c.cc
|
|
@@ -79,106 +79,88 @@ marisa_status marisa_end(marisa_trie *h) {
|
|
|
|
marisa_status marisa_build(marisa_trie *h, const char * const *keys,
|
|
size_t num_keys, const size_t *key_lengths, const double *key_weights,
|
|
- marisa_uint32 *key_ids, int flags) try {
|
|
+ marisa_uint32 *key_ids, int flags) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.build(keys, num_keys, key_lengths, key_weights, key_ids, flags);
|
|
h->mapper.clear();
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_mmap(marisa_trie *h, const char *filename,
|
|
- long offset, int whence) try {
|
|
+ long offset, int whence) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.mmap(&h->mapper, filename, offset, whence);
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
-marisa_status marisa_map(marisa_trie *h, const void *ptr, size_t size) try {
|
|
+marisa_status marisa_map(marisa_trie *h, const void *ptr, size_t size) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.map(ptr, size);
|
|
h->mapper.clear();
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_load(marisa_trie *h, const char *filename,
|
|
- long offset, int whence) try {
|
|
+ long offset, int whence) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.load(filename, offset, whence);
|
|
h->mapper.clear();
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
-marisa_status marisa_fread(marisa_trie *h, FILE *file) try {
|
|
+marisa_status marisa_fread(marisa_trie *h, FILE *file) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.fread(file);
|
|
h->mapper.clear();
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
-marisa_status marisa_read(marisa_trie *h, int fd) try {
|
|
+marisa_status marisa_read(marisa_trie *h, int fd) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.read(fd);
|
|
h->mapper.clear();
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_save(const marisa_trie *h, const char *filename,
|
|
- int trunc_flag, long offset, int whence) try {
|
|
+ int trunc_flag, long offset, int whence) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.save(filename, trunc_flag != 0, offset, whence);
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
-marisa_status marisa_fwrite(const marisa_trie *h, FILE *file) try {
|
|
+marisa_status marisa_fwrite(const marisa_trie *h, FILE *file) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.fwrite(file);
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
-marisa_status marisa_write(const marisa_trie *h, int fd) try {
|
|
+marisa_status marisa_write(const marisa_trie *h, int fd) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
}
|
|
h->trie.write(fd);
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_restore(const marisa_trie *h, marisa_uint32 key_id,
|
|
- char *key_buf, size_t key_buf_size, size_t *key_length) try {
|
|
+ char *key_buf, size_t key_buf_size, size_t *key_length) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (key_length == NULL) {
|
|
@@ -186,12 +168,10 @@ marisa_status marisa_restore(const marisa_trie *h, marisa_uint32 key_id,
|
|
}
|
|
*key_length = h->trie.restore(key_id, key_buf, key_buf_size);
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_lookup(const marisa_trie *h,
|
|
- const char *ptr, size_t length, marisa_uint32 *key_id) try {
|
|
+ const char *ptr, size_t length, marisa_uint32 *key_id) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (key_id == NULL) {
|
|
@@ -203,14 +183,12 @@ marisa_status marisa_lookup(const marisa_trie *h,
|
|
*key_id = h->trie.lookup(ptr, length);
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_find(const marisa_trie *h,
|
|
const char *ptr, size_t length,
|
|
marisa_uint32 *key_ids, size_t *key_lengths,
|
|
- size_t max_num_results, size_t *num_results) try {
|
|
+ size_t max_num_results, size_t *num_results) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (num_results == NULL) {
|
|
@@ -223,8 +201,6 @@ marisa_status marisa_find(const marisa_trie *h,
|
|
key_ids, key_lengths, max_num_results);
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_find_first(const marisa_trie *h,
|
|
@@ -262,7 +238,7 @@ marisa_status marisa_find_last(const marisa_trie *h,
|
|
marisa_status marisa_find_callback(const marisa_trie *h,
|
|
const char *ptr, size_t length,
|
|
int (*callback)(void *, marisa_uint32, size_t),
|
|
- void *first_arg_to_callback) try {
|
|
+ void *first_arg_to_callback) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (callback == NULL) {
|
|
@@ -276,8 +252,6 @@ marisa_status marisa_find_callback(const marisa_trie *h,
|
|
::FindCallback(callback, first_arg_to_callback));
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_predict(const marisa_trie *h,
|
|
@@ -289,7 +263,7 @@ marisa_status marisa_predict(const marisa_trie *h,
|
|
|
|
marisa_status marisa_predict_breadth_first(const marisa_trie *h,
|
|
const char *ptr, size_t length, marisa_uint32 *key_ids,
|
|
- size_t max_num_results, size_t *num_results) try {
|
|
+ size_t max_num_results, size_t *num_results) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (num_results == NULL) {
|
|
@@ -303,13 +277,11 @@ marisa_status marisa_predict_breadth_first(const marisa_trie *h,
|
|
ptr, length, key_ids, NULL, max_num_results);
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_predict_depth_first(const marisa_trie *h,
|
|
const char *ptr, size_t length, marisa_uint32 *key_ids,
|
|
- size_t max_num_results, size_t *num_results) try {
|
|
+ size_t max_num_results, size_t *num_results) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (num_results == NULL) {
|
|
@@ -323,14 +295,12 @@ marisa_status marisa_predict_depth_first(const marisa_trie *h,
|
|
ptr, length, key_ids, NULL, max_num_results);
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
marisa_status marisa_predict_callback(const marisa_trie *h,
|
|
const char *ptr, size_t length,
|
|
int (*callback)(void *, marisa_uint32, const char *, size_t),
|
|
- void *first_arg_to_callback) try {
|
|
+ void *first_arg_to_callback) {
|
|
if (h == NULL) {
|
|
return MARISA_HANDLE_ERROR;
|
|
} else if (callback == NULL) {
|
|
@@ -344,8 +314,6 @@ marisa_status marisa_predict_callback(const marisa_trie *h,
|
|
::PredictCallback(callback, first_arg_to_callback));
|
|
}
|
|
return MARISA_OK;
|
|
-} catch (const marisa::Exception &ex) {
|
|
- return ex.status();
|
|
}
|
|
|
|
size_t marisa_get_num_tries(const marisa_trie *h) {
|
|
diff --git a/lib/marisa/trie-inline.h b/lib/marisa/trie-inline.h
|
|
index 6b1e502..2c9218c 100644
|
|
--- a/lib/marisa/trie-inline.h
|
|
+++ b/lib/marisa/trie-inline.h
|
|
@@ -179,7 +179,7 @@ inline bool Trie::find_child(UInt32 &node, T query,
|
|
}
|
|
|
|
template <typename T, typename U>
|
|
-std::size_t Trie::find_callback_(T query, U callback) const try {
|
|
+std::size_t Trie::find_callback_(T query, U callback) const {
|
|
std::size_t count = 0;
|
|
UInt32 node = 0;
|
|
std::size_t pos = 0;
|
|
@@ -192,10 +192,6 @@ std::size_t Trie::find_callback_(T query, U callback) const try {
|
|
}
|
|
} while (!query.ends_at(pos) && find_child<T>(node, query, pos));
|
|
return count;
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
template <typename T>
|
|
@@ -235,7 +231,7 @@ inline bool Trie::predict_child(UInt32 &node, T query, std::size_t &pos,
|
|
}
|
|
|
|
template <typename T, typename U>
|
|
-std::size_t Trie::predict_callback_(T query, U callback) const try {
|
|
+std::size_t Trie::predict_callback_(T query, U callback) const {
|
|
std::string key;
|
|
UInt32 node = 0;
|
|
std::size_t pos = 0;
|
|
@@ -299,10 +295,6 @@ std::size_t Trie::predict_callback_(T query, U callback) const try {
|
|
++stack_pos;
|
|
}
|
|
return count;
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
inline UInt32 Trie::key_id_to_node(UInt32 key_id) const {
|
|
diff --git a/lib/marisa/trie-search.cc b/lib/marisa/trie-search.cc
|
|
index 1f35681..098e0b3 100644
|
|
--- a/lib/marisa/trie-search.cc
|
|
+++ b/lib/marisa/trie-search.cc
|
|
@@ -247,30 +247,22 @@ std::size_t Trie::predict_depth_first(
|
|
|
|
void Trie::restore_(UInt32 key_id, std::string *key) const {
|
|
const std::size_t start_pos = key->length();
|
|
- try {
|
|
- UInt32 node = key_id_to_node(key_id);
|
|
- while (node != 0) {
|
|
- if (has_link(node)) {
|
|
- const std::size_t prev_pos = key->length();
|
|
- if (has_trie()) {
|
|
- trie_->trie_restore(get_link(node), key);
|
|
- } else {
|
|
- tail_restore(node, key);
|
|
- }
|
|
- std::reverse(key->begin() + prev_pos, key->end());
|
|
+ UInt32 node = key_id_to_node(key_id);
|
|
+ while (node != 0) {
|
|
+ if (has_link(node)) {
|
|
+ const std::size_t prev_pos = key->length();
|
|
+ if (has_trie()) {
|
|
+ trie_->trie_restore(get_link(node), key);
|
|
} else {
|
|
- *key += labels_[node];
|
|
+ tail_restore(node, key);
|
|
}
|
|
- node = get_parent(node);
|
|
- }
|
|
- std::reverse(key->begin() + start_pos, key->end());
|
|
- } catch (const std::bad_alloc &) {
|
|
- key->resize(start_pos);
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
- } catch (const std::length_error &) {
|
|
- key->resize(start_pos);
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
+ std::reverse(key->begin() + prev_pos, key->end());
|
|
+ } else {
|
|
+ *key += labels_[node];
|
|
+ }
|
|
+ node = get_parent(node);
|
|
}
|
|
+ std::reverse(key->begin() + start_pos, key->end());
|
|
}
|
|
|
|
void Trie::trie_restore(UInt32 node, std::string *key) const {
|
|
@@ -468,7 +460,7 @@ template std::size_t Trie::tail_match<const Query &>(UInt32 node,
|
|
|
|
template <typename T, typename U, typename V>
|
|
std::size_t Trie::find_(T query, U key_ids, V key_lengths,
|
|
- std::size_t max_num_results) const try {
|
|
+ std::size_t max_num_results) const {
|
|
if (max_num_results == 0) {
|
|
return 0;
|
|
}
|
|
@@ -489,10 +481,6 @@ std::size_t Trie::find_(T query, U key_ids, V key_lengths,
|
|
}
|
|
} while (!query.ends_at(pos) && find_child<T>(node, query, pos));
|
|
return count;
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
template <typename T>
|
|
@@ -533,7 +521,7 @@ UInt32 Trie::find_last_(T query, std::size_t *key_length) const {
|
|
|
|
template <typename T, typename U, typename V>
|
|
std::size_t Trie::predict_breadth_first_(T query, U key_ids, V keys,
|
|
- std::size_t max_num_results) const try {
|
|
+ std::size_t max_num_results) const {
|
|
if (max_num_results == 0) {
|
|
return 0;
|
|
}
|
|
@@ -596,15 +584,11 @@ std::size_t Trie::predict_breadth_first_(T query, U key_ids, V keys,
|
|
node_end = louds_pos_to_node(get_child(node_end), node_end);
|
|
}
|
|
return count;
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
template <typename T, typename U, typename V>
|
|
std::size_t Trie::predict_depth_first_(T query, U key_ids, V keys,
|
|
- std::size_t max_num_results) const try {
|
|
+ std::size_t max_num_results) const {
|
|
if (max_num_results == 0) {
|
|
return 0;
|
|
} else if (keys.is_valid()) {
|
|
@@ -665,10 +649,6 @@ std::size_t Trie::predict_depth_first_(T query, U key_ids, V keys,
|
|
++stack_pos;
|
|
}
|
|
return count;
|
|
-} catch (const std::bad_alloc &) {
|
|
- MARISA_THROW(MARISA_MEMORY_ERROR);
|
|
-} catch (const std::length_error &) {
|
|
- MARISA_THROW(MARISA_SIZE_ERROR);
|
|
}
|
|
|
|
template <typename T>
|
|
diff --git a/lib/marisa/writer.cc b/lib/marisa/writer.cc
|
|
index 2256f59..55dcb97 100644
|
|
--- a/lib/marisa/writer.cc
|
|
+++ b/lib/marisa/writer.cc
|
|
@@ -92,11 +92,7 @@ void Writer::write_data(const void *data, std::size_t size) {
|
|
MARISA_THROW(MARISA_IO_ERROR);
|
|
}
|
|
} else if (stream_ != NULL) {
|
|
- try {
|
|
- if (!stream_->write(static_cast<const char *>(data), size)) {
|
|
- MARISA_THROW(MARISA_IO_ERROR);
|
|
- }
|
|
- } catch (const std::ios_base::failure &) {
|
|
+ if (!stream_->write(static_cast<const char *>(data), size)) {
|
|
MARISA_THROW(MARISA_IO_ERROR);
|
|
}
|
|
} else {
|