203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* 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
 |