summaryrefslogtreecommitdiff
path: root/VP
diff options
context:
space:
mode:
Diffstat (limited to 'VP')
-rwxr-xr-xVP/Makefile5
-rw-r--r--VP/search-script.cpp73
2 files changed, 77 insertions, 1 deletions
diff --git a/VP/Makefile b/VP/Makefile
index 9e723d3..13a540e 100755
--- a/VP/Makefile
+++ b/VP/Makefile
@@ -3,7 +3,7 @@
CPPFLAGS=-Wall -g -O3 -mcpu=i686 -pedantic -pedantic-errors -Werror -I..
CXX=g++
-TARGET = main_dump VP-CD1.sqr decomp-slz unarc
+TARGET = main_dump VP-CD1.sqr decomp-slz unarc search-script
all: ${TARGET}
@@ -16,6 +16,9 @@ decomp-slz: decomp-slz.o ../fileutils.o ../fileutils.h ../generic.o ../generic.h
unarc: unarc.o ../fileutils.o ../fileutils.h ../generic.o ../generic.h Makefile
${CXX} ${LDFLAGS} unarc.o ../fileutils.o ../generic.o -o unarc
+search-script: search-script.o ../fileutils.o ../fileutils.h ../generic.o ../generic.h Makefile
+ ${CXX} ${LDFLAGS} search-script.o ../fileutils.o ../generic.o -o search-script
+
clean:
rm -f *.o ${TARGET}
diff --git a/VP/search-script.cpp b/VP/search-script.cpp
new file mode 100644
index 0000000..263bc49
--- /dev/null
+++ b/VP/search-script.cpp
@@ -0,0 +1,73 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "fileutils.h"
+#include "generic.h"
+
+#define THRESHOLD 2000
+
+int main(int argc, char ** argv) {
+ int h, n, o, i, p, c, pp, b;
+
+ verbosity = M_INFO;
+
+ if (argc != 2) {
+ printm(M_BARE, "Usage: search-script <file>\n");
+ exit(-1);
+ }
+
+ if ((h = open(argv[1], O_RDONLY)) < 0) {
+ printm(M_ERROR, "Error opening file %s\n", argv[1]);
+ exit(-1);
+ }
+
+ printm(M_STATUS, "Reading informations...\n");
+
+ read(h, &n, 4);
+
+ o = n;
+
+ n -= 4;
+ n /= 8;
+
+ printm(M_INFO, "Script claims to have %i texts.\n", n);
+
+ if (n > THRESHOLD) {
+ printm(M_ERROR, "Too much texts to make sense.\n");
+ exit(-1);
+ }
+
+ printm(M_STATUS, "Reading index.\n");
+
+ pp = -1;
+ for (i = 0; i < n; i++) {
+ lseek(h, i * 8 + 4, SEEK_SET);
+ read(h, &c, 4);
+ read(h, &p, 4);
+ printm(M_INFO, "Index #%i has pointer %i and counter %i\n", i, p, c);
+ if (pp > p) {
+ printm(M_ERROR, "Script's text overlapping.\n");
+ exit(-1);
+ }
+
+ if (((unsigned int)(p + o)) > filesize(h)) {
+ printm(M_ERROR, "Text bigger than script.\n");
+ exit(-1);
+ }
+
+ lseek(h, p + o - 1, SEEK_SET);
+ b = 0;
+ read(h, &b, 1);
+
+ if (b) {
+ printm(M_ERROR, "Byte before the pointer is not 0 (%i = 0x%02x)\n", b, b);
+ exit(-1);
+ }
+
+ pp = p;
+ }
+
+ printm(M_STATUS, "Script seems ok to me.\n");
+
+ exit(0);
+}