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