Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zMain.c, revision 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>