// SPDX-License-Identifier: GPL-2.0 /* * misc.c * * This is a collection of several routines from gzip-1.0.3 * adapted for Linux. * * malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994 * * Modified for ARM Linux by Russell King * * Nicolas Pitre <nico@visuaide.com> 1999/04/14 : * For this code to run directly from Flash, all constant variables must * be marked with 'const' and all other variables initialized at run-time * only. This way all non constant variables will end up in the bss segment, * which should point to addresses in RAM and cleared to 0 on start. * This allows for a much quicker boot time. * * Modified for Alpha, from the ARM version, by Jay Estabrook 2003.
*/
#define WSIZE 0x8000 /* Window size must be at least 32k, */ /* and a power of two */
static uch *inbuf; /* input buffer */ static uch *window; /* Sliding window buffer */
staticunsigned insize; /* valid bytes in inbuf */ staticunsigned inptr; /* index of next byte to be processed in inbuf */ staticunsigned outcnt; /* 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 */
/* =========================================================================== * Fill the input buffer. This is called only when the buffer is empty * and at least one byte is really needed.
*/ int fill_inbuf(void)
{ if (insize != 0)
error("ran out of input data");
inbuf = input_data;
insize = input_data_size;
inptr = 1; return inbuf[0];
}
/* =========================================================================== * Write the output window window[0..outcnt-1] and update crc and bytes_out. * (Used for the decompressed data only.)
*/ void flush_window(void)
{
ulg c = crc; unsigned n;
uch *in, *out, ch;
in = window;
out = &output_data[output_ptr]; for (n = 0; n < outcnt; n++) {
ch = *out++ = *in++;
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
}
crc = c;
bytes_out += (ulg)outcnt;
output_ptr += (ulg)outcnt;
outcnt = 0; /* puts("."); */
}
staticvoid error(char *x)
{
puts("\n\n");
puts(x);
puts("\n\n -- System halted");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.