Blame src/cppunit/TypeInfoHelper.cpp
|
Packit |
8c9aa0 |
#include <cppunit/Portability.h>
|
|
Packit |
8c9aa0 |
#include <cppunit/extensions/TypeInfoHelper.h>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#include <string>
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#if CPPUNIT_HAVE_GCC_ABI_DEMANGLE
|
|
Packit |
8c9aa0 |
#include <cstdlib>
|
|
Packit |
8c9aa0 |
#include <cxxabi.h>
|
|
Packit |
8c9aa0 |
#endif
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_BEGIN
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string
|
|
Packit |
8c9aa0 |
TypeInfoHelper::getClassName( const std::type_info &info )
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
#if defined(CPPUNIT_HAVE_GCC_ABI_DEMANGLE) && CPPUNIT_HAVE_GCC_ABI_DEMANGLE
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
int status = 0;
|
|
Packit |
8c9aa0 |
char* c_name = 0;
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
const char* c_origName = info.name();
|
|
Packit |
8c9aa0 |
if(c_origName[0] == '*')
|
|
Packit |
8c9aa0 |
++c_origName;
|
|
Packit |
8c9aa0 |
c_name = abi::__cxa_demangle( c_origName, 0, 0, &status );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
std::string name;
|
|
Packit |
8c9aa0 |
if(c_name)
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
name = std::string( c_name );
|
|
Packit |
8c9aa0 |
free( c_name );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
else
|
|
Packit |
8c9aa0 |
{
|
|
Packit |
8c9aa0 |
name = std::string( c_origName );
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#else // CPPUNIT_HAVE_GCC_ABI_DEMANGLE
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
static std::string classPrefix( "class " );
|
|
Packit |
8c9aa0 |
std::string name( info.name() );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
// Work around gcc 3.0 bug: strip number before type name.
|
|
Packit |
8c9aa0 |
unsigned int firstNotDigitIndex = 0;
|
|
Packit |
8c9aa0 |
while ( firstNotDigitIndex < name.length() &&
|
|
Packit |
8c9aa0 |
name[firstNotDigitIndex] >= '0' &&
|
|
Packit |
8c9aa0 |
name[firstNotDigitIndex] <= '9' )
|
|
Packit |
8c9aa0 |
++firstNotDigitIndex;
|
|
Packit |
8c9aa0 |
name = name.substr( firstNotDigitIndex );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
if ( name.substr( 0, classPrefix.length() ) == classPrefix )
|
|
Packit |
8c9aa0 |
return name.substr( classPrefix.length() );
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
#endif // CPPUNIT_HAVE_GCC_ABI_DEMANGLE
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
return name;
|
|
Packit |
8c9aa0 |
}
|
|
Packit |
8c9aa0 |
|
|
Packit |
8c9aa0 |
CPPUNIT_NS_END
|