static int fprintImports(FILE *f, SmiModule *smiModule, char *prefix, Imports *backtrace) { SmiModule *smiModule2; Imports *imports, *imp; int i, n, recurse = 0, done = 0; for (imp = backtrace; imp; imp = imp->nextPtr) { if (strcmp(imp->module, smiModule->name) == 0) { fprintf(stderr, "%s (recursion - aborted)\n", prefix); return 0; } } imp = (Imports *) xmalloc(sizeof(Imports)); imp->module = smiModule->name; imp->nextPtr = backtrace; backtrace = imp; imports = getImports(smiModule, &n); for (i = 0; i < n; i++) { char *newprefix; smiModule2 = smiGetModule(imports[i].module); recurse = (NULL == smiGetFirstImport(smiModule2)); if (recurse) { fprintf(f, "%s |\n", prefix); } fprintf(f, "%s +--%s [%d identifier%s]\n", prefix, imports[i].module, imports[i].count, imports[i].count > 1 ? "s" : ""); newprefix = xmalloc(strlen(prefix)+10); strcpy(newprefix, prefix); if (i == n-1) { strcat(newprefix, " "); } else { strcat(newprefix, " |"); } done = fprintImports(f, smiModule2, newprefix, backtrace); if (! recurse && done) { if (i == n-1) { fprintf(f, "%s \n", prefix); } else { fprintf(f, "%s |\n", prefix); } } xfree(newprefix); } freeImports(imports, n); xfree(backtrace); return recurse; }
Image PEFormat::toImage() { getImports(); getExports(); getRelocations(); Image image; image.fileName = getFileName(); image.info = info_; image.imports = std::move(imports_); image.sections = std::move(sections_); image.relocations = std::move(relocations_); image.header = std::move(header_); image.exports.assign_move(exports_.begin(), exports_.end()); return image; }