]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/dll/include/boost/dll/detail/demangling/demangle_symbol.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / dll / include / boost / dll / detail / demangling / demangle_symbol.hpp
CommitLineData
7c673cae
FG
1// Copyright 2015 Klemens Morgenstern
2//
3// This file provides a demangling for function names, i.e. entry points of a dll.
4//
5// Distributed under the Boost Software License, Version 1.0.
6// See http://www.boost.org/LICENSE_1_0.txt
7
8#ifndef BOOST_DLL_DEMANGLE_SYMBOL_HPP_
9#define BOOST_DLL_DEMANGLE_SYMBOL_HPP_
10
11#include <boost/config.hpp>
12#include <string>
13#include <algorithm>
14
15#if defined(BOOST_MSVC) || defined(BOOST_MSVC_FULL_VER)
16
17namespace boost
18{
19namespace dll
20{
21namespace detail
22{
23
24typedef void * (__cdecl * allocation_function)(std::size_t);
25typedef void (__cdecl * free_function)(void *);
26
27extern "C" char* __unDName( char* outputString,
28 const char* name,
29 int maxStringLength, // Note, COMMA is leading following optional arguments
30 allocation_function pAlloc,
31 free_function pFree,
32 unsigned short disableFlags
33 );
34
35
36inline std::string demangle_symbol(const char *mangled_name)
37{
38
39 allocation_function alloc = [](std::size_t size){return static_cast<void*>(new char[size]);};
40 free_function free_f = [](void* p){delete [] static_cast<char*>(p);};
41
42
43
44 std::unique_ptr<char> name { __unDName(
45 nullptr,
46 mangled_name,
47 0,
48 alloc,
49 free_f,
50 static_cast<unsigned short>(0))};
51
52 return std::string(name.get());
53}
54inline std::string demangle_symbol(const std::string& mangled_name)
55{
56 return demangle_symbol(mangled_name.c_str());
57}
58
59
60}}}
61#else
62
63#include <boost/core/demangle.hpp>
64
65namespace boost
66{
67namespace dll
68{
69namespace detail
70{
71
72inline std::string demangle_symbol(const char *mangled_name)
73{
74
75 if (*mangled_name == '_')
76 {
77 //because it start's with an underline _
78 auto dm = boost::core::demangle(mangled_name);
79 if (!dm.empty())
80 return dm;
81 else
82 return (mangled_name);
83 }
84
85 //could not demangled
86 return "";
87
88
89}
90
91//for my personal convinience
92inline std::string demangle_symbol(const std::string& mangled_name)
93{
94 return demangle_symbol(mangled_name.c_str());
95}
96
97
98}
99namespace experimental
100{
101using ::boost::dll::detail::demangle_symbol;
102}
103
104}}
105
106#endif
107
108#endif /* BOOST_DEMANGLE_HPP_ */