Skip to content

Commit

Permalink
Restructure main
Browse files Browse the repository at this point in the history
  • Loading branch information
Adikso committed Sep 25, 2018
1 parent 1041896 commit 2e3f0ef
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 55 deletions.
101 changes: 48 additions & 53 deletions src/debugextract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,36 +52,7 @@ int main(int argc, char *argv[]) {
return 1;
}

PDBExtractor pdbExtractor;
ELFExtractor elfExtractor;
DWARFExtractor dwarfExtractor;

ExtractResult pdbExtractResult = pdbExtractor.load(v[0], args["base"].as<int>());
ExtractResult elfExtractResult = elfExtractor.load(v[0], args["base"].as<int>());
ExtractResult dwarfExtractResult = dwarfExtractor.load(v[0], args["base"].as<int>());

Extractor * extractor;
if (pdbExtractResult == ExtractResult::OK) {
extractor = &pdbExtractor;
} else if (dwarfExtractResult == ExtractResult::OK) {
extractor = &dwarfExtractor;
} else if (elfExtractResult == ExtractResult::OK) {
extractor = &elfExtractor;
} else {
std::cout << "Failed to load file: ";

if (pdbExtractResult == ExtractResult::ERR_FILE_OPEN) {
std::cout << "File not found";
} else if (dwarfExtractResult == ExtractResult::MISSING_DEBUG || elfExtractResult == ExtractResult::MISSING_DEBUG) {
std::cout << "File does not contain debug information";
} else {
std::cout << "Unsupported format";
}

std::cout << std::endl;
return 2;
}

Extractor * extractor = getExtractorForFile(v[0], args["base"].as<int>());
DumpConfig config = argsToConfig(args);

std::string outputPath;
Expand All @@ -104,12 +75,7 @@ int main(int argc, char *argv[]) {
Analyser analyser{config};

if (args.count("list")) {
for (auto &type : extractor->getTypesList(false)) {
if (!analyser.isCompilerGeneratedType(type)) {
std::cout << type << std::endl;
}
}
return 0;
list(extractor, analyser);
}

std::list<std::string> names;
Expand All @@ -119,8 +85,9 @@ int main(int argc, char *argv[]) {
names = split(v[1], ',');
}

std::vector<Type *> types = getTypes(extractor, analyser, names);
std::vector<std::string> dumpOut = dump(types, config);
std::vector<Type *> types = extractor->getTypes(std::move(names));
ClassDumper * dumper = config.json ? (ClassDumper *) new JsonClassDumper : new CodeClassDumper;
std::vector<std::string> dumpOut = dumper->dump(std::move(types), config);

if (config.toDirectory) {
std::string extension = (config.json ? "json" : "hpp");
Expand All @@ -133,13 +100,7 @@ int main(int argc, char *argv[]) {
file.close();
}
} else {
std::stringstream outStream;

for (auto &type : dumpOut) {
outStream << type << std::endl;
}

std::string out = outStream.str();
std::string out = join(dumpOut, "\n");

if (args.count("output")) {
std::ofstream file;
Expand All @@ -155,6 +116,48 @@ int main(int argc, char *argv[]) {
return 0;
}

void list(Extractor * extractor, Analyser &analyser) {
for (auto &type : extractor->getTypesList(false)) {
if (!analyser.isCompilerGeneratedType(type)) {
std::cout << type << std::endl;
}
}
}

Extractor * getExtractorForFile(const std::string &filename, int base) {
auto * pdbExtractor = new PDBExtractor;
auto * elfExtractor = new ELFExtractor;
auto * dwarfExtractor = new DWARFExtractor;

ExtractResult pdbExtractResult = pdbExtractor->load(filename, base);
ExtractResult elfExtractResult = elfExtractor->load(filename, base);
ExtractResult dwarfExtractResult = dwarfExtractor->load(filename, base);

if (pdbExtractResult == ExtractResult::OK) {
return pdbExtractor;
}
else if (dwarfExtractResult == ExtractResult::OK) {
return dwarfExtractor;
}
else if (elfExtractResult == ExtractResult::OK) {
return elfExtractor;
}

std::stringstream errorMessage;
errorMessage << "Failed to load file: ";

if (pdbExtractResult == ExtractResult::ERR_FILE_OPEN) {
errorMessage << "File not found";
} else if (dwarfExtractResult == ExtractResult::MISSING_DEBUG || elfExtractResult == ExtractResult::MISSING_DEBUG) {
errorMessage << "File does not contain debug information";
} else {
errorMessage << "Unsupported format";
}

errorMessage << std::endl;
throw errorMessage.str();
}

DumpConfig argsToConfig(const cxxopts::ParseResult &args) {
DumpConfig config;
config.indent = args["indent"].as<int>();
Expand All @@ -170,11 +173,3 @@ DumpConfig argsToConfig(const cxxopts::ParseResult &args) {
return config;
}

std::vector<Type *> getTypes(Extractor * extractor, Analyser &analyser, std::list<std::string> names) {
return extractor->getTypes(std::move(names));
}

std::vector<std::string> dump(std::vector<Type *> types, DumpConfig config) {
ClassDumper * dumper = config.json ? (ClassDumper *) new JsonClassDumper : new CodeClassDumper;
return dumper->dump(std::move(types), config);
}
5 changes: 3 additions & 2 deletions src/debugextract.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ using namespace debugtocpp::pdb;
using namespace debugtocpp::dwarf;

DumpConfig argsToConfig(const cxxopts::ParseResult &args);
std::vector<Type *> getTypes(Extractor * extractor, Analyser &analyser, std::list<std::string> names);
std::vector<std::string> dump(std::vector<Type *> types, DumpConfig config);
Extractor * getExtractorForFile(const std::string &filename, int base);

void list(Extractor * extractor, Analyser &analyser);

#endif //DEBUGTOCPP_DEBUGEXTRACT_HPP
10 changes: 10 additions & 0 deletions src/utils/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ inline std::list<std::string> split(const std::string &input, char delimiter) {
return tokens;
}

inline std::string join(std::vector<std::string> &source, std::string delim) {
std::string out;

for (auto &type : source) {
out.append(type).append(delim);
}

return out;
}

inline int isDirectory(const std::string &path) {
struct stat statbuf{};
if (stat(path.c_str(), &statbuf) != 0)
Expand Down

0 comments on commit 2e3f0ef

Please sign in to comment.