diff options
-rwxr-xr-x | Makefile | 32 | ||||
-rwxr-xr-x | Xenogears/Makefile | 8 | ||||
-rw-r--r-- | Xenogears/main_dump.cpp | 12 | ||||
-rw-r--r-- | bgrep.cpp | 10 | ||||
-rw-r--r-- | cd-tool.cpp | 104 | ||||
-rw-r--r-- | crypto-search.cpp | 17 | ||||
-rw-r--r-- | dtemain.cpp | 20 | ||||
-rw-r--r-- | generic/Exceptions.cpp | 49 | ||||
-rw-r--r-- | generic/Input.cpp | 19 | ||||
-rwxr-xr-x | generic/Makefile | 2 | ||||
-rw-r--r-- | generic/Output.cpp | 6 | ||||
-rw-r--r-- | generic/String.cpp | 18 | ||||
-rw-r--r-- | includes/String.h | 3 | ||||
-rw-r--r-- | includes/cdutils.h | 5 | ||||
-rw-r--r-- | includes/dte.h | 6 | ||||
-rw-r--r-- | includes/generic.h | 5 | ||||
-rwxr-xr-x | lib/Makefile | 4 | ||||
-rw-r--r-- | lib/cdutils.cpp | 15 | ||||
-rw-r--r-- | lib/dteutils.cpp | 79 | ||||
-rw-r--r-- | lzss-main.cpp | 36 | ||||
-rw-r--r-- | str-player.cpp | 16 |
21 files changed, 254 insertions, 212 deletions
@@ -1,10 +1,10 @@ #!/usr/bin/make -f -CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -Iincludes `sdl-config --cflags` -LDFLAGS=`sdl-config --libs` +CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -Iincludes `sdl-config --cflags` -DHAVE_ZLIB +LDFLAGS=`sdl-config --libs` -lz -lefence CXX=g++ -SUBDIRS = psxdev generic lib Xenogears VP MegamanX5 +SUBDIRS = psxdev generic lib Xenogears TARGET = lzss dlzss cd-tool str-player crypto-search bgrep dte-tool all: subdirs ${TARGET} @@ -12,29 +12,29 @@ all: subdirs ${TARGET} subdirs: for d in ${SUBDIRS} ; do make -C $$d || exit -1 ; done -lzss: includes/lzss.h includes/generic.h includes/fileutils.h lzss-main.o generic/generic.a lib/lib.a Makefile - ${CXX} ${LDFLAGS} -DLZSS_MAIN lzss-main.o lib/lib.a generic/generic.a -o lzss +lzss: includes/lzss.h includes/generic.h lzss-main.o generic/generic.a lib/lib.a Makefile + ${CXX} -DLZSS_MAIN lzss-main.o lib/lib.a generic/generic.a -o lzss ${LDFLAGS} dlzss: lzss Makefile ln -fs lzss dlzss yazedc: yazedc-main.o lib/lib.a Makefile - ${CXX} ${LDFLAGS} yazedc-main.o lib/lib.a -DMAIN -o yazedc + ${CXX} yazedc-main.o lib/lib.a -DMAIN -o yazedc ${LDFLAGS} -cd-tool: includes/cdutils.h includes/fileutils.h includes/generic.h includes/yazedc.h cd-tool.o Makefile - ${CXX} ${LDFLAGAS} cd-tool.o lib/lib.a generic/generic.a -o cd-tool +cd-tool: includes/cdutils.h includes/generic.h includes/yazedc.h cd-tool.o Makefile + ${CXX} cd-tool.o lib/lib.a generic/generic.a -o cd-tool ${LDFLAGS} -dte-tool: includes/generic.h includes/fileutils.h includes/dte.h dtemain.o lib/lib.a generic/generic.a Makefile - ${CXX} ${LDFLAGS} dtemain.o lib/lib.a generic/generic.a -o dte-tool +dte-tool: includes/generic.h includes/dte.h dtemain.o lib/lib.a generic/generic.a Makefile + ${CXX} dtemain.o lib/lib.a generic/generic.a -o dte-tool ${LDFLAGS} -str-player: str-player.o includes/generic.h includes/fileutils.h includes/cdutils.h includes/yazedc.h lib/lib.a generic/generic.a psxdev/psxdev.a Makefile - ${CXX} ${LDFLAGS} str-player.o psxdev/psxdev.a lib/lib.a generic/generic.a -o str-player +str-player: str-player.o includes/generic.h includes/cdutils.h includes/yazedc.h lib/lib.a generic/generic.a psxdev/psxdev.a Makefile + ${CXX} str-player.o psxdev/psxdev.a lib/lib.a generic/generic.a -o str-player ${LDFLAGS} -crypto-search: crypto-search.o includes/generic.h includes/fileutils.h lib/lib.a generic/generic.a Makefile - ${CXX} ${LDFLAGS} crypto-search.o lib/lib.a generic/generic.a -o crypto-search +crypto-search: crypto-search.o includes/generic.h lib/lib.a generic/generic.a Makefile + ${CXX} crypto-search.o lib/lib.a generic/generic.a -o crypto-search ${LDFLAGS} -bgrep: bgrep.o includes/generic.h includes/fileutils.h generic/generic.a Makefile - ${CXX} ${LDFLAGS} bgrep.o generic/generic.a -o bgrep +bgrep: bgrep.o includes/generic.h generic/generic.a Makefile + ${CXX} bgrep.o generic/generic.a -o bgrep ${LDFLAGS} clean: for d in ${SUBDIRS} ; do make -C $$d clean || exit -1 ; done diff --git a/Xenogears/Makefile b/Xenogears/Makefile index 50cc0f4..0f4a0bc 100755 --- a/Xenogears/Makefile +++ b/Xenogears/Makefile @@ -1,18 +1,18 @@ #!/usr/bin/make -f -CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -I../includes +CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -I../includes -DHAVE_ZLIB CXX=g++ CC=gcc -LIBS=-lz -LDFLAGS=${LIBS} +LIBS=-lz -lefence +LDFLAGS=${LIBS} `pkg-config --libs glib-2.0` TARGET = reinsert main_dump Decrypt script-comp script-dec XenoCD1.sqr XenoCD2.sqr compil compil-2 all: ${TARGET} main_dump: main_dump.o ../includes/cdutils.h ../includes/generic.h ../includes/yazedc.h ../lib/lib.a ../generic/generic.a Makefile - ${CXX} ${LDFLAGS} main_dump.o ../lib/lib.a ../generic/generic.a -o main_dump + ${CXX} main_dump.o ../lib/lib.a ../generic/generic.a -o main_dump ${LDFLAGS} reinsert: reinsert.o ../includes/cdutils.h ../includes/generic.h ../includes/yazedc.h ../lib/lib.a ../generic/generic.a Makefile ${CXX} ${LDFLAGS} reinsert.o ../lib/lib.a ../generic/generic.a -o reinsert diff --git a/Xenogears/main_dump.cpp b/Xenogears/main_dump.cpp index 60c15df..e380f7a 100644 --- a/Xenogears/main_dump.cpp +++ b/Xenogears/main_dump.cpp @@ -53,7 +53,7 @@ struct t_sequence { String title, iso_filename, prefix; unsigned long iso_size; unsigned int nb_records, nb_seqs = 0; -struct t_sequence sequences[1000]; +struct t_sequence sequences[100]; long check_iso(Handle * f_iso); void read_files(Handle * f_iso); @@ -62,7 +62,7 @@ int process_def_file(Handle * f_def); Byte user_data[2352]; -int main(int argc, char **argv) +int Main(int argc, char **argv) { Handle * f_def, * f_iso; @@ -266,3 +266,11 @@ void file_dump(Handle * f_iso, unsigned long debut, unsigned long taille, long n delete f_out; printm(M_BARE, " (*) Dumped file number %4ld - type \"" + sequences[seq].name + "\" \r", num); } + +int main(int argc, char ** argv) { + try { + Main(argc, argv); + } catch (GeneralException e) { + fprintf(stderr, "Main got an unexpected exception: %s\n", e.GetMsg()); + } +} @@ -1,22 +1,22 @@ #include <stdio.h> #include <stdlib.h> -#include "fileutils.h" +#include "Input.h" #define THRESHOLD 20480 int main(int argc, char ** argv) { unsigned int p = strtol(argv[1], 0, 0); char * fn = argv[2]; - FILE * f = fopen(fn, "r+"); + Handle * f = new Input(fn); if (!f) { printf("Bleeh.\n"); exit(-1); } - int l = filesize(f), i; + int l = f->GetSize(), i; char * b = (char *) malloc(l); - fread(b, 1, l, f); + f->read(b, l); for (i = 0; i < l - 3; i++) { unsigned int r = *((unsigned int *) &(b[i])); @@ -25,5 +25,5 @@ int main(int argc, char ** argv) { } } - fclose(f); + delete f; } diff --git a/cd-tool.cpp b/cd-tool.cpp index 4b601ba..9f10eaa 100644 --- a/cd-tool.cpp +++ b/cd-tool.cpp @@ -25,9 +25,10 @@ #include <fcntl.h> #include <string.h> #include <unistd.h> +#include "Input.h" +#include "Output.h" #include "cdutils.h" #include "generic.h" -#include "fileutils.h" int lga = 0; struct option long_options[] = { @@ -58,7 +59,7 @@ void showhelp(void) { int main(int argc, char ** argv) { int type = GUESS, c, size, force = 0, sector; - int iso_r, iso_w; + Handle * iso_r, * iso_w = 0; char * ppf = 0, * iso_name = 0, * arg1 = 0, * arg2 = 0, * f; verbosity = M_WARNING; @@ -90,17 +91,14 @@ int main(int argc, char ** argv) { iso_name = argv[optind++]; - if ((iso_r = open(iso_name, O_RDONLY)) < 0) { - printm(M_ERROR, "Failed to open %s for reading.\n", iso_name); - exit(-1); - } - if (argc == optind) { showhelp(); printm(M_ERROR, "Need a command to execute.\n"); exit(-1); } + iso_r = new Input(iso_name); + get_iso_infos(iso_r); if (!strcmp(argv[optind], "infos")) { @@ -113,6 +111,7 @@ int main(int argc, char ** argv) { if ((argc - 1) != optind) { showhelp(); printm(M_ERROR, "printdir needs one argument.\n"); + delete iso_r; exit(-1); } arg1 = argv[optind]; @@ -120,85 +119,87 @@ int main(int argc, char ** argv) { free(f); if (!dir.R) { printm(M_ERROR, "Path %s was not found on iso.\n", arg1); + delete iso_r; exit(-1); } if (!(dir.Flags & 2)) { printm(M_ERROR, "Path %s design a file and not a directory.\n", arg1); + delete iso_r; exit(-1); } show_head_entry(); show_dir(iso_r, &dir); } else if (!strcmp(argv[optind], "extract-file")) { struct DirEntry dir; - int file; + Handle * file; optind++; if ((argc - 2) != optind) { showhelp(); printm(M_ERROR, "extract-file needs two arguments.\n"); + delete iso_r; exit(-1); } arg1 = argv[optind++]; arg2 = argv[optind++]; - if ((file = open(arg1, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { - printm(M_ERROR, "Failed to open file %s for writing.\n", arg1); - exit(-1); - } + file = new Output(arg1); dir = find_path(iso_r, f = strdup(arg2)); free(f); if (!dir.R) { printm(M_ERROR, "Path %s was not found on iso.\n", arg2); + delete iso_r; + delete file; exit(-1); } printm(M_STATUS, "Reading path %s to file %s.\n", arg2, arg1); read_file(iso_r, file, type, dir.Sector, dir.Size); + delete file; } else if (!strcmp(argv[optind], "extract")) { - int file; + Handle * file; optind++; if ((argc - 3) != optind) { showhelp(); printm(M_ERROR, "extract needs three arguments.\n"); + delete iso_r; exit(-1); } arg1 = argv[optind++]; size = atoi(argv[optind++]); sector = atoi(argv[optind++]); - if ((file = open(arg1, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { - printm(M_ERROR, "Failed to open file %s for writing.\n", arg1); - exit(-1); - } + file = new Output(arg1); printm(M_STATUS, "Reading %i bytes from sector %i to file %s.\n", size, sector, arg1); read_file(iso_r, file, type, sector, size); + delete file; } else if (!strcmp(argv[optind], "insert-file")) { struct DirEntry dir, * d; unsigned char * buffer; - int file; + Handle * file; int old_type; - if ((iso_w = open(iso_name, O_WRONLY)) < 0) { - printm(M_ERROR, "Failed to open %s for writing.\n", iso_name); - exit(-1); - } - lseek(iso_w, 0, SEEK_SET); if (ppf) { if (open_ppf(ppf, iso_r, "Created by CD-Tool") < 0) { printm(M_ERROR, "Failed to open file %s for writing.\n", ppf); } + } else { + iso_w = new Output(iso_name, 0, 0); } optind++; if ((argc - 2) != optind) { showhelp(); printm(M_ERROR, "insert-file needs two arguments.\n"); + delete iso_r; + if (ppf) { + close_ppf(); + } else { + delete iso_w; + } exit(-1); } arg1 = argv[optind++]; arg2 = argv[optind++]; - if ((file = open(arg1, O_RDONLY)) < 0) { - printm(M_ERROR, "Failed to open file %s for reading.\n", arg1); - exit(-1); - } + file = new Input(arg1); dir = find_path(iso_r, f = strdup(arg2)); free(f); if (!dir.R) { @@ -212,11 +213,18 @@ int main(int argc, char ** argv) { type = old_type; } if (((dir.Size / sec_sizes[old_type]) + ((dir.Size % sec_sizes[old_type]) ? 1 : 0)) < - ((filesize(file) / sec_sizes[type]) + ((filesize(file) % sec_sizes[type]) ? 1 : 0))) { + (((size_t) file->GetSize() / sec_sizes[type]) + (((size_t) file->GetSize() % sec_sizes[type]) ? 1 : 0))) { if (force) { - printm(M_WARNING, "New file too big: %i vs %i in %s.\n", dir.Size, filesize(file), sec_modes[type]); + printm(M_WARNING, "New file too big: %i vs %i in " + sec_modes[type] + ".\n", dir.Size, file->GetSize()); } else { - printm(M_ERROR, "New file too big: %i vs %i in %s.\n", dir.Size, filesize(file), sec_modes[type]); + printm(M_ERROR, "New file too big: %i vs %i in " + sec_modes[type] + ".\n", dir.Size, file->GetSize()); + delete iso_r; + if (ppf) { + close_ppf(); + } else { + delete iso_w; + } + delete file; exit(-1); } } @@ -231,43 +239,57 @@ int main(int argc, char ** argv) { f = arg2; } d = find_dir_entry(iso_r, &buffer, &dir, f); - d->Size = filesize(file); + d->Size = file->GetSize(); write_datas(iso_r, iso_w, buffer, GUESS, dir.Sector, dir.Size); free(buffer); - } else if (!strcmp(argv[optind], "insert")) { - int file; - if ((iso_w = open(iso_name, O_WRONLY)) < 0) { - printm(M_ERROR, "Failed to open %s for writing.\n", iso_name); - exit(-1); + delete file; + if (ppf) { + close_ppf(); + } else { + delete iso_w; } - lseek(iso_w, 0, SEEK_SET); + } else if (!strcmp(argv[optind], "insert")) { + Handle * file; if (ppf) { if (open_ppf(ppf, iso_r, "Created by CD-Tool") < 0) { printm(M_ERROR, "Failed to open file %s for writing.\n", ppf); } + } else { + iso_w = new Output(iso_name, 0, 0); } optind++; if ((argc - 2) != optind) { showhelp(); printm(M_ERROR, "insert needs two arguments.\n"); + if (ppf) { + close_ppf(); + } else { + delete iso_w; + } + delete iso_r; exit(-1); } arg1 = argv[optind++]; sector = atoi(argv[optind++]); - if ((file = open(arg1, O_RDONLY)) < 0) { - printm(M_ERROR, "Failed to open file %s for reading.\n", arg1); - exit(-1); - } + file = new Input(arg1); printm(M_STATUS, "Writing file %s at sector %i.\n", arg1, sector); write_file(iso_r, iso_w, file, type, sector); + if (ppf) { + close_ppf(); + } else { + delete iso_w; + } + delete file; } else { showhelp(); printm(M_ERROR, "Command %s unknow.\n", argv[optind]); + delete iso_r; exit(-1); } + delete iso_r; exit(0); } diff --git a/crypto-search.cpp b/crypto-search.cpp index 8775095..4ece311 100644 --- a/crypto-search.cpp +++ b/crypto-search.cpp @@ -23,11 +23,12 @@ #include <string.h> #include <unistd.h> #include "generic.h" -#include "fileutils.h" +#include "Input.h" int main(int argc, char ** argv) { - int h, size, mind, maxd, delta, len, i, j; + int size, mind, maxd, delta, len, i, j; char * buffer, * str; + Handle * h; if (argc != 3) { printm(M_BARE, "Usage: %s <inputfile> <needle>\n", argv[0]); @@ -36,23 +37,21 @@ int main(int argc, char ** argv) { verbosity = M_INFO; - if ((h = open(argv[1], O_RDONLY)) < 0) { - printm(M_ERROR, "Unable to open file %s\n", argv[1]); - exit(-1); - } + h = new Input(argv[1]); str = argv[2]; - size = filesize(h); + size = h->GetSize(); printm(M_STATUS, "Requesting memory (%i bytes)\n", size); if (!(buffer = (char *) malloc(size))) { printm(M_ERROR, "Not enough memory.\n"); + delete h; exit(-1); } printm(M_STATUS, "Loading file...\n"); - read(h, buffer, size); + h->read(buffer, size); printm(M_STATUS, "Done, initialising the search.\n"); len = strlen(argv[2]); @@ -88,4 +87,6 @@ int main(int argc, char ** argv) { } } } + + delete h; } diff --git a/dtemain.cpp b/dtemain.cpp index c044c79..ec60509 100644 --- a/dtemain.cpp +++ b/dtemain.cpp @@ -21,28 +21,28 @@ #include <unistd.h> #include <stdlib.h> #include <string.h> -#include "fileutils.h" +#include "Input.h" #include "generic.h" #include "dte.h" int main(int argc, char ** argv) { - FILE * f, * t; + Handle * f, * t; long old_size; int i; verbosity = M_INFO; printm(M_STATUS, "Reading thingy table\n"); - t = fopen(argv[2], "r"); + t = new Input(argv[2]); read_thingy(t); - fclose(t); + delete t; - f = fopen(argv[1], "r"); - dte_text_size = filesize(f); + f = new Input(argv[1]); + dte_text_size = f->GetSize(); dte_text = (char *) calloc(dte_text_size + 4, 1); printm(M_STATUS, "Reading file, size = %li\n", dte_text_size); read_thingy_file(f); - fclose(f); + delete f; printm(M_STATUS, "True size = %li\n", old_size = dte_text_size); @@ -50,11 +50,11 @@ int main(int argc, char ** argv) { dte_compress(); printm(M_STATUS, "Rereading file.\n"); - f = fopen(argv[1], "r"); - dte_text_size = filesize(f); + f = new Input(argv[1]); + dte_text_size = f->GetSize(); dte_text = (char *) calloc(dte_text_size + 4, 1); read_thingy_file(f); - fclose(f); + delete f; printm(M_STATUS, "True size = %li, real gain = %li\n", dte_text_size, old_size - dte_text_size); diff --git a/generic/Exceptions.cpp b/generic/Exceptions.cpp index f24c0fb..b7c00a6 100644 --- a/generic/Exceptions.cpp +++ b/generic/Exceptions.cpp @@ -3,6 +3,10 @@ #include <string.h> #include <errno.h> #include <stddef.h> +#include <glib.h> +#ifdef DEBUG +#include <iostream> +#endif #include "String.h" #include "Exceptions.h" #include "generic.h" @@ -82,36 +86,26 @@ void * xmalloc(size_t s) throw (GeneralException) { return 0; } - if (!(r = (char *) ::malloc(s + 2 * sizeof(size_t)))) { - throw MemoryException(s + 2 * sizeof(size_t)); + if (!(r = (char *) ::malloc(s))) { + throw MemoryException(s); } +#ifdef DEBUG + fprintf(stderr, "Allocating %i bytes of memory, got it at %p\n", s, r); +#endif - memset(r, 0, s + 2 * sizeof(size_t)); + memset(r, 0, s); - *((size_t *)r) = s; - *(((size_t *)r) + 1) = 0xdeedbeef; - - return (void *)(r + 2 * sizeof(size_t)); + return (void *)(r); } void * xrealloc(void * ptr, size_t s) { - char * r; - size_t os; - - if (!ptr) { - return xmalloc(s); - } - - os = *(((size_t *) ptr) - 1); - - r = (char *) xmalloc(s); - - if (s) { - memcpy(r, ptr, MIN(s, os)); - } - - xfree(ptr); +#ifdef DEBUG + void * r = realloc(ptr, s); + fprintf(stderr, "Reallocating pointer at %p for %i bytes, now at %p\n", ptr, s, r); return r; +#else + return realloc(ptr, s); +#endif } #ifdef OVER_FREE @@ -123,12 +117,11 @@ void xfree(void *& p) { } void xfree(char *& p) { +#ifdef DEBUG + fprintf(stderr, "Freeing pointer at %p\n", p); +#endif if (p) { - if (*(((size_t *)p) - 1) != 0xdeedbeef) { - fprintf(stderr, "Error: trying to xfree() a non xmalloc()ed bloc.\n"); - exit(-1); - } - ::free(p - 2 * sizeof(size_t)); + ::free(p); p = 0; } } diff --git a/generic/Input.cpp b/generic/Input.cpp index b7ee99c..d415279 100644 --- a/generic/Input.cpp +++ b/generic/Input.cpp @@ -16,18 +16,23 @@ Input::Input(const String & no) throw (GeneralException) : Handle(no.strlen() ? open(no.to_charp(), O_RDONLY) : dup(0)), n(no) { + +#ifdef DEBUG + fprintf(stderr, "Opening file %s, Input at %p\n", no.to_charp(), this); +#endif + if (GetHandle() < 0) { throw IOGeneral(String(_("Error opening file ")) + no + _(" for reading: ") + strerror(errno)); } - size = lseek(GetHandle(), 0, SEEK_END); - lseek(GetHandle(), 0, SEEK_SET); - struct stat s; - fstat(GetHandle(), &s); - date_modif = s.st_mtime; + + if (S_ISREG(s.st_mode)) { + size = seek(0, SEEK_END); + seek(0, SEEK_SET); + } } Input::Input(const Input & i) : Handle(i), n(i.n), size(i.size), date_modif(i.date_modif) { @@ -63,11 +68,11 @@ time_t Input::GetModif() { off_t Input::seek(off_t offset, int whence) throw (GeneralException) { if ((itell = lseek(GetHandle(), offset, whence)) < 0) { - throw IOGeneral(String(_("Error seeking file ")) + n + _(": ") + strerror(errno)); + throw IOGeneral(String(_("Error seeking file ")) + GetName() + _(": ") + strerror(errno)); } #ifdef PARANOID_SEEK if (itell != lseek(GetHandle(), 0, SEEK_CUR)) { - throw IOGeneral(String(_("Error seeking file ")) + n + _(": the position does not match")); + throw IOGeneral(String(_("Error seeking file ")) + GetName() + _(": the position does not match")); } #endif return itell; diff --git a/generic/Makefile b/generic/Makefile index 4ca5e32..7107501 100755 --- a/generic/Makefile +++ b/generic/Makefile @@ -1,6 +1,6 @@ #!/usr/bin/make -f -CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -I../includes -DPARANOID_SEEK -DHAVE_ZLIB +CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -I../includes -DPARANOID_SEEK -DHAVE_ZLIB `pkg-config --cflags glib-2.0` CXX=g++ CC=gcc diff --git a/generic/Output.cpp b/generic/Output.cpp index e136524..1d7981e 100644 --- a/generic/Output.cpp +++ b/generic/Output.cpp @@ -14,7 +14,11 @@ #endif Output::Output(String no, int create, int trunc) throw (GeneralException) : - Handle(no.strlen() ? open(no.to_charp(), O_WRONLY | (O_CREAT * (create ? 1 : 0)) | (trunc ? O_TRUNC : O_APPEND), 00666) : dup(1)), + Handle(no.strlen() ? open(no.to_charp(), O_WRONLY | (O_CREAT * (create ? 1 : 0)) | (trunc ? O_TRUNC : O_APPEND) +#ifdef __linux__ +, 00666 +#endif +) : dup(1)), n(no) { if (GetHandle() < 0) { throw IOGeneral(String(_("Error opening file ")) + no + _(" for writing: ") + strerror(errno)); diff --git a/generic/String.cpp b/generic/String.cpp index c389c13..22d77d6 100644 --- a/generic/String.cpp +++ b/generic/String.cpp @@ -14,7 +14,11 @@ extern "C" { char String::t[BUFSIZ + 1]; -String::String(const String & s) : str(Base::strdup(s.str)), siz(s.siz) { } +String::String(const String & s) : str(Base::strdup(s.str)), siz(s.siz) { +#ifdef DEBUG + fprintf(stderr, "Duplicating string `%s', from %p to %p\n", str, s.str, str); +#endif +} String::String(char c) : siz(1) { char * t = (char *) malloc(2); @@ -23,8 +27,17 @@ String::String(char c) : siz(1) { str = t; } +String::String(const char * s) : str(Base::strdup(s)), siz(::strlen(str)) { +#ifdef DEBUG + fprintf(stderr, "Creating a string with `%s' at %p\n", str, str); +#endif +} + +#if 0 String::String(const char * s, ...) { va_list ap; + + fprintf(stderr, "Creating a String with s = '%s'\n", s); /* This causes a warning: cannot pass objects of type `const String' through `...' but it is not really a problem. */ @@ -33,7 +46,8 @@ String::String(const char * s, ...) { str = Base::strdup(t); va_end(ap); siz = ::strlen(str); -} +} +#endif String::String(int hs, const char * s) : str(s ? Base::strdup(s) : Base::strdup("")), siz(hs) { } diff --git a/includes/String.h b/includes/String.h index 7b5fdc4..af97d2b 100644 --- a/includes/String.h +++ b/includes/String.h @@ -9,7 +9,10 @@ class String : public Base { public: String(const String &); + String(const char * = ""); +#if 0 String(const char * = "", ...); +#endif String(char); String(int); String(unsigned int); diff --git a/includes/cdutils.h b/includes/cdutils.h index fa44ca6..e3cf8fb 100644 --- a/includes/cdutils.h +++ b/includes/cdutils.h @@ -56,14 +56,15 @@ extern long sec_sizes[]; extern long sec_offsts[]; extern String sec_modes[]; -Handle * open_ppf(String ppf, Handle * iso, char * comment); +Handle * open_ppf(String ppf, Handle * iso, String comment) throw(GeneralException); +void close_ppf() throw(GeneralException); unsigned short int swap_word(unsigned short int i); unsigned long int swap_dword(unsigned long int i); int guess_type(Handle * f_iso, int number); void sector_seek(Handle * f_iso, long sector); long read_sector(Handle * f_iso, Byte * buffer, int type, int number = -1); void read_datas(Handle * f_iso, Byte * buffer, int type, int number, long size); -void read_Handle(Handle * f_iso, Handle * Handle, int type, int number, long size); +void read_file(Handle * f_iso, Handle * Handle, int type, int number, long size); void write_sector(Handle * f_iso_r, Handle * f_iso_w, Byte * buffer, int type, int number = -1); void write_datas(Handle * f_iso_r, Handle * f_iso_w, Byte * buffer, int type, int number, long size); void write_file(Handle * f_iso_r, Handle * f_iso_w, Handle * Handle, int type, int number = -1); diff --git a/includes/dte.h b/includes/dte.h index 267e9ed..3be7f9c 100644 --- a/includes/dte.h +++ b/includes/dte.h @@ -4,10 +4,10 @@ void dte_reset(void); void build_dte(void); void push_entry(long entry); -char * read_line(FILE * f, char * b); +char * read_line(Handle * f, char * b); void dte_compress(); -void read_thingy(FILE * f); -void read_thingy_file(FILE * f); +void read_thingy(Handle * f); +void read_thingy_file(Handle * f); extern char * dte_text; extern char * things[256]; diff --git a/includes/generic.h b/includes/generic.h index 9c5b7a4..5586953 100644 --- a/includes/generic.h +++ b/includes/generic.h @@ -33,8 +33,13 @@ #define bcopy(x,y,z) memcpy((y),(x),(z)) #endif +#ifndef MAX #define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#ifndef MAX #define MAX(a,b) ((a)<(b)?(b):(a) +#endif #ifndef SDL_VERSIONNUM typedef unsigned long int Uint32; diff --git a/lib/Makefile b/lib/Makefile index e5a1b85..c351a36 100755 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,9 +1,9 @@ #!/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++ -OBJECTS = cdutils.o lzss.o yazedc.o +OBJECTS = cdutils.o lzss.o yazedc.o dteutils.o TARGET = lib.a all: ${TARGET} diff --git a/lib/cdutils.cpp b/lib/cdutils.cpp index e4d7749..1049535 100644 --- a/lib/cdutils.cpp +++ b/lib/cdutils.cpp @@ -60,10 +60,12 @@ unsigned long from_MSF(unsigned long msf, unsigned long start) { return from_MSF(m, s, f, start); } -Output * open_ppf(String ppf, Handle * iso, String comment) { +Handle * open_ppf(String ppf, Handle * iso, String comment) throw (GeneralException) { int i, l; Byte buffer[1024]; + if (ppf_file) + throw GeneralException("Tried to open_ppf() while already opened."); ppf_file = new Output(ppf); ppf_file->write("PPF20\001", 6); @@ -112,6 +114,15 @@ void write_ppf(Byte * old_sec, Byte * new_sec, int sec_num) { } } +void close_ppf() throw (GeneralException) { + if (ppf_file) { + delete ppf_file; + ppf_file = 0; + } else { + throw GeneralException("Tried to close_ppf() without previous opening"); + } +} + String format_date(String input) { String output; @@ -162,7 +173,7 @@ int guess_type(Handle * f_iso, int number) { } void sector_seek(Handle * f_iso, long sector) { - f_iso->seek(2336 * sector); + f_iso->seek(2352 * sector); } long read_sector(Handle * f_iso, Byte * buffer, int type, int number) { diff --git a/lib/dteutils.cpp b/lib/dteutils.cpp index 6c8dcc4..0f52667 100644 --- a/lib/dteutils.cpp +++ b/lib/dteutils.cpp @@ -208,28 +208,6 @@ void push_entry(long entry) { } } -String read_line(Handle * f, String b) { - int r, pos = 0; - - while (!feof(f)) { - if ((r = fgetc(f)) == EOF) - break; - if (r == 0x0d) { - if ((r = fgetc(f)) == EOF) - break; - } - if (r == 0x0a) { - b[pos] = 0; - return b; - } - b[pos++] = r; - } - - b[pos] = 0; - - return b; -} - void dte_compress() { int i, j; char c1, c2; @@ -262,26 +240,24 @@ void dte_compress() { } void read_thingy(Handle * f) { - char line[256], * st, * thing; + String line, st, thing; long code; int i; - st = line + 2; - thing = line + 5; - line[0] = '0'; - line[1] = 'x'; - dte_size = 0; for (i = 0; i < 256; i++) { dte_entries[i] = -1; } - while (!feof(f)) { - if (strlen(read_line(f, st))) { - line[4] = 0; - sscanf(line, "%li", &code); - switch (strlen(thing)) { + while (1) { + line = "0x"; + *f >> st; + if (st.strlen()) { + line += st.extract(0, 1); + code = line.to_int(); + thing = st.extract(3); + switch (thing.strlen()) { case 0: dte_size++; dte_entries[code] = 0; @@ -289,7 +265,7 @@ void read_thingy(Handle * f) { case 1: alloweds[code] = 1; default: - things[code] = strdup(thing); + things[code] = thing; thingtree::addstring(thing, code); } } @@ -297,40 +273,41 @@ void read_thingy(Handle * f) { } void read_thingy_file(Handle * f) { - char line[10240], * p, * c, trans[5]; + String line, trans; long code; - int ptr = 0, i; + int ptr = 0, i, c; for (i = 0; i < 256; i++) { dte_usage[i] = 0; } - while (!feof(f)) { - if (!strlen(p = read_line(f, line))) + while (1) { + *f >> line; + if (!line.strlen()) continue; - while (*p) { - if (*p == '<') { - if (!(c = strchr(p, '>'))) { + i = 0; + while (line[i]) { + if (line[i] == '<') { + if ((c = line.strchr('>', i)) < 0) { printm(M_ERROR, "Error in file: '<' not closed.\n"); exit(-1); } - p++; - if ((c - p) == 2) { - *c = 0; - sprintf(trans, "0x%s", p); - sscanf(trans, "%li", &code); + i++; + if (c == 2) { + trans = "0x" + line.extract(i, 2); + code = line.to_int(); dte_text[ptr++] = code; printm(M_BARE, "0x%02x-", code); } else { - printm(M_BARE, "Unknow %s-", p); + printm(M_BARE, "Unknow " + trans.extract(2) + "-"); } - p = c + 1; + i += c; } else { - if ((code = thingtree::look(p)) == -1) + if ((code = thingtree::look(line.extract(i))) == -1) exit(-1); dte_text[ptr++] = code; - p += strlen(things[code]); - printm(M_BARE, "%s-", things[code]); + i += things[code].strlen(); + printm(M_BARE, things[code] + "-"); dte_usage[code]++; } } diff --git a/lzss-main.cpp b/lzss-main.cpp index 0d08cba..0a4a446 100644 --- a/lzss-main.cpp +++ b/lzss-main.cpp @@ -21,15 +21,15 @@ #include <stdlib.h> #include <string.h> #include <getopt.h> -#include <iostream> -#include "fileutils.h" +#include "Input.h" +#include "Output.h" #include "generic.h" #include "lzss.h" char * fn1, * fn2, * pname; int lga = 0; -int compress = 1; +int lzsscompress = 1; struct option long_options[] = { {"1iscomp", 1, &lga, 1 }, @@ -96,7 +96,7 @@ void showhelp(void) { "If you don't know what they are, forget them.\n" "\n" "Default behavior is to %scompress.\n" -"\n", pname, pname, pname, pname, compress ? "" : "de"); +"\n", pname, pname, pname, pname, lzsscompress ? "" : "de"); } void showscheme(void) { @@ -146,7 +146,7 @@ void dump(void) { int main(int argc, char ** argv) { long length = -1; - FILE * f1, * f2; + Handle * f1, * f2; int p, show = 0; int c, s, t; @@ -156,7 +156,7 @@ int main(int argc, char ** argv) { verbosity = M_STATUS; if (!strcasecmp(pname + p, "dlzss")) { - compress = 0; + lzsscompress = 0; } printm(M_BARE, /* @@ -317,10 +317,10 @@ LZSS_MAIN " compressor/decompressor version " LZSS_VERSION ",\n" */ exit(0); break; case 'd': - compress = 0; + lzsscompress = 0; break; case 'c': - compress = 1; + lzsscompress = 1; break; case 'b': blockb = 1; @@ -347,21 +347,17 @@ LZSS_MAIN " compressor/decompressor version " LZSS_VERSION ",\n" */ fn1 = argv[optind++]; fn2 = argv[optind++]; - if (!(f1 = fopen(fn1, "r"))) { - printm(M_ERROR, "Error opening file %s for reading.\n", fn1); - } + f1 = new Input(fn1); - if (!(f2 = fopen(fn2, "w"))) { - printm(M_ERROR, "Error opening file %s for writing.\n", fn2); - } + f2 = new Output(fn2); - if (compress) { + if (lzsscompress) { printm(M_STATUS, "Compressing `%s' to `%s'...\n", fn1, fn2); } else { printm(M_STATUS, "Decompressing `%s' to `%s'...\n", fn1, fn2); } - if (compress) { + if (lzsscompress) { if (length == -1) { lzss_comp(f1, f2); } else { @@ -371,14 +367,14 @@ LZSS_MAIN " compressor/decompressor version " LZSS_VERSION ",\n" */ length = lzss_decomp(f1, f2, length); } - printm(M_STATUS, "Done, filesize changed from %i to %i.\n", filesize(f1), filesize(f2)); + printm(M_STATUS, "Done, filesize changed from %i to %i.\n", f1->GetSize(), f2->GetSize()); if (!bitmap_count) bitmap_count = 8; - if (compress) + if (lzsscompress) printm(M_STATUS, "Compressed %i = 0x%08x blocs, containing %i = 0x%08x chunks.\n", blk + 1, blk + 1, blk * 8 + bitmap_count, blk * 8 + bitmap_count); - fclose(f1); - fclose(f2); + delete f1; + delete f2; exit(0); } diff --git a/str-player.cpp b/str-player.cpp index 223270c..7d9f47b 100644 --- a/str-player.cpp +++ b/str-player.cpp @@ -2,8 +2,8 @@ #include <string.h> #include <SDL/SDL.h> #include <SDL/SDL_audio.h> +#include "Input.h" #include "psxdev/bs.h" -#include "fileutils.h" #include "generic.h" #include "cdutils.h" #include "psxdev/xadecode.h" @@ -64,11 +64,11 @@ void mixaudio(void *unused, Uint8 *stream, int len) { audio_len -= len; } -void process_one_sector(FILE * f) { +void process_one_sector(Handle * f) { Byte sector[2336]; STR_Header * h; - fread(sector, 2336, 1, f); + f->read(sector, 2336); h = (STR_Header *) ((Byte *) sector + 8); // printm(M_INFO, "SubHeader: FN = %x, CN = %x, SM = %x, CI = %x: ", sector[0], sector[1], sector[2], sector[3]); /* @@ -184,6 +184,8 @@ void process_one_sector(FILE * f) { } int main(int argc, char ** argv) { + Handle * file = 0; + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0) { printm(M_ERROR, "Couldn't initialise SDL: %s\n", SDL_GetError()); exit(-1); @@ -194,18 +196,18 @@ int main(int argc, char ** argv) { switch (argc) { case 1: + file = &Stdin; break; case 2: - fclose(stdin); - stdin = fopen(argv[1], "r"); + file = new Input(argv[1]); break; default: printm(M_ERROR, "Too much arguments.\n"); exit(-1); } - while (!feof(stdin)) { - process_one_sector(stdin); + while (1) { + process_one_sector(file); } if (!audio) |