Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA_C/LzmaTest.c, revision 1.1
1.1 ! misho 1: /*
! 2: LzmaTest.c
! 3: Test application for LZMA Decoder
! 4: LZMA SDK 4.16 Copyright (c) 1999-2004 Igor Pavlov (2005-03-18)
! 5: */
! 6:
! 7: #include <stdio.h>
! 8: #include <stdlib.h>
! 9: #include <string.h>
! 10:
! 11: #include "LzmaDecode.h"
! 12:
! 13: size_t MyReadFile(FILE *file, void *data, size_t size)
! 14: {
! 15: return (fread(data, 1, size, file) == size);
! 16: }
! 17:
! 18: #ifdef _LZMA_IN_CB
! 19: typedef struct _CBuffer
! 20: {
! 21: ILzmaInCallback InCallback;
! 22: unsigned char *Buffer;
! 23: unsigned int Size;
! 24: } CBuffer;
! 25:
! 26: int LzmaReadCompressed(void *object, unsigned char **buffer, unsigned int *size)
! 27: {
! 28: CBuffer *bo = (CBuffer *)object;
! 29: *size = bo->Size; /* You can specify any available size here */
! 30: *buffer = bo->Buffer;
! 31: bo->Buffer += *size;
! 32: bo->Size -= *size;
! 33: return LZMA_RESULT_OK;
! 34: }
! 35: #endif
! 36:
! 37: int main2(int numargs, const char *args[], char *rs)
! 38: {
! 39: FILE *inputHandle, *outputHandle;
! 40: unsigned int length, processedSize;
! 41: unsigned int compressedSize, outSize, outSizeProcessed, lzmaInternalSize;
! 42: void *inStream, *outStream, *lzmaInternalData;
! 43: unsigned char properties[5];
! 44: unsigned char prop0;
! 45: int ii;
! 46: int lc, lp, pb;
! 47: int res;
! 48: #ifdef _LZMA_IN_CB
! 49: CBuffer bo;
! 50: #endif
! 51:
! 52: sprintf(rs + strlen(rs), "\nLZMA Decoder 4.16 Copyright (c) 1999-2005 Igor Pavlov 2005-03-18\n");
! 53: if (numargs < 2 || numargs > 3)
! 54: {
! 55: sprintf(rs + strlen(rs), "\nUsage: lzmaDec file.lzma [outFile]\n");
! 56: return 1;
! 57: }
! 58:
! 59: inputHandle = fopen(args[1], "rb");
! 60: if (inputHandle == 0)
! 61: {
! 62: sprintf(rs + strlen(rs), "\n Open input file error");
! 63: return 1;
! 64: }
! 65:
! 66: fseek(inputHandle, 0, SEEK_END);
! 67: length = ftell(inputHandle);
! 68: fseek(inputHandle, 0, SEEK_SET);
! 69:
! 70: if (!MyReadFile(inputHandle, properties, sizeof(properties)))
! 71: return 1;
! 72:
! 73: outSize = 0;
! 74: for (ii = 0; ii < 4; ii++)
! 75: {
! 76: unsigned char b;
! 77: if (!MyReadFile(inputHandle, &b, sizeof(b)))
! 78: return 1;
! 79: outSize += (unsigned int)(b) << (ii * 8);
! 80: }
! 81:
! 82: if (outSize == 0xFFFFFFFF)
! 83: {
! 84: sprintf(rs + strlen(rs), "\nstream version is not supported");
! 85: return 1;
! 86: }
! 87:
! 88: for (ii = 0; ii < 4; ii++)
! 89: {
! 90: unsigned char b;
! 91: if (!MyReadFile(inputHandle, &b, sizeof(b)))
! 92: return 1;
! 93: if (b != 0)
! 94: {
! 95: sprintf(rs + strlen(rs), "\n too long file");
! 96: return 1;
! 97: }
! 98: }
! 99:
! 100: compressedSize = length - 13;
! 101: inStream = malloc(compressedSize);
! 102: if (inStream == 0)
! 103: {
! 104: sprintf(rs + strlen(rs), "\n can't allocate");
! 105: return 1;
! 106: }
! 107: if (!MyReadFile(inputHandle, inStream, compressedSize))
! 108: {
! 109: sprintf(rs + strlen(rs), "\n can't read");
! 110: return 1;
! 111: }
! 112:
! 113: fclose(inputHandle);
! 114:
! 115: prop0 = properties[0];
! 116: if (prop0 >= (9*5*5))
! 117: {
! 118: sprintf(rs + strlen(rs), "\n Properties error");
! 119: return 1;
! 120: }
! 121: for (pb = 0; prop0 >= (9 * 5);
! 122: pb++, prop0 -= (9 * 5));
! 123: for (lp = 0; prop0 >= 9;
! 124: lp++, prop0 -= 9);
! 125: lc = prop0;
! 126:
! 127: lzmaInternalSize =
! 128: (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp)))* sizeof(CProb);
! 129:
! 130: #ifdef _LZMA_OUT_READ
! 131: lzmaInternalSize += 100;
! 132: #endif
! 133:
! 134: outStream = malloc(outSize);
! 135: lzmaInternalData = malloc(lzmaInternalSize);
! 136: if (outStream == 0 || lzmaInternalData == 0)
! 137: {
! 138: sprintf(rs + strlen(rs), "\n can't allocate");
! 139: return 1;
! 140: }
! 141:
! 142: #ifdef _LZMA_IN_CB
! 143: bo.InCallback.Read = LzmaReadCompressed;
! 144: bo.Buffer = (unsigned char *)inStream;
! 145: bo.Size = compressedSize;
! 146: #endif
! 147:
! 148: #ifdef _LZMA_OUT_READ
! 149: {
! 150: UInt32 nowPos;
! 151: unsigned char *dictionary;
! 152: UInt32 dictionarySize = 0;
! 153: int i;
! 154: for (i = 0; i < 4; i++)
! 155: dictionarySize += (UInt32)(properties[1 + i]) << (i * 8);
! 156: if (dictionarySize == 0)
! 157: dictionarySize = 1; /* LZMA decoder can not work with dictionarySize = 0 */
! 158: dictionary = (unsigned char *)malloc(dictionarySize);
! 159: if (dictionary == 0)
! 160: {
! 161: sprintf(rs + strlen(rs), "\n can't allocate");
! 162: return 1;
! 163: }
! 164: res = LzmaDecoderInit((unsigned char *)lzmaInternalData, lzmaInternalSize,
! 165: lc, lp, pb,
! 166: dictionary, dictionarySize,
! 167: #ifdef _LZMA_IN_CB
! 168: &bo.InCallback
! 169: #else
! 170: (unsigned char *)inStream, compressedSize
! 171: #endif
! 172: );
! 173: if (res == 0)
! 174: for (nowPos = 0; nowPos < outSize;)
! 175: {
! 176: UInt32 blockSize = outSize - nowPos;
! 177: UInt32 kBlockSize = 0x10000;
! 178: if (blockSize > kBlockSize)
! 179: blockSize = kBlockSize;
! 180: res = LzmaDecode((unsigned char *)lzmaInternalData,
! 181: ((unsigned char *)outStream) + nowPos, blockSize, &outSizeProcessed);
! 182: if (res != 0)
! 183: break;
! 184: if (outSizeProcessed == 0)
! 185: {
! 186: outSize = nowPos;
! 187: break;
! 188: }
! 189: nowPos += outSizeProcessed;
! 190: }
! 191: free(dictionary);
! 192: }
! 193:
! 194: #else
! 195: res = LzmaDecode((unsigned char *)lzmaInternalData, lzmaInternalSize,
! 196: lc, lp, pb,
! 197: #ifdef _LZMA_IN_CB
! 198: &bo.InCallback,
! 199: #else
! 200: (unsigned char *)inStream, compressedSize,
! 201: #endif
! 202: (unsigned char *)outStream, outSize, &outSizeProcessed);
! 203: outSize = outSizeProcessed;
! 204: #endif
! 205:
! 206: if (res != 0)
! 207: {
! 208: sprintf(rs + strlen(rs), "\nerror = %d\n", res);
! 209: return 1;
! 210: }
! 211:
! 212: if (numargs > 2)
! 213: {
! 214: outputHandle = fopen(args[2], "wb+");
! 215: if (outputHandle == 0)
! 216: {
! 217: sprintf(rs + strlen(rs), "\n Open output file error");
! 218: return 1;
! 219: }
! 220: processedSize = fwrite(outStream, 1, outSize, outputHandle);
! 221: if (processedSize != outSize)
! 222: {
! 223: sprintf(rs + strlen(rs), "\n can't write");
! 224: return 1;
! 225: }
! 226: fclose(outputHandle);
! 227: }
! 228: free(lzmaInternalData);
! 229: free(outStream);
! 230: free(inStream);
! 231: return 0;
! 232: }
! 233:
! 234: int main(int numargs, const char *args[])
! 235: {
! 236: char sz[800] = { 0 };
! 237: int code = main2(numargs, args, sz);
! 238: printf(sz);
! 239: return code;
! 240: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>