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 #endif // __cplusplus +#if defined(__ANDROID__) +#include +#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(buf), size)) { - MARISA_THROW(MARISA_IO_ERROR); - } - } catch (const std::ios_base::failure &) { + if (!stream_->read(static_cast(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 > &keys, build_trie(keys, static_cast(NULL), flags); return; } - try { - std::vector 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 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 > &keys, @@ -168,7 +162,7 @@ void Trie::build_trie(Vector > &keys, template void Trie::build_cur(Vector > &keys, - Vector *terminals, Progress &progress) try { + Vector *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 > &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 > &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 -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(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 @@ -235,7 +231,7 @@ inline bool Trie::predict_child(UInt32 &node, T query, std::size_t &pos, } template -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(UInt32 node, template 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(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 @@ -533,7 +521,7 @@ UInt32 Trie::find_last_(T query, std::size_t *key_length) const { template 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 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 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(data), size)) { - MARISA_THROW(MARISA_IO_ERROR); - } - } catch (const std::ios_base::failure &) { + if (!stream_->write(static_cast(data), size)) { MARISA_THROW(MARISA_IO_ERROR); } } else {