1 /* Types.h -- Basic types 2 2010-10-09 : Igor Pavlov : Public domain */ 3 4 #ifndef __7Z_TYPES_H 5 #define __7Z_TYPES_H 6 7 #include <stddef.h> 8 9 #ifdef _WIN32 10 #include <windows.h> 11 #endif 12 13 #ifndef EXTERN_C_BEGIN 14 #ifdef __cplusplus 15 #define EXTERN_C_BEGIN extern "C" { 16 #define EXTERN_C_END } 17 #else 18 #define EXTERN_C_BEGIN 19 #define EXTERN_C_END 20 #endif 21 #endif 22 23 EXTERN_C_BEGIN 24 25 #define SZ_OK 0 26 27 #define SZ_ERROR_DATA 1 28 #define SZ_ERROR_MEM 2 29 #define SZ_ERROR_CRC 3 30 #define SZ_ERROR_UNSUPPORTED 4 31 #define SZ_ERROR_PARAM 5 32 #define SZ_ERROR_INPUT_EOF 6 33 #define SZ_ERROR_OUTPUT_EOF 7 34 #define SZ_ERROR_READ 8 35 #define SZ_ERROR_WRITE 9 36 #define SZ_ERROR_PROGRESS 10 37 #define SZ_ERROR_FAIL 11 38 #define SZ_ERROR_THREAD 12 39 40 #define SZ_ERROR_ARCHIVE 16 41 #define SZ_ERROR_NO_ARCHIVE 17 42 43 typedef int SRes; 44 45 #ifdef _WIN32 46 typedef DWORD WRes; 47 #else 48 typedef int WRes; 49 #endif 50 51 #ifndef RINOK 52 #define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } 53 #endif 54 55 typedef unsigned char Byte; 56 typedef short Int16; 57 typedef unsigned short UInt16; 58 59 #ifdef _LZMA_UINT32_IS_ULONG 60 typedef long Int32; 61 typedef unsigned long UInt32; 62 #else 63 typedef int Int32; 64 typedef unsigned int UInt32; 65 #endif 66 67 #ifdef _SZ_NO_INT_64 68 69 /* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. 70 NOTES: Some code will work incorrectly in that case! */ 71 72 typedef long Int64; 73 typedef unsigned long UInt64; 74 75 #else 76 77 #if defined(_MSC_VER) || defined(__BORLANDC__) 78 typedef __int64 Int64; 79 typedef unsigned __int64 UInt64; 80 #define UINT64_CONST(n) n 81 #else 82 typedef long long int Int64; 83 typedef unsigned long long int UInt64; 84 #define UINT64_CONST(n) n ## ULL 85 #endif 86 87 #endif 88 89 #ifdef _LZMA_NO_SYSTEM_SIZE_T 90 typedef UInt32 SizeT; 91 #else 92 typedef size_t SizeT; 93 #endif 94 95 typedef int Bool; 96 #define True 1 97 #define False 0 98 99 100 #ifdef _WIN32 101 #define MY_STD_CALL __stdcall 102 #else 103 #define MY_STD_CALL 104 #endif 105 106 #ifdef _MSC_VER 107 108 #if _MSC_VER >= 1300 109 #define MY_NO_INLINE __declspec(noinline) 110 #else 111 #define MY_NO_INLINE 112 #endif 113 114 #define MY_CDECL __cdecl 115 #define MY_FAST_CALL __fastcall 116 117 #else 118 119 #define MY_CDECL 120 #define MY_FAST_CALL 121 122 #endif 123 124 125 /* The following interfaces use first parameter as pointer to structure */ 126 127 typedef struct 128 { 129 Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ 130 } IByteIn; 131 132 typedef struct 133 { 134 void (*Write)(void *p, Byte b); 135 } IByteOut; 136 137 typedef struct 138 { 139 SRes (*Read)(void *p, void *buf, size_t *size); 140 /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. 141 (output(*size) < input(*size)) is allowed */ 142 } ISeqInStream; 143 144 /* it can return SZ_ERROR_INPUT_EOF */ 145 SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); 146 SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); 147 SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); 148 149 typedef struct 150 { 151 size_t (*Write)(void *p, const void *buf, size_t size); 152 /* Returns: result - the number of actually written bytes. 153 (result < size) means error */ 154 } ISeqOutStream; 155 156 typedef enum 157 { 158 SZ_SEEK_SET = 0, 159 SZ_SEEK_CUR = 1, 160 SZ_SEEK_END = 2 161 } ESzSeek; 162 163 typedef struct 164 { 165 SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ 166 SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); 167 } ISeekInStream; 168 169 typedef struct 170 { 171 SRes (*Look)(void *p, const void **buf, size_t *size); 172 /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. 173 (output(*size) > input(*size)) is not allowed 174 (output(*size) < input(*size)) is allowed */ 175 SRes (*Skip)(void *p, size_t offset); 176 /* offset must be <= output(*size) of Look */ 177 178 SRes (*Read)(void *p, void *buf, size_t *size); 179 /* reads directly (without buffer). It's same as ISeqInStream::Read */ 180 SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); 181 } ILookInStream; 182 183 SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); 184 SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); 185 186 /* reads via ILookInStream::Read */ 187 SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); 188 SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); 189 190 #define LookToRead_BUF_SIZE (1 << 14) 191 192 typedef struct 193 { 194 ILookInStream s; 195 ISeekInStream *realStream; 196 size_t pos; 197 size_t size; 198 Byte buf[LookToRead_BUF_SIZE]; 199 } CLookToRead; 200 201 void LookToRead_CreateVTable(CLookToRead *p, int lookahead); 202 void LookToRead_Init(CLookToRead *p); 203 204 typedef struct 205 { 206 ISeqInStream s; 207 ILookInStream *realStream; 208 } CSecToLook; 209 210 void SecToLook_CreateVTable(CSecToLook *p); 211 212 typedef struct 213 { 214 ISeqInStream s; 215 ILookInStream *realStream; 216 } CSecToRead; 217 218 void SecToRead_CreateVTable(CSecToRead *p); 219 220 typedef struct 221 { 222 SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); 223 /* Returns: result. (result != SZ_OK) means break. 224 Value (UInt64)(Int64)-1 for size means unknown value. */ 225 } ICompressProgress; 226 227 typedef struct 228 { 229 void *(*Alloc)(void *p, size_t size); 230 void (*Free)(void *p, void *address); /* address can be 0 */ 231 } ISzAlloc; 232 233 #define IAlloc_Alloc(p, size) (p)->Alloc((p), size) 234 #define IAlloc_Free(p, a) (p)->Free((p), a) 235 236 #ifdef _WIN32 237 238 #define CHAR_PATH_SEPARATOR '\\' 239 #define WCHAR_PATH_SEPARATOR L'\\' 240 #define STRING_PATH_SEPARATOR "\\" 241 #define WSTRING_PATH_SEPARATOR L"\\" 242 243 #else 244 245 #define CHAR_PATH_SEPARATOR '/' 246 #define WCHAR_PATH_SEPARATOR L'/' 247 #define STRING_PATH_SEPARATOR "/" 248 #define WSTRING_PATH_SEPARATOR L"/" 249 250 #endif 251 252 EXTERN_C_END 253 254 #endif 255