diff --git descriptor/writer/root_writer.cc descriptor/writer/root_writer.cc index e1205c8f34..c714fbb22f 100644 --- descriptor/writer/root_writer.cc +++ descriptor/writer/root_writer.cc @@ -278,29 +278,32 @@ bool root_writer_t::do_copy(FILE* outfp, obj_node_info_t& root, const char* open // merges pak files into an archive // -void root_writer_t::copy(const char* name, int argc, char* argv[]) +void root_writer_t::copy(const string &name, int argc, char* argv[]) { searchfolder_t find; - FILE* outfp = NULL; - if (strchr(name, '*') == NULL) { - // is not a wildcard name - outfp = fopen(name, "wb"); + + if (name.find('*') == string::npos) { + outfp = fopen(name.c_str(), "wb"); } + + string expanded_name = name; if (outfp == NULL) { - name = find.complete(name, "pak").c_str(); - outfp = fopen(name, "wb"); + expanded_name = find.complete(name, "pak"); + outfp = fopen(expanded_name.c_str(), "wb"); } + if (!outfp) { - dbg->fatal( "Merge", "Cannot open destination file %s", name); - exit(3); + dbg->fatal( "Merge", "Cannot open destination file %s", expanded_name.c_str()); } + fclose(outfp); - if (remove(name) != 0) { - dbg->warning("Merge", "Could not delete %s"); + if (remove(expanded_name.c_str()) != 0) { + dbg->warning("Merge", "Could not delete %s", expanded_name.c_str()); } + // create temporary file - std::string tmpfile_name = name; + std::string tmpfile_name = expanded_name; tmpfile_name += ".tmp"; outfp = fopen(tmpfile_name.c_str(), "wb"); @@ -322,9 +325,9 @@ void root_writer_t::copy(const char* name, int argc, char* argv[]) any = do_copy(outfp, root, argv[i]); } else { find.search(argv[i], "pak"); - FOR(searchfolder_t, const& i, find) { - if (strcmp(i, name) != 0) { - any |= do_copy(outfp, root, i); + FOR(searchfolder_t, const& entry, find) { + if (strcmp(entry, expanded_name.c_str()) != 0) { + any |= do_copy(outfp, root, entry); } else { dbg->warning( "Merge", "Skipping reading from output file"); @@ -342,28 +345,30 @@ void root_writer_t::copy(const char* name, int argc, char* argv[]) fclose(outfp); - printf("renaming temporary file %s to %s\n", tmpfile_name.c_str(), name); + printf("renaming temporary file %s to %s\n", tmpfile_name.c_str(), expanded_name.c_str()); - rename(tmpfile_name.c_str(), name); + rename(tmpfile_name.c_str(), expanded_name.c_str()); } /* makes single files from a merged file */ -void root_writer_t::uncopy(const char* name) +void root_writer_t::uncopy(const string &name) { FILE* infp = NULL; - if (strchr(name,'*') == NULL) { - // is not a wildcard name - infp = fopen(name, "rb"); + + if (name.find('*') == std::string::npos) { + infp = fopen(name.c_str(), "rb"); } + + string expanded_name = name; if (infp == NULL) { searchfolder_t find; - name = find.complete(name, "pak").c_str(); - infp = fopen(name, "rb"); + expanded_name = find.complete(name, "pak"); + infp = fopen(expanded_name.c_str(), "rb"); } if (!infp) { - dbg->fatal( "Unmerge", "Cannot open archive file %s\n", name); + dbg->fatal( "Unmerge", "Cannot open archive file %s\n", expanded_name.c_str()); exit(3); } @@ -376,7 +381,7 @@ void root_writer_t::uncopy(const char* name) obj_node_info_t root; obj_node_t::read_node( infp, root ); if (root.children == 1) { - dbg->error( "Unmerge", "%s is not an archive (aborting)", name); + dbg->error( "Unmerge", "%s is not an archive (aborting)", expanded_name.c_str()); fclose(infp); exit(3); } @@ -455,9 +460,10 @@ void root_writer_t::uncopy(const char* name) } } else { - dbg->warning( "Unmerge", "Skipping file %s - version mismatch", name); + dbg->warning( "Unmerge", "Skipping file %s - version mismatch", expanded_name.c_str()); } } + fclose(infp); } diff --git descriptor/writer/root_writer.h descriptor/writer/root_writer.h index 6191340970..e41d8038cb 100644 --- descriptor/writer/root_writer.h +++ descriptor/writer/root_writer.h @@ -36,7 +36,7 @@ class root_writer_t : public obj_writer_t { void write(const char* name, int argc, char* argv[]); void dump(int argc, char* argv[]); void list(int argc, char* argv[]); - void copy(const char* name, int argc, char* argv[]); + void copy(const std::string &name, int argc, char* argv[]); /** * @brief Expands makeobj pre-processor stuff @@ -52,7 +52,7 @@ class root_writer_t : public obj_writer_t { void expand_dat(const char* name, int argc, char* argv[]); /* makes single files from a merged file */ - void uncopy(const char* name); + void uncopy(const std::string &name); static const std::string & get_inpath() { return inpath; }