3 files + 57 − 10 Inline Compare changes Side-by-side Inline Show whitespace changes Files 3 src/utils/Demangle.cpp +37 −9 Original line number Diff line number Diff line Loading @@ -2,18 +2,46 @@ #include <cxxabi.h> #include <memory> #include <sstream> #warning remove #include <iostream> #include <rang.hpp> std::string demangle(const std::string_view mangled) { std::string_view separators = " \t\r\n:"; std::stringstream demangled; std::string_view string_data = mangled; while (not string_data.empty()) { auto begin = string_data.find_first_not_of(separators); if (begin != 0) { auto space = string_data.substr(0, begin); demangled << space; string_data.remove_prefix(begin); begin = 0; } auto end = string_data.find_first_of(separators); auto token = string_data.substr(0, end); int status = -1; char* cxa_demangled = abi::__cxa_demangle(mangled.data(), NULL, NULL, &status); char* cxa_demangled = abi::__cxa_demangle(std::string{token}.data(), nullptr, nullptr, &status); if (status == 0) { std::string demangled{cxa_demangled}; demangled << cxa_demangled; free(cxa_demangled); return demangled; } else { return std::string{mangled}; demangled << token; } if (end != std::string_view::npos) { string_data.remove_prefix(end); } else { string_data = {}; } } return demangled.str(); } src/utils/PluginsLoader.cpp +2 −1 Original line number Diff line number Diff line #include <utils/PluginsLoader.hpp> #include <utils/ConsoleManager.hpp> #include <utils/Demangle.hpp> #include <dlfcn.h> Loading Loading @@ -40,7 +41,7 @@ PluginsLoader::_open(const std::string& plugin) } else { std::cerr << " *" << rang::fgB::red << "cannot load " << rang::fg::reset << '\"' << rang::fgB::yellow << plugin << rang::fg::reset << "\"\n"; std::cerr << " " << rang::fgB::magenta << dlerror() << rang::fg::reset << '\n'; std::cerr << " " << rang::fgB::magenta << demangle(dlerror()) << rang::fg::reset << '\n'; } } Loading tests/test_Demangle.cpp +18 −0 Original line number Diff line number Diff line #include <catch2/catch_test_macros.hpp> #include <catch2/matchers/catch_matchers_all.hpp> #include <algebra/TinyVector.hpp> #include <utils/Demangle.hpp> #include <cxxabi.h> #include <sstream> #warning remove #include <iostream> // clazy:excludeall=non-pod-global-static Loading Loading @@ -35,4 +40,17 @@ TEST_CASE("Demangle", "[utils]") REQUIRE((std::string{"not_mangled"} == demangle("not_mangled"))); } SECTION("demangle phrase") { std::stringstream mangled; std::stringstream demangled; mangled << " Sentence contains mangled text " << std::string{typeid(std::string).name()} << " and " << std::string{typeid(TinyVector<3>).name()} << " ."; demangled << " Sentence contains mangled text " << demangle(std::string{typeid(std::string).name()}) << " and " << demangle(std::string{typeid(TinyVector<3>).name()}) << " ."; REQUIRE((demangled.str() == demangle(mangled.str()))); } }
src/utils/Demangle.cpp +37 −9 Original line number Diff line number Diff line Loading @@ -2,18 +2,46 @@ #include <cxxabi.h> #include <memory> #include <sstream> #warning remove #include <iostream> #include <rang.hpp> std::string demangle(const std::string_view mangled) { std::string_view separators = " \t\r\n:"; std::stringstream demangled; std::string_view string_data = mangled; while (not string_data.empty()) { auto begin = string_data.find_first_not_of(separators); if (begin != 0) { auto space = string_data.substr(0, begin); demangled << space; string_data.remove_prefix(begin); begin = 0; } auto end = string_data.find_first_of(separators); auto token = string_data.substr(0, end); int status = -1; char* cxa_demangled = abi::__cxa_demangle(mangled.data(), NULL, NULL, &status); char* cxa_demangled = abi::__cxa_demangle(std::string{token}.data(), nullptr, nullptr, &status); if (status == 0) { std::string demangled{cxa_demangled}; demangled << cxa_demangled; free(cxa_demangled); return demangled; } else { return std::string{mangled}; demangled << token; } if (end != std::string_view::npos) { string_data.remove_prefix(end); } else { string_data = {}; } } return demangled.str(); }
src/utils/PluginsLoader.cpp +2 −1 Original line number Diff line number Diff line #include <utils/PluginsLoader.hpp> #include <utils/ConsoleManager.hpp> #include <utils/Demangle.hpp> #include <dlfcn.h> Loading Loading @@ -40,7 +41,7 @@ PluginsLoader::_open(const std::string& plugin) } else { std::cerr << " *" << rang::fgB::red << "cannot load " << rang::fg::reset << '\"' << rang::fgB::yellow << plugin << rang::fg::reset << "\"\n"; std::cerr << " " << rang::fgB::magenta << dlerror() << rang::fg::reset << '\n'; std::cerr << " " << rang::fgB::magenta << demangle(dlerror()) << rang::fg::reset << '\n'; } } Loading
tests/test_Demangle.cpp +18 −0 Original line number Diff line number Diff line #include <catch2/catch_test_macros.hpp> #include <catch2/matchers/catch_matchers_all.hpp> #include <algebra/TinyVector.hpp> #include <utils/Demangle.hpp> #include <cxxabi.h> #include <sstream> #warning remove #include <iostream> // clazy:excludeall=non-pod-global-static Loading Loading @@ -35,4 +40,17 @@ TEST_CASE("Demangle", "[utils]") REQUIRE((std::string{"not_mangled"} == demangle("not_mangled"))); } SECTION("demangle phrase") { std::stringstream mangled; std::stringstream demangled; mangled << " Sentence contains mangled text " << std::string{typeid(std::string).name()} << " and " << std::string{typeid(TinyVector<3>).name()} << " ."; demangled << " Sentence contains mangled text " << demangle(std::string{typeid(std::string).name()}) << " and " << demangle(std::string{typeid(TinyVector<3>).name()}) << " ."; REQUIRE((demangled.str() == demangle(mangled.str()))); } }