Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zMain.c, revision 1.1.1.1

1.1       misho       1: /* 
                      2: 7zMain.c
                      3: Test application for 7z Decoder
                      4: LZMA SDK 4.16 Copyright (c) 1999-2005 Igor Pavlov (2005-09-24)
                      5: */
                      6: 
                      7: #include <stdio.h>
                      8: #include <stdlib.h>
                      9: #include <string.h>
                     10: 
                     11: #include "7zCrc.h"
                     12: #include "7zIn.h"
                     13: #include "7zExtract.h"
                     14: 
                     15: typedef struct _CFileInStream
                     16: {
                     17:   ISzInStream InStream;
                     18:   FILE *File;
                     19: } CFileInStream;
                     20: 
                     21: #ifdef _LZMA_IN_CB
                     22: 
                     23: #define kBufferSize (1 << 12)
                     24: Byte g_Buffer[kBufferSize];
                     25: 
                     26: SZ_RESULT SzFileReadImp(void *object, void **buffer, size_t maxRequiredSize, size_t *processedSize)
                     27: {
                     28:   CFileInStream *s = (CFileInStream *)object;
                     29:   size_t processedSizeLoc;
                     30:   if (maxRequiredSize > kBufferSize)
                     31:     maxRequiredSize = kBufferSize;
                     32:   processedSizeLoc = fread(g_Buffer, 1, maxRequiredSize, s->File);
                     33:   *buffer = g_Buffer;
                     34:   if (processedSize != 0)
                     35:     *processedSize = processedSizeLoc;
                     36:   return SZ_OK;
                     37: }
                     38: 
                     39: #else
                     40: 
                     41: SZ_RESULT SzFileReadImp(void *object, void *buffer, size_t size, size_t *processedSize)
                     42: {
                     43:   CFileInStream *s = (CFileInStream *)object;
                     44:   size_t processedSizeLoc = fread(buffer, 1, size, s->File);
                     45:   if (processedSize != 0)
                     46:     *processedSize = processedSizeLoc;
                     47:   return SZ_OK;
                     48: }
                     49: 
                     50: #endif
                     51: 
                     52: SZ_RESULT SzFileSeekImp(void *object, CFileSize pos)
                     53: {
                     54:   CFileInStream *s = (CFileInStream *)object;
                     55:   int res = fseek(s->File, (long)pos, SEEK_SET);
                     56:   if (res == 0)
                     57:     return SZ_OK;
                     58:   return SZE_FAIL;
                     59: }
                     60: 
                     61: void PrintError(char *sz)
                     62: {
                     63:   printf("\nERROR: %s\n", sz);
                     64: }
                     65: 
                     66: int main(int numargs, char *args[])
                     67: {
                     68:   CFileInStream archiveStream;
                     69:   CArchiveDatabaseEx db;
                     70:   SZ_RESULT res;
                     71:   ISzAlloc allocImp;
                     72:   ISzAlloc allocTempImp;
                     73: 
                     74:   printf("\n7z ANSI-C Decoder 4.16 Copyright (c) 1999-2005 Igor Pavlov  2005-03-29\n");
                     75:   if (numargs == 1)
                     76:   {
                     77:     printf(
                     78:       "\nUsage: 7zDec <command> <archive_name>\n\n"
                     79:       "<Commands>\n"
                     80:       "  e: Extract files from archive\n"
                     81:       "  l: List contents of archive\n"
                     82:       "  t: Test integrity of archive\n");
                     83:     return 0;
                     84:   }
                     85:   if (numargs < 3)
                     86:   {
                     87:     PrintError("incorrect command");
                     88:     return 1;
                     89:   }
                     90: 
                     91:   archiveStream.File = fopen(args[2], "rb");
                     92:   if (archiveStream.File == 0)
                     93:   {
                     94:     PrintError("can not open input file");
                     95:     return 1;
                     96:   }
                     97: 
                     98:   archiveStream.InStream.Read = SzFileReadImp;
                     99:   archiveStream.InStream.Seek = SzFileSeekImp;
                    100: 
                    101:   allocImp.Alloc = SzAlloc;
                    102:   allocImp.Free = SzFree;
                    103: 
                    104:   allocTempImp.Alloc = SzAllocTemp;
                    105:   allocTempImp.Free = SzFreeTemp;
                    106: 
                    107:   InitCrcTable();
                    108:   SzArDbExInit(&db);
                    109:   res = SzArchiveOpen(&archiveStream.InStream, &db, &allocImp, &allocTempImp);
                    110:   if (res == SZ_OK)
                    111:   {
                    112:     char *command = args[1];
                    113:     int listCommand = 0;
                    114:     int testCommand = 0;
                    115:     int extractCommand = 0;
                    116:     if (strcmp(command, "l") == 0)
                    117:       listCommand = 1;
                    118:     if (strcmp(command, "t") == 0)
                    119:       testCommand = 1;
                    120:     else if (strcmp(command, "e") == 0)
                    121:       extractCommand = 1;
                    122: 
                    123:     if (listCommand)
                    124:     {
                    125:       UInt32 i;
                    126:       for (i = 0; i < db.Database.NumFiles; i++)
                    127:       {
                    128:         CFileItem *f = db.Database.Files + i;
                    129:         printf("%10d  %s\n", (int)f->Size, f->Name);
                    130:       }
                    131:     }
                    132:     else if (testCommand || extractCommand)
                    133:     {
                    134:       UInt32 i;
                    135:       UInt32 blockIndex;
                    136:       Byte *outBuffer = 0;
                    137:       size_t outBufferSize;
                    138:       printf("\n");
                    139:       for (i = 0; i < db.Database.NumFiles; i++)
                    140:       {
                    141:         size_t offset;
                    142:         size_t outSizeProcessed;
                    143:         CFileItem *f = db.Database.Files + i;
                    144:         printf(testCommand ? 
                    145:             "Tesing    ":
                    146:             "Extracting");
                    147:         printf(" %s", f->Name);
                    148:         res = SzExtract(&archiveStream.InStream, &db, i, 
                    149:             &blockIndex, &outBuffer, &outBufferSize, 
                    150:             &offset, &outSizeProcessed, 
                    151:             &allocImp, &allocTempImp);
                    152:         if (res != SZ_OK)
                    153:           break;
                    154:         if (!testCommand)
                    155:         {
                    156:           FILE *outputHandle;
                    157:           UInt32 processedSize;
                    158:           char *fileName = f->Name;
                    159:           size_t nameLen = strlen(f->Name);
                    160:           for (; nameLen > 0; nameLen--)
                    161:             if (f->Name[nameLen - 1] == '/')
                    162:             {
                    163:               fileName = f->Name + nameLen;
                    164:               break;
                    165:             }
                    166:             
                    167:           outputHandle = fopen(fileName, "wb+");
                    168:           if (outputHandle == 0)
                    169:           {
                    170:             PrintError("can not open output file");
                    171:             res = SZE_FAIL;
                    172:             break;
                    173:           }
                    174:           processedSize = fwrite(outBuffer + offset, 1, outSizeProcessed, outputHandle);
                    175:           if (processedSize != outSizeProcessed)
                    176:           {
                    177:             PrintError("can not write output file");
                    178:             res = SZE_FAIL;
                    179:             break;
                    180:           }
                    181:           if (fclose(outputHandle))
                    182:           {
                    183:             PrintError("can not close output file");
                    184:             res = SZE_FAIL;
                    185:             break;
                    186:           }
                    187:         }
                    188:         printf("\n");
                    189:       }
                    190:       allocImp.Free(outBuffer);
                    191:     }
                    192:     else
                    193:     {
                    194:       PrintError("incorrect command");
                    195:       res = SZE_FAIL;
                    196:     }
                    197:   }
                    198:   SzArDbExFree(&db, allocImp.Free);
                    199: 
                    200:   fclose(archiveStream.File);
                    201:   if (res == SZ_OK)
                    202:   {
                    203:     printf("\nEverything is Ok\n");
                    204:     return 0;
                    205:   }
                    206:   if (res == SZE_OUTOFMEMORY)
                    207:     PrintError("can not allocate memory");
                    208:   else     
                    209:     printf("\nERROR #%d\n", res);
                    210:   return 1;
                    211: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>