72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
//
|
|
// j2b.c
|
|
// Dumb J2B Archive parser
|
|
//
|
|
// Created by Christopher Snowhill on 10/4/13.
|
|
// Copyright 2013 __NoWork, Inc__. All rights reserved.
|
|
//
|
|
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <zlib.h>
|
|
|
|
#include "j2b.h"
|
|
|
|
void * unpackJ2b( const void * in, long * size )
|
|
{
|
|
uint32_t fileLength;
|
|
uint32_t checksum;
|
|
uint32_t lenCompressed;
|
|
uint32_t lenUncompressed;
|
|
const uint8_t * in8 = ( const uint8_t * ) in;
|
|
Bytef * uncompressedData;
|
|
int zErr;
|
|
uLong dataUncompressed;
|
|
|
|
if ( *size < 8 )
|
|
return 0;
|
|
|
|
if ( in8[0] != 'M' || in8[1] != 'U' || in8[2] != 'S' || in8[3] != 'E' ||
|
|
in8[4] != 0xDE || in8[5] != 0xAD ||
|
|
( ( in8[6] != 0xBE || in8[7] != 0xAF ) && ( in8[6] != 0xBA || in8[7] != 0xBE ) ) )
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if ( *size < 12 )
|
|
return 0;
|
|
|
|
fileLength = in8[8] | (in8[9] << 8) | (in8[10] << 16) | (in8[11] << 24);
|
|
|
|
if ( fileLength < 12 || fileLength + 12 > *size )
|
|
return 0;
|
|
|
|
checksum = in8[12] | (in8[13] << 8) | (in8[14] << 16) | (in8[15] << 24);
|
|
lenCompressed = in8[16] | (in8[17] << 8) | (in8[18] << 16) | (in8[19] << 24);
|
|
lenUncompressed = in8[20] | (in8[21] << 8) | (in8[22] << 16) | (in8[23] << 24);
|
|
|
|
if ( lenCompressed + 12 > fileLength )
|
|
return 0;
|
|
|
|
if ( crc32( 0, in8 + 24, lenCompressed) != checksum )
|
|
return 0;
|
|
|
|
uncompressedData = (Bytef *) malloc( lenUncompressed );
|
|
|
|
if ( !uncompressedData )
|
|
return 0;
|
|
|
|
dataUncompressed = lenUncompressed;
|
|
|
|
zErr = uncompress( uncompressedData, &dataUncompressed, in8 + 24, lenCompressed );
|
|
if ( zErr != Z_OK )
|
|
{
|
|
free( uncompressedData );
|
|
return 0;
|
|
}
|
|
|
|
*size = dataUncompressed;
|
|
|
|
return uncompressedData;
|
|
}
|