summaryrefslogtreecommitdiff
path: root/src/tools/ffread.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/ffread.c')
-rw-r--r--src/tools/ffread.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/tools/ffread.c b/src/tools/ffread.c
new file mode 100644
index 0000000..0206229
--- /dev/null
+++ b/src/tools/ffread.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "util.h"
+
+int main(int argc, char *argv[])
+{
+ FILE *fp;
+ unsigned char id[4];
+ char cdir[560];
+ int nfiles;
+ int off;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s <file.ffl>\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ fp = fopen(argv[1], "rb");
+ if (fp == NULL) {
+ fprintf(stderr, "unable to open %s\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
+
+ fread(id, 1, 4, fp);
+ if ((id[0] != 'R') || (id[1] != 'F') | (id[2] != 'F') | (id[3] != 'L')) {
+ fprintf(stderr, "%s is not a valid RFFL file\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
+
+ if (ReadInt32L(fp) != 0x0000) {
+ fprintf(stderr, "%s is not a version 0000 RFFL file\n", argv[1]);
+ exit(EXIT_FAILURE);
+ }
+
+ nfiles = ReadInt32L(fp);
+
+ off = ReadInt32L(fp) + 20;
+ ReadInt32L(fp);
+
+ //if (getcwd(cdir, sizeof(cdir)) == NULL) {
+ // fprintf(stderr, "your cwd is too long...\n");
+ // exit(EXIT_FAILURE);
+ //}
+
+ while (nfiles--) {
+ FILE *ofp;
+ char name[512], *nptr;
+ int i, j;
+ int c;
+
+ int offset = ReadInt32L(fp);
+ int length = ReadInt32L(fp);
+ int pffset;
+
+ j = 0;
+ do {
+ for (i = 0; i < 4; i++, j++) {
+ c = fgetc(fp);
+ name[j] = c;
+
+ if (c == 0) break;
+ }
+
+ } while (c != 0);
+ for (; i < 3; i++) fgetc(fp);
+
+ printf("Filename: %s (%d, %d)\n", name, offset, length);
+
+ pffset = ftell(fp);
+
+ for (j = 0, nptr = &name[0]; name[j]; j++)
+ if (name[j] == '\\')
+ nptr = &name[j+1];
+
+ fseek(fp, off+offset, SEEK_SET);
+
+ ofp = fopen(nptr, "wb");
+
+ for (i = 0; i < length; i++)
+ fputc(fgetc(fp), ofp);
+
+ fclose(ofp);
+
+ fseek(fp, pffset, SEEK_SET);
+
+ }
+
+ fclose(fp);
+
+ return 0;
+}