1/** @file
2  Types.h
3
4  Based on LZMA SDK 4.65:
5    Types.h -- Basic types
6    2008-11-23 : Igor Pavlov : Public domain
7
8  Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
9  This program and the accompanying materials
10  are licensed and made available under the terms and conditions of the BSD License
11  which accompanies this distribution.  The full text of the license may be found at
12  http://opensource.org/licenses/bsd-license.php
13
14  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
15  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16
17**/
18
19#ifndef __7Z_TYPES_H
20#define __7Z_TYPES_H
21
22#ifdef EFIAPI
23
24#include "UefiLzma.h"
25
26#else
27
28#include <stddef.h>
29
30#ifdef _WIN32
31#include <windows.h>
32#endif
33
34#endif
35
36#define SZ_OK 0
37
38#define SZ_ERROR_DATA 1
39#define SZ_ERROR_MEM 2
40#define SZ_ERROR_CRC 3
41#define SZ_ERROR_UNSUPPORTED 4
42#define SZ_ERROR_PARAM 5
43#define SZ_ERROR_INPUT_EOF 6
44#define SZ_ERROR_OUTPUT_EOF 7
45#define SZ_ERROR_READ 8
46#define SZ_ERROR_WRITE 9
47#define SZ_ERROR_PROGRESS 10
48#define SZ_ERROR_FAIL 11
49#define SZ_ERROR_THREAD 12
50
51#define SZ_ERROR_ARCHIVE 16
52#define SZ_ERROR_NO_ARCHIVE 17
53
54typedef int SRes;
55
56#ifdef _WIN32
57typedef DWORD WRes;
58#else
59typedef int WRes;
60#endif
61
62#ifndef RINOK
63#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
64#endif
65
66typedef unsigned char Byte;
67typedef short Int16;
68typedef unsigned short UInt16;
69
70#ifdef _LZMA_UINT32_IS_ULONG
71typedef long Int32;
72typedef unsigned long UInt32;
73#else
74typedef int Int32;
75typedef unsigned int UInt32;
76#endif
77
78#ifdef _SZ_NO_INT_64
79
80/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
81   NOTES: Some code will work incorrectly in that case! */
82
83typedef long Int64;
84typedef unsigned long UInt64;
85
86#else
87
88#if defined(_MSC_VER) || defined(__BORLANDC__)
89typedef __int64 Int64;
90typedef unsigned __int64 UInt64;
91#else
92typedef long long int Int64;
93typedef unsigned long long int UInt64;
94#endif
95
96#endif
97
98#ifdef _LZMA_NO_SYSTEM_SIZE_T
99typedef UInt32 SizeT;
100#else
101typedef size_t SizeT;
102#endif
103
104typedef int Bool;
105#define True 1
106#define False 0
107
108
109#ifdef _MSC_VER
110
111#if _MSC_VER >= 1300
112#define MY_NO_INLINE __declspec(noinline)
113#else
114#define MY_NO_INLINE
115#endif
116
117#define MY_CDECL __cdecl
118#define MY_STD_CALL __stdcall
119#define MY_FAST_CALL MY_NO_INLINE __fastcall
120
121#else
122
123#define MY_CDECL
124#define MY_STD_CALL
125#define MY_FAST_CALL
126
127#endif
128
129
130/* The following interfaces use first parameter as pointer to structure */
131
132typedef struct
133{
134  SRes (*Read)(void *p, void *buf, size_t *size);
135    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
136       (output(*size) < input(*size)) is allowed */
137} ISeqInStream;
138
139/* it can return SZ_ERROR_INPUT_EOF */
140SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
141SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
142SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
143
144typedef struct
145{
146  size_t (*Write)(void *p, const void *buf, size_t size);
147    /* Returns: result - the number of actually written bytes.
148       (result < size) means error */
149} ISeqOutStream;
150
151typedef enum
152{
153  SZ_SEEK_SET = 0,
154  SZ_SEEK_CUR = 1,
155  SZ_SEEK_END = 2
156} ESzSeek;
157
158typedef struct
159{
160  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
161  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
162} ISeekInStream;
163
164typedef struct
165{
166  SRes (*Look)(void *p, void **buf, size_t *size);
167    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
168       (output(*size) > input(*size)) is not allowed
169       (output(*size) < input(*size)) is allowed */
170  SRes (*Skip)(void *p, size_t offset);
171    /* offset must be <= output(*size) of Look */
172
173  SRes (*Read)(void *p, void *buf, size_t *size);
174    /* reads directly (without buffer). It's same as ISeqInStream::Read */
175  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
176} ILookInStream;
177
178SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
179SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
180
181/* reads via ILookInStream::Read */
182SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
183SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
184
185#define LookToRead_BUF_SIZE (1 << 14)
186
187typedef struct
188{
189  ILookInStream s;
190  ISeekInStream *realStream;
191  size_t pos;
192  size_t size;
193  Byte buf[LookToRead_BUF_SIZE];
194} CLookToRead;
195
196void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
197void LookToRead_Init(CLookToRead *p);
198
199typedef struct
200{
201  ISeqInStream s;
202  ILookInStream *realStream;
203} CSecToLook;
204
205void SecToLook_CreateVTable(CSecToLook *p);
206
207typedef struct
208{
209  ISeqInStream s;
210  ILookInStream *realStream;
211} CSecToRead;
212
213void SecToRead_CreateVTable(CSecToRead *p);
214
215typedef struct
216{
217  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
218    /* Returns: result. (result != SZ_OK) means break.
219       Value (UInt64)(Int64)-1 for size means unknown value. */
220} ICompressProgress;
221
222typedef struct
223{
224  void *(*Alloc)(void *p, size_t size);
225  void (*Free)(void *p, void *address); /* address can be 0 */
226} ISzAlloc;
227
228#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
229#define IAlloc_Free(p, a) (p)->Free((p), a)
230
231#endif
232