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