f535537f |
1 | /* 7zTypes.h -- Basic types |
2 | 2024-01-24 : Igor Pavlov : Public domain */ |
3 | |
4 | #ifndef ZIP7_7Z_TYPES_H |
5 | #define ZIP7_7Z_TYPES_H |
6 | |
7 | #ifdef _WIN32 |
8 | /* #include <windows.h> */ |
9 | #else |
10 | #include <errno.h> |
11 | #endif |
12 | |
13 | #include <stddef.h> |
14 | |
15 | #ifndef EXTERN_C_BEGIN |
16 | #ifdef __cplusplus |
17 | #define EXTERN_C_BEGIN extern "C" { |
18 | #define EXTERN_C_END } |
19 | #else |
20 | #define EXTERN_C_BEGIN |
21 | #define EXTERN_C_END |
22 | #endif |
23 | #endif |
24 | |
25 | EXTERN_C_BEGIN |
26 | |
27 | #define SZ_OK 0 |
28 | |
29 | #define SZ_ERROR_DATA 1 |
30 | #define SZ_ERROR_MEM 2 |
31 | #define SZ_ERROR_CRC 3 |
32 | #define SZ_ERROR_UNSUPPORTED 4 |
33 | #define SZ_ERROR_PARAM 5 |
34 | #define SZ_ERROR_INPUT_EOF 6 |
35 | #define SZ_ERROR_OUTPUT_EOF 7 |
36 | #define SZ_ERROR_READ 8 |
37 | #define SZ_ERROR_WRITE 9 |
38 | #define SZ_ERROR_PROGRESS 10 |
39 | #define SZ_ERROR_FAIL 11 |
40 | #define SZ_ERROR_THREAD 12 |
41 | |
42 | #define SZ_ERROR_ARCHIVE 16 |
43 | #define SZ_ERROR_NO_ARCHIVE 17 |
44 | |
45 | typedef int SRes; |
46 | |
47 | |
48 | #ifdef _MSC_VER |
49 | #if _MSC_VER > 1200 |
50 | #define MY_ALIGN(n) __declspec(align(n)) |
51 | #else |
52 | #define MY_ALIGN(n) |
53 | #endif |
54 | #else |
55 | /* |
56 | // C11/C++11: |
57 | #include <stdalign.h> |
58 | #define MY_ALIGN(n) alignas(n) |
59 | */ |
60 | #define MY_ALIGN(n) __attribute__ ((aligned(n))) |
61 | #endif |
62 | |
63 | |
64 | #ifdef _WIN32 |
65 | |
66 | /* typedef DWORD WRes; */ |
67 | typedef unsigned WRes; |
68 | #define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) |
69 | |
70 | // #define MY_HRES_ERROR_INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR) |
71 | |
72 | #else // _WIN32 |
73 | |
74 | // #define ENV_HAVE_LSTAT |
75 | typedef int WRes; |
76 | |
77 | // (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT |
78 | #define MY_FACILITY_ERRNO 0x800 |
79 | #define MY_FACILITY_WIN32 7 |
80 | #define MY_FACILITY_WRes MY_FACILITY_ERRNO |
81 | |
82 | #define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \ |
83 | ( (HRESULT)(x) & 0x0000FFFF) \ |
84 | | (MY_FACILITY_WRes << 16) \ |
85 | | (HRESULT)0x80000000 )) |
86 | |
87 | #define MY_SRes_HRESULT_FROM_WRes(x) \ |
88 | ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x)) |
89 | |
90 | // we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno) |
91 | #define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x) |
92 | |
93 | /* |
94 | #define ERROR_FILE_NOT_FOUND 2L |
95 | #define ERROR_ACCESS_DENIED 5L |
96 | #define ERROR_NO_MORE_FILES 18L |
97 | #define ERROR_LOCK_VIOLATION 33L |
98 | #define ERROR_FILE_EXISTS 80L |
99 | #define ERROR_DISK_FULL 112L |
100 | #define ERROR_NEGATIVE_SEEK 131L |
101 | #define ERROR_ALREADY_EXISTS 183L |
102 | #define ERROR_DIRECTORY 267L |
103 | #define ERROR_TOO_MANY_POSTS 298L |
104 | |
105 | #define ERROR_INTERNAL_ERROR 1359L |
106 | #define ERROR_INVALID_REPARSE_DATA 4392L |
107 | #define ERROR_REPARSE_TAG_INVALID 4393L |
108 | #define ERROR_REPARSE_TAG_MISMATCH 4394L |
109 | */ |
110 | |
111 | // we use errno equivalents for some WIN32 errors: |
112 | |
113 | #define ERROR_INVALID_PARAMETER EINVAL |
114 | #define ERROR_INVALID_FUNCTION EINVAL |
115 | #define ERROR_ALREADY_EXISTS EEXIST |
116 | #define ERROR_FILE_EXISTS EEXIST |
117 | #define ERROR_PATH_NOT_FOUND ENOENT |
118 | #define ERROR_FILE_NOT_FOUND ENOENT |
119 | #define ERROR_DISK_FULL ENOSPC |
120 | // #define ERROR_INVALID_HANDLE EBADF |
121 | |
122 | // we use FACILITY_WIN32 for errors that has no errno equivalent |
123 | // Too many posts were made to a semaphore. |
124 | #define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL) |
125 | #define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L) |
126 | #define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L) |
127 | |
128 | // if (MY_FACILITY_WRes != FACILITY_WIN32), |
129 | // we use FACILITY_WIN32 for COM errors: |
130 | #define E_OUTOFMEMORY ((HRESULT)0x8007000EL) |
131 | #define E_INVALIDARG ((HRESULT)0x80070057L) |
132 | #define MY_E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) |
133 | |
134 | /* |
135 | // we can use FACILITY_ERRNO for some COM errors, that have errno equivalents: |
136 | #define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM) |
137 | #define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) |
138 | #define MY_E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) |
139 | */ |
140 | |
141 | #define TEXT(quote) quote |
142 | |
143 | #define FILE_ATTRIBUTE_READONLY 0x0001 |
144 | #define FILE_ATTRIBUTE_HIDDEN 0x0002 |
145 | #define FILE_ATTRIBUTE_SYSTEM 0x0004 |
146 | #define FILE_ATTRIBUTE_DIRECTORY 0x0010 |
147 | #define FILE_ATTRIBUTE_ARCHIVE 0x0020 |
148 | #define FILE_ATTRIBUTE_DEVICE 0x0040 |
149 | #define FILE_ATTRIBUTE_NORMAL 0x0080 |
150 | #define FILE_ATTRIBUTE_TEMPORARY 0x0100 |
151 | #define FILE_ATTRIBUTE_SPARSE_FILE 0x0200 |
152 | #define FILE_ATTRIBUTE_REPARSE_POINT 0x0400 |
153 | #define FILE_ATTRIBUTE_COMPRESSED 0x0800 |
154 | #define FILE_ATTRIBUTE_OFFLINE 0x1000 |
155 | #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 |
156 | #define FILE_ATTRIBUTE_ENCRYPTED 0x4000 |
157 | |
158 | #define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ |
159 | |
160 | #endif |
161 | |
162 | |
163 | #ifndef RINOK |
164 | #define RINOK(x) { const int _result_ = (x); if (_result_ != 0) return _result_; } |
165 | #endif |
166 | |
167 | #ifndef RINOK_WRes |
168 | #define RINOK_WRes(x) { const WRes _result_ = (x); if (_result_ != 0) return _result_; } |
169 | #endif |
170 | |
171 | typedef unsigned char Byte; |
172 | typedef short Int16; |
173 | typedef unsigned short UInt16; |
174 | |
175 | #ifdef Z7_DECL_Int32_AS_long |
176 | typedef long Int32; |
177 | typedef unsigned long UInt32; |
178 | #else |
179 | typedef int Int32; |
180 | typedef unsigned int UInt32; |
181 | #endif |
182 | |
183 | |
184 | #ifndef _WIN32 |
185 | |
186 | typedef int INT; |
187 | typedef Int32 INT32; |
188 | typedef unsigned int UINT; |
189 | typedef UInt32 UINT32; |
190 | typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility |
191 | typedef UINT32 ULONG; |
192 | |
193 | #undef DWORD |
194 | typedef UINT32 DWORD; |
195 | |
196 | #define VOID void |
197 | |
198 | #define HRESULT LONG |
199 | |
200 | typedef void *LPVOID; |
201 | // typedef void VOID; |
202 | // typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; |
203 | // gcc / clang on Unix : sizeof(long==sizeof(void*) in 32 or 64 bits) |
204 | typedef long INT_PTR; |
205 | typedef unsigned long UINT_PTR; |
206 | typedef long LONG_PTR; |
207 | typedef unsigned long DWORD_PTR; |
208 | |
209 | typedef size_t SIZE_T; |
210 | |
211 | #endif // _WIN32 |
212 | |
213 | |
214 | #define MY_HRES_ERROR_INTERNAL_ERROR ((HRESULT)0x8007054FL) |
215 | |
216 | |
217 | #ifdef Z7_DECL_Int64_AS_long |
218 | |
219 | typedef long Int64; |
220 | typedef unsigned long UInt64; |
221 | |
222 | #else |
223 | |
224 | #if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__clang__) |
225 | typedef __int64 Int64; |
226 | typedef unsigned __int64 UInt64; |
227 | #else |
228 | #if defined(__clang__) || defined(__GNUC__) |
229 | #include <stdint.h> |
230 | typedef int64_t Int64; |
231 | typedef uint64_t UInt64; |
232 | #else |
233 | typedef long long int Int64; |
234 | typedef unsigned long long int UInt64; |
235 | // #define UINT64_CONST(n) n ## ULL |
236 | #endif |
237 | #endif |
238 | |
239 | #endif |
240 | |
241 | #define UINT64_CONST(n) n |
242 | |
243 | |
244 | #ifdef Z7_DECL_SizeT_AS_unsigned_int |
245 | typedef unsigned int SizeT; |
246 | #else |
247 | typedef size_t SizeT; |
248 | #endif |
249 | |
250 | /* |
251 | #if (defined(_MSC_VER) && _MSC_VER <= 1200) |
252 | typedef size_t MY_uintptr_t; |
253 | #else |
254 | #include <stdint.h> |
255 | typedef uintptr_t MY_uintptr_t; |
256 | #endif |
257 | */ |
258 | |
259 | typedef int BoolInt; |
260 | /* typedef BoolInt Bool; */ |
261 | #define True 1 |
262 | #define False 0 |
263 | |
264 | |
265 | #ifdef _WIN32 |
266 | #define Z7_STDCALL __stdcall |
267 | #else |
268 | #define Z7_STDCALL |
269 | #endif |
270 | |
271 | #ifdef _MSC_VER |
272 | |
273 | #if _MSC_VER >= 1300 |
274 | #define Z7_NO_INLINE __declspec(noinline) |
275 | #else |
276 | #define Z7_NO_INLINE |
277 | #endif |
278 | |
279 | #define Z7_FORCE_INLINE __forceinline |
280 | |
281 | #define Z7_CDECL __cdecl |
282 | #define Z7_FASTCALL __fastcall |
283 | |
284 | #else // _MSC_VER |
285 | |
286 | #if (defined(__GNUC__) && (__GNUC__ >= 4)) \ |
287 | || (defined(__clang__) && (__clang_major__ >= 4)) \ |
288 | || defined(__INTEL_COMPILER) \ |
289 | || defined(__xlC__) |
290 | #define Z7_NO_INLINE __attribute__((noinline)) |
291 | #define Z7_FORCE_INLINE __attribute__((always_inline)) inline |
292 | #else |
293 | #define Z7_NO_INLINE |
294 | #define Z7_FORCE_INLINE |
295 | #endif |
296 | |
297 | #define Z7_CDECL |
298 | |
299 | #if defined(_M_IX86) \ |
300 | || defined(__i386__) |
301 | // #define Z7_FASTCALL __attribute__((fastcall)) |
302 | // #define Z7_FASTCALL __attribute__((cdecl)) |
303 | #define Z7_FASTCALL |
304 | #elif defined(MY_CPU_AMD64) |
305 | // #define Z7_FASTCALL __attribute__((ms_abi)) |
306 | #define Z7_FASTCALL |
307 | #else |
308 | #define Z7_FASTCALL |
309 | #endif |
310 | |
311 | #endif // _MSC_VER |
312 | |
313 | |
314 | /* The following interfaces use first parameter as pointer to structure */ |
315 | |
316 | // #define Z7_C_IFACE_CONST_QUAL |
317 | #define Z7_C_IFACE_CONST_QUAL const |
318 | |
319 | #define Z7_C_IFACE_DECL(a) \ |
320 | struct a ## _; \ |
321 | typedef Z7_C_IFACE_CONST_QUAL struct a ## _ * a ## Ptr; \ |
322 | typedef struct a ## _ a; \ |
323 | struct a ## _ |
324 | |
325 | |
326 | Z7_C_IFACE_DECL (IByteIn) |
327 | { |
328 | Byte (*Read)(IByteInPtr p); /* reads one byte, returns 0 in case of EOF or error */ |
329 | }; |
330 | #define IByteIn_Read(p) (p)->Read(p) |
331 | |
332 | |
333 | Z7_C_IFACE_DECL (IByteOut) |
334 | { |
335 | void (*Write)(IByteOutPtr p, Byte b); |
336 | }; |
337 | #define IByteOut_Write(p, b) (p)->Write(p, b) |
338 | |
339 | |
340 | Z7_C_IFACE_DECL (ISeqInStream) |
341 | { |
342 | SRes (*Read)(ISeqInStreamPtr p, void *buf, size_t *size); |
343 | /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. |
344 | (output(*size) < input(*size)) is allowed */ |
345 | }; |
346 | #define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) |
347 | |
348 | /* try to read as much as avail in stream and limited by (*processedSize) */ |
349 | SRes SeqInStream_ReadMax(ISeqInStreamPtr stream, void *buf, size_t *processedSize); |
350 | /* it can return SZ_ERROR_INPUT_EOF */ |
351 | // SRes SeqInStream_Read(ISeqInStreamPtr stream, void *buf, size_t size); |
352 | // SRes SeqInStream_Read2(ISeqInStreamPtr stream, void *buf, size_t size, SRes errorType); |
353 | SRes SeqInStream_ReadByte(ISeqInStreamPtr stream, Byte *buf); |
354 | |
355 | |
356 | Z7_C_IFACE_DECL (ISeqOutStream) |
357 | { |
358 | size_t (*Write)(ISeqOutStreamPtr p, const void *buf, size_t size); |
359 | /* Returns: result - the number of actually written bytes. |
360 | (result < size) means error */ |
361 | }; |
362 | #define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) |
363 | |
364 | typedef enum |
365 | { |
366 | SZ_SEEK_SET = 0, |
367 | SZ_SEEK_CUR = 1, |
368 | SZ_SEEK_END = 2 |
369 | } ESzSeek; |
370 | |
371 | |
372 | Z7_C_IFACE_DECL (ISeekInStream) |
373 | { |
374 | SRes (*Read)(ISeekInStreamPtr p, void *buf, size_t *size); /* same as ISeqInStream::Read */ |
375 | SRes (*Seek)(ISeekInStreamPtr p, Int64 *pos, ESzSeek origin); |
376 | }; |
377 | #define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) |
378 | #define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) |
379 | |
380 | |
381 | Z7_C_IFACE_DECL (ILookInStream) |
382 | { |
383 | SRes (*Look)(ILookInStreamPtr p, const void **buf, size_t *size); |
384 | /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. |
385 | (output(*size) > input(*size)) is not allowed |
386 | (output(*size) < input(*size)) is allowed */ |
387 | SRes (*Skip)(ILookInStreamPtr p, size_t offset); |
388 | /* offset must be <= output(*size) of Look */ |
389 | SRes (*Read)(ILookInStreamPtr p, void *buf, size_t *size); |
390 | /* reads directly (without buffer). It's same as ISeqInStream::Read */ |
391 | SRes (*Seek)(ILookInStreamPtr p, Int64 *pos, ESzSeek origin); |
392 | }; |
393 | |
394 | #define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) |
395 | #define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) |
396 | #define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) |
397 | #define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) |
398 | |
399 | |
400 | SRes LookInStream_LookRead(ILookInStreamPtr stream, void *buf, size_t *size); |
401 | SRes LookInStream_SeekTo(ILookInStreamPtr stream, UInt64 offset); |
402 | |
403 | /* reads via ILookInStream::Read */ |
404 | SRes LookInStream_Read2(ILookInStreamPtr stream, void *buf, size_t size, SRes errorType); |
405 | SRes LookInStream_Read(ILookInStreamPtr stream, void *buf, size_t size); |
406 | |
407 | |
408 | typedef struct |
409 | { |
410 | ILookInStream vt; |
411 | ISeekInStreamPtr realStream; |
412 | |
413 | size_t pos; |
414 | size_t size; /* it's data size */ |
415 | |
416 | /* the following variables must be set outside */ |
417 | Byte *buf; |
418 | size_t bufSize; |
419 | } CLookToRead2; |
420 | |
421 | void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); |
422 | |
423 | #define LookToRead2_INIT(p) { (p)->pos = (p)->size = 0; } |
424 | |
425 | |
426 | typedef struct |
427 | { |
428 | ISeqInStream vt; |
429 | ILookInStreamPtr realStream; |
430 | } CSecToLook; |
431 | |
432 | void SecToLook_CreateVTable(CSecToLook *p); |
433 | |
434 | |
435 | |
436 | typedef struct |
437 | { |
438 | ISeqInStream vt; |
439 | ILookInStreamPtr realStream; |
440 | } CSecToRead; |
441 | |
442 | void SecToRead_CreateVTable(CSecToRead *p); |
443 | |
444 | |
445 | Z7_C_IFACE_DECL (ICompressProgress) |
446 | { |
447 | SRes (*Progress)(ICompressProgressPtr p, UInt64 inSize, UInt64 outSize); |
448 | /* Returns: result. (result != SZ_OK) means break. |
449 | Value (UInt64)(Int64)-1 for size means unknown value. */ |
450 | }; |
451 | |
452 | #define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) |
453 | |
454 | |
455 | |
456 | typedef struct ISzAlloc ISzAlloc; |
457 | typedef const ISzAlloc * ISzAllocPtr; |
458 | |
459 | struct ISzAlloc |
460 | { |
461 | void *(*Alloc)(ISzAllocPtr p, size_t size); |
462 | void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */ |
463 | }; |
464 | |
465 | #define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) |
466 | #define ISzAlloc_Free(p, a) (p)->Free(p, a) |
467 | |
468 | /* deprecated */ |
469 | #define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) |
470 | #define IAlloc_Free(p, a) ISzAlloc_Free(p, a) |
471 | |
472 | |
473 | |
474 | |
475 | |
476 | #ifndef MY_offsetof |
477 | #ifdef offsetof |
478 | #define MY_offsetof(type, m) offsetof(type, m) |
479 | /* |
480 | #define MY_offsetof(type, m) FIELD_OFFSET(type, m) |
481 | */ |
482 | #else |
483 | #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) |
484 | #endif |
485 | #endif |
486 | |
487 | |
488 | |
489 | #ifndef Z7_container_of |
490 | |
491 | /* |
492 | #define Z7_container_of(ptr, type, m) container_of(ptr, type, m) |
493 | #define Z7_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) |
494 | #define Z7_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) |
495 | #define Z7_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) |
496 | */ |
497 | |
498 | /* |
499 | GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" |
500 | GCC 3.4.4 : classes with constructor |
501 | GCC 4.8.1 : classes with non-public variable members" |
502 | */ |
503 | |
504 | #define Z7_container_of(ptr, type, m) \ |
505 | ((type *)(void *)((char *)(void *) \ |
506 | (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) |
507 | |
508 | #define Z7_container_of_CONST(ptr, type, m) \ |
509 | ((const type *)(const void *)((const char *)(const void *) \ |
510 | (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) |
511 | |
512 | /* |
513 | #define Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) \ |
514 | ((type *)(void *)(const void *)((const char *)(const void *) \ |
515 | (1 ? (ptr) : &((type *)NULL)->m) - MY_offsetof(type, m))) |
516 | */ |
517 | |
518 | #endif |
519 | |
520 | #define Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) |
521 | |
522 | // #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) |
523 | #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of(ptr, type, m) |
524 | // #define Z7_CONTAINER_FROM_VTBL(ptr, type, m) Z7_container_of_NON_CONST_FROM_CONST(ptr, type, m) |
525 | |
526 | #define Z7_CONTAINER_FROM_VTBL_CONST(ptr, type, m) Z7_container_of_CONST(ptr, type, m) |
527 | |
528 | #define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) |
529 | /* |
530 | #define Z7_CONTAINER_FROM_VTBL_CLS(ptr, type, m) Z7_CONTAINER_FROM_VTBL(ptr, type, m) |
531 | */ |
532 | #if defined (__clang__) || defined(__GNUC__) |
533 | #define Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL \ |
534 | _Pragma("GCC diagnostic push") \ |
535 | _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") |
536 | #define Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL \ |
537 | _Pragma("GCC diagnostic pop") |
538 | #else |
539 | #define Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL |
540 | #define Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL |
541 | #endif |
542 | |
543 | #define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(ptr, type, m, p) \ |
544 | Z7_DIAGNOSTIC_IGNORE_BEGIN_CAST_QUAL \ |
545 | type *p = Z7_CONTAINER_FROM_VTBL(ptr, type, m); \ |
546 | Z7_DIAGNOSTIC_IGNORE_END_CAST_QUAL |
547 | |
548 | #define Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(type) \ |
549 | Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR(pp, type, vt, p) |
550 | |
551 | |
552 | // #define ZIP7_DECLARE_HANDLE(name) typedef void *name; |
553 | #define Z7_DECLARE_HANDLE(name) struct name##_dummy{int unused;}; typedef struct name##_dummy *name; |
554 | |
555 | |
556 | #define Z7_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) |
557 | |
558 | #ifndef Z7_ARRAY_SIZE |
559 | #define Z7_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) |
560 | #endif |
561 | |
562 | |
563 | #ifdef _WIN32 |
564 | |
565 | #define CHAR_PATH_SEPARATOR '\\' |
566 | #define WCHAR_PATH_SEPARATOR L'\\' |
567 | #define STRING_PATH_SEPARATOR "\\" |
568 | #define WSTRING_PATH_SEPARATOR L"\\" |
569 | |
570 | #else |
571 | |
572 | #define CHAR_PATH_SEPARATOR '/' |
573 | #define WCHAR_PATH_SEPARATOR L'/' |
574 | #define STRING_PATH_SEPARATOR "/" |
575 | #define WSTRING_PATH_SEPARATOR L"/" |
576 | |
577 | #endif |
578 | |
579 | #define k_PropVar_TimePrec_0 0 |
580 | #define k_PropVar_TimePrec_Unix 1 |
581 | #define k_PropVar_TimePrec_DOS 2 |
582 | #define k_PropVar_TimePrec_HighPrec 3 |
583 | #define k_PropVar_TimePrec_Base 16 |
584 | #define k_PropVar_TimePrec_100ns (k_PropVar_TimePrec_Base + 7) |
585 | #define k_PropVar_TimePrec_1ns (k_PropVar_TimePrec_Base + 9) |
586 | |
587 | EXTERN_C_END |
588 | |
589 | #endif |
590 | |
591 | /* |
592 | #ifndef Z7_ST |
593 | #ifdef _7ZIP_ST |
594 | #define Z7_ST |
595 | #endif |
596 | #endif |
597 | */ |