00001
00025 #include <stdio.h>
00026 #include <stdlib.h>
00027 #include <string.h>
00028
00029 #include "hqrdepack.h"
00030 #include "filereader.h"
00031
00032 filereader fr;
00033
00039 void hqr_decompress_entry(unsigned char * dst, unsigned char * src, int decompsize, int mode)
00040 {
00041 unsigned char b;
00042 int lenght, d,i;
00043 unsigned short int offset;
00044 unsigned char *ptr;
00045
00046 do{
00047 b = *(src++);
00048 for(d=0; d < 8; d++)
00049 {
00050 if(!(b & (1 << d)))
00051 {
00052 offset = *(unsigned short int*)(src);
00053 src+=2;
00054 lenght = (offset & 0x0F) + (mode+1);
00055 ptr = dst - (offset >> 4) - 1;
00056 for(i=0;i<lenght;i++)
00057 *(dst++)=*(ptr++);
00058 }
00059 else
00060 {
00061 lenght = 1;
00062 *(dst++) = *(src++);
00063 }
00064 decompsize-=lenght;
00065 if(decompsize<=0)
00066 return;
00067 }
00068 }while(decompsize);
00069 }
00070
00076 void hqr_decompress_lz_entry(unsigned char * dst, unsigned char * src, int decompsize, int mode)
00077 {
00078 unsigned short int offset;
00079 int lenght;
00080 unsigned char *ptr;
00081
00082 while( decompsize > 0 )
00083 {
00084 unsigned char bits;
00085 unsigned char type = *(src++);
00086 for( bits=1; bits!=0; bits<<=1 )
00087 {
00088 if(!(type&bits))
00089 {
00090 offset = *(unsigned short int*)(src);
00091 src+=2;
00092 lenght = (offset & 0x0F) + (mode+1);
00093 ptr = dst - (offset >> 4) - 1;
00094 if(offset == 0) {
00095 memset(dst, *ptr, lenght);
00096 }
00097 else {
00098 if ((ptr+lenght) >= dst ) {
00099 signed long n;
00100 unsigned char *tmp = dst;
00101 for(n=0; n < lenght; n++)
00102 *tmp++ = *ptr++;
00103 }
00104 else {
00105 memcpy(dst,ptr,lenght);
00106 }
00107 }
00108 dst += lenght;
00109 }
00110 else
00111 {
00112 lenght = 1;
00113 *(dst++) = *(src++);
00114 }
00115 decompsize -= lenght;
00116 if(decompsize<=0)
00117 return;
00118 }
00119 }
00120 }
00121
00127 int hqr_get_entry(unsigned char * ptr, char *filename, int index)
00128 {
00129 unsigned int headerSize;
00130 unsigned int offsetToData;
00131 unsigned int realSize;
00132 unsigned int compSize;
00133 unsigned short int mode;
00134
00135 if (!filename)
00136 return 0;
00137
00138 if(!fropen(&fr,filename))
00139 printf("HQR: %s can't be found !\n", filename);
00140
00141 frread(&fr,&headerSize,4);
00142
00143 if((unsigned int)index >= headerSize/4)
00144 {
00145 printf("\nHQR WARNING: Invalid entry index!!\n");
00146 frclose(&fr);
00147 return 0;
00148 }
00149
00150 frseek(&fr,index*4);
00151 frread(&fr,&offsetToData,4);
00152
00153 frseek(&fr,offsetToData);
00154 frread(&fr,&realSize,4);
00155 frread(&fr,&compSize,4);
00156 frread(&fr,&mode,2);
00157
00158 if(!ptr)
00159 ptr =(unsigned char*)malloc(realSize);
00160
00161 if(!ptr)
00162 {
00163 printf("\nHQR WARNING: Unable to allocate memory!!\n");
00164 frclose(&fr);
00165 return 0;
00166 }
00167
00168
00169 if(mode==0)
00170 {
00171 frread(&fr,ptr,realSize);
00172 }
00173
00174 else
00175 {
00176 unsigned char* compDataPtr=0;
00177 compDataPtr=(unsigned char*)malloc(compSize);
00178 frread(&fr,compDataPtr,compSize);
00179 hqr_decompress_entry(ptr,compDataPtr,realSize,mode);
00180 free(compDataPtr);
00181 }
00182
00183 frclose(&fr);
00184
00185 return realSize;
00186 }
00187
00192 int hqr_entry_size(char *filename, int index)
00193 {
00194 unsigned int headerSize;
00195 unsigned int offsetToData;
00196 unsigned int realSize;
00197
00198
00199 if (!filename)
00200 return 0;
00201
00202 if (!fropen(&fr,filename)) {
00203 printf("HQR: %s can't be found !\n", filename);
00204 exit(1);
00205 }
00206
00207 frread(&fr,&headerSize,4);
00208
00209 if((unsigned int)index >= headerSize/4)
00210 {
00211 printf("\nHQR WARNING: Invalid entry index!!\n");
00212
00213 frclose(&fr);
00214 return 0;
00215 }
00216
00217 frseek(&fr,index*4);
00218 frread(&fr,&offsetToData,4);
00219
00220 frseek(&fr,offsetToData);
00221 frread(&fr,&realSize,4);
00222
00223 frclose(&fr);
00224
00225 return realSize;
00226 }
00227
00231 int hqr_num_entries(char *filename)
00232 {
00233 unsigned int headerSize;
00234
00235 if (!filename)
00236 return 0;
00237
00238 if (!fropen(&fr,filename)) {
00239 printf("HQR: %s can't be found !\n", filename);
00240 exit(1);
00241 }
00242
00243 frread(&fr,&headerSize,4);
00244
00245 return headerSize/4;
00246 }