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