nuclear@14: /* Types.h -- Basic types nuclear@14: 2008-11-23 : Igor Pavlov : Public domain */ nuclear@14: nuclear@14: #ifndef __7Z_TYPES_H nuclear@14: #define __7Z_TYPES_H nuclear@14: nuclear@14: #include nuclear@14: nuclear@14: #ifdef _WIN32 nuclear@14: #include nuclear@14: #endif nuclear@14: nuclear@14: #include "NameMangle.h" nuclear@14: nuclear@14: #define SZ_OK 0 nuclear@14: nuclear@14: #define SZ_ERROR_DATA 1 nuclear@14: #define SZ_ERROR_MEM 2 nuclear@14: #define SZ_ERROR_CRC 3 nuclear@14: #define SZ_ERROR_UNSUPPORTED 4 nuclear@14: #define SZ_ERROR_PARAM 5 nuclear@14: #define SZ_ERROR_INPUT_EOF 6 nuclear@14: #define SZ_ERROR_OUTPUT_EOF 7 nuclear@14: #define SZ_ERROR_READ 8 nuclear@14: #define SZ_ERROR_WRITE 9 nuclear@14: #define SZ_ERROR_PROGRESS 10 nuclear@14: #define SZ_ERROR_FAIL 11 nuclear@14: #define SZ_ERROR_THREAD 12 nuclear@14: nuclear@14: #define SZ_ERROR_ARCHIVE 16 nuclear@14: #define SZ_ERROR_NO_ARCHIVE 17 nuclear@14: nuclear@14: typedef int SRes; nuclear@14: nuclear@14: #ifdef _WIN32 nuclear@14: typedef DWORD WRes; nuclear@14: #else nuclear@14: typedef int WRes; nuclear@14: #endif nuclear@14: nuclear@14: #ifndef RINOK nuclear@14: #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } nuclear@14: #endif nuclear@14: nuclear@14: typedef unsigned char Byte; nuclear@14: typedef short Int16; nuclear@14: typedef unsigned short UInt16; nuclear@14: nuclear@14: #ifdef _LZMA_UINT32_IS_ULONG nuclear@14: typedef long Int32; nuclear@14: typedef unsigned long UInt32; nuclear@14: #else nuclear@14: typedef int Int32; nuclear@14: typedef unsigned int UInt32; nuclear@14: #endif nuclear@14: nuclear@14: #ifdef _SZ_NO_INT_64 nuclear@14: nuclear@14: /* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. nuclear@14: NOTES: Some code will work incorrectly in that case! */ nuclear@14: nuclear@14: typedef long Int64; nuclear@14: typedef unsigned long UInt64; nuclear@14: nuclear@14: #else nuclear@14: nuclear@14: #if defined(_MSC_VER) || defined(__BORLANDC__) nuclear@14: typedef __int64 Int64; nuclear@14: typedef unsigned __int64 UInt64; nuclear@14: #else nuclear@14: typedef long long int Int64; nuclear@14: typedef unsigned long long int UInt64; nuclear@14: #endif nuclear@14: nuclear@14: #endif nuclear@14: nuclear@14: #ifdef _LZMA_NO_SYSTEM_SIZE_T nuclear@14: typedef UInt32 SizeT; nuclear@14: #else nuclear@14: typedef size_t SizeT; nuclear@14: #endif nuclear@14: nuclear@14: typedef int Bool; nuclear@14: #define True 1 nuclear@14: #define False 0 nuclear@14: nuclear@14: nuclear@14: #ifdef _MSC_VER nuclear@14: nuclear@14: #if _MSC_VER >= 1300 nuclear@14: #define MY_NO_INLINE __declspec(noinline) nuclear@14: #else nuclear@14: #define MY_NO_INLINE nuclear@14: #endif nuclear@14: nuclear@14: #define MY_CDECL __cdecl nuclear@14: #define MY_STD_CALL __stdcall nuclear@14: #define MY_FAST_CALL MY_NO_INLINE __fastcall nuclear@14: nuclear@14: #else nuclear@14: nuclear@14: #define MY_CDECL nuclear@14: #define MY_STD_CALL nuclear@14: #define MY_FAST_CALL nuclear@14: nuclear@14: #endif nuclear@14: nuclear@14: nuclear@14: /* The following interfaces use first parameter as pointer to structure */ nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: SRes (*Read)(void *p, void *buf, size_t *size); nuclear@14: /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. nuclear@14: (output(*size) < input(*size)) is allowed */ nuclear@14: } ISeqInStream; nuclear@14: nuclear@14: /* it can return SZ_ERROR_INPUT_EOF */ nuclear@14: SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); nuclear@14: SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); nuclear@14: SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: size_t (*Write)(void *p, const void *buf, size_t size); nuclear@14: /* Returns: result - the number of actually written bytes. nuclear@14: (result < size) means error */ nuclear@14: } ISeqOutStream; nuclear@14: nuclear@14: typedef enum nuclear@14: { nuclear@14: SZ_SEEK_SET = 0, nuclear@14: SZ_SEEK_CUR = 1, nuclear@14: SZ_SEEK_END = 2 nuclear@14: } ESzSeek; nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ nuclear@14: SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); nuclear@14: } ISeekInStream; nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: SRes (*Look)(void *p, void **buf, size_t *size); nuclear@14: /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. nuclear@14: (output(*size) > input(*size)) is not allowed nuclear@14: (output(*size) < input(*size)) is allowed */ nuclear@14: SRes (*Skip)(void *p, size_t offset); nuclear@14: /* offset must be <= output(*size) of Look */ nuclear@14: nuclear@14: SRes (*Read)(void *p, void *buf, size_t *size); nuclear@14: /* reads directly (without buffer). It's same as ISeqInStream::Read */ nuclear@14: SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); nuclear@14: } ILookInStream; nuclear@14: nuclear@14: SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); nuclear@14: SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); nuclear@14: nuclear@14: /* reads via ILookInStream::Read */ nuclear@14: SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); nuclear@14: SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); nuclear@14: nuclear@14: #define LookToRead_BUF_SIZE (1 << 14) nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: ILookInStream s; nuclear@14: ISeekInStream *realStream; nuclear@14: size_t pos; nuclear@14: size_t size; nuclear@14: Byte buf[LookToRead_BUF_SIZE]; nuclear@14: } CLookToRead; nuclear@14: nuclear@14: void LookToRead_CreateVTable(CLookToRead *p, int lookahead); nuclear@14: void LookToRead_Init(CLookToRead *p); nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: ISeqInStream s; nuclear@14: ILookInStream *realStream; nuclear@14: } CSecToLook; nuclear@14: nuclear@14: void SecToLook_CreateVTable(CSecToLook *p); nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: ISeqInStream s; nuclear@14: ILookInStream *realStream; nuclear@14: } CSecToRead; nuclear@14: nuclear@14: void SecToRead_CreateVTable(CSecToRead *p); nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); nuclear@14: /* Returns: result. (result != SZ_OK) means break. nuclear@14: Value (UInt64)(Int64)-1 for size means unknown value. */ nuclear@14: } ICompressProgress; nuclear@14: nuclear@14: typedef struct nuclear@14: { nuclear@14: void *(*Alloc)(void *p, size_t size); nuclear@14: void (*Free)(void *p, void *address); /* address can be 0 */ nuclear@14: } ISzAlloc; nuclear@14: nuclear@14: #define IAlloc_Alloc(p, size) (p)->Alloc((p), size) nuclear@14: #define IAlloc_Free(p, a) (p)->Free((p), a) nuclear@14: nuclear@14: #endif