Source code
Revision control
Copy as Markdown
Other Tools
/* 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↩