diff options
Diffstat (limited to 'src/paq.cc')
-rw-r--r-- | src/paq.cc | 48 |
1 files changed, 42 insertions, 6 deletions
@@ -1,5 +1,7 @@ #include <dirent.h> +#include <unistd.h> #include <iostream.h> +#include <list> #include <Main.h> #include <Input.h> #include <Output.h> @@ -26,36 +28,66 @@ extern "C" int sortdir(const void * d1, const void * d2) { n = current_dir + "/" + (**((const dirent **)d2)).d_name; stat(n.to_charp(), &fstats2); - if (!(S_ISDIR(fstats1.st_mode) ^ S_ISDIR(fstats2.st_mode))) { + if (!((S_ISDIR(fstats1.st_mode) ? 1 : 0) ^ (S_ISDIR(fstats2.st_mode) ? 1 : 0))) { return alphasort(d1, d2); } else { if (S_ISDIR(fstats1.st_mode)) - return 1; - else return -1; + else + return 1; } } CODE_BEGINS + +private: + +struct couple { + String p, v; +}; + Output * Archive; +std::list<String> filelist; + +void finalize(void) { + int size; + Input * file; + for (std::list<String>::iterator i = filelist.begin(); i != filelist.end(); i++) { + cerr << "Finalize file " << *i << endl; + file = new Input(*i); + size = file->GetSize(); + Archive->write(&size, 4); + delete file; + file = new Input(*i + ".gz"); + copy(file, Archive); + delete file; + unlink((*i + ".gz").to_charp()); + } +} + void process_file(const String & filename) { char t; - int size; - cerr << "Processing file " << filename << endl; + int size, old_size; + cerr << "Processing file " << filename << "... "; Input * from = new Input(filename); Output * to = new Output(filename + ".gz"); to->SetZ(); + old_size = from->GetSize(); + copy(from, to); delete to; delete from; + filelist.push_back(filename); + from = new Input(filename + ".gz"); size = from->GetSize() + 4; + cerr << old_size << " --> " << from->GetSize() << " (" << 100 * from->GetSize() / old_size << "%)\n"; Archive->write(&size, 4); @@ -122,11 +154,15 @@ void build_archive(const String & dirname) { Archive->write(buff, 4); process_directory(dirname); + + finalize(); } +public: + virtual int startup(void) throw (GeneralException) { Archive = new Output("/tmp/bleh.paq"); - process_directory("."); + build_archive("."); return 0; } CODE_ENDS |