From 72e74c1e331a040561ff04f5515b9cf787f7b9f8 Mon Sep 17 00:00:00 2001 From: hashirama Date: Sat, 18 May 2024 22:33:14 -0400 Subject: [PATCH] improve debugging 2/2 --- hakurei | Bin 0 -> 255600 bytes src/error.patch | 332 ++++++++++++++++++++++++++++++ src/hakurei.cpp | 325 +++++++++++++++++++++++++++++ src/{main.cc => hakurei.cpp.orig} | 0 src/hakurei.cpp.rej | 11 + 5 files changed, 668 insertions(+) create mode 100755 hakurei create mode 100644 src/error.patch create mode 100644 src/hakurei.cpp rename src/{main.cc => hakurei.cpp.orig} (100%) create mode 100644 src/hakurei.cpp.rej diff --git a/hakurei b/hakurei new file mode 100755 index 0000000000000000000000000000000000000000..f3df313438fd90b908a72b9624f263f33f8b8171 GIT binary patch literal 255600 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�$_uWvA&exj>z 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 literal 0 HcmV?d00001 diff --git a/src/error.patch b/src/error.patch new file mode 100644 index 0000000..15b458e --- /dev/null +++ b/src/error.patch @@ -0,0 +1,332 @@ +--- hakurei.cpp 2024-05-19 09:00:00.000000000 +0000 ++++ hakurei.cpp 2024-05-19 09:00:00.000000000 +0000 +@@ -2,6 +2,7 @@ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + struct Entry { + const std::string_view decoded_view; + const uint64_t id; + inline Entry(const std::string_view decoded_view, const uint64_t id) : decoded_view(decoded_view), id(id) {} + }; + + inline std::pair remove_one_utf8_char(const std::string& str) { + if (str.empty()) { + return {"", str}; + } + const size_t len = str.size(); + size_t i = 0; + while (i < len) { + const unsigned char c = str[i]; + if (c < 0x80) { + return {str.substr(i, 1), str.substr(i + 1)}; + } else if ((c >> 5) == 0x6) { + return {str.substr(i, 2), str.substr(i + 2)}; + } else if ((c >> 4) == 0xe) { + return {str.substr(i, 3), str.substr(i + 3)}; + } else if ((c >> 3) == 0x1e) { + return {str.substr(i, 4), str.substr(i + 4)}; + } + i++; + } + return {"", ""}; + } + + inline std::string get_input(const int argc, char* const argv[], const bool goldendict_mode) { + std::string search_string; + if (!isatty(fileno(stdin))) { + std::getline(std::cin, search_string); + } else { + if (goldendict_mode) { + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--sentence") == 0 && i + 1 < argc) { + search_string = argv[i + 1]; + break; + } + } + } else { + if (argc < 2) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + exit(1); + } + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--debug") == 0) { + // Handle debug mode + } else if (std::strcmp(argv[i], "--dict") == 0 && i + 1 < argc) { + i++; + } else { + search_string = argv[i]; + break; + } + } + } + } + if (search_string.empty()) { + std::cerr << "Search string not provided." << std::endl; + exit(1); + } + return search_string; + } + + inline std::filesystem::path find_dic_file() { + static const std::vector locations = { + std::filesystem::path("/usr/share/hakurei/"), + std::filesystem::path(std::getenv("HOME")) / ".local/share/hakurei/", + std::filesystem::current_path() + }; + for (const auto& location : locations) { + const auto dict_path = location / "dict.bin"; + if (std::filesystem::exists(dict_path) && std::filesystem::is_regular_file(dict_path)) { + return dict_path; + } + } + throw std::runtime_error("Couldn't find the word list."); + } + + inline void print_debug_info(const std::vector& substrings, const std::string& raw_output) { + std::cout << "Stored raw output:" << std::endl; + for (const auto& str : substrings) { + std::cout << str << std::endl; + } + std::cout << "Raw output:" << std::endl; + std::cout << raw_output << std::endl; + } + + void log_execution(const int argc, char* argv[], const std::string& search_string, const std::string& dict_file, bool debug_mode, bool goldendict_mode) { + std::ofstream log_file; + log_file.open("/tmp/hakurei.log", std::ios_base::app); + if (!log_file) { + std::cerr << "Failed to open log file." << std::endl; + return; + } + + std::time_t now = std::time(nullptr); + log_file << "Hakurei executed at " << std::ctime(&now); + log_file << "Command-line arguments:\n"; + for (int i = 0; i < argc; ++i) { + log_file << "argv[" << i << "]: " << argv[i] << "\n"; + } + log_file << "Parsed parameters:\n"; + log_file << "search_string: " << search_string << "\n"; + log_file << "dict_file: " << dict_file << "\n"; + log_file << "debug_mode: " << debug_mode << "\n"; + log_file << "goldendict_mode: " << goldendict_mode << "\n"; + + log_file.close(); + } + + void log_internal(const std::string& message) { + std::ofstream log_file; + log_file.open("/tmp/hakurei.log", std::ios_base::app); + if (!log_file) { + std::cerr << "Failed to open log file." << std::endl; + return; + } + std::time_t now = std::time(nullptr); + log_file << std::ctime(&now) << ": " << message << std::endl; + log_file.close(); + } + + inline void wrap_html_output( + const std::vector& substrings, + const std::map>& alternatives_map, + std::string& sentence + ) { + // Log the HTML output call + log_internal("HTML output is being called"); + + std::string output_html; + output_html += "
"; + + std::string sentence_copy = sentence; + + output_html += "
"; + + while (!sentence_copy.empty()) { + bool found = false; + for (const auto& substring : substrings) { + if (sentence_copy.rfind(substring, 0) == 0) { + output_html += "
" + substring + ""; + + auto alt_itr = alternatives_map.find(sentence_copy); + if (alt_itr != alternatives_map.end() && !alt_itr->second.empty()) { + output_html += "
    "; + for (const auto& alt : alt_itr->second) { + output_html += "
  • " + alt + "
  • "; + } + output_html += "
"; + } + + output_html += "
"; + output_html += ""; + sentence_copy.erase(0, substring.size()); + found = true; + break; + } + } + if (!found) { + output_html += sentence_copy[0]; + sentence_copy.erase(0, 1); + } + } + + output_html += "
"; + output_html += "
"; + + std::cout << output_html << std::endl; + } + + int main(const int argc, char* argv[]) { + bool debug_mode = false; + bool goldendict_mode = false; + std::string word, sentence; + std::string dict_file; + + log_internal("Program started"); + + try { + dict_file = find_dic_file().string(); + log_internal("Dictionary file located at: " + dict_file); + } catch (const std::exception& e) { + log_internal(std::string("Error: ") + e.what()); + std::cerr << "Error: " << e.what() << std::endl; + return 1; + } + + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--debug") == 0) { + debug_mode = true; + log_internal("Debug mode enabled"); + } else if (std::strcmp(argv[i], "--dict") == 0 && i + 1 < argc) { + dict_file = argv[i + 1]; + log_internal("Dictionary file set to: " + dict_file); + if (!std::filesystem::exists(dict_file)) { + log_internal("Error: Dictionary file not found at " + dict_file); + std::cerr << "Error: Dictionary file not found at " << dict_file << std::endl; + return 1; + } + i++; + } else if (std::strcmp(argv[i], "--goldendict") == 0) { + goldendict_mode = true; + log_internal("GoldenDict mode enabled"); + } else if (std::strcmp(argv[i], "--word") == 0 && i + 1 < argc) { + word = argv[i + 1]; + log_internal("Word set to: " + word); + i++; + } else if (std::strcmp(argv[i], "--sentence") == 0 && i + 1 < argc) { + sentence = argv[i + 1]; + log_internal("Sentence set to: " + sentence); + i++; + } + } + + std::string search_string; + try { + search_string = get_input(argc, argv, goldendict_mode); + log_internal("Search string: " + search_string); + } catch (const std::exception& e) { + log_internal(std::string("Error: ") + e.what()); + std::cerr << "Error: Failed to retrieve search string." << std::endl; + exit(1); + } + + if (goldendict_mode && !sentence.empty()) { + search_string = sentence; + log_internal("Search string overridden by sentence: " + search_string); + } + + log_execution(argc, argv, search_string, dict_file, debug_mode, goldendict_mode); + + xcdat::trie_15_type trie; + try { + trie = xcdat::load(dict_file); + log_internal("Trie loaded from dictionary file"); + } catch (const std::exception& e) { + log_internal(std::string("Error: Failed to load trie from dictionary file: ") + e.what()); + std::cerr << "Error: Failed to load trie from dictionary file." << std::endl; + return 1; + } + + std::vector substrings; + std::vector results; + std::map> alternatives_map; + + log_internal("Starting search loop with search string: " + search_string); + while (!search_string.empty()) { + auto itr = trie.make_prefix_iterator(search_string); + + while (itr.next()) { + results.emplace_back(itr.decoded_view(), itr.id()); + log_internal("Found result: " + std::string(itr.decoded_view())); + } + + if (!results.empty()) { + for (const auto& entry : results) { + const std::string substring(entry.decoded_view); + substrings.push_back(substring); + derived_map[substring].push_back(search_string); + alternatives_map[search_string].insert(substring); + log_internal("Substring added: " + substring); + if (!goldendict_mode) { + std::cout << substring << std::endl; + } + } + } + + const auto [removed_char, new_search_string] = remove_one_utf8_char(search_string); + log_internal("Removed character: " + removed_char); + + if (!removed_char.empty() && !goldendict_mode) { + std::cout << removed_char << std::endl; + } + + if (new_search_string == search_string) { + std::cerr << "Error: Search string did not change after removing a character. Exiting to prevent infinite loop." << std::endl; + log_internal("Error: Search string did not change after removing a character. Exiting to prevent infinite loop."); + break; + } + + search_string = new_search_string; + log_internal("New search string: " + search_string); + + if (debug_mode) { + std::cout << "After removing one character: " << search_string << std::endl; + raw_output += search_string + '\n'; + } + + results.clear(); + search_string.erase(0, search_string.find_first_not_of(" \t\n\r\f\v")); + } + + log_internal("Search loop ended"); + if (debug_mode) { + print_debug_info(substrings, raw_output); + } + + if (goldendict_mode) { + wrap_html_output(substrings, alternatives_map, sentence); + log_internal("HTML output wrapped"); + exit(0); + } + + log_internal("Program finished"); + return 0; + } diff --git a/src/hakurei.cpp b/src/hakurei.cpp new file mode 100644 index 0000000..66a32f8 --- /dev/null +++ b/src/hakurei.cpp @@ -0,0 +1,325 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct Entry { + const std::string_view decoded_view; + const uint64_t id; + inline Entry(const std::string_view decoded_view, const uint64_t id) : decoded_view(decoded_view), id(id) {} +}; + +inline std::pair remove_one_utf8_char(const std::string& str) { + if (str.empty()) { + return {"", str}; + } + const size_t len = str.size(); + size_t i = 0; + while (i < len) { + const unsigned char c = str[i]; + if (c < 0x80) { + return {str.substr(i, 1), str.substr(i + 1)}; + } else if ((c >> 5) == 0x6) { + return {str.substr(i, 2), str.substr(i + 2)}; + } else if ((c >> 4) == 0xe) { + return {str.substr(i, 3), str.substr(i + 3)}; + } else if ((c >> 3) == 0x1e) { + return {str.substr(i, 4), str.substr(i + 4)}; + } + i++; + } + return {"", ""}; +} + +inline std::string get_input(const int argc, char* const argv[], const bool goldendict_mode) { + std::string search_string; + if (!isatty(fileno(stdin))) { + std::getline(std::cin, search_string); + } else { + if (goldendict_mode) { + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--sentence") == 0 && i + 1 < argc) { + search_string = argv[i + 1]; + break; + } + } + } else { + if (argc < 2) { + std::cerr << "Usage: " << argv[0] << " " << std::endl; + exit(1); + } + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--debug") == 0) { + // Handle debug mode + } else if (std::strcmp(argv[i], "--dict") == 0 && i + 1 < argc) { + i++; + } else { + search_string = argv[i]; + break; + } + } + } + } + if (search_string.empty()) { + std::cerr << "Search string not provided." << std::endl; + exit(1); + } + return search_string; +} + +inline std::filesystem::path find_dic_file() { + static const std::vector locations = { + std::filesystem::path("/usr/share/hakurei/"), + std::filesystem::path(std::getenv("HOME")) / ".local/share/hakurei/", + std::filesystem::current_path() + }; + for (const auto& location : locations) { + const auto dict_path = location / "dict.bin"; + if (std::filesystem::exists(dict_path) && std::filesystem::is_regular_file(dict_path)) { + return dict_path; + } + } + throw std::runtime_error("Couldn't find the word list."); +} + +inline void print_debug_info(const std::vector& substrings, const std::string& raw_output) { + std::cout << "Stored raw output:" << std::endl; + for (const auto& str : substrings) { + std::cout << str << std::endl; + } + std::cout << "Raw output:" << std::endl; + std::cout << raw_output << std::endl; +} + + +void log_execution(const int argc, char* argv[], const std::string& search_string, const std::string& dict_file, bool debug_mode, bool goldendict_mode) { + std::ofstream log_file; + log_file.open("/tmp/hakurei.log", std::ios_base::app); + if (!log_file) { + std::cerr << "Failed to open log file." << std::endl; + return; + } + + std::time_t now = std::time(nullptr); + log_file << "Hakurei executed at " << std::ctime(&now); + log_file << "Command-line arguments:\n"; + for (int i = 0; i < argc; ++i) { + log_file << "argv[" << i << "]: " << argv[i] << "\n"; + } + log_file << "Parsed parameters:\n"; + log_file << "search_string: " << search_string << "\n"; + log_file << "dict_file: " << dict_file << "\n"; + log_file << "debug_mode: " << debug_mode << "\n"; + log_file << "goldendict_mode: " << goldendict_mode << "\n"; + + log_file.close(); +} + + +void log_internal(const std::string& message) { + std::ofstream log_file; + log_file.open("/tmp/hakurei.log", std::ios_base::app); + if (!log_file) { + std::cerr << "Failed to open log file." << std::endl; + return; + } + std::time_t now = std::time(nullptr); + log_file << std::ctime(&now) << ": " << message << std::endl; + log_file.close(); +} + + +inline void wrap_html_output( + const std::vector& substrings, + const std::map>& alternatives_map, + std::string& sentence + ) { + // Log the HTML output call + log_internal("HTML output is being called"); + + std::string output_html; + output_html += "
"; + + std::string sentence_copy = sentence; + + output_html += "
"; + + while (!sentence_copy.empty()) { + bool found = false; + for (const auto& substring : substrings) { + if (sentence_copy.rfind(substring, 0) == 0) { + output_html += "
" + substring + ""; + + auto alt_itr = alternatives_map.find(sentence_copy); + if (alt_itr != alternatives_map.end() && !alt_itr->second.empty()) { + output_html += "
    "; + for (const auto& alt : alt_itr->second) { + output_html += "
  • " + alt + "
  • "; + } + output_html += "
"; + } + + output_html += "
"; + output_html += ""; + + sentence_copy = sentence_copy.substr(substring.size()); + found = true; + break; + } + } + if (!found) { + const auto [removed_char, new_sentence_copy] = remove_one_utf8_char(sentence_copy); + if (removed_char.empty()) { + std::cerr << "Error: Unable to remove a character from the sentence. Exiting to prevent infinite loop." << std::endl; + break; + } + output_html += "
" + removed_char + "
"; + sentence_copy = new_sentence_copy; + } + } + + output_html += "
"; + output_html += "
"; + std::cout << output_html << std::endl; +} + + + +int main(const int argc, char* argv[]) { + + std::string dict_file = find_dic_file().string(); // Default dictionary file path + const auto trie = xcdat::load(dict_file); + log_internal("Trie loaded from dictionary file"); + + + bool debug_mode = false; + bool goldendict_mode = false; + std::string word, sentence; + + log_internal("Program started"); + + // Parse command line arguments + for (int i = 1; i < argc; ++i) { + if (std::strcmp(argv[i], "--debug") == 0) { + debug_mode = true; + log_internal("Debug mode enabled"); + } else if (std::strcmp(argv[i], "--dict") == 0 && i + 1 < argc) { + dict_file = argv[i + 1]; + log_internal("Dictionary file set to: " + dict_file); + i++; // Skip the next argument as it's the dictionary file path + } else if (std::strcmp(argv[i], "--goldendict") == 0) { + goldendict_mode = true; + log_internal("GoldenDict mode enabled"); + } else if (std::strcmp(argv[i], "--word") == 0 && i + 1 < argc) { + word = argv[i + 1]; + log_internal("Word set to: " + word); + i++; + } else if (std::strcmp(argv[i], "--sentence") == 0 && i + 1 < argc) { + sentence = argv[i + 1]; + log_internal("Sentence set to: " + sentence); + i++; + } + } + + std::string search_string = get_input(argc, argv, goldendict_mode); + log_internal("Search string: " + search_string); + if (goldendict_mode && !sentence.empty()) { + search_string = sentence; + log_internal("Search string overridden by sentence: " + search_string); + } + + // Log the execution details + log_execution(argc, argv, search_string, dict_file, debug_mode, goldendict_mode); + + std::string raw_output; + + std::vector substrings; + std::vector results; + std::map> derived_map; + std::map> alternatives_map; + + while (!search_string.empty()) { + auto itr = trie.make_prefix_iterator(search_string); + + while (itr.next()) { + results.emplace_back(itr.decoded_view(), itr.id()); + log_internal("Found result: " + std::string(itr.decoded_view())); + } + + // Add all substrings to the results + if (!results.empty()) { + for (const auto& entry : results) { + const std::string substring(entry.decoded_view); + substrings.push_back(substring); + derived_map[substring].push_back(search_string); + alternatives_map[search_string].insert(substring); + log_internal("Substring added: " + substring); + if (!goldendict_mode) { + std::cout << substring << std::endl; + } + } + } + + // Remove one UTF-8 character from the search string and get the removed character + const auto [removed_char, new_search_string] = remove_one_utf8_char(search_string); + log_internal("Removed character: " + removed_char); + + if (!removed_char.empty() && !goldendict_mode) { + std::cout << removed_char << std::endl; + } + + if (new_search_string == search_string) { + std::cerr << "Error: Search string did not change after removing a character. Exiting to prevent infinite loop." << std::endl; + log_internal("Error: Search string did not change after removing a character. Exiting to prevent infinite loop."); + break; + } + + search_string = new_search_string; + log_internal("New search string: " + search_string); + + // Print debug information if in debug mode + if (debug_mode) { + std::cout << "After removing one character: " << search_string << std::endl; + raw_output += search_string + '\n'; + } + + results.clear(); + + // Remove leading whitespace + search_string.erase(0, search_string.find_first_not_of(" \t\n\r\f\v")); + } + + // Print debug information if in debug mode + if (debug_mode) { + print_debug_info(substrings, raw_output); + } + + // Wrap the output in HTML format for GoldenDict if in GoldenDict mode + if (goldendict_mode) { + wrap_html_output(substrings, alternatives_map, sentence); + exit(0); + } + + log_internal("Program finished"); + return 0; +} diff --git a/src/main.cc b/src/hakurei.cpp.orig similarity index 100% rename from src/main.cc rename to src/hakurei.cpp.orig diff --git a/src/hakurei.cpp.rej b/src/hakurei.cpp.rej new file mode 100644 index 0000000..0831211 --- /dev/null +++ b/src/hakurei.cpp.rej @@ -0,0 +1,11 @@ +--- /dev/null ++++ /dev/null +@@ -144,7 +144,8 @@ + + int main(const int argc, char* argv[]) { + bool debug_mode = false; + bool goldendict_mode = false; + std::string word, sentence; ++ std::string dict_file; + + log_internal("Program started");