178acc472SPeter Tyser /* Types.h -- Basic types 2*5fe8380dSStefan Reinauer 2010-10-09 : Igor Pavlov : Public domain */ 378acc472SPeter Tyser 478acc472SPeter Tyser #ifndef __7Z_TYPES_H 578acc472SPeter Tyser #define __7Z_TYPES_H 678acc472SPeter Tyser 778acc472SPeter Tyser #include <stddef.h> 878acc472SPeter Tyser 978acc472SPeter Tyser #ifdef _WIN32 1078acc472SPeter Tyser #include <windows.h> 1178acc472SPeter Tyser #endif 1278acc472SPeter Tyser 1378acc472SPeter Tyser #define SZ_OK 0 1478acc472SPeter Tyser 1578acc472SPeter Tyser #define SZ_ERROR_DATA 1 1678acc472SPeter Tyser #define SZ_ERROR_MEM 2 1778acc472SPeter Tyser #define SZ_ERROR_CRC 3 1878acc472SPeter Tyser #define SZ_ERROR_UNSUPPORTED 4 1978acc472SPeter Tyser #define SZ_ERROR_PARAM 5 2078acc472SPeter Tyser #define SZ_ERROR_INPUT_EOF 6 2178acc472SPeter Tyser #define SZ_ERROR_OUTPUT_EOF 7 2278acc472SPeter Tyser #define SZ_ERROR_READ 8 2378acc472SPeter Tyser #define SZ_ERROR_WRITE 9 2478acc472SPeter Tyser #define SZ_ERROR_PROGRESS 10 2578acc472SPeter Tyser #define SZ_ERROR_FAIL 11 2678acc472SPeter Tyser #define SZ_ERROR_THREAD 12 2778acc472SPeter Tyser 2878acc472SPeter Tyser #define SZ_ERROR_ARCHIVE 16 2978acc472SPeter Tyser #define SZ_ERROR_NO_ARCHIVE 17 3078acc472SPeter Tyser 3178acc472SPeter Tyser typedef int SRes; 3278acc472SPeter Tyser 3378acc472SPeter Tyser #ifdef _WIN32 3478acc472SPeter Tyser typedef DWORD WRes; 3578acc472SPeter Tyser #else 3678acc472SPeter Tyser typedef int WRes; 3778acc472SPeter Tyser #endif 3878acc472SPeter Tyser 3978acc472SPeter Tyser #ifndef RINOK 4078acc472SPeter Tyser #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } 4178acc472SPeter Tyser #endif 4278acc472SPeter Tyser 4378acc472SPeter Tyser typedef unsigned char Byte; 4478acc472SPeter Tyser typedef short Int16; 4578acc472SPeter Tyser typedef unsigned short UInt16; 4678acc472SPeter Tyser 4778acc472SPeter Tyser #ifdef _LZMA_UINT32_IS_ULONG 4878acc472SPeter Tyser typedef long Int32; 4978acc472SPeter Tyser typedef unsigned long UInt32; 5078acc472SPeter Tyser #else 5178acc472SPeter Tyser typedef int Int32; 5278acc472SPeter Tyser typedef unsigned int UInt32; 5378acc472SPeter Tyser #endif 5478acc472SPeter Tyser 5578acc472SPeter Tyser #ifdef _SZ_NO_INT_64 5678acc472SPeter Tyser 5778acc472SPeter Tyser /* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. 5878acc472SPeter Tyser NOTES: Some code will work incorrectly in that case! */ 5978acc472SPeter Tyser 6078acc472SPeter Tyser typedef long Int64; 6178acc472SPeter Tyser typedef unsigned long UInt64; 6278acc472SPeter Tyser 6378acc472SPeter Tyser #else 6478acc472SPeter Tyser 6578acc472SPeter Tyser #if defined(_MSC_VER) || defined(__BORLANDC__) 6678acc472SPeter Tyser typedef __int64 Int64; 6778acc472SPeter Tyser typedef unsigned __int64 UInt64; 68*5fe8380dSStefan Reinauer #define UINT64_CONST(n) n 6978acc472SPeter Tyser #else 7078acc472SPeter Tyser typedef long long int Int64; 7178acc472SPeter Tyser typedef unsigned long long int UInt64; 72*5fe8380dSStefan Reinauer #define UINT64_CONST(n) n ## ULL 7378acc472SPeter Tyser #endif 7478acc472SPeter Tyser 7578acc472SPeter Tyser #endif 7678acc472SPeter Tyser 7778acc472SPeter Tyser #ifdef _LZMA_NO_SYSTEM_SIZE_T 7878acc472SPeter Tyser typedef UInt32 SizeT; 7978acc472SPeter Tyser #else 8078acc472SPeter Tyser typedef size_t SizeT; 8178acc472SPeter Tyser #endif 8278acc472SPeter Tyser 8378acc472SPeter Tyser typedef int Bool; 8478acc472SPeter Tyser #define True 1 8578acc472SPeter Tyser #define False 0 8678acc472SPeter Tyser 8778acc472SPeter Tyser 8878acc472SPeter Tyser #ifdef _MSC_VER 8978acc472SPeter Tyser 9078acc472SPeter Tyser #if _MSC_VER >= 1300 9178acc472SPeter Tyser #define MY_NO_INLINE __declspec(noinline) 9278acc472SPeter Tyser #else 9378acc472SPeter Tyser #define MY_NO_INLINE 9478acc472SPeter Tyser #endif 9578acc472SPeter Tyser 9678acc472SPeter Tyser #define MY_CDECL __cdecl 97*5fe8380dSStefan Reinauer #define MY_FAST_CALL __fastcall 9878acc472SPeter Tyser 9978acc472SPeter Tyser #else 10078acc472SPeter Tyser 10178acc472SPeter Tyser #define MY_CDECL 10278acc472SPeter Tyser #define MY_FAST_CALL 10378acc472SPeter Tyser 10478acc472SPeter Tyser #endif 10578acc472SPeter Tyser 10678acc472SPeter Tyser 10778acc472SPeter Tyser /* The following interfaces use first parameter as pointer to structure */ 10878acc472SPeter Tyser 10978acc472SPeter Tyser typedef struct 11078acc472SPeter Tyser { 111*5fe8380dSStefan Reinauer Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ 112*5fe8380dSStefan Reinauer } IByteIn; 113*5fe8380dSStefan Reinauer 114*5fe8380dSStefan Reinauer typedef struct 115*5fe8380dSStefan Reinauer { 116*5fe8380dSStefan Reinauer void (*Write)(void *p, Byte b); 117*5fe8380dSStefan Reinauer } IByteOut; 118*5fe8380dSStefan Reinauer 119*5fe8380dSStefan Reinauer typedef struct 120*5fe8380dSStefan Reinauer { 12178acc472SPeter Tyser SRes (*Read)(void *p, void *buf, size_t *size); 12278acc472SPeter Tyser /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. 12378acc472SPeter Tyser (output(*size) < input(*size)) is allowed */ 12478acc472SPeter Tyser } ISeqInStream; 12578acc472SPeter Tyser 12678acc472SPeter Tyser /* it can return SZ_ERROR_INPUT_EOF */ 12778acc472SPeter Tyser SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); 12878acc472SPeter Tyser SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); 12978acc472SPeter Tyser SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); 13078acc472SPeter Tyser 13178acc472SPeter Tyser typedef struct 13278acc472SPeter Tyser { 13378acc472SPeter Tyser size_t (*Write)(void *p, const void *buf, size_t size); 13478acc472SPeter Tyser /* Returns: result - the number of actually written bytes. 13578acc472SPeter Tyser (result < size) means error */ 13678acc472SPeter Tyser } ISeqOutStream; 13778acc472SPeter Tyser 13878acc472SPeter Tyser typedef enum 13978acc472SPeter Tyser { 14078acc472SPeter Tyser SZ_SEEK_SET = 0, 14178acc472SPeter Tyser SZ_SEEK_CUR = 1, 14278acc472SPeter Tyser SZ_SEEK_END = 2 14378acc472SPeter Tyser } ESzSeek; 14478acc472SPeter Tyser 14578acc472SPeter Tyser typedef struct 14678acc472SPeter Tyser { 14778acc472SPeter Tyser SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ 14878acc472SPeter Tyser SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); 14978acc472SPeter Tyser } ISeekInStream; 15078acc472SPeter Tyser 15178acc472SPeter Tyser typedef struct 15278acc472SPeter Tyser { 153*5fe8380dSStefan Reinauer SRes (*Look)(void *p, const void **buf, size_t *size); 15478acc472SPeter Tyser /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. 15578acc472SPeter Tyser (output(*size) > input(*size)) is not allowed 15678acc472SPeter Tyser (output(*size) < input(*size)) is allowed */ 15778acc472SPeter Tyser SRes (*Skip)(void *p, size_t offset); 15878acc472SPeter Tyser /* offset must be <= output(*size) of Look */ 15978acc472SPeter Tyser 16078acc472SPeter Tyser SRes (*Read)(void *p, void *buf, size_t *size); 16178acc472SPeter Tyser /* reads directly (without buffer). It's same as ISeqInStream::Read */ 16278acc472SPeter Tyser SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); 16378acc472SPeter Tyser } ILookInStream; 16478acc472SPeter Tyser 16578acc472SPeter Tyser SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); 16678acc472SPeter Tyser SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); 16778acc472SPeter Tyser 16878acc472SPeter Tyser /* reads via ILookInStream::Read */ 16978acc472SPeter Tyser SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); 17078acc472SPeter Tyser SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); 17178acc472SPeter Tyser 17278acc472SPeter Tyser #define LookToRead_BUF_SIZE (1 << 14) 17378acc472SPeter Tyser 17478acc472SPeter Tyser typedef struct 17578acc472SPeter Tyser { 17678acc472SPeter Tyser ILookInStream s; 17778acc472SPeter Tyser ISeekInStream *realStream; 17878acc472SPeter Tyser size_t pos; 17978acc472SPeter Tyser size_t size; 18078acc472SPeter Tyser Byte buf[LookToRead_BUF_SIZE]; 18178acc472SPeter Tyser } CLookToRead; 18278acc472SPeter Tyser 18378acc472SPeter Tyser void LookToRead_CreateVTable(CLookToRead *p, int lookahead); 18478acc472SPeter Tyser void LookToRead_Init(CLookToRead *p); 18578acc472SPeter Tyser 18678acc472SPeter Tyser typedef struct 18778acc472SPeter Tyser { 18878acc472SPeter Tyser ISeqInStream s; 18978acc472SPeter Tyser ILookInStream *realStream; 19078acc472SPeter Tyser } CSecToLook; 19178acc472SPeter Tyser 19278acc472SPeter Tyser void SecToLook_CreateVTable(CSecToLook *p); 19378acc472SPeter Tyser 19478acc472SPeter Tyser typedef struct 19578acc472SPeter Tyser { 19678acc472SPeter Tyser ISeqInStream s; 19778acc472SPeter Tyser ILookInStream *realStream; 19878acc472SPeter Tyser } CSecToRead; 19978acc472SPeter Tyser 20078acc472SPeter Tyser void SecToRead_CreateVTable(CSecToRead *p); 20178acc472SPeter Tyser 20278acc472SPeter Tyser typedef struct 20378acc472SPeter Tyser { 20478acc472SPeter Tyser SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); 20578acc472SPeter Tyser /* Returns: result. (result != SZ_OK) means break. 20678acc472SPeter Tyser Value (UInt64)(Int64)-1 for size means unknown value. */ 20778acc472SPeter Tyser } ICompressProgress; 20878acc472SPeter Tyser 20978acc472SPeter Tyser typedef struct 21078acc472SPeter Tyser { 21178acc472SPeter Tyser void *(*Alloc)(void *p, size_t size); 21278acc472SPeter Tyser void (*Free)(void *p, void *address); /* address can be 0 */ 21378acc472SPeter Tyser } ISzAlloc; 21478acc472SPeter Tyser 21578acc472SPeter Tyser #define IAlloc_Alloc(p, size) (p)->Alloc((p), size) 21678acc472SPeter Tyser #define IAlloc_Free(p, a) (p)->Free((p), a) 21778acc472SPeter Tyser 218*5fe8380dSStefan Reinauer #ifdef _WIN32 219*5fe8380dSStefan Reinauer 220*5fe8380dSStefan Reinauer #define CHAR_PATH_SEPARATOR '\\' 221*5fe8380dSStefan Reinauer #define WCHAR_PATH_SEPARATOR L'\\' 222*5fe8380dSStefan Reinauer #define STRING_PATH_SEPARATOR "\\" 223*5fe8380dSStefan Reinauer #define WSTRING_PATH_SEPARATOR L"\\" 224*5fe8380dSStefan Reinauer 225*5fe8380dSStefan Reinauer #else 226*5fe8380dSStefan Reinauer 227*5fe8380dSStefan Reinauer #define CHAR_PATH_SEPARATOR '/' 228*5fe8380dSStefan Reinauer #define WCHAR_PATH_SEPARATOR L'/' 229*5fe8380dSStefan Reinauer #define STRING_PATH_SEPARATOR "/" 230*5fe8380dSStefan Reinauer #define WSTRING_PATH_SEPARATOR L"/" 231*5fe8380dSStefan Reinauer 232*5fe8380dSStefan Reinauer #endif 233*5fe8380dSStefan Reinauer 23478acc472SPeter Tyser #endif 235