110 lines
2.6 KiB
C
110 lines
2.6 KiB
C
|
#include "tccboot.h"
|
||
|
|
||
|
/*
|
||
|
* gzip declarations
|
||
|
*/
|
||
|
|
||
|
#define OF(args) args
|
||
|
#define STATIC static
|
||
|
|
||
|
#define memzero(s, n) memset ((s), 0, (n))
|
||
|
|
||
|
typedef unsigned char uch;
|
||
|
typedef unsigned short ush;
|
||
|
typedef unsigned long ulg;
|
||
|
|
||
|
#define WSIZE 0x8000 /* Window size must be at least 32k, */
|
||
|
/* and a power of two */
|
||
|
|
||
|
static uch *inbuf; /* input buffer */
|
||
|
static uch window[WSIZE]; /* Sliding window buffer */
|
||
|
|
||
|
static unsigned insize = 0; /* valid bytes in inbuf */
|
||
|
static unsigned inptr = 0; /* index of next byte to be processed in inbuf */
|
||
|
static unsigned outcnt = 0; /* bytes in output buffer */
|
||
|
|
||
|
/* gzip flag byte */
|
||
|
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ASCII text */
|
||
|
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
||
|
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
||
|
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
||
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||
|
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
|
||
|
#define RESERVED 0xC0 /* bit 6,7: reserved */
|
||
|
|
||
|
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
|
||
|
|
||
|
/* Diagnostic functions */
|
||
|
#ifdef DEBUG
|
||
|
# define Assert(cond,msg) {if(!(cond)) error(msg);}
|
||
|
# define Trace(x) fprintf x
|
||
|
# define Tracev(x) {if (verbose) fprintf x ;}
|
||
|
# define Tracevv(x) {if (verbose>1) fprintf x ;}
|
||
|
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
|
||
|
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
|
||
|
#else
|
||
|
# define Assert(cond,msg)
|
||
|
# define Trace(x)
|
||
|
# define Tracev(x)
|
||
|
# define Tracevv(x)
|
||
|
# define Tracec(c,x)
|
||
|
# define Tracecv(c,x)
|
||
|
#endif
|
||
|
|
||
|
static int fill_inbuf(void);
|
||
|
static void flush_window(void);
|
||
|
static void error(char *m);
|
||
|
|
||
|
static void gzip_mark(void **ptr)
|
||
|
{
|
||
|
}
|
||
|
static void gzip_release(void **ptr)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
static long bytes_out;
|
||
|
static uch *output_data;
|
||
|
static const uint8_t *input_data;
|
||
|
static int input_len;
|
||
|
|
||
|
#include "inflate.c"
|
||
|
|
||
|
/* ===========================================================================
|
||
|
* Fill the input buffer. This is called only when the buffer is empty
|
||
|
* and at least one byte is really needed.
|
||
|
*/
|
||
|
static int fill_inbuf(void)
|
||
|
{
|
||
|
if (insize != 0) {
|
||
|
error("ran out of input data\n");
|
||
|
}
|
||
|
|
||
|
inbuf = (uint8_t *)input_data;
|
||
|
insize = input_len;
|
||
|
inptr = 1;
|
||
|
return inbuf[0];
|
||
|
}
|
||
|
|
||
|
static void flush_window(void)
|
||
|
{
|
||
|
memcpy(output_data, window, outcnt);
|
||
|
output_data += outcnt;
|
||
|
bytes_out += outcnt;
|
||
|
outcnt = 0;
|
||
|
}
|
||
|
|
||
|
static void error(char *x)
|
||
|
{
|
||
|
fatal("%s", x);
|
||
|
}
|
||
|
|
||
|
int do_gunzip(uint8_t *dest, const uint8_t *src, int src_len)
|
||
|
{
|
||
|
input_data = src;
|
||
|
input_len = src_len;
|
||
|
output_data = dest;
|
||
|
bytes_out = 0;
|
||
|
gunzip();
|
||
|
return bytes_out;
|
||
|
}
|