9 #include "../libs/zlib.h"
12 # pragma comment (lib, "../libs/zlib64.lib")
14 # pragma comment (lib, "../libs/zlib.lib")
21 pbool QC_decodeMethodSupported(int method)
36 char *QC_decode(progfuncs_t *progfuncs, int complen, int len, int method, char *info, char *buffer)
39 if (method == 0) //copy
41 if (complen != len) Sys_Error("lengths do not match");
42 memcpy(buffer, info, len);
44 else if (method == 1) //xor encryption
46 if (complen != len) Sys_Error("lengths do not match");
47 for (i = 0; i < len; i++)
48 buffer[i] = info[i] ^ 0xA5;
50 else if (method == 2) //compression (ZLIB)
75 if (Z_STREAM_END != inflate(&strm, Z_FINISH)) //decompress it in one go.
76 Sys_Error("Failed block decompression\n");
80 //add your decryption/decompression routine here.
82 Sys_Error("Bad file encryption routine\n");
89 void SafeWrite(int hand, void *buf, long count);
90 int SafeSeek(int hand, int ofs, int mode);
91 //we are allowed to trash our input here.
92 int QC_encode(progfuncs_t *progfuncs, int len, int method, char *in, int handle)
95 if (method == 0) //copy
97 SafeWrite(handle, in, len);
100 else if (method == 1) //xor encryption
102 for (i = 0; i < len; i++)
103 in[i] = in[i] ^ 0xA5;
104 SafeWrite(handle, in, len);
107 else if (method == 2) //compression (ZLIB)
134 deflateInit(&strm, Z_BEST_COMPRESSION);
135 while(deflate(&strm, Z_FINISH) == Z_OK)
137 SafeWrite(handle, out, sizeof(out) - strm.avail_out); //compress in chunks of 8192. Saves having to allocate a huge-mega-big buffer
138 i+=sizeof(out) - strm.avail_out;
140 strm.avail_out = sizeof(out);
142 SafeWrite(handle, out, sizeof(out) - strm.avail_out);
143 i+=sizeof(out) - strm.avail_out;
147 Sys_Error("ZLIB compression not supported in this build");
150 //add your compression/decryption routine here.
153 Sys_Error("Wierd method");
159 char *filefromprogs(progfuncs_t *progfuncs, progsnum_t prnum, char *fname, int *size, char *buffer)
162 includeddatafile_t *s;
163 if (!pr_progstate[prnum].progs)
165 if (pr_progstate[prnum].progs->version != PROG_EXTENDEDVERSION)
167 if (!pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION16 &&
168 !pr_progstate[prnum].progs->secondaryversion != PROG_SECONDARYVERSION32)
171 num = *(int*)((char *)pr_progstate[prnum].progs + pr_progstate[prnum].progs->ofsfiles);
172 s = (includeddatafile_t *)((char *)pr_progstate[prnum].progs + pr_progstate[prnum].progs->ofsfiles+4);
175 if (!strcmp(s->filename, fname))
180 return (char *)0xffffffff;
181 return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)pr_progstate[prnum].progs+s->ofs, buffer);
194 char *filefromnewprogs(progfuncs_t *progfuncs, char *prname, char *fname, int *size, char *buffer)
197 includeddatafile_t *s;
199 if (!PR_ReallyLoadProgs(progfuncs, prname, -1, &progs, false))
206 if (progs.progs->version < PROG_EXTENDEDVERSION)
208 if (!progs.progs->ofsfiles)
211 num = *(int*)((char *)progs.progs + progs.progs->ofsfiles);
212 s = (includeddatafile_t *)((char *)progs.progs + progs.progs->ofsfiles+4);
215 if (!strcmp(s->filename, fname))
220 return (char *)0xffffffff;
221 return QC_decode(progfuncs, s->compsize, s->size, s->compmethod, (char *)progs.progs+s->ofs, buffer);