mirror of
https://github.com/QuasarApp/macdependency.git
synced 2025-04-27 04:44:31 +00:00
50 lines
1.2 KiB
C++
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
|
|
}
|
|
} |