SOURCES: busybox-lzmacat.diff - better version by Christian Leber
areq
areq at pld-linux.org
Wed Jun 15 22:36:40 CEST 2005
Author: areq Date: Wed Jun 15 20:36:40 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- better version by Christian Leber
---- Files affected:
SOURCES:
busybox-lzmacat.diff (1.1 -> 1.2)
---- Diffs:
================================================================
Index: SOURCES/busybox-lzmacat.diff
diff -u SOURCES/busybox-lzmacat.diff:1.1 SOURCES/busybox-lzmacat.diff:1.2
--- SOURCES/busybox-lzmacat.diff:1.1 Sun Jun 5 16:49:24 2005
+++ SOURCES/busybox-lzmacat.diff Wed Jun 15 22:36:35 2005
@@ -1,39 +1,204 @@
-diff -urN busybox.snapshot/archival/Config.in busybox-lzmacat/archival/Config.in
---- busybox.snapshot/archival/Config.in 2005-05-03 21:43:40.000000000 +0200
-+++ busybox-lzmacat/archival/Config.in 2005-05-03 21:46:02.000000000 +0200
-@@ -121,6 +121,12 @@
- gzip is used to compress files.
- It's probably the most widely used UNIX compression program.
-
-+config CONFIG_LZMACAT
-+ bool "lzmacat"
-+ default n
-+ help
-+ lzmacat decompresses a given file to STUOUT
+--- busybox-20050614.orig/archival/libunarchive/lzmacat.c 1970-01-01 01:00:00.000000000 +0100
++++ busybox-20050614/archival/lzmacat.c 2005-06-15 02:13:51.000000000 +0200
+@@ -0,0 +1,190 @@
++/*
++ lzmacat.c
+
- config CONFIG_RPM2CPIO
- bool "rpm2cpio"
- default n
-diff -urN busybox.snapshot/archival/Makefile.in busybox-lzmacat/archival/Makefile.in
---- busybox.snapshot/archival/Makefile.in 2005-05-03 21:43:40.000000000 +0200
-+++ busybox-lzmacat/archival/Makefile.in 2005-05-03 21:46:02.000000000 +0200
-@@ -32,6 +32,7 @@
- ARCHIVAL-$(CONFIG_DPKG_DEB) += dpkg_deb.o
- ARCHIVAL-$(CONFIG_GUNZIP) += gunzip.o
- ARCHIVAL-$(CONFIG_GZIP) += gzip.o
-+ARCHIVAL-$(CONFIG_LZMACAT) += lzmacat.o
- ARCHIVAL-$(CONFIG_RPM2CPIO) += rpm2cpio.o
- ARCHIVAL-$(CONFIG_RPM) += rpm.o
- ARCHIVAL-$(CONFIG_TAR) += tar.o
-diff -urN busybox.snapshot/archival/libunarchive/LzmaDecode.c busybox-lzmacat/archival/libunarchive/LzmaDecode.c
---- busybox.snapshot/archival/libunarchive/LzmaDecode.c 1970-01-01 01:00:00.000000000 +0100
-+++ busybox-lzmacat/archival/libunarchive/LzmaDecode.c 2005-05-03 21:46:02.000000000 +0200
-@@ -0,0 +1,663 @@
++ Copyright (C) 1999-2004 Igor Pavlov (2005-03-18))
++ examplecode from the LZMA DSK
++ Copyright (C) 2005 Christian Leber
++ changed to lzmcacat functionality
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++
++ e-mail: christian at leber.de
++*/
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#include "busybox.h"
++#include "libunarchive/LzmaDecode.h"
++
++#define _LZMA_READ_BUFFER_SIZE 0x10000
++#define _LZMA_WRITE_BUFFER_SIZE 0x10000
++
++#ifdef _LZMA_IN_CB
++typedef struct _CBuffer
++{
++ ILzmaInCallback InCallback;
++ unsigned char *Buffer;
++ FILE *fil;
++} CBuffer;
++
++int LzmaReadCompressed(void *object, unsigned char **buffer, unsigned int *size)
++{
++ CBuffer *bo = (CBuffer *)object;
++ /* try to read _LZMA_READ_SIZE bytes */
++ *size = fread(bo->Buffer,1,
++ _LZMA_READ_BUFFER_SIZE,bo->fil);
++ *buffer = bo->Buffer;
++ return LZMA_RESULT_OK;
++}
++#endif
++
++int lzmacat_main(int argc, char **argv)
++{
++ FILE *inputHandle;
++ unsigned int outSize, outSizeProcessed, lzmaInternalSize;
++ void *lzmaInternalData;
++ unsigned char header[13];
++ unsigned char prop0;
++ unsigned char *out_buffer;
++ int i, res;
++ int lc, lp, pb;
++ CBuffer bo;
++ UInt32 nowPos;
++ unsigned char *dictionary;
++ UInt32 dictionarySize = 0;
++
++ if (argc != 2) {
++ fprintf(stderr, "lzmacat\n");
++ fprintf(stderr, "Usage: lzmaDec file.lzma\n");
++ return 1;
++ }
++
++ inputHandle = fopen(argv[1], "rb");
++ if (inputHandle == 0) {
++ fprintf(stderr, "Open input file errori\n");
++ return 1;
++ }
++
++ if (!fread(header, 1, sizeof(header),inputHandle)) {
++ fprintf(stderr, "Can't read header\n");
++ return 1;
++ }
++
++ outSize = 0;
++ for (i = 0; i < 4; i++) {
++ outSize += (unsigned int)(header[5+i]) << (i * 8);
++ }
++
++ if (outSize == 0xFFFFFFFF) {
++ fprintf(stderr, "stream version is not supported\n");
++ return 1;
++ }
++
++ for (i = 0; i < 4; i++) {
++ if (header[9+i] != 0) {
++ fprintf(stderr, "file too big (bigger than 4 GB)\n");
++ return 1;
++ }
++ }
++
++ prop0 = header[0];
++ if (prop0 >= (9*5*5)) {
++ fprintf(stderr, "Properties error\n");
++ return 1;
++ }
++ pb = prop0 / 45;
++ prop0 = prop0 % 45;
++ lp = prop0 / 9;
++ lc = prop0 % 9;
++ lzmaInternalSize =
++ (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb);
++ /* because we a reusing _LZMA_OUT_READ */
++ lzmaInternalSize += 100;
++
++ lzmaInternalData = malloc(lzmaInternalSize);
++ if (lzmaInternalData == 0) {
++ fprintf(stderr, "malloc error!\n");
++ return 1;
++ }
++
++ bo.InCallback.Read = LzmaReadCompressed;
++ bo.Buffer = malloc(_LZMA_READ_BUFFER_SIZE);
++ if (bo.Buffer == 0) {
++ fprintf(stderr, "malloc error!\n");
++ free(lzmaInternalData);
++ return 1;
++ }
++ bo.fil = inputHandle;
++
++ for (i = 0; i < 4; i++) {
++ dictionarySize += (UInt32)(header[1 + i]) << (i * 8);
++ }
++
++ if (dictionarySize == 0) {
++ dictionarySize = 1;
++ /* LZMA decoder can not work with dictionarySize = 0 */
++ }
++
++ dictionary = (unsigned char *)malloc(dictionarySize);
++ if (dictionary == 0) {
++ fprintf(stderr, "malloc error!\n");
++ free(lzmaInternalData);
++ free(bo.Buffer);
++ return 1;
++ }
++ res = LzmaDecoderInit((unsigned char *)lzmaInternalData,
++ lzmaInternalSize,
++ lc, lp, pb,
++ dictionary, dictionarySize,
++ &bo.InCallback);
++ if (res == 0) {
++ out_buffer = malloc (_LZMA_WRITE_BUFFER_SIZE);
++ if(out_buffer==0) {
++ fprintf(stderr, "malloc error!\n");
++ free(lzmaInternalData);
++ free(bo.Buffer);
++ free(dictionary);
++ return 1;
++ }
++ for (nowPos = 0; nowPos < outSize;) {
++ UInt32 blockSize = outSize - nowPos;
++ if (blockSize > _LZMA_WRITE_BUFFER_SIZE)
++ blockSize = _LZMA_WRITE_BUFFER_SIZE;
++ res = LzmaDecode((unsigned char *)lzmaInternalData,
++ out_buffer, blockSize, &outSizeProcessed);
++ if (res != 0)
++ break;
++ if (outSizeProcessed == 0) {
++ outSize = nowPos;
++ break;
++ }
++ nowPos += outSizeProcessed;
++ write(fileno(stdout),out_buffer,outSizeProcessed);
++ }
++ }
++ free(lzmaInternalData);
++ free(bo.Buffer);
++ free(dictionary);
++ free(out_buffer);
++ if (res != 0) {
++ fprintf(stderr, "\nerror = %d\n", res);
++ return 1;
++ }
++ return 0;
++}
++
+--- busybox-20050614.orig/archival/libunarchive/LzmaDecode.c 1970-01-01 01:00:00.000000000 +0100
++++ busybox-20050614/archival/libunarchive/LzmaDecode.c 2005-06-15 02:13:59.000000000 +0200
+@@ -0,0 +1,586 @@
+/*
+ LzmaDecode.c
-+ LZMA Decoder
++ LZMA Decoder (optimized for Speed version)
+
-+ LZMA SDK 4.05 Copyright (c) 1999-2004 Igor Pavlov (2004-08-25)
++ LZMA SDK 4.17 Copyright (c) 1999-2005 Igor Pavlov (2005-04-05)
+ http://www.7-zip.org/
+
+ LZMA SDK is licensed under two licenses:
@@ -43,9 +208,9 @@
+ follow rules of that license.
+
+ SPECIAL EXCEPTION:
-+ Igor Pavlov, as the author of this code, expressly permits you to
-+ statically or dynamically link your code (or bind by name) to the
-+ interfaces of this file without subjecting your linked code to the
++ Igor Pavlov, as the author of this Code, expressly permits you to
++ statically or dynamically link your Code (or bind by name) to the
++ interfaces of this file without subjecting your linked Code to the
+ terms of the CPL or GNU LGPL. Any modifications or additions
+ to this file, however, are subject to the LGPL or CPL terms.
+*/
@@ -63,242 +228,44 @@
+#define kBitModelTotal (1 << kNumBitModelTotalBits)
+#define kNumMoveBits 5
+
-+typedef struct _CRangeDecoder
-+{
-+ Byte *Buffer;
-+ Byte *BufferLim;
-+ UInt32 Range;
-+ UInt32 Code;
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *InCallback;
-+ int Result;
-+ #endif
-+ int ExtraBytes;
-+} CRangeDecoder;
-+
-+Byte RangeDecoderReadByte(CRangeDecoder *rd)
-+{
-+ if (rd->Buffer == rd->BufferLim)
-+ {
-+ #ifdef _LZMA_IN_CB
-+ UInt32 size;
-+ rd->Result = rd->InCallback->Read(rd->InCallback, &rd->Buffer, &size);
-+ rd->BufferLim = rd->Buffer + size;
-+ if (size == 0)
-+ #endif
-+ {
-+ rd->ExtraBytes = 1;
-+ return 0xFF;
-+ }
-+ }
-+ return (*rd->Buffer++);
-+}
-+
-+/* #define ReadByte (*rd->Buffer++) */
-+#define ReadByte (RangeDecoderReadByte(rd))
++#define RC_READ_BYTE (*Buffer++)
+
-+void RangeDecoderInit(CRangeDecoder *rd,
-+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback
-+ #else
-+ Byte *stream, UInt32 bufferSize
-+ #endif
-+ )
-+{
-+ int i;
-+ #ifdef _LZMA_IN_CB
-+ rd->InCallback = inCallback;
-+ rd->Buffer = rd->BufferLim = 0;
-+ #else
-+ rd->Buffer = stream;
-+ rd->BufferLim = stream + bufferSize;
-+ #endif
-+ rd->ExtraBytes = 0;
-+ rd->Code = 0;
-+ rd->Range = (0xFFFFFFFF);
-+ for(i = 0; i < 5; i++)
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+}
++#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
++ { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
+
-+#define RC_INIT_VAR UInt32 range = rd->Range; UInt32 code = rd->Code;
-+#define RC_FLUSH_VAR rd->Range = range; rd->Code = code;
-+#define RC_NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | ReadByte; }
++#ifdef _LZMA_IN_CB
+
-+UInt32 RangeDecoderDecodeDirectBits(CRangeDecoder *rd, int numTotalBits)
-+{
-+ RC_INIT_VAR
-+ UInt32 result = 0;
-+ int i;
-+ for (i = numTotalBits; i > 0; i--)
-+ {
-+ /* UInt32 t; */
-+ range >>= 1;
++#define RC_TEST { if (Buffer == BufferLim) \
++ { UInt32 size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \
++ BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }}
+
-+ result <<= 1;
-+ if (code >= range)
-+ {
-+ code -= range;
-+ result |= 1;
-+ }
-+ /*
-+ t = (code - range) >> 31;
-+ t &= 1;
-+ code -= range & (t - 1);
-+ result = (result + result) | (1 - t);
-+ */
-+ RC_NORMALIZE
-+ }
-+ RC_FLUSH_VAR
-+ return result;
-+}
++#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
+
-+int RangeDecoderBitDecode(CProb *prob, CRangeDecoder *rd)
-+{
-+ UInt32 bound = (rd->Range >> kNumBitModelTotalBits) * *prob;
-+ if (rd->Code < bound)
-+ {
-+ rd->Range = bound;
-+ *prob += (kBitModelTotal - *prob) >> kNumMoveBits;
-+ if (rd->Range < kTopValue)
-+ {
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+ rd->Range <<= 8;
-+ }
-+ return 0;
-+ }
-+ else
-+ {
-+ rd->Range -= bound;
-+ rd->Code -= bound;
-+ *prob -= (*prob) >> kNumMoveBits;
-+ if (rd->Range < kTopValue)
-+ {
-+ rd->Code = (rd->Code << 8) | ReadByte;
-+ rd->Range <<= 8;
-+ }
-+ return 1;
-+ }
-+}
++#else
+
-+#define RC_GET_BIT2(prob, mi, A0, A1) \
-+ UInt32 bound = (range >> kNumBitModelTotalBits) * *prob; \
-+ if (code < bound) \
-+ { A0; range = bound; *prob += (kBitModelTotal - *prob) >> kNumMoveBits; mi <<= 1; } \
-+ else \
-+ { A1; range -= bound; code -= bound; *prob -= (*prob) >> kNumMoveBits; mi = (mi + mi) + 1; } \
-+ RC_NORMALIZE
++#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }
+
-+#define RC_GET_BIT(prob, mi) RC_GET_BIT2(prob, mi, ; , ;)
++#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
++
++#endif
+
-+int RangeDecoderBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+ int mi = 1;
-+ int i;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ for(i = numLevels; i > 0; i--)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + mi;
-+ RC_GET_BIT(prob, mi)
-+ #else
-+ mi = (mi + mi) + RangeDecoderBitDecode(probs + mi, rd);
-+ #endif
-+ }
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return mi - (1 << numLevels);
-+}
++#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
+
-+int RangeDecoderReverseBitTreeDecode(CProb *probs, int numLevels, CRangeDecoder *rd)
-+{
-+ int mi = 1;
-+ int i;
-+ int symbol = 0;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ for(i = 0; i < numLevels; i++)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + mi;
-+ RC_GET_BIT2(prob, mi, ; , symbol |= (1 << i))
-+ #else
-+ int bit = RangeDecoderBitDecode(probs + mi, rd);
-+ mi = mi + mi + bit;
-+ symbol |= (bit << i);
-+ #endif
-+ }
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
++#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
++#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
++#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
++
++#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
++ { UpdateBit0(p); mi <<= 1; A0; } else \
++ { UpdateBit1(p); mi = (mi + mi) + 1; A1; }
++
++#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
+
-+Byte LzmaLiteralDecode(CProb *probs, CRangeDecoder *rd)
-+{
-+ int symbol = 1;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ do
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + symbol;
-+ RC_GET_BIT(prob, symbol)
-+ #else
-+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+ #endif
-+ }
-+ while (symbol < 0x100);
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
++#define RangeDecoderBitTreeDecode(probs, numLevels, res) \
++ { int i = numLevels; res = 1; \
++ do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
++ res -= (1 << numLevels); }
+
-+Byte LzmaLiteralDecodeMatch(CProb *probs, CRangeDecoder *rd, Byte matchByte)
-+{
-+ int symbol = 1;
-+ #ifdef _LZMA_LOC_OPT
-+ RC_INIT_VAR
-+ #endif
-+ do
-+ {
-+ int bit;
-+ int matchBit = (matchByte >> 7) & 1;
-+ matchByte <<= 1;
-+ #ifdef _LZMA_LOC_OPT
-+ {
-+ CProb *prob = probs + ((1 + matchBit) << 8) + symbol;
-+ RC_GET_BIT2(prob, symbol, bit = 0, bit = 1)
-+ }
-+ #else
-+ bit = RangeDecoderBitDecode(probs + ((1 + matchBit) << 8) + symbol, rd);
-+ symbol = (symbol << 1) | bit;
-+ #endif
-+ if (matchBit != bit)
-+ {
-+ while (symbol < 0x100)
-+ {
-+ #ifdef _LZMA_LOC_OPT
-+ CProb *prob = probs + symbol;
-+ RC_GET_BIT(prob, symbol)
-+ #else
-+ symbol = (symbol + symbol) | RangeDecoderBitDecode(probs + symbol, rd);
-+ #endif
-+ }
-+ break;
-+ }
-+ }
-+ while (symbol < 0x100);
-+ #ifdef _LZMA_LOC_OPT
-+ RC_FLUSH_VAR
-+ #endif
-+ return symbol;
-+}
+
+#define kNumPosBitsMax 4
+#define kNumPosStatesMax (1 << kNumPosBitsMax)
@@ -317,19 +284,9 @@
+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
+
-+int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)
-+{
-+ if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)
-+ return RangeDecoderBitTreeDecode(p + LenLow +
-+ (posState << kLenNumLowBits), kLenNumLowBits, rd);
-+ if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)
-+ return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid +
-+ (posState << kLenNumMidBits), kLenNumMidBits, rd);
-+ return kLenNumLowSymbols + kLenNumMidSymbols +
-+ RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);
-+}
+
+#define kNumStates 12
++#define kNumLitStates 7
+
+#define kStartPosModelIndex 4
+#define kEndPosModelIndex 14
@@ -364,7 +321,13 @@
+
+typedef struct _LzmaVarState
+{
-+ CRangeDecoder RangeDecoder;
++ Byte *Buffer;
++ Byte *BufferLim;
++ UInt32 Range;
++ UInt32 Code;
++ #ifdef _LZMA_IN_CB
++ ILzmaInCallback *InCallback;
++ #endif
+ Byte *Dictionary;
+ UInt32 DictionarySize;
+ UInt32 DictionaryPos;
@@ -374,8 +337,8 @@
+ int lp;
+ int pb;
+ int State;
-+ int PreviousIsMatch;
+ int RemainLen;
++ Byte TempDictionary[4];
+} LzmaVarState;
+
+int LzmaDecoderInit(
@@ -383,12 +346,16 @@
+ int lc, int lp, int pb,
+ unsigned char *dictionary, UInt32 dictionarySize,
+ #ifdef _LZMA_IN_CB
-+ ILzmaInCallback *inCallback
++ ILzmaInCallback *InCallback
+ #else
+ unsigned char *inStream, UInt32 inSize
+ #endif
+ )
+{
++ Byte *Buffer;
++ Byte *BufferLim;
++ UInt32 Range;
++ UInt32 Code;
+ LzmaVarState *vs = (LzmaVarState *)buffer;
+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));
+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));
@@ -404,18 +371,24 @@
+ vs->lp = lp;
+ vs->pb = pb;
+ vs->State = 0;
-+ vs->PreviousIsMatch = 0;
+ vs->RemainLen = 0;
+ dictionary[dictionarySize - 1] = 0;
+ for (i = 0; i < numProbs; i++)
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/busybox-lzmacat.diff?r1=1.1&r2=1.2&f=u
More information about the pld-cvs-commit
mailing list