2005-06-30 02:58:59 -07:00
# include <linux/zlib.h>
2005-06-23 22:01:12 -07:00
/* bits taken from ppc */
extern void * avail_ram , * end_avail ;
void exit ( void )
{
for ( ; ; ) ;
}
2005-06-30 02:58:59 -07:00
void * zalloc ( unsigned size )
2005-06-23 22:01:12 -07:00
{
void * p = avail_ram ;
size = ( size + 7 ) & - 8 ;
avail_ram + = size ;
if ( avail_ram > end_avail ) {
//puts("oops... out of memory\n");
//pause();
exit ( ) ;
}
return p ;
}
# define HEAD_CRC 2
# define EXTRA_FIELD 4
# define ORIG_NAME 8
# define COMMENT 0x10
# define RESERVED 0xe0
# define DEFLATED 8
void gunzip ( void * dst , int dstlen , unsigned char * src , int * lenp )
{
z_stream s ;
int r , i , flags ;
/* skip header */
i = 10 ;
flags = src [ 3 ] ;
if ( src [ 2 ] ! = DEFLATED | | ( flags & RESERVED ) ! = 0 ) {
//puts("bad gzipped data\n");
exit ( ) ;
}
if ( ( flags & EXTRA_FIELD ) ! = 0 )
i = 12 + src [ 10 ] + ( src [ 11 ] < < 8 ) ;
if ( ( flags & ORIG_NAME ) ! = 0 )
while ( src [ i + + ] ! = 0 )
;
if ( ( flags & COMMENT ) ! = 0 )
while ( src [ i + + ] ! = 0 )
;
if ( ( flags & HEAD_CRC ) ! = 0 )
i + = 2 ;
if ( i > = * lenp ) {
//puts("gunzip: ran out of data in header\n");
exit ( ) ;
}
2005-06-30 02:58:59 -07:00
s . workspace = zalloc ( zlib_inflate_workspacesize ( ) ) ;
r = zlib_inflateInit2 ( & s , - MAX_WBITS ) ;
2005-06-23 22:01:12 -07:00
if ( r ! = Z_OK ) {
//puts("inflateInit2 returned "); puthex(r); puts("\n");
exit ( ) ;
}
s . next_in = src + i ;
s . avail_in = * lenp - i ;
s . next_out = dst ;
s . avail_out = dstlen ;
2005-06-30 02:58:59 -07:00
r = zlib_inflate ( & s , Z_FINISH ) ;
2005-06-23 22:01:12 -07:00
if ( r ! = Z_OK & & r ! = Z_STREAM_END ) {
//puts("inflate returned "); puthex(r); puts("\n");
exit ( ) ;
}
* lenp = s . next_out - ( unsigned char * ) dst ;
2005-06-30 02:58:59 -07:00
zlib_inflateEnd ( & s ) ;
2005-06-23 22:01:12 -07:00
}