OSDN Git Service

wwww
[proj16/16.git] / 16 / v2 / source / UTIL / PACK / PACK.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 #include <stdio.h>\r
18 #include <stdlib.h>\r
19 #include <string.h>\r
20 \r
21 #define byte unsigned char\r
22 \r
23 // ================================= Data ====================================\r
24 \r
25 FILE *pack;\r
26 FILE *list;\r
27 FILE *src;\r
28 char *strbuf,*filebuf;\r
29 int numfiles,curofs;\r
30 char headertag[]="VRGPACK";\r
31 \r
32 typedef struct\r
33 {\r
34   unsigned char fname[84];            // pathname thingo\r
35   int size;                           // size of the file\r
36   int packofs;                        // where the file can be found in PACK\r
37   int count;                          // internal (engine-runtime) use\r
38   char extractable;                   // can UNPACK .. unpack it?\r
39   char override;                      // should the engine override it w/\r
40                                       // local files?\r
41 } filestruct;\r
42 \r
43 filestruct filetbl[512];\r
44 byte *ptr;\r
45 \r
46 // ================================= Code ====================================\r
47 \r
48 void CreatePackHeader()\r
49 { char a;\r
50 \r
51   fwrite(&headertag, 1, 7, pack);\r
52   a=1; fwrite(&a, 1, 1, pack);              // pack version 1\r
53   fwrite(&numfiles, 1, 4, pack);            // number of files in archive\r
54 \r
55   // Hmm.. that's it. What a boring header. :)\r
56 }\r
57 \r
58 void EncryptHeader()\r
59 { byte lastvalue; //, precodebyte;\r
60 \r
61   ptr=(byte *) filetbl;\r
62   lastvalue=*ptr;\r
63   ptr++;\r
64 \r
65   while (ptr < (byte *) (int) filetbl + (int) 5120)\r
66   {\r
67     (*ptr)+=lastvalue;\r
68     lastvalue=*ptr;\r
69     ptr++;\r
70   }\r
71 }\r
72 \r
73 void DecryptHeader()\r
74 { byte lastvalue, precodebyte;\r
75 \r
76   ptr=(byte *) filetbl;\r
77   lastvalue=*ptr;\r
78   ptr++;\r
79 \r
80   while (ptr < (byte *) (int) filetbl + (int) 5120)\r
81   {\r
82     precodebyte=*ptr;\r
83     (*ptr)-=lastvalue;\r
84     lastvalue=precodebyte;\r
85     ptr++;\r
86   }\r
87 }\r
88 \r
89 void BuildFileTable()\r
90 { int i;\r
91 \r
92   curofs=12+(numfiles*100);\r
93   memset(filetbl, 0, sizeof filetbl);\r
94 \r
95   for (i=0; i<numfiles; i++)\r
96   {\r
97     fscanf(list,"%s",strbuf);\r
98     if (!(src=fopen(strbuf,"rb")))\r
99     {\r
100       printf("Could not open included file %s. \n",strbuf);\r
101       exit(-1);\r
102     }\r
103     memcpy(&filetbl[i].fname,strbuf,strlen(strbuf));\r
104     fseek(src,0,2);\r
105     filetbl[i].packofs=curofs;\r
106     filetbl[i].size=ftell(src);\r
107     curofs+=filetbl[i].size;\r
108     fscanf(list,"%s",strbuf); filetbl[i].extractable=atoi(strbuf);\r
109     fscanf(list,"%s",strbuf); filetbl[i].override=atoi(strbuf);\r
110     fclose(src);\r
111   }\r
112   EncryptHeader();\r
113   fwrite(&filetbl, numfiles, 100, pack);\r
114   DecryptHeader();\r
115 }\r
116 \r
117 void DumpFiles()\r
118 { int i;\r
119 \r
120   for (i=0; i<numfiles; i++)\r
121   {\r
122     filebuf=(char *) malloc(filetbl[i].size);\r
123     src=fopen(filetbl[i].fname, "rb");\r
124     printf("Packing file %s...\n", filetbl[i].fname);\r
125     fread(filebuf, 1, filetbl[i].size, src);\r
126     fwrite(filebuf, 1, filetbl[i].size, pack);\r
127     fclose(src);\r
128     free(filebuf);\r
129   }\r
130   printf("Done.\n");\r
131 }\r
132 \r
133 int main(int argc, char *argv[])\r
134 {\r
135   printf("PACK v.0.1 Copyright (C)1997 BJ Eirich \n");\r
136   if (argc<2)\r
137   {\r
138     printf("USAGE: PACK <makefile> \n");\r
139     exit(-1);\r
140   }\r
141 \r
142   if (!(list=fopen(argv[1],"r")))\r
143   {\r
144     printf("Unable to open file %s. \n",argv[1]);\r
145     exit(-1);\r
146   }\r
147 \r
148   strbuf=(char *) malloc(100);\r
149   fscanf(list,"%s",strbuf);\r
150 \r
151   if (!(pack=fopen(strbuf,"wb")))\r
152   {\r
153     printf("Unable to create file %s. \n",strbuf);\r
154     exit(0);\r
155   }\r
156   fscanf(list,"%d",&numfiles);\r
157 \r
158   CreatePackHeader();\r
159   BuildFileTable();\r
160   DumpFiles();\r
161 \r
162   fclose(list);\r
163   fclose(pack);\r
164 \r
165   return 0;\r
166 }\r