From 2d95bd0b12e5c977f1f4cb69ad3b5dc881a318ec Mon Sep 17 00:00:00 2001 From: Cong Gu Date: Sun, 25 Sep 2016 01:13:43 -0500 Subject: [PATCH 1/3] specify dictionary order by -u switches or ~/.sdcv_ordering --- src/sdcv.cpp | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/sdcv.cpp b/src/sdcv.cpp index 31136bf..17c109e 100644 --- a/src/sdcv.cpp +++ b/src/sdcv.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -151,6 +152,7 @@ int main(int argc, char *argv[]) try { } std::list disable_list; + std::list order_list, bookname_list; if (use_dict_list) { std::list empty_list; @@ -167,6 +169,35 @@ int main(int argc, char *argv[]) try { return; disable_list.push_back(dict_info.ifo_file_name); }); + + // add bookname to list + gchar **p = get_impl(use_dict_list); + while (*p) { + bookname_list.push_back(*p); + ++p; + } + } else { + FILE *ordering_file; + char bookname[1024]; + if ((ordering_file = fopen((std::string(homedir)+G_DIR_SEPARATOR+".sdcv_ordering").c_str(), "r"))) { + while (fgets(bookname, 1023, ordering_file)) + bookname_list.push_back(bookname); + fclose(ordering_file); + } + } + + // translation from bookname to filename + for (std::list::const_iterator bookname=bookname_list.begin(); + bookname!=bookname_list.end(); ++bookname) { + std::list empty_list; + for_each_file(dicts_dir_list, ".ifo", empty_list, empty_list, + [&order_list, &bookname](const std::string &filename, bool) -> void { + DictInfo dict_info; + if (dict_info.load_from_ifo_file(filename, false) && + bookname->compare(0, dict_info.bookname.size(), dict_info.bookname) == 0 && + std::find(order_list.begin(), order_list.end(), filename)==order_list.end()) + order_list.push_back(filename); + }); } const std::string conf_dir = std::string(g_get_home_dir()) + G_DIR_SEPARATOR + ".stardict"; @@ -174,8 +205,7 @@ int main(int argc, char *argv[]) try { fprintf(stderr, _("g_mkdir failed: %s\n"), strerror(errno)); Library lib(utf8_input, utf8_output, colorize); - std::list empty_list; - lib.load(dicts_dir_list, empty_list, disable_list); + lib.load(dicts_dir_list, order_list, disable_list); std::unique_ptr io(create_readline_object()); if (optind < argc) { From 97b13e6702e4f41532fbaf1ea9c9ec3d394e1cdf Mon Sep 17 00:00:00 2001 From: "Evgeniy A. Dushistov" Date: Sat, 22 Apr 2017 20:52:18 +0300 Subject: [PATCH 2/3] remove not used code --- src/stardict_lib.cpp | 27 --------------------------- src/stardict_lib.hpp | 4 ---- 2 files changed, 31 deletions(-) diff --git a/src/stardict_lib.cpp b/src/stardict_lib.cpp index b7aa60b..89cdef7 100644 --- a/src/stardict_lib.cpp +++ b/src/stardict_lib.cpp @@ -909,33 +909,6 @@ void Libs::load(const std::list& dicts_dirs, }); } -void Libs::reload(const std::list& dicts_dirs, - const std::list& order_list, - const std::list& disable_list) -{ - std::vector prev(oLib); - oLib.clear(); - - for_each_file(dicts_dirs, ".ifo", order_list, disable_list, - [&prev, this](const std::string& url, bool disable) -> void { - if (!disable) { - auto it = prev.begin(); - for (; it != prev.end(); ++it) - if ((*it)->ifofilename() == url) - break; - if (it != prev.end()) { - Dict *res = *it; - prev.erase(it); - oLib.push_back(res); - } else - load_dict(url); - } - }); - - for (Dict *p : prev) - delete p; -} - const gchar *Libs::poGetCurrentWord(glong * iCurrent) { const gchar *poCurrentWord = nullptr; diff --git a/src/stardict_lib.hpp b/src/stardict_lib.hpp index eea7627..cb85730 100644 --- a/src/stardict_lib.hpp +++ b/src/stardict_lib.hpp @@ -139,10 +139,6 @@ public: void load(const std::list& dicts_dirs, const std::list& order_list, const std::list& disable_list); - void reload(const std::list& dicts_dirs, - const std::list& order_list, - const std::list& disable_list); - glong narticles(int idict) const { return oLib[idict]->narticles(); } const std::string& dict_name(int idict) const { return oLib[idict]->dict_name(); } gint ndicts() const { return oLib.size(); } From 1667de0650a574db580d4561e74f8ae9cbaa5a01 Mon Sep 17 00:00:00 2001 From: "Evgeniy A. Dushistov" Date: Sat, 22 Apr 2017 21:23:00 +0300 Subject: [PATCH 3/3] cleanups for specify "dictionary order by" --- src/readline.cpp | 21 +++++----- src/readline.hpp | 2 +- src/sdcv.cpp | 106 ++++++++++++++++++++++++----------------------- 3 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/readline.cpp b/src/readline.cpp index 6b942be..22c8091 100644 --- a/src/readline.cpp +++ b/src/readline.cpp @@ -34,18 +34,19 @@ #include "readline.hpp" +bool stdio_getline(FILE *in, std::string & str) +{ + assert(in != nullptr); + str.clear(); + int ch; + while ((ch=fgetc(in)) != EOF && ch != '\n') + str += ch; + + return EOF != ch; +} + #ifndef WITH_READLINE namespace { - static bool stdio_getline(FILE *in, std::string & str) - { - str.clear(); - int ch; - while ((ch=fgetc(in)) != EOF && ch != '\n') - str += ch; - - return EOF != ch; - } - class dummy_readline : public IReadLine { public: bool read(const string& banner, string& line) override { diff --git a/src/readline.hpp b/src/readline.hpp index 4f46b46..b418f2b 100644 --- a/src/readline.hpp +++ b/src/readline.hpp @@ -11,4 +11,4 @@ public: extern std::string sdcv_readline; extern IReadLine *create_readline_object(); - +extern bool stdio_getline(FILE *in, std::string &str); diff --git a/src/sdcv.cpp b/src/sdcv.cpp index 17c109e..870555f 100644 --- a/src/sdcv.cpp +++ b/src/sdcv.cpp @@ -1,4 +1,4 @@ -/* +/* * This file part of sdcv - console version of Stardict program * http://sdcv.sourceforge.net * Copyright (C) 2003-2006 Evgeniy @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -55,9 +56,11 @@ static void free_str_array(gchar **arr) } namespace glib { -typedef ResourceWrapper StrArr; + using StrArr = ResourceWrapper; } +static void list_dicts(const std::list &dicts_dir_list); + int main(int argc, char *argv[]) try { setlocale(LC_ALL, ""); #if ENABLE_NLS @@ -96,7 +99,7 @@ int main(int argc, char *argv[]) try { _("path/to/dir") }, { "color", 'c', 0, G_OPTION_ARG_NONE, &colorize, _("colorize the output"), nullptr }, - { nullptr }, + {}, }; glib::Error error; @@ -137,72 +140,57 @@ int main(int argc, char *argv[]) try { }; if (show_list_dicts) { - printf(_("Dictionary's name Word count\n")); - std::list order_list, disable_list; - for_each_file(dicts_dir_list, ".ifo", order_list, - disable_list, [](const std::string &filename, bool) -> void { - DictInfo dict_info; - if (dict_info.load_from_ifo_file(filename, false)) { - const std::string bookname = utf8_to_locale_ign_err(dict_info.bookname); - printf("%s %d\n", bookname.c_str(), dict_info.wordcount); - } - }); - + list_dicts(dicts_dir_list); return EXIT_SUCCESS; } std::list disable_list; - std::list order_list, bookname_list; + std::map bookname_to_ifo; + for_each_file(dicts_dir_list, ".ifo", std::list(), std::list(), + [&bookname_to_ifo](const std::string &fname, bool) { + DictInfo dict_info; + const bool load_ok = dict_info.load_from_ifo_file(fname, false); + if (!load_ok) + return; + bookname_to_ifo[dict_info.bookname] = dict_info.ifo_file_name; + }); + + std::list order_list; if (use_dict_list) { - std::list empty_list; - - for_each_file(dicts_dir_list, ".ifo", empty_list, empty_list, - [&disable_list, &use_dict_list](const std::string &filename, bool) -> void { - DictInfo dict_info; - const bool load_ok = dict_info.load_from_ifo_file(filename, false); - if (!load_ok) - return; - - for (gchar **p = get_impl(use_dict_list); *p != nullptr; ++p) - if (strcmp(*p, dict_info.bookname.c_str()) == 0) - return; - disable_list.push_back(dict_info.ifo_file_name); - }); + for (auto &&x : bookname_to_ifo) { + gchar **p = get_impl(use_dict_list); + for (; *p != nullptr; ++p) + if (x.first.compare(*p) == 0) { + break; + } + if (*p == nullptr) { + disable_list.push_back(x.second); + } + } // add bookname to list gchar **p = get_impl(use_dict_list); while (*p) { - bookname_list.push_back(*p); + order_list.push_back(bookname_to_ifo.at(*p)); ++p; } } else { - FILE *ordering_file; - char bookname[1024]; - if ((ordering_file = fopen((std::string(homedir)+G_DIR_SEPARATOR+".sdcv_ordering").c_str(), "r"))) { - while (fgets(bookname, 1023, ordering_file)) - bookname_list.push_back(bookname); + const std::string odering_cfg_file = std::string(homedir) + G_DIR_SEPARATOR_S ".sdcv_ordering"; + FILE *ordering_file = fopen(odering_cfg_file.c_str(), "r"); + if (ordering_file != nullptr) { + std::string line; + while (stdio_getline(ordering_file, line)) { + order_list.push_back(bookname_to_ifo.at(line)); + } fclose(ordering_file); } } - // translation from bookname to filename - for (std::list::const_iterator bookname=bookname_list.begin(); - bookname!=bookname_list.end(); ++bookname) { - std::list empty_list; - for_each_file(dicts_dir_list, ".ifo", empty_list, empty_list, - [&order_list, &bookname](const std::string &filename, bool) -> void { - DictInfo dict_info; - if (dict_info.load_from_ifo_file(filename, false) && - bookname->compare(0, dict_info.bookname.size(), dict_info.bookname) == 0 && - std::find(order_list.begin(), order_list.end(), filename)==order_list.end()) - order_list.push_back(filename); - }); - } - const std::string conf_dir = std::string(g_get_home_dir()) + G_DIR_SEPARATOR + ".stardict"; - if (g_mkdir(conf_dir.c_str(), S_IRWXU) == -1 && errno != EEXIST) + if (g_mkdir(conf_dir.c_str(), S_IRWXU) == -1 && errno != EEXIST) { fprintf(stderr, _("g_mkdir failed: %s\n"), strerror(errno)); + } Library lib(utf8_input, utf8_output, colorize); lib.load(dicts_dir_list, order_list, disable_list); @@ -210,8 +198,9 @@ int main(int argc, char *argv[]) try { std::unique_ptr io(create_readline_object()); if (optind < argc) { for (int i = optind; i < argc; ++i) - if (!lib.process_phrase(argv[i], *io, non_interactive)) + if (!lib.process_phrase(argv[i], *io, non_interactive)) { return EXIT_FAILURE; + } } else if (!non_interactive) { std::string phrase; @@ -230,3 +219,18 @@ int main(int argc, char *argv[]) try { fprintf(stderr, "Internal error: %s\n", ex.what()); exit(EXIT_FAILURE); } + +static void list_dicts(const std::list &dicts_dir_list) +{ + printf(_("Dictionary's name Word count\n")); + std::list order_list, disable_list; + for_each_file(dicts_dir_list, ".ifo", order_list, + disable_list, [](const std::string &filename, bool) -> void { + DictInfo dict_info; + if (dict_info.load_from_ifo_file(filename, false)) { + const std::string bookname = utf8_to_locale_ign_err(dict_info.bookname); + printf("%s %d\n", bookname.c_str(), dict_info.wordcount); + } + }); + +}