INTERFACE: #include IMPLEMENTATION: #include //#define NO_UNMANGLING std::string unmangle(const char* name) { #if 0 /* sr21 (gcc-2.95): show base class name only (no templates) */ if (*name == 't') { // t1Z int num = 0; ++name; while (*name >= '0' && *name <= '9') num = 10*num + *name++ - '0'; name += num + 2; } while (*name >= '0' && *name <= '9') ++name; return std::string(name); #elif ( __GNUC__ == 2 && __GNUC_MINOR__ == 95 && ! defined NO_UNMANGLING ) /* md11 (gcc-2.95): show names including templates, e.g. Annotated */ std::string temp(""); if (*name == 't') { // t1Z int num = 0; ++name; while (*name >= '0' && *name <= '9') num = 10*num + *name++ - '0'; temp = std::string (name, num); name += num + 2; } while (*name >= '0' && *name <= '9') ++name; return (temp.length()? temp+"<"+name+">" : std::string(name)); #elif ( __GNUC__ == 3 && __GNUC_MINOR__ == 2 && ! defined NO_UNMANGLING ) /* md11 (gcc-3.2): show names including templates, e.g. Annotated */ assert(name); std::string unmangled(""); while (*name != 0) if (! unmangle_32(name, unmangled) ) return unmangled + "[error unmangling type `" + name + "']"; return unmangled; #else # ifndef NO_UNMANGLING # warning "gcc version not recognized. unmangling of types disabled." # endif /* noop */ return std::string(name); #endif } /* local to unmangling for GCC 3.2 */ // ::= ( | N | //