summaryrefslogtreecommitdiff
path: root/tools/cpio/src/unzip.h
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2010-07-29 15:25:12 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2010-07-29 15:25:12 +0200
commitfd6481d82ff407139157e53df28563d40bb3ad3b (patch)
treeed2ae9e08c31d1eed424793272a60c25cdec6c00 /tools/cpio/src/unzip.h
parent14804005d5b33beb6f52d4a72034acb00c00eb90 (diff)
add a cpio implementation to tools directory
cpio utility is a mess in point of portability. For example NetBSD cpio implementation does not support userid and groupid changes for the archive. This feature is required for initramfs filesystem targets. This cpio is from the Heirloom project. Fix needed rebuild of tools, when changing targets.
Diffstat (limited to 'tools/cpio/src/unzip.h')
-rw-r--r--tools/cpio/src/unzip.h121
1 files changed, 121 insertions, 0 deletions
diff --git a/tools/cpio/src/unzip.h b/tools/cpio/src/unzip.h
new file mode 100644
index 000000000..d53f81024
--- /dev/null
+++ b/tools/cpio/src/unzip.h
@@ -0,0 +1,121 @@
+/*
+ * Changes by Gunnar Ritter, Freiburg i. Br., Germany, May 2003.
+ *
+ * Derived from unzip 5.40.
+ *
+ * Sccsid @(#)unzip.h 1.5 (gritter) 7/16/04
+ */
+
+#include <inttypes.h>
+
+#define Trace(a)
+
+#define MAX_BITS 13
+#define HSIZE (1 << MAX_BITS)
+#define WSIZE 65536L /* at least 64K for enhanced deflate */
+
+#define redirSlide G.area.Slide
+
+#define NEXTBYTE (--G.incnt >= 0 ? (int)(*G.inptr++) : readbyte(&G))
+
+#define READBITS(nbits, zdest) { \
+ if (nbits > G.bits_left) { \
+ int temp; \
+ G.zipeof = 1; \
+ while (G.bits_left <= 8 * (int)(sizeof G.bitbuf - 1) && \
+ (temp = NEXTBYTE) != EOF) { \
+ G.bitbuf |= (uint32_t)temp << G.bits_left; \
+ G.bits_left += 8; \
+ G.zipeof = 0; \
+ } \
+ } \
+ zdest = (int16_t)((uint16_t)G.bitbuf & mask_bits[nbits]); \
+ G.bitbuf >>= nbits; \
+ G.bits_left -= nbits; \
+}
+
+#undef FALSE
+#undef TRUE
+enum {
+ FALSE = 0,
+ TRUE = 1
+};
+
+union work {
+ struct {
+ int16_t Parent[HSIZE];
+ uint8_t value[HSIZE];
+ uint8_t Stack[HSIZE];
+ } shrink;
+ uint8_t Slide[WSIZE];
+};
+
+#define OUTBUFSIZ 4096
+
+struct globals {
+ union work area;
+ uint8_t inbuf[4096];
+ long long zsize;
+ long long uzsize;
+ uint8_t *inptr;
+ const char *tgt;
+ struct huft *fixed_tl;
+ struct huft *fixed_td;
+ struct huft *fixed_tl64;
+ struct huft *fixed_td64;
+ struct huft *fixed_tl32;
+ struct huft *fixed_td32;
+ const uint16_t *cplens;
+ const uint8_t *cplext;
+ const uint8_t *cpdext;
+ long csize;
+ long ucsize;
+ uint8_t outbuf[OUTBUFSIZ];
+ uint8_t *outptr;
+ uint32_t *crc;
+ uint32_t bitbuf;
+ uint32_t wp;
+ uint32_t bb;
+ uint32_t bk;
+ unsigned outcnt;
+ int tfd;
+ int doswap;
+ int incnt;
+ int bits_left;
+ int zipeof;
+ int fixed_bl;
+ int fixed_bd;
+ int fixed_bl64;
+ int fixed_bd64;
+ int fixed_bl32;
+ int fixed_bd32;
+ int status;
+};
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+ that have 16-bit pointers (e.g. PC's in the small or medium model).
+ Valid extra bits are 0..13. e == 15 is EOB (end of block), e == 16
+ means that v is a literal, 16 < e < 32 means that v is a pointer to
+ the next table, which codes e - 16 bits, and lastly e == 99 indicates
+ an unused code. If a code with e == 99 is looked up, this implies an
+ error in the data. */
+
+struct huft {
+ uint8_t e; /* number of extra bits or operation */
+ uint8_t b; /* number of bits in this code or subcode */
+ union {
+ uint16_t n; /* literal, length base, or distance base */
+ struct huft *t; /* pointer to next level of table */
+ } v;
+};
+
+extern const uint16_t mask_bits[];
+
+extern void flush(struct globals *, const void *, size_t);
+extern int readbyte(struct globals *);
+
+extern int huft_build(const unsigned *b, unsigned n, unsigned s,
+ const uint16_t *d, const uint8_t *e,
+ struct huft **t, int *m,
+ int bits, int nob, int eob);
+extern void huft_free(struct huft *);