typedef struct { // for unPAK routine(s) u_long offset,length; u_char method,x1,x2,x3; // method: 1 = standard RLE } entryheader; u_long getpaklength(int index); u_long getpakaddress(int index); void unpak(int index, void *dest); void unpakRLE(void *source, void *dest, u_long length); void TransferTIM(int index); void TransferTextures(u_long *tim); u_long getpaklength(int index) { // returns length of file in PAK u_long length,*pakheadpt,version,hsize; entryheader *headpt; pakheadpt = (u_long *)( ((u_char *)PAKFILEADDR) + _PAKHEAD); // pointer to pak headers version = *pakheadpt; hsize = *(pakheadpt+1); headpt = (entryheader *)(pakheadpt+2); headpt+=index; // skip to file header we want length = headpt->length; return(length); } u_long getpakaddress(int index) { // returns address of file in PAK (used to get address of uncompressed files) u_long length,*pakheadpt,version,hsize; entryheader *headpt; pakheadpt = (u_long *)( ((u_char *)PAKFILEADDR) + _PAKHEAD); // pointer to pak headers version = *pakheadpt; hsize = *(pakheadpt+1); headpt = (entryheader *)(pakheadpt+2); headpt+=index; // skip to file header we want return((u_long)PAKFILEADDR+headpt->offset); } void unpak(int index, void *dest) { // unpacks index (#number of file in pak) to destination void *source; u_long length,*pakheadpt,version,hsize; entryheader *headpt; pakheadpt = (u_long *)( ((u_char *)PAKFILEADDR) + _PAKHEAD); // pointer to pak headers version = *pakheadpt; hsize = *(pakheadpt+1); headpt = (entryheader *)(pakheadpt+2); headpt+=index; // skip to file header we want source = (void *)( ((u_char *)PAKFILEADDR) + headpt->offset ); length = headpt->length; if (headpt->method == 0) printf("DOH: trying to unpack a stored file\n"); else if (headpt->method == 1) unpakRLE(source, dest, length); } void unpakRLE(void *source, void *dest, u_long length) { // Unpacks from address source to dest. length is total size after unpacking u_char *src,*dst; u_char rlec,tmp; u_long count; int f; src = (u_char *) source; dst = (u_char *) dest; count = 0; while (count127) // if single byte { tmp = *src; // read data src++; for (f=0;f<(256-rlec)+1;f++) { *dst=tmp; // write it many times dst++; } count+=(256-rlec)+1; } else // if multiple bytes { for (f=0;f