diff options
Diffstat (limited to 'VP')
-rwxr-xr-x | VP/Makefile | 7 | ||||
-rw-r--r-- | VP/decomp-slz.cpp | 52 | ||||
-rw-r--r-- | VP/main_dump.cpp | 82 | ||||
-rw-r--r-- | VP/unarc.cpp | 41 |
4 files changed, 104 insertions, 78 deletions
diff --git a/VP/Makefile b/VP/Makefile index 27af592..815eb9d 100755 --- a/VP/Makefile +++ b/VP/Makefile @@ -1,9 +1,12 @@ #!/usr/bin/make -f -CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -I../includes +CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -I../includes -DHAVE_ZLIB CXX=g++ -TARGET = main_dump VP-CD1.sqr decomp-slz unarc search-script +LIBS=-lz +LDFLAGS=${LIBS} + +TARGET = main_dump VP-CD1.sqr decomp-slz unarc all: ${TARGET} diff --git a/VP/decomp-slz.cpp b/VP/decomp-slz.cpp index fa09411..076d3bd 100644 --- a/VP/decomp-slz.cpp +++ b/VP/decomp-slz.cpp @@ -2,56 +2,62 @@ #include <stdlib.h> #include "lzss.h" -#include "fileutils.h" -#include "generic.h" +#include "Input.h" +#include "Output.h" +#include "Main.h" -int main(int argc, char ** argv) { +CODE_BEGINS +public: +Appli() : lzss_o(new lzss) {} +virtual ~Appli() { + delete lzss_o; +} +private: + +lzss * lzss_o; + +virtual int startup() throw (GeneralException) { int sig, l, d, v; - FILE * fin = stdin, * fout = stdout; + Handle * fin = &Stdin, * fout = &Stdout; switch (argc) { case 3: - if (!(fout = fopen(argv[2], "w"))) { - printm(M_ERROR, "Error opening file %s.\n", argv[3]); - exit(-1); - } + fout = new Output(argv[2]); case 2: - if (!(fin = fopen(argv[1], "r"))) { - printm(M_ERROR, "Error opening file %s.\n", argv[2]); - exit(-1); - } + fin = new Input(argv[1]); break; case 1: break; default: printm(M_BARE, "Usage: %s [filein] [fileout]\n", argv[0]); - exit(-1); + return -1; } verbosity = M_STATUS; - fread(&sig, 1, 4, fin); - fread(&d, 1, 4, fin); - fread(&l, 1, 4, fin); + fin->read(&sig, 4); + fin->read(&d, 4); + fin->read(&l, 4); switch (sig) { case 0x05a4c53: printm(M_STATUS, "Detected a SLZ-type 0 file.\n"); - fread(&v, 1, 4, fin); + fin->read(&v, 4); copy(fin, fout, d); - exit(0); + return 0; case 0x15a4c53: - scheme = schemes[VP_1]; + lzss_o->change_scheme(lzss_o->schemes[lzss_o->VP_1]); printm(M_STATUS, "Detected a SLZ-type 1 file.\n"); break; case 0x25a4c53: - scheme = schemes[VP_2]; + lzss_o->change_scheme(lzss_o->schemes[lzss_o->VP_2]); printm(M_STATUS, "Detected a SLZ-type 2 file.\n"); break; default: printm(M_ERROR, "Not a SLZ file.\n"); - exit(-1); + return -1; } - lzss_decomp(fin, fout, l); - exit(0); + lzss_o->lzss_decomp(fin, fout, l); + return 0; } +CODE_ENDS diff --git a/VP/main_dump.cpp b/VP/main_dump.cpp index 0845e1a..421db66 100644 --- a/VP/main_dump.cpp +++ b/VP/main_dump.cpp @@ -33,8 +33,21 @@ #include "Input.h" #include "Output.h" #include "String.h" +#include "Main.h" +#include "cdabstract.h" + +CODE_BEGINS +public: +Appli() : tourne(0), nb_seqs(0), f_def(0), f_iso(0), f_out(0), cdutil(0) {} +virtual ~Appli() { + delete cdutil; + delete f_def; + delete f_iso; + delete f_out; +} +private: -unsigned int tourne = 0; +unsigned int tourne; struct t_index_tab { unsigned long address; @@ -53,20 +66,15 @@ struct t_sequence { String title, iso_filename, prefix; unsigned long iso_size; -unsigned int nb_records, nb_seqs = 0; +unsigned int nb_records, nb_seqs; struct t_sequence sequences[1000]; - -long check_iso(Handle * f_iso); -void read_files(Handle * f_iso); -void file_dump(Handle * f_iso, unsigned long debut, unsigned long taille, long num, int seq); -int process_def_file(Handle * f_def); +Handle * f_def, * f_iso, * f_out; +cdutils * cdutil; unsigned char user_data[2352]; -int main(int argc, char **argv) +virtual int startup() throw (GeneralException) { - Handle * f_def, * f_iso; - verbosity = M_STATUS; fprintf(stderr, @@ -76,40 +84,41 @@ int main(int argc, char **argv) if (argc != 3) { fprintf(stderr, "Usage: %s <definition_file.sqr> <iso_file_name>\nSee readme.txt for details\n", argv[0]); - exit(-1); + throw Exit(-1); } printm(M_STATUS, "Processing file %s...\n", argv[1]); f_def = new Input(argv[1]); - if (process_def_file(f_def)) { - delete f_def; + if (process_def_file()) { printm(M_ERROR, "Unable to process the definition file \"%s\"...\n", argv[1]); - exit(-1); + throw Exit(-1); } iso_filename = argv[2]; printm(M_STATUS, "Begin processing iso file.\n"); - f_iso = new Input(iso_filename); + f_iso = open_iso(iso_filename); - if (check_iso(f_iso)) { + if (check_iso()) { printm(M_ERROR, "Invalid iso file for " + title + "\n"); printm(M_ERROR, "===> Make sure you are using a Genuine iso file.\n"); } else { printm(M_INFO, "Genuine " + title + " iso detected.\n"); } + + cdutil = new cdutils(f_iso); + printm(M_STATUS, "Entering files read sequence\n"); - read_files(f_iso); - delete f_iso; - exit(0); + read_files(); + throw Exit(0); } /* * Ugly but working... for now */ -int process_def_file(Handle * f_def) +int process_def_file() { String t; unsigned int n, sum = 0; @@ -153,19 +162,23 @@ int process_def_file(Handle * f_def) } } -long check_iso(Handle * f_iso) +long check_iso() { unsigned long length; length = f_iso->GetSize(); - printm(M_INFO, "Filesize of iso file " + iso_filename + " is %ld bytes\n", length); - if (length != iso_size) { - return 1; + if (length < 0) { + printm(M_INFO, "Can not get file size, assuming reading from cd.\n"); + } else { + printm(M_INFO, "Filesize of iso file " + iso_filename + " is %ld bytes\n", length); + if (length != iso_size) { + return 1; + } } return 0; } -void read_files(Handle * f_iso) +void read_files() { t_index_tab index_tab[10000]; unsigned long i; @@ -178,10 +191,10 @@ void read_files(Handle * f_iso) #define INDEXPOS 150 - sector_seek(f_iso, INDEXPOS); + cdutil->sector_seek(INDEXPOS); for (i = INDEXPOS; i < (INDEXPOS + 10); i++) { printm(M_INFO, "Reading fat sector %lu\n", i); - read_sector(f_iso, &fat[2048 * (i - INDEXPOS)], MODE_2_FORM_1); + cdutil->read_sector(&fat[2048 * (i - INDEXPOS)], MODE_2_FORM_1); } memcpy(key, fat + 0x4f00, 256); @@ -197,7 +210,7 @@ void read_files(Handle * f_iso) m = fat[j]; s = fat[j + 1]; f = fat[j + 2]; - index_tab[indexer].address = from_MSF(m, s, f); + index_tab[indexer].address = cdutil->from_MSF(m, s, f); if (m || s || f) { index_tab[indexer].index = j / 4; index_tab[indexer].flags = fat[j + 3]; @@ -224,7 +237,7 @@ void read_files(Handle * f_iso) printm(M_INFO, "%6lu - %02x: ", index_tab[i].address, index_tab[i].flags); size = index_tab[i + 1].address - index_tab[i].address; size *= sec_sizes[index_tab[i].type]; - file_dump(f_iso, index_tab[i].address, size, i, seq); + file_dump(index_tab[i].address, size, i, seq); if (verbosity >= M_INFO) { fprintf(stderr, "\n"); } @@ -233,12 +246,11 @@ void read_files(Handle * f_iso) fprintf(stderr, "\n"); } -void file_dump(Handle * f_iso, unsigned long debut, unsigned long taille, long num, int seq) +void file_dump(unsigned long debut, unsigned long taille, long num, int seq) { long i; long nbsects; String nom; - Handle * f_out; char type = sequences[seq].type; char ptitbidule[] = "-\\|/"; @@ -248,17 +260,17 @@ void file_dump(Handle * f_iso, unsigned long debut, unsigned long taille, long n nom += sequences[seq].prefix + "/"; MKDIR(nom.to_charp()); - nom += String("%04ld.out", num); + nom += String().set("%04ld.out", num); f_out = new Output(nom); nbsects = taille / sec_sizes[type]; if (taille % sec_sizes[type]) nbsects++; - sector_seek(f_iso, debut); + cdutil->sector_seek(debut); for (i = 0; i < nbsects; i++) { if (verbosity < M_INFO) fprintf(stderr, " (%c)\010\010\010\010\010", ptitbidule[((tourne++) >> 8) % 4]); - read_sector(f_iso, user_data, type); + cdutil->read_sector(user_data, type); if (i != (nbsects - 1)) { f_out->write(user_data, sec_sizes[type]); } else { @@ -266,5 +278,7 @@ void file_dump(Handle * f_iso, unsigned long debut, unsigned long taille, long n } } delete f_out; + f_out = 0; printm(M_BARE, " (*) Dumped file number %4ld - type \"" + sequences[seq].name + "\" \r", num); } +CODE_ENDS diff --git a/VP/unarc.cpp b/VP/unarc.cpp index 5699260..7a22c48 100644 --- a/VP/unarc.cpp +++ b/VP/unarc.cpp @@ -2,14 +2,18 @@ #include <stdlib.h> #include <unistd.h> -#include "fileutils.h" +#include "Input.h" +#include "Output.h" #include "generic.h" +#include "Main.h" #define THRESHOLD 2000 -int main(int argc, char ** argv) { - int h, o, n, * index, * sizes, i, d; - char temp[100]; +CODE_BEGINS +int startup() { + int n, * index, * sizes, i, d; + String temp; + Handle * h, * o; verbosity = M_INFO; @@ -18,12 +22,9 @@ int main(int argc, char ** argv) { exit(-1); } - if ((h = open(argv[1], O_RDONLY)) < 0) { - printm(M_ERROR, "Unable to open archive file: %s\n", argv[1]); - exit(-1); - } + h = new Input(argv[1]); - read(h, &n, 4); + h->read(&n, 4); printm(M_STATUS, "Archive claims to have %i files, checking integrity.\n", n); @@ -36,8 +37,8 @@ int main(int argc, char ** argv) { sizes = (int *) malloc(n * sizeof(int)); for (i = 0; i < n; i++) { - lseek(h, (i + 1) * 8 + 4, SEEK_SET); - read(h, &(sizes[i]), 4); + h->seek((i + 1) * 8 + 4, SEEK_SET); + h->read(&(sizes[i]), 4); printm(M_INFO, "File #%i size = %i = 0x%08x\n", i, sizes[i], sizes[i]); } @@ -50,9 +51,9 @@ int main(int argc, char ** argv) { printm(M_INFO, "Index #%i = %i = 0x%08x\n", i, index[i], index[i]); } - d = filesize(h) - index[n - 1] - sizes[n - 1]; + d = h->GetSize() - index[n - 1] - sizes[n - 1]; - printm(M_INFO, "Archive size: %i, last index: %i, last file size: %i, difference = %i\n", filesize(h), index[n - 1], sizes[n - 1], d); + printm(M_INFO, "Archive size: %i, last index: %i, last file size: %i, difference = %i\n", h->GetSize(), index[n - 1], sizes[n - 1], d); if ((d < 0) || (d > 2048)) { printm(M_ERROR, "Archive incoherent.\n"); @@ -62,15 +63,17 @@ int main(int argc, char ** argv) { printm(M_STATUS, "Archive seems to be ok, extracting.\n"); for (i = 0; i < n; i++) { - sprintf(temp, "%04i.out", i); - o = open(temp, O_WRONLY | O_CREAT | O_TRUNC, 0666); + temp.set("%04i.out", i); + o = new Output(temp); - printm(M_INFO, "Extracting %s\n", temp); + printm(M_INFO, "Extracting " + temp + "\n"); - lseek(h, index[i], SEEK_SET); + h->seek(index[i], SEEK_SET); copy(h, o, sizes[i]); - close(o); + delete o; } - exit(0); + delete h; + return 0; } +CODE_ENDS |