src/third-party/lzma/7z.h (view raw)
1/* 7z.h -- 7z interface
22013-01-18 : Igor Pavlov : Public domain */
3
4#ifndef __7Z_H
5#define __7Z_H
6
7#include "7zTypes.h"
8
9EXTERN_C_BEGIN
10
11#define k7zStartHeaderSize 0x20
12#define k7zSignatureSize 6
13
14extern Byte k7zSignature[k7zSignatureSize];
15
16typedef struct
17{
18 const Byte *Data;
19 size_t Size;
20} CSzData;
21
22/* CSzCoderInfo & CSzFolder support only default methods */
23
24typedef struct
25{
26 size_t PropsOffset;
27 UInt32 MethodID;
28 Byte NumInStreams;
29 Byte NumOutStreams;
30 Byte PropsSize;
31} CSzCoderInfo;
32
33typedef struct
34{
35 UInt32 InIndex;
36 UInt32 OutIndex;
37} CSzBindPair;
38
39#define SZ_NUM_CODERS_IN_FOLDER_MAX 4
40#define SZ_NUM_BINDS_IN_FOLDER_MAX 3
41#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4
42#define SZ_NUM_CODERS_OUT_STREAMS_IN_FOLDER_MAX 4
43
44typedef struct
45{
46 UInt32 NumCoders;
47 UInt32 NumBindPairs;
48 UInt32 NumPackStreams;
49 UInt32 MainOutStream;
50 UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX];
51 CSzBindPair BindPairs[SZ_NUM_BINDS_IN_FOLDER_MAX];
52 CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX];
53 UInt64 CodersUnpackSizes[SZ_NUM_CODERS_OUT_STREAMS_IN_FOLDER_MAX];
54} CSzFolder;
55
56/*
57typedef struct
58{
59 size_t CodersDataOffset;
60 size_t UnpackSizeDataOffset;
61 // UInt32 StartCoderUnpackSizesIndex;
62 UInt32 StartPackStreamIndex;
63 // UInt32 IndexOfMainOutStream;
64} CSzFolder2;
65*/
66
67SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd, CSzData *sdSizes);
68
69typedef struct
70{
71 UInt32 Low;
72 UInt32 High;
73} CNtfsFileTime;
74
75typedef struct
76{
77 Byte *Defs; /* MSB 0 bit numbering */
78 UInt32 *Vals;
79} CSzBitUi32s;
80
81typedef struct
82{
83 Byte *Defs; /* MSB 0 bit numbering */
84 // UInt64 *Vals;
85 CNtfsFileTime *Vals;
86} CSzBitUi64s;
87
88#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
89
90#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0)
91
92typedef struct
93{
94 UInt32 NumPackStreams;
95 UInt32 NumFolders;
96
97 UInt64 *PackPositions; // NumPackStreams + 1
98 CSzBitUi32s FolderCRCs;
99
100 size_t *FoCodersOffsets;
101 size_t *FoSizesOffsets;
102 // UInt32 StartCoderUnpackSizesIndex;
103 UInt32 *FoStartPackStreamIndex;
104
105 // CSzFolder2 *Folders; // +1 item for sum values
106 Byte *CodersData;
107 Byte *UnpackSizesData;
108 size_t UnpackSizesDataSize;
109 // UInt64 *CoderUnpackSizes;
110} CSzAr;
111
112
113SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,
114 ILookInStream *stream, UInt64 startPos,
115 Byte *outBuffer, size_t outSize,
116 ISzAlloc *allocMain);
117
118/*
119 SzExtract extracts file from archive
120
121 *outBuffer must be 0 before first call for each new archive.
122
123 Extracting cache:
124 If you need to decompress more than one file, you can send
125 these values from previous call:
126 *blockIndex,
127 *outBuffer,
128 *outBufferSize
129 You can consider "*outBuffer" as cache of solid block. If your archive is solid,
130 it will increase decompression speed.
131
132 If you use external function, you can declare these 3 cache variables
133 (blockIndex, outBuffer, outBufferSize) as static in that external function.
134
135 Free *outBuffer and set *outBuffer to 0, if you want to flush cache.
136*/
137
138typedef struct
139{
140 CSzAr db;
141
142 UInt64 startPosAfterHeader;
143 UInt64 dataPos;
144
145 UInt32 NumFiles;
146
147 UInt64 *UnpackPositions;
148 // Byte *IsEmptyFiles;
149 Byte *IsDirs;
150 CSzBitUi32s CRCs;
151
152 CSzBitUi32s Attribs;
153 // CSzBitUi32s Parents;
154 CSzBitUi64s MTime;
155 CSzBitUi64s CTime;
156
157 // UInt32 *FolderStartPackStreamIndex;
158 UInt32 *FolderStartFileIndex; // + 1
159 UInt32 *FileIndexToFolderIndexMap;
160
161 size_t *FileNameOffsets; /* in 2-byte steps */
162 Byte *FileNames; /* UTF-16-LE */
163} CSzArEx;
164
165#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i))
166
167#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i])
168
169void SzArEx_Init(CSzArEx *p);
170void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc);
171UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder);
172int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize);
173
174/*
175if dest == NULL, the return value specifies the required size of the buffer,
176 in 16-bit characters, including the null-terminating character.
177if dest != NULL, the return value specifies the number of 16-bit characters that
178 are written to the dest, including the null-terminating character. */
179
180size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
181
182/*
183size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex);
184UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
185*/
186
187SRes SzArEx_Extract(
188 const CSzArEx *db,
189 ILookInStream *inStream,
190 UInt32 fileIndex, /* index of file */
191 UInt32 *blockIndex, /* index of solid block */
192 Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */
193 size_t *outBufferSize, /* buffer size for output buffer */
194 size_t *offset, /* offset of stream for required file in *outBuffer */
195 size_t *outSizeProcessed, /* size of file in *outBuffer */
196 ISzAlloc *allocMain,
197 ISzAlloc *allocTemp);
198
199
200/*
201SzArEx_Open Errors:
202SZ_ERROR_NO_ARCHIVE
203SZ_ERROR_ARCHIVE
204SZ_ERROR_UNSUPPORTED
205SZ_ERROR_MEM
206SZ_ERROR_CRC
207SZ_ERROR_INPUT_EOF
208SZ_ERROR_FAIL
209*/
210
211SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream,
212 ISzAlloc *allocMain, ISzAlloc *allocTemp);
213
214EXTERN_C_END
215
216#endif