203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /* 7z.h -- 7z interface
 | ||
|  | 2017-04-03 : Igor Pavlov : Public domain */ | ||
|  | 
 | ||
|  | #ifndef __7Z_H
 | ||
|  | #define __7Z_H
 | ||
|  | 
 | ||
|  | #include "7zTypes.h"
 | ||
|  | 
 | ||
|  | EXTERN_C_BEGIN | ||
|  | 
 | ||
|  | #define k7zStartHeaderSize 0x20
 | ||
|  | #define k7zSignatureSize 6
 | ||
|  | 
 | ||
|  | extern const Byte k7zSignature[k7zSignatureSize]; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   const Byte *Data; | ||
|  |   size_t Size; | ||
|  | } CSzData; | ||
|  | 
 | ||
|  | /* CSzCoderInfo & CSzFolder support only default methods */ | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   size_t PropsOffset; | ||
|  |   UInt32 MethodID; | ||
|  |   Byte NumStreams; | ||
|  |   Byte PropsSize; | ||
|  | } CSzCoderInfo; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   UInt32 InIndex; | ||
|  |   UInt32 OutIndex; | ||
|  | } CSzBond; | ||
|  | 
 | ||
|  | #define SZ_NUM_CODERS_IN_FOLDER_MAX 4
 | ||
|  | #define SZ_NUM_BONDS_IN_FOLDER_MAX 3
 | ||
|  | #define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4
 | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   UInt32 NumCoders; | ||
|  |   UInt32 NumBonds; | ||
|  |   UInt32 NumPackStreams; | ||
|  |   UInt32 UnpackStream; | ||
|  |   UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX]; | ||
|  |   CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX]; | ||
|  |   CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX]; | ||
|  | } CSzFolder; | ||
|  | 
 | ||
|  | 
 | ||
|  | SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd); | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   UInt32 Low; | ||
|  |   UInt32 High; | ||
|  | } CNtfsFileTime; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   Byte *Defs; /* MSB 0 bit numbering */ | ||
|  |   UInt32 *Vals; | ||
|  | } CSzBitUi32s; | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   Byte *Defs; /* MSB 0 bit numbering */ | ||
|  |   // UInt64 *Vals;
 | ||
|  |   CNtfsFileTime *Vals; | ||
|  | } CSzBitUi64s; | ||
|  | 
 | ||
|  | #define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
 | ||
|  | 
 | ||
|  | #define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
 | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   UInt32 NumPackStreams; | ||
|  |   UInt32 NumFolders; | ||
|  | 
 | ||
|  |   UInt64 *PackPositions;          // NumPackStreams + 1
 | ||
|  |   CSzBitUi32s FolderCRCs;         // NumFolders
 | ||
|  | 
 | ||
|  |   size_t *FoCodersOffsets;        // NumFolders + 1
 | ||
|  |   UInt32 *FoStartPackStreamIndex; // NumFolders + 1
 | ||
|  |   UInt32 *FoToCoderUnpackSizes;   // NumFolders + 1
 | ||
|  |   Byte *FoToMainUnpackSizeIndex;  // NumFolders
 | ||
|  |   UInt64 *CoderUnpackSizes;       // for all coders in all folders
 | ||
|  | 
 | ||
|  |   Byte *CodersData; | ||
|  | } CSzAr; | ||
|  | 
 | ||
|  | UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); | ||
|  | 
 | ||
|  | SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, | ||
|  |     ILookInStream *stream, UInt64 startPos, | ||
|  |     Byte *outBuffer, size_t outSize, | ||
|  |     ISzAllocPtr allocMain); | ||
|  | 
 | ||
|  | typedef struct | ||
|  | { | ||
|  |   CSzAr db; | ||
|  | 
 | ||
|  |   UInt64 startPosAfterHeader; | ||
|  |   UInt64 dataPos; | ||
|  |    | ||
|  |   UInt32 NumFiles; | ||
|  | 
 | ||
|  |   UInt64 *UnpackPositions;  // NumFiles + 1
 | ||
|  |   // Byte *IsEmptyFiles;
 | ||
|  |   Byte *IsDirs; | ||
|  |   CSzBitUi32s CRCs; | ||
|  | 
 | ||
|  |   CSzBitUi32s Attribs; | ||
|  |   // CSzBitUi32s Parents;
 | ||
|  |   CSzBitUi64s MTime; | ||
|  |   CSzBitUi64s CTime; | ||
|  | 
 | ||
|  |   UInt32 *FolderToFile;   // NumFolders + 1
 | ||
|  |   UInt32 *FileToFolder;   // NumFiles
 | ||
|  | 
 | ||
|  |   size_t *FileNameOffsets; /* in 2-byte steps */ | ||
|  |   Byte *FileNames;  /* UTF-16-LE */ | ||
|  | } CSzArEx; | ||
|  | 
 | ||
|  | #define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i))
 | ||
|  | 
 | ||
|  | #define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i])
 | ||
|  | 
 | ||
|  | void SzArEx_Init(CSzArEx *p); | ||
|  | void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc); | ||
|  | UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); | ||
|  | int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); | ||
|  | 
 | ||
|  | /*
 | ||
|  | if dest == NULL, the return value specifies the required size of the buffer, | ||
|  |   in 16-bit characters, including the null-terminating character. | ||
|  | if dest != NULL, the return value specifies the number of 16-bit characters that | ||
|  |   are written to the dest, including the null-terminating character. */ | ||
|  | 
 | ||
|  | size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); | ||
|  | 
 | ||
|  | /*
 | ||
|  | size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex); | ||
|  | UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest); | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |   SzArEx_Extract extracts file from archive | ||
|  | 
 | ||
|  |   *outBuffer must be 0 before first call for each new archive. | ||
|  | 
 | ||
|  |   Extracting cache: | ||
|  |     If you need to decompress more than one file, you can send | ||
|  |     these values from previous call: | ||
|  |       *blockIndex, | ||
|  |       *outBuffer, | ||
|  |       *outBufferSize | ||
|  |     You can consider "*outBuffer" as cache of solid block. If your archive is solid, | ||
|  |     it will increase decompression speed. | ||
|  |    | ||
|  |     If you use external function, you can declare these 3 cache variables | ||
|  |     (blockIndex, outBuffer, outBufferSize) as static in that external function. | ||
|  |      | ||
|  |     Free *outBuffer and set *outBuffer to 0, if you want to flush cache. | ||
|  | */ | ||
|  | 
 | ||
|  | SRes SzArEx_Extract( | ||
|  |     const CSzArEx *db, | ||
|  |     ILookInStream *inStream, | ||
|  |     UInt32 fileIndex,         /* index of file */ | ||
|  |     UInt32 *blockIndex,       /* index of solid block */ | ||
|  |     Byte **outBuffer,         /* pointer to pointer to output buffer (allocated with allocMain) */ | ||
|  |     size_t *outBufferSize,    /* buffer size for output buffer */ | ||
|  |     size_t *offset,           /* offset of stream for required file in *outBuffer */ | ||
|  |     size_t *outSizeProcessed, /* size of file in *outBuffer */ | ||
|  |     ISzAllocPtr allocMain, | ||
|  |     ISzAllocPtr allocTemp); | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | SzArEx_Open Errors: | ||
|  | SZ_ERROR_NO_ARCHIVE | ||
|  | SZ_ERROR_ARCHIVE | ||
|  | SZ_ERROR_UNSUPPORTED | ||
|  | SZ_ERROR_MEM | ||
|  | SZ_ERROR_CRC | ||
|  | SZ_ERROR_INPUT_EOF | ||
|  | SZ_ERROR_FAIL | ||
|  | */ | ||
|  | 
 | ||
|  | SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, | ||
|  |     ISzAllocPtr allocMain, ISzAllocPtr allocTemp); | ||
|  | 
 | ||
|  | EXTERN_C_END | ||
|  | 
 | ||
|  | #endif
 |