macdependency/MachO/demangler.cpp
2009-09-23 16:12:43 +00:00

50 lines
1.2 KiB
C++

#include "demangler.h"
#include "machodemangleexception.h"
using namespace boost::process;
/**
class for using c++flt to demangle names. Uses Boost.Process from http://www.highscore.de/cpp/process/index.html
*/
Demangler::Demangler() : child(NULL), isRunning(false)
{
init();
}
Demangler::~Demangler()
{
if (child)
child->terminate();
delete child;
}
string Demangler::demangleName(const string& name) {
if (isRunning){
(*stdin) << name << endl;
string line;
getline(*stdout, line);
return line;
} else {
throw MachODemangleException("Could not find/start process c++flt.");
}
}
void Demangler::init() {
try {
std::string exec = find_executable_in_path("c++filt");
std::vector<std::string> args;
args.push_back("--strip-underscore");
context ctx;
ctx.environment = self::get_environment();
ctx.stdout_behavior = capture_stream();
ctx.stdin_behavior = capture_stream();
child = new boost::process::child(launch(exec, args, ctx));
stdout = &child->get_stdout();
stdin = &child->get_stdin();
isRunning = true;
// TODO: check exceptions
} catch (boost::filesystem::filesystem_error& e) {
// errors during finding executable
} catch (boost::system::system_error& e2) {
// errors during starting of process
}
}