9 #include "../libs/zlib.h"
11 # pragma comment (lib, "../libs/zlib.lib")
17 pbool QC_decodeMethodSupported(int method)
32 char *QC_decode(progfuncs_t *progfuncs, int complen, int len, int method, char *info, char *buffer)
35 if (method == 0) //copy
37 if (complen != len) Sys_Error("lengths do not match");
38 memcpy(buffer, info, len);
40 else if (method == 1) //xor encryption
42 if (complen != len) Sys_Error("lengths do not match");
43 for (i = 0; i < len; i++)
44 buffer[i] = info[i] ^ 0xA5;
46 else if (method == 2) //compression (ZLIB)
71 if (Z_STREAM_END != inflate(&strm, Z_FINISH)) //decompress it in one go.
72 Sys_Error("Failed block decompression\n");
76 //add your decryption/decompression routine here.
78 Sys_Error("Bad file encryption routine\n");
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)
91 if (method == 0) //copy
93 SafeWrite(handle, in, len);
96 else if (method == 1) //xor encryption
98 for (i = 0; i < len; i++)
100 SafeWrite(handle, in, len);
103 else if (method == 2) //compression (ZLIB)
130 deflateInit(&strm, Z_BEST_COMPRESSION);
131 while(deflate(&strm, Z_FINISH) == Z_OK)
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;
136 strm.avail_out = sizeof(out);
138 SafeWrite(handle, out, sizeof(out) - strm.avail_out);
139 i+=sizeof(out) - strm.avail_out;
143 Sys_Error("ZLIB compression not supported in this build");
146 //add your compression/decryption routine here.
149 Sys_Error("Wierd method");
155 char *filefromprogs(progfuncs_t *progfuncs, progsnum_t prnum, char *fname, int *size, char *buffer)
158 includeddatafile_t *s;
159 if (!pr_progstate[prnum].progs)
161 if (pr_progstate[prnum].progs->version != PROG_EXTENDEDVERSION)
163 if (!pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION16 &&
164 !pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION32)
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);
171 if (!strcmp(s->filename, fname))
176 return (char *)0xffffffff;
177 return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)pr_progstate[prnum].progs+s->ofs, buffer);
190 char *filefromnewprogs(progfuncs_t *progfuncs, char *prname, char *fname, int *size, char *buffer)
193 includeddatafile_t *s;
195 if (!PR_ReallyLoadProgs(progfuncs, prname, -1, &progs, false))
202 if (progs.progs->version < PROG_EXTENDEDVERSION)
204 if (!progs.progs->ofsfiles)
207 num = *(int*)((char *)progs.progs + progs.progs->ofsfiles);
208 s = (includeddatafile_t *)((char *)progs.progs + progs.progs->ofsfiles+4);
211 if (!strcmp(s->filename, fname))
216 return (char *)0xffffffff;
217 return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)progs.progs+s->ofs, buffer);