111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao/** @file
211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  Types.h
311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  Based on LZMA SDK 4.65:
511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    Types.h -- Basic types
611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    2008-11-23 : Igor Pavlov : Public domain
711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  Copyright (c) 2009, Intel Corporation. All rights reserved.<BR>
911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  This program and the accompanying materials
1011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  are licensed and made available under the terms and conditions of the BSD License
1111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  which accompanies this distribution.  The full text of the license may be found at
1211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  http://opensource.org/licenses/bsd-license.php
1311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
1411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
1711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao**/
1811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
1911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifndef __7Z_TYPES_H
2011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define __7Z_TYPES_H
2111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
2211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef EFIAPI
2311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
2411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#include "UefiLzma.h"
2511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
2611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
2711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
2811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#include <stddef.h>
2911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
3011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _WIN32
3111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#include <windows.h>
3211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
3311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
3411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
3511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
3611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_OK 0
3711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
3811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_DATA 1
3911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_MEM 2
4011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_CRC 3
4111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_UNSUPPORTED 4
4211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_PARAM 5
4311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_INPUT_EOF 6
4411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_OUTPUT_EOF 7
4511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_READ 8
4611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_WRITE 9
4711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_PROGRESS 10
4811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_FAIL 11
4911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_THREAD 12
5011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
5111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_ARCHIVE 16
5211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define SZ_ERROR_NO_ARCHIVE 17
5311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
5411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef int SRes;
5511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
5611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _WIN32
5711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef DWORD WRes;
5811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
5911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef int WRes;
6011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
6111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
6211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifndef RINOK
6311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
6411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
6511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
6611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned char Byte;
6711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef short Int16;
6811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned short UInt16;
6911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
7011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _LZMA_UINT32_IS_ULONG
7111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef long Int32;
7211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned long UInt32;
7311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
7411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef int Int32;
7511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned int UInt32;
7611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
7711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
7811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _SZ_NO_INT_64
7911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
8011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
8111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao   NOTES: Some code will work incorrectly in that case! */
8211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
8311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef long Int64;
8411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned long UInt64;
8511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
8611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
8711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
8811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#if defined(_MSC_VER) || defined(__BORLANDC__)
8911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef __int64 Int64;
9011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned __int64 UInt64;
9111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
9211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef long long int Int64;
9311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef unsigned long long int UInt64;
9411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
9511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
9611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
9711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
9811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _LZMA_NO_SYSTEM_SIZE_T
9911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef UInt32 SizeT;
10011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
10111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef size_t SizeT;
10211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
10311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
10411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef int Bool;
10511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define True 1
10611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define False 0
10711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
10811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
10911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#ifdef _MSC_VER
11011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
11111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#if _MSC_VER >= 1300
11211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_NO_INLINE __declspec(noinline)
11311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
11411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_NO_INLINE
11511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
11611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
11711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_CDECL __cdecl
11811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_STD_CALL __stdcall
11911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_FAST_CALL MY_NO_INLINE __fastcall
12011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
12111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#else
12211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
12311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_CDECL
12411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_STD_CALL
12511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define MY_FAST_CALL
12611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
12711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
12811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
12911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
13011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao/* The following interfaces use first parameter as pointer to structure */
13111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
13211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
13311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
13411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Read)(void *p, void *buf, size_t *size);
13511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
13611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao       (output(*size) < input(*size)) is allowed */
13711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ISeqInStream;
13811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
13911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao/* it can return SZ_ERROR_INPUT_EOF */
14011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
14111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
14211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
14311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
14411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
14511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
14611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  size_t (*Write)(void *p, const void *buf, size_t size);
14711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* Returns: result - the number of actually written bytes.
14811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao       (result < size) means error */
14911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ISeqOutStream;
15011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
15111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef enum
15211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
15311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SZ_SEEK_SET = 0,
15411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SZ_SEEK_CUR = 1,
15511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SZ_SEEK_END = 2
15611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ESzSeek;
15711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
15811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
15911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
16011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
16111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
16211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ISeekInStream;
16311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
16411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
16511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
16611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Look)(void *p, void **buf, size_t *size);
16711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
16811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao       (output(*size) > input(*size)) is not allowed
16911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao       (output(*size) < input(*size)) is allowed */
17011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Skip)(void *p, size_t offset);
17111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* offset must be <= output(*size) of Look */
17211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
17311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Read)(void *p, void *buf, size_t *size);
17411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* reads directly (without buffer). It's same as ISeqInStream::Read */
17511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
17611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ILookInStream;
17711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
17811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
17911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
18011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
18111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao/* reads via ILookInStream::Read */
18211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
18311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming GaoSRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
18411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
18511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define LookToRead_BUF_SIZE (1 << 14)
18611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
18711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
18811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
18911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ILookInStream s;
19011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ISeekInStream *realStream;
19111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  size_t pos;
19211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  size_t size;
19311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  Byte buf[LookToRead_BUF_SIZE];
19411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} CLookToRead;
19511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
19611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaovoid LookToRead_CreateVTable(CLookToRead *p, int lookahead);
19711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaovoid LookToRead_Init(CLookToRead *p);
19811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
19911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
20011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
20111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ISeqInStream s;
20211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ILookInStream *realStream;
20311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} CSecToLook;
20411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
20511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaovoid SecToLook_CreateVTable(CSecToLook *p);
20611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
20711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
20811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
20911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ISeqInStream s;
21011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  ILookInStream *realStream;
21111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} CSecToRead;
21211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
21311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaovoid SecToRead_CreateVTable(CSecToRead *p);
21411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
21511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
21611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
21711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
21811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao    /* Returns: result. (result != SZ_OK) means break.
21911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao       Value (UInt64)(Int64)-1 for size means unknown value. */
22011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ICompressProgress;
22111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
22211ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gaotypedef struct
22311ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao{
22411ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  void *(*Alloc)(void *p, size_t size);
22511ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao  void (*Free)(void *p, void *address); /* address can be 0 */
22611ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao} ISzAlloc;
22711ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
22811ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
22911ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#define IAlloc_Free(p, a) (p)->Free((p), a)
23011ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao
23111ff2c714b3b2e79f574ed18b75edabd77f9a336Liming Gao#endif
232