Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA_C/LzmaTest.c, revision 1.1.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>