diff --git descriptor/writer/root_writer.cc descriptor/writer/root_writer.cc index e1205c8f34..b3b7ab877b 100644 --- descriptor/writer/root_writer.cc +++ descriptor/writer/root_writer.cc @@ -12,9 +12,9 @@ #include "obj_writer.h" #include "root_writer.h" -using std::string; -string root_writer_t::inpath; +std::string root_writer_t::inpath; + void root_writer_t::write_header(FILE* fp) { @@ -37,7 +37,7 @@ void root_writer_t::write(const char* filename, int argc, char* argv[]) FILE* outfp = NULL; obj_node_t* node = NULL; bool separate = false; - string file = find.complete(filename, "pak"); + std::string file = find.complete(filename, "pak"); if (file[file.size()-1] == '/') { printf("writing individual files to %s\n", filename); @@ -69,9 +69,9 @@ void root_writer_t::write(const char* filename, int argc, char* argv[]) printf(" reading file %s\n", i); inpath = arg; - string::size_type n = inpath.rfind('/'); + std::string::size_type n = inpath.rfind('/'); - if(n!=string::npos) { + if(n!=std::string::npos) { inpath = inpath.substr(0, n + 1); } else { @@ -80,7 +80,7 @@ void root_writer_t::write(const char* filename, int argc, char* argv[]) while(infile.read(obj)) { if(separate) { - string name(filename); + std::string name(filename); name = name + obj.get("obj") + "." + obj.get("name") + ".pak"; @@ -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 std::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('*') == std::string::npos) { + outfp = fopen(name.c_str(), "wb"); } + + std::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 std::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"); } + + std::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); } @@ -389,8 +394,9 @@ void root_writer_t::uncopy(const char* name) long start_pos=ftell(infp); // now make a name - string writer = node_writer_name(infp); - string node_name; + std::string writer = node_writer_name(infp); + std::string node_name; + if( writer=="factory" ) { // we need to take name from following building node ... obj_node_info_t node; @@ -431,7 +437,8 @@ void root_writer_t::uncopy(const char* name) dbg->warning( "Unmerge", "%s has no name! (using %s) as default", writer.c_str(), (const char *)random_name ); node_name = random_name; } - string outfile = writer + "." + node_name + ".pak"; + + std::string outfile = writer + "." + node_name + ".pak"; FILE* outfp = fopen(outfile.c_str(), "wb"); if (!outfp) { dbg->error( "Unmerge", "Could not open %s for writing (aborting)", outfile.c_str()); @@ -455,9 +462,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); } @@ -491,7 +499,7 @@ void root_writer_t::expand_dat(const char* filename, int argc, char* argv[]) searchfolder_t find; FILE* outfp = NULL; bool generate_name = false; - string file = find.complete(filename, "dat"); + std::string file = find.complete(filename, "dat"); if (file[file.size()-1] == '/') { printf("writing individual files to %s\n", filename); @@ -504,6 +512,7 @@ void root_writer_t::expand_dat(const char* filename, int argc, char* argv[]) dbg->fatal( "Write dat", "Cannot create destination file %s", filename ); exit(3); } + printf("writing file %s\n", filename); } @@ -521,9 +530,9 @@ void root_writer_t::expand_dat(const char* filename, int argc, char* argv[]) printf(" reading file %s\n", i); inpath = arg; - string::size_type n = inpath.rfind('/'); + std::string::size_type n = inpath.rfind('/'); - if(n!=string::npos) { + if(n!=std::string::npos) { inpath = inpath.substr(0, n + 1); } else { @@ -531,7 +540,7 @@ void root_writer_t::expand_dat(const char* filename, int argc, char* argv[]) } if(generate_name) { - string name(i); + std::string name(i); name.replace(name.size() - 3, 3, "expanded.dat"); 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; }