]> git.xonotic.org Git - voretournament/voretournament.git/blob - misc/mediasource/fteqcc-src/qcd_main.c
Move all other sources in a separate subfolder
[voretournament/voretournament.git] / misc / mediasource / fteqcc-src / qcd_main.c
1 #include "progsint.h"
2 //#include "qcc.h"
3
4 //#define AVAIL_ZLIB
5
6 #ifdef AVAIL_ZLIB
7 #ifdef _WIN32
8 #define ZEXPORT VARGS
9 #include "../libs/zlib.h"
10
11 # pragma comment (lib, "../libs/zlib.lib") 
12 #else
13 #include <zlib.h>
14 #endif
15 #endif
16
17 pbool QC_decodeMethodSupported(int method)
18 {
19         if (method == 0)
20                 return true;
21         if (method == 1)
22                 return true;
23         if (method == 2)
24         {
25 #ifdef AVAIL_ZLIB
26                 return false;
27 #endif
28         }
29         return false;
30 }
31
32 char *QC_decode(progfuncs_t *progfuncs, int complen, int len, int method, char *info, char *buffer)
33 {
34         int i;
35         if (method == 0)        //copy
36         {
37                 if (complen != len) Sys_Error("lengths do not match");
38                 memcpy(buffer, info, len);              
39         }
40         else if (method == 1)   //xor encryption
41         {
42                 if (complen != len) Sys_Error("lengths do not match");
43                 for (i = 0; i < len; i++)
44                         buffer[i] = info[i] ^ 0xA5;             
45         }
46         else if (method == 2)   //compression (ZLIB)
47         {
48 #ifdef AVAIL_ZLIB
49                 z_stream strm = {
50                         info,
51                         complen,
52                         0,
53
54                         buffer,
55                         len,
56                         0,
57
58                         NULL,
59                         NULL,
60
61                         NULL,
62                         NULL,
63                         NULL,
64
65                         Z_BINARY,
66                         0,
67                         0
68                 };
69
70                 inflateInit(&strm);
71                 if (Z_STREAM_END != inflate(&strm, Z_FINISH))   //decompress it in one go.
72                         Sys_Error("Failed block decompression\n");
73                 inflateEnd(&strm);
74 #endif
75         }
76         //add your decryption/decompression routine here.
77         else
78                 Sys_Error("Bad file encryption routine\n");
79
80
81         return buffer;
82 }
83
84 #ifndef MINIMAL
85 void SafeWrite(int hand, void *buf, long count);
86 int SafeSeek(int hand, int ofs, int mode);
87 //we are allowed to trash our input here.
88 int QC_encode(progfuncs_t *progfuncs, int len, int method, char *in, int handle)
89 {
90         int i;
91         if (method == 0) //copy
92         {               
93                 SafeWrite(handle, in, len);
94                 return len;
95         }
96         else if (method == 1)   //xor encryption
97         {
98                 for (i = 0; i < len; i++)
99                         in[i] = in[i] ^ 0xA5;
100                 SafeWrite(handle, in, len);
101                 return len;
102         }
103         else if (method == 2)   //compression (ZLIB)
104         {
105 #ifdef AVAIL_ZLIB
106                 char out[8192];
107
108                 z_stream strm = {
109                         in,
110                         len,
111                         0,
112
113                         out,
114                         sizeof(out),
115                         0,
116
117                         NULL,
118                         NULL,
119
120                         NULL,
121                         NULL,
122                         NULL,
123
124                         Z_BINARY,
125                         0,
126                         0
127                 };
128                 i=0;
129
130                 deflateInit(&strm, Z_BEST_COMPRESSION);
131                 while(deflate(&strm, Z_FINISH) == Z_OK)
132                 {
133                         SafeWrite(handle, out, sizeof(out) - strm.avail_out);   //compress in chunks of 8192. Saves having to allocate a huge-mega-big buffer
134                         i+=sizeof(out) - strm.avail_out;
135                         strm.next_out = out;
136                         strm.avail_out = sizeof(out);
137                 }
138                 SafeWrite(handle, out, sizeof(out) - strm.avail_out);
139                 i+=sizeof(out) - strm.avail_out;
140                 deflateEnd(&strm);
141                 return i;
142 #endif
143                 Sys_Error("ZLIB compression not supported in this build");
144                 return 0;
145         }
146         //add your compression/decryption routine here.
147         else
148         {
149                 Sys_Error("Wierd method");
150                 return 0;
151         }
152 }
153 #endif
154
155 char *filefromprogs(progfuncs_t *progfuncs, progsnum_t prnum, char *fname, int *size, char *buffer)
156 {
157         int num;
158         includeddatafile_t *s;
159         if (!pr_progstate[prnum].progs)
160                 return NULL;
161         if (pr_progstate[prnum].progs->version != PROG_EXTENDEDVERSION)
162                 return NULL;
163         if (!pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION16 &&
164                 !pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION32)
165                 return NULL;
166         
167         num = *(int*)((char *)pr_progstate[prnum].progs + pr_progstate[prnum].progs->ofsfiles);
168         s = (includeddatafile_t *)((char *)pr_progstate[prnum].progs + pr_progstate[prnum].progs->ofsfiles+4);  
169         while(num>0)
170         {
171                 if (!strcmp(s->filename, fname))
172                 {
173                         if (size)
174                                 *size = s->size;
175                         if (!buffer)
176                                 return (char *)0xffffffff;
177                         return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)pr_progstate[prnum].progs+s->ofs, buffer);
178                 }
179
180                 s++;
181                 num--;
182         }       
183
184         if (size)
185                 *size = 0;
186         return NULL;
187 }
188
189 /*
190 char *filefromnewprogs(progfuncs_t *progfuncs, char *prname, char *fname, int *size, char *buffer)
191 {
192         int num;
193         includeddatafile_t *s;  
194         progstate_t progs;
195         if (!PR_ReallyLoadProgs(progfuncs, prname, -1, &progs, false))
196         {
197                 if (size)
198                         *size = 0;
199                 return NULL;
200         }
201
202         if (progs.progs->version < PROG_EXTENDEDVERSION)
203                 return NULL;
204         if (!progs.progs->ofsfiles)
205                 return NULL;
206
207         num = *(int*)((char *)progs.progs + progs.progs->ofsfiles);
208         s = (includeddatafile_t *)((char *)progs.progs + progs.progs->ofsfiles+4);      
209         while(num>0)
210         {
211                 if (!strcmp(s->filename, fname))
212                 {
213                         if (size)
214                                 *size = s->size;
215                         if (!buffer)
216                                 return (char *)0xffffffff;
217                         return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)progs.progs+s->ofs, buffer);
218                 }
219
220                 s++;
221                 num--;
222         }       
223
224         if (size)
225                 *size = 0;
226         return NULL;
227 }
228 */