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 | |