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