summaryrefslogtreecommitdiff
path: root/src/paq.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/paq.cc')
-rw-r--r--src/paq.cc48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/paq.cc b/src/paq.cc
index 65c9fc1..96f6f39 100644
--- a/src/paq.cc
+++ b/src/paq.cc
@@ -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