summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-text/sdcv/files/sdcv-synonyms-bin-search.patch')
-rw-r--r--app-text/sdcv/files/sdcv-synonyms-bin-search.patch112
1 files changed, 0 insertions, 112 deletions
diff --git a/app-text/sdcv/files/sdcv-synonyms-bin-search.patch b/app-text/sdcv/files/sdcv-synonyms-bin-search.patch
deleted file mode 100644
index e3583b1a5fb6..000000000000
--- a/app-text/sdcv/files/sdcv-synonyms-bin-search.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-ommit 4ae420734990ab9f5ccc038262368256b9323f4a
-Merge: b66799f 994c1c7
-Author: Evgeniy Dushistov <dushistov@mail.ru>
-Date: Wed Dec 23 04:30:13 2020 +0300
-
- Merge pull request #67 from doozan/master
-
- Use binary search for synonyms, fixes #31
-
-diff --git a/src/stardict_lib.cpp b/src/stardict_lib.cpp
-index 0af4304..6b1f92b 100644
---- a/src/stardict_lib.cpp
-+++ b/src/stardict_lib.cpp
-@@ -833,21 +833,23 @@ bool SynFile::load(const std::string &url, gulong wc)
- {
- struct stat stat_buf;
- if (!stat(url.c_str(), &stat_buf)) {
-- MapFile syn;
-- if (!syn.open(url.c_str(), stat_buf.st_size))
-+
-+ if (!synfile.open(url.c_str(), stat_buf.st_size))
- return false;
-- const gchar *current = syn.begin();
-+
-+ synlist.resize(wc + 1);
-+ gchar *p1 = synfile.begin();
-+
- for (unsigned long i = 0; i < wc; i++) {
- // each entry in a syn-file is:
- // - 0-terminated string
- // 4-byte index into .dict file in network byte order
-- glib::CharStr lower_string{ g_utf8_casefold(current, -1) };
-- std::string synonym{ get_impl(lower_string) };
-- current += synonym.length() + 1;
-- const guint32 idx = g_ntohl(get_uint32(current));
-- current += sizeof(idx);
-- synonyms[synonym] = idx;
-+
-+ synlist[i] = p1;
-+ p1 += strlen(p1) + 1 + 4;
- }
-+ synlist[wc] = p1;
-+
- return true;
- } else {
- return false;
-@@ -856,13 +858,38 @@ bool SynFile::load(const std::string &url, gulong wc)
-
- bool SynFile::lookup(const char *str, glong &idx)
- {
-- glib::CharStr lower_string{ g_utf8_casefold(str, -1) };
-- auto it = synonyms.find(get_impl(lower_string));
-- if (it != synonyms.end()) {
-- idx = it->second;
-- return true;
-+ bool bFound = false;
-+ glong iTo = synlist.size() - 2;
-+ if (iTo <0) return false;
-+
-+ if (stardict_strcmp(str, get_key(0)) < 0) {
-+ idx = 0;
-+ } else if (stardict_strcmp(str, get_key(iTo)) > 0) {
-+ idx = INVALID_INDEX;
-+ } else {
-+ glong iThisIndex = 0;
-+ glong iFrom = 0;
-+ gint cmpint;
-+ while (iFrom <= iTo) {
-+ iThisIndex = (iFrom + iTo) / 2;
-+ cmpint = stardict_strcmp(str, get_key(iThisIndex));
-+ if (cmpint > 0)
-+ iFrom = iThisIndex + 1;
-+ else if (cmpint < 0)
-+ iTo = iThisIndex - 1;
-+ else {
-+ bFound = true;
-+ break;
-+ }
-+ }
-+ if (!bFound)
-+ idx = iFrom; //next
-+ else {
-+ const gchar *key = get_key(iThisIndex);
-+ idx = g_ntohl(get_uint32(key+strlen(key)+1));
-+ }
- }
-- return false;
-+ return bFound;
- }
-
- bool Dict::Lookup(const char *str, glong &idx)
-diff --git a/src/stardict_lib.hpp b/src/stardict_lib.hpp
-index a629cbe..38f76f4 100644
---- a/src/stardict_lib.hpp
-+++ b/src/stardict_lib.hpp
-@@ -102,11 +102,15 @@ public:
- class SynFile
- {
- public:
-+ SynFile() {}
-+ ~SynFile() {}
- bool load(const std::string &url, gulong wc);
- bool lookup(const char *str, glong &idx);
-+ const gchar *get_key(glong idx) { return synlist[idx]; }
-
- private:
-- std::map<std::string, gulong> synonyms;
-+ MapFile synfile;
-+ std::vector<gchar *> synlist;
- };
-
- class Dict : public DictBase