// "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman // Ken Silverman's official web site: "http://www.advsys.net/ken" // See the included license file "BUILDLIC.TXT" for license info. // // This file has been modified from Ken Silverman's original release // by Jonathon Fowler (jf@jonof.id.au) #include "compat.h" #include "kplib.h" #include #define MAXFILES 4096 static char buf[65536]; static int numfiles, anyfiles4extraction; static char marked4extraction[MAXFILES]; static char filelist[MAXFILES][16]; static int fileoffs[MAXFILES+1], fileleng[MAXFILES]; void findfiles(const char *dafilespec) { char t[13]; int i; for(i=numfiles-1;i>=0;i--) { memcpy(t,filelist[i],12); t[12] = 0; if (Bwildmatch(t,dafilespec)) { marked4extraction[i] = 1; anyfiles4extraction = 1; } } } int main(int argc, char **argv) { int i, j, k, l, fil, fil2; struct Bstat stbuf; int onlylist = (argc==2); if (argc < 2) { Bprintf("KEXTRACT [@file or filespec...] by Kenneth Silverman\n"); Bprintf(" This program extracts files from a previously grouped group file.\n"); Bprintf(" You can extract files using the ? and * wildcards.\n"); Bprintf(" Ex: kextract stuff.dat tiles000.art nukeland.map palette.dat\n"); Bprintf(" (stuff.dat is the group file, the rest are the files to extract)\n"); Bprintf(" kextract stuff.grp\n"); Bprintf(" (simply lists the contents of stuff.grp)\n"); return(0); } if ((fil = Bopen(argv[1],BO_BINARY|BO_RDONLY,BS_IREAD)) == -1) { Bprintf("Error: %s could not be opened\n",argv[1]); return(0); } Bread(fil,buf,16); if ((buf[0] != 'K') || (buf[1] != 'e') || (buf[2] != 'n') || (buf[3] != 'S') || (buf[4] != 'i') || (buf[5] != 'l') || (buf[6] != 'v') || (buf[7] != 'e') || (buf[8] != 'r') || (buf[9] != 'm') || (buf[10] != 'a') || (buf[11] != 'n')) { Bclose(fil); Bprintf("Error: %s not a valid group file\n",argv[1]); return(0); } numfiles = *((int*)&buf[12]); numfiles = B_LITTLE32(numfiles); Bread(fil,filelist,numfiles<<4); j = 0; for(i=0;i1;i--) { if (argv[i][0] == '@') { if ((fil2 = Bopen(&argv[i][1],BO_BINARY|BO_RDONLY,BS_IREAD)) != -1) { l = Bread(fil2,buf,65536); j = 0; while ((j < l) && (buf[j] <= 32)) j++; while (j < l) { k = j; while ((k < l) && (buf[k] > 32)) k++; buf[k] = 0; findfiles(&buf[j]); j = k+1; while ((j < l) && (buf[j] <= 32)) j++; } Bclose(fil2); } } else findfiles(argv[i]); } if (anyfiles4extraction == 0) { Bclose(fil); Bprintf("No files found in group file with those names\n"); return(0); } if (Bfstat(fil, &stbuf) == -1) stbuf.st_mtime = 0; for(i=0;i