Blame src/cppunit/TypeInfoHelper.cpp

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