123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- /* 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
|