all repos — mgba @ 22245617f434049f4646916d1b2930d376503b0d

mGBA Game Boy Advance Emulator

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