| 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 { |