# HG changeset patch # User Paper # Date 1739164041 18000 # Node ID 668f4f31dddaf6257f47bb4c2adf1b8f37f9b39a # Parent a76e55e098d138bf5dc20f26c09d7f11d96c931b strategist: outward APIs are now in C diff -r a76e55e098d1 -r 668f4f31ddda include/animone/strategies.h --- a/include/animone/strategies.h Sun Feb 09 23:18:57 2025 -0500 +++ b/include/animone/strategies.h Mon Feb 10 00:07:21 2025 -0500 @@ -2,12 +2,37 @@ #define ANIMONE_ANIMONE_STRATEGIES_H_ #include "animone.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int animone_internal_ApplyStrategies(animone::Result *results, size_t results_size); + +#ifdef __cplusplus +} + +#include #include namespace animone::internal { -bool ApplyStrategies(std::vector& results); +inline bool ApplyStrategies(std::vector& results) +{ + Result *results_c; + size_t results_size_c; + + int x = ::animone_internal_ApplyStrategies(results_c, results_size_c); + + results.assign(results_c, results_c + results_size_c); + + std::free(results_c); + + return x; +} } +#endif // defined(__cplusplus) + #endif // ANIMONE_ANIMONE_STRATEGIES_H_ \ No newline at end of file diff -r a76e55e098d1 -r 668f4f31ddda src/strategist.cc --- a/src/strategist.cc Sun Feb 09 23:18:57 2025 -0500 +++ b/src/strategist.cc Mon Feb 10 00:07:21 2025 -0500 @@ -11,8 +11,6 @@ * anymore, and we just pass the result vector to different function that append * to the result (which is better imo) */ -namespace animone::internal { - static bool ApplyWindowTitleFormat(const std::string& format, std::string& title) { if (format.empty()) return false; @@ -39,19 +37,18 @@ return true; } -static MediaInfoType InferMediaInformationType(const std::string& str) { +static animone::MediaInfoType InferMediaInformationType(const std::string& str) { const std::regex path_pattern(R"(^(?:[A-Za-z]:[/\\]|\\\\)[^<>:"/\\|?*]+)"); - return (std::regex_search(str, path_pattern)) ? MediaInfoType::File : MediaInfoType::Unknown; + return (std::regex_search(str, path_pattern)) ? animone::MediaInfoType::File : animone::MediaInfoType::Unknown; } -static bool AddMedia(Result& result, const MediaInfo media_information) { +static bool AddMedia(animone::Result *result, const animone::MediaInfo media_information) { if (media_information.value.empty()) return false; - Media media = { - .information = {media_information} - }; - result.media.push_back(std::move(media)); + animone::Media media; + media.information = {media_information}; + result->media.push_back(std::move(media)); return true; } @@ -59,70 +56,78 @@ /* ------------------------------------------------------------------------- */ /* strategies */ -static bool ApplyWindowTitleStrategy(std::vector& results) { +typedef bool (*strategy_spec_t)(animone::Result *results, size_t results_size); + +static bool ApplyWindowTitleStrategy(animone::Result *results, size_t results_size) { bool success = false; - for (auto& result : results) { - auto title = result.window.text; + for (size_t i = 0; i < results_size; i++) { + auto title = results[i].window.text; if (title.empty()) continue; - ApplyWindowTitleFormat(result.player.window_title_format, title); + ApplyWindowTitleFormat(results[i].player.window_title_format, title); - success |= AddMedia(result, {InferMediaInformationType(title), title}); + success |= AddMedia(&results[i], {InferMediaInformationType(title), title}); } return success; } -static bool ApplyOpenFilesStrategy(std::vector& results) { +static bool ApplyOpenFilesStrategy(animone::Result *results, size_t results_size) { bool success = false; - /* map pids to our results, saves time with open_file_proc */ - std::unordered_map pid_map; - std::set pids; + std::set pids; + + for (size_t i = 0; i < results_size; i++) + pids.insert(results[i].process.pid); + + auto open_file_proc = [&](const animone::internal::OpenFile& file) -> bool { + animone::Result *result = NULL; - for (Result& result : results) { - const pid_t pid = result.process.pid; - if (!pid) - continue; + for (size_t i = 0; i < results_size; i++) { + if (results[i].process.pid == file.pid) { + result = &results[i]; + break; + } + } - pid_map.insert({pid, &result}); - pids.insert(pid); - } + if (!result) + return false; - auto open_file_proc = [&](const OpenFile& file) -> bool { - success |= AddMedia(*pid_map[file.pid], {MediaInfoType::File, file.path}); + success |= AddMedia(result, {animone::MediaInfoType::File, file.path}); return true; }; - EnumerateOpenFiles(pids, open_file_proc); + animone::internal::EnumerateOpenFiles(pids, open_file_proc); return success; } -static bool ApplyAccessibilityStrategy(std::vector& results) { - bool success = false; +static bool ApplyAccessibilityStrategy(animone::Result *results, size_t results_size) { + int success = 0; - for (Result& result : results) { - auto web_browser_proc = [&result](const WebBrowserInformation& info) { + for (size_t i = 0; i < results_size; i++) { + // TODO refactor our processing function specs to take in userdata + + auto web_browser_proc = [results, i](const animone::internal::WebBrowserInformation& info) -> void { auto value = info.value; switch (info.type) { - case WebBrowserInformationType::Address: - AddMedia(result, {MediaInfoType::Url, value}); - break; - case WebBrowserInformationType::Title: - ApplyWindowTitleFormat(result.player.window_title_format, value); - AddMedia(result, {MediaInfoType::Title, value}); - break; - case WebBrowserInformationType::Tab: - AddMedia(result, {MediaInfoType::Tab, value}); - break; + case animone::internal::WebBrowserInformationType::Address: + AddMedia(&results[i], {animone::MediaInfoType::Url, value}); + break; + case animone::internal::WebBrowserInformationType::Title: + ApplyWindowTitleFormat(results[i].player.window_title_format, value); + AddMedia(&results[i], {animone::MediaInfoType::Title, value}); + break; + case animone::internal::WebBrowserInformationType::Tab: + AddMedia(&results[i], {animone::MediaInfoType::Tab, value}); + break; } }; - success |= GetWebBrowserInformation(result, web_browser_proc); + success |= animone::internal::GetWebBrowserInformation(results[i], web_browser_proc); } return success; @@ -130,14 +135,19 @@ /* ------------------------------------------------------------------------- */ -bool ApplyStrategies(std::vector& results) { - bool success = false; +int animone_internal_ApplyStrategies(animone::Result *results, size_t results_size) +{ + static const strategy_spec_t strategies[] = { + ApplyWindowTitleStrategy, + ApplyOpenFilesStrategy, + ApplyAccessibilityStrategy + }; - success |= ApplyWindowTitleStrategy(results); - success |= ApplyOpenFilesStrategy(results); - success |= ApplyAccessibilityStrategy(results); + int success = 0; + + for (size_t i = 0; i < (sizeof(strategies)/sizeof(*strategies)); i++) + success |= strategies[i](results, results_size); return success; } -} // namespace animone::internal