/*
Filepacker script based on the super simple filepacker by Thomas Oppl
Usage:
Create resource file:
FILE* <file pointer> = fopen("<file name>", "wb");
Add a file:
addfile(<resource file pointer>,"<name of file to be added>");
Don't forget to use fclose(<file pointer>) after adding all files!
Load a resource into the engine buffer:
loadresources("<resource file name>");
*/
#include <acknex.h>
#include <stdio.h>
int compress(byte *dest, long *destlen, const byte *source, long sourcelen);
API(compress, zlib1)
int compress2(byte *dest, long *destlen, const byte *source, long sourcelen, int level);
API(compress2, zlib1)
int uncompress(byte *dest, long *destlen, const byte *source, long sourcelen);
API(uncompress, zlib1)
void encipher(unsigned int num_rounds, unsigned long *v, unsigned long *k) // 64-bit block feistel network with a 128-bit key
{
unsigned long v0 = v[0], v1 = v[1], i;
unsigned long sum = 0, delta = 0x9E3779B9;
for(i = 0; i < num_rounds; i++)
{
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
}
v[0] = v0; v[1] = v1;
}
void decipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) // 64-bit block feistel network with a 128-bit key
{
unsigned long v0 = v[0], v1 = v[1], i;
unsigned long delta = 0x9E3779B9, sum = delta * num_rounds;
for(i = 0; i < num_rounds; i++)
{
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
}
v[0] = v0; v[1] = v1;
}
void encipherbuffer(char *buffer, long Size)
{
unsigned long key[4] = {15671, 176, 807912, 235807};
long offset = 0;
while(offset < Size - 8)
{
encipher(64, (unsigned long*)(buffer + offset), key);
offset += 8;
}
}
void decipherbuffer(char *buffer, long Size)
{
unsigned long key[4] = {15671, 176, 807912, 235807};
long offset = 0;
while(offset < Size - 8)
{
decipher(64, (unsigned long*)(buffer + offset), key);
offset += 8;
}
}
void addfile(FILE *fp, char *filename)
{
long Size;
char *buffer = file_load(filename, NULL, &Size);
long compressedsize = (Size + 12) * 1.1; // must be a bit bigger than the source buffer
char *compressedbuffer = (char*)sys_malloc(sizeof(char) * compressedsize);
compress2(compressedbuffer, &compressedsize, buffer,Size,9);
printf("\nname: %s | size: %d | compressedsize: %d", filename,Size, compressedsize);
encipherbuffer(compressedbuffer, compressedsize);
long length = str_len(filename);
fwrite(&length, sizeof(long), 1, fp);
fwrite(filename, sizeof(char) * length, 1, fp);
fwrite(&Size, sizeof(long), 1, fp);
fwrite(&compressedsize, sizeof(long), 1, fp);
fwrite(compressedbuffer, sizeof(char) * compressedsize, 1, fp);
sys_free(buffer);
sys_free(compressedbuffer);
}
void loadresources(char *filename)
{
FILE *fp = fopen(filename, "rb");
if(!fp) {error("couldn't open file!"); return;}
long length;
while(fread(&length, sizeof(long), 1, fp)) // while not eof
{
char *name = (char*)sys_malloc(sizeof(char) * (length + 1));
fread(name, sizeof(char) * length, 1, fp);
name[length] = 0; // termination
long Size;
fread(&Size, sizeof(long), 1, fp);
long compressedsize;
fread(&compressedsize, sizeof(long), 1, fp);
char *compressedbuffer = (char*)sys_malloc(sizeof(char) * compressedsize);
fread(compressedbuffer, sizeof(char) * compressedsize, 1, fp);
//printf("name: %s | size: %d | compressedsize: %d", name, Size, compressedsize);
decipherbuffer(compressedbuffer, compressedsize);
char *buffer = (char*)sys_malloc(sizeof(char) * Size);
uncompress(buffer, Size, compressedbuffer, compressedsize);
add_buffer(name, buffer, Size);
sys_free(name);
sys_free(compressedbuffer);
}
fclose(fp);
}
void loadresources_file(char *resourcename, char* filename)
{
FILE *fp = fopen(resourcename, "rb");
if(!fp) {error("couldn't open file!"); return;}
long length;
while(fread(&length, sizeof(long), 1, fp)) // while not eof
{
char *name = (char*)sys_malloc(sizeof(char) * (length + 1));
fread(name, sizeof(char) * length, 1, fp);
name[length] = 0; // termination
if(!str_cmpi(filename,name))
{
sys_free(name);
continue;
}
long Size;
fread(&Size, sizeof(long), 1, fp);
long compressedsize;
fread(&compressedsize, sizeof(long), 1, fp);
char *compressedbuffer = (char*)sys_malloc(sizeof(char) * compressedsize);
fread(compressedbuffer, sizeof(char) * compressedsize, 1, fp);
//printf("name: %s | size: %d | compressedsize: %d", name, Size, compressedsize);
decipherbuffer(compressedbuffer, compressedsize);
char *buffer = (char*)sys_malloc(sizeof(char) * Size);
uncompress(buffer, Size, compressedbuffer, compressedsize);
add_buffer(name, buffer, Size);
sys_free(name);
sys_free(compressedbuffer);
fclose(fp);
return;
}
fclose(fp);
}