| // Copyright (c) FIRST and other WPILib contributors. |
| // Open Source Software; you can modify and/or share it under the terms of |
| // the WPILib BSD license file in the root directory of this project. |
| |
| #include "wpi/Demangle.h" |
| |
| #include <windows.h> // NOLINT(build/include_order) |
| |
| #include <dbghelp.h> |
| |
| #include "wpi/SmallString.h" |
| #include "wpi/mutex.h" |
| |
| #pragma comment(lib, "Dbghelp.lib") |
| |
| namespace wpi { |
| |
| std::string Demangle(std::string_view mangledSymbol) { |
| static wpi::mutex m; |
| std::scoped_lock lock(m); |
| SmallString<128> buf{mangledSymbol}; |
| char buffer[256]; |
| DWORD sz = UnDecorateSymbolName(buf.c_str(), buffer, sizeof(buffer), |
| UNDNAME_COMPLETE); |
| if (sz == 0) |
| return std::string{mangledSymbol}; |
| return std::string(buffer, sz); |
| } |
| |
| } // namespace wpi |