Home | History | Annotate | Download | only in C
      1 /* 7z.h -- 7z interface
      2 2017-04-03 : 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 } CSzAr;
     95 
     96 UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex);
     97 
     98 SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex,
     99     ILookInStream *stream, UInt64 startPos,
    100     Byte *outBuffer, size_t outSize,
    101     ISzAllocPtr allocMain);
    102 
    103 typedef struct
    104 {
    105   CSzAr db;
    106 
    107   UInt64 startPosAfterHeader;
    108   UInt64 dataPos;
    109 
    110   UInt32 NumFiles;
    111 
    112   UInt64 *UnpackPositions;  // NumFiles + 1
    113   // Byte *IsEmptyFiles;
    114   Byte *IsDirs;
    115   CSzBitUi32s CRCs;
    116 
    117   CSzBitUi32s Attribs;
    118   // CSzBitUi32s Parents;
    119   CSzBitUi64s MTime;
    120   CSzBitUi64s CTime;
    121 
    122   UInt32 *FolderToFile;   // NumFolders + 1
    123   UInt32 *FileToFolder;   // NumFiles
    124 
    125   size_t *FileNameOffsets; /* in 2-byte steps */
    126   Byte *FileNames;  /* UTF-16-LE */
    127 } CSzArEx;
    128 
    129 #define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i))
    130 
    131 #define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i])
    132 
    133 void SzArEx_Init(CSzArEx *p);
    134 void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc);
    135 UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder);
    136 int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize);
    137 
    138 /*
    139 if dest == NULL, the return value specifies the required size of the buffer,
    140   in 16-bit characters, including the null-terminating character.
    141 if dest != NULL, the return value specifies the number of 16-bit characters that
    142   are written to the dest, including the null-terminating character. */
    143 
    144 size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
    145 
    146 /*
    147 size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex);
    148 UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest);
    149 */
    150 
    151 
    152 
    153 /*
    154   SzArEx_Extract extracts file from archive
    155 
    156   *outBuffer must be 0 before first call for each new archive.
    157 
    158   Extracting cache:
    159     If you need to decompress more than one file, you can send
    160     these values from previous call:
    161       *blockIndex,
    162       *outBuffer,
    163       *outBufferSize
    164     You can consider "*outBuffer" as cache of solid block. If your archive is solid,
    165     it will increase decompression speed.
    166 
    167     If you use external function, you can declare these 3 cache variables
    168     (blockIndex, outBuffer, outBufferSize) as static in that external function.
    169 
    170     Free *outBuffer and set *outBuffer to 0, if you want to flush cache.
    171 */
    172 
    173 SRes SzArEx_Extract(
    174     const CSzArEx *db,
    175     ILookInStream *inStream,
    176     UInt32 fileIndex,         /* index of file */
    177     UInt32 *blockIndex,       /* index of solid block */
    178     Byte **outBuffer,         /* pointer to pointer to output buffer (allocated with allocMain) */
    179     size_t *outBufferSize,    /* buffer size for output buffer */
    180     size_t *offset,           /* offset of stream for required file in *outBuffer */
    181     size_t *outSizeProcessed, /* size of file in *outBuffer */
    182     ISzAllocPtr allocMain,
    183     ISzAllocPtr allocTemp);
    184 
    185 
    186 /*
    187 SzArEx_Open Errors:
    188 SZ_ERROR_NO_ARCHIVE
    189 SZ_ERROR_ARCHIVE
    190 SZ_ERROR_UNSUPPORTED
    191 SZ_ERROR_MEM
    192 SZ_ERROR_CRC
    193 SZ_ERROR_INPUT_EOF
    194 SZ_ERROR_FAIL
    195 */
    196 
    197 SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream,
    198     ISzAllocPtr allocMain, ISzAllocPtr allocTemp);
    199 
    200 EXTERN_C_END
    201 
    202 #endif
    203