root / lab4 / .minix-src / include / lzma.h @ 14
History | View | Annotate | Download (9.06 KB)
1 |
/**
|
---|---|
2 |
* \file api/lzma.h
|
3 |
* \brief The public API of liblzma data compression library
|
4 |
*
|
5 |
* liblzma is a public domain general-purpose data compression library with
|
6 |
* a zlib-like API. The native file format is .xz, but also the old .lzma
|
7 |
* format and raw (no headers) streams are supported. Multiple compression
|
8 |
* algorithms (filters) are supported. Currently LZMA2 is the primary filter.
|
9 |
*
|
10 |
* liblzma is part of XZ Utils <http://tukaani.org/xz/>. XZ Utils includes
|
11 |
* a gzip-like command line tool named xz and some other tools. XZ Utils
|
12 |
* is developed and maintained by Lasse Collin.
|
13 |
*
|
14 |
* Major parts of liblzma are based on Igor Pavlov's public domain LZMA SDK
|
15 |
* <http://7-zip.org/sdk.html>.
|
16 |
*
|
17 |
* The SHA-256 implementation is based on the public domain code found from
|
18 |
* 7-Zip <http://7-zip.org/>, which has a modified version of the public
|
19 |
* domain SHA-256 code found from Crypto++ <http://www.cryptopp.com/>.
|
20 |
* The SHA-256 code in Crypto++ was written by Kevin Springle and Wei Dai.
|
21 |
*/
|
22 |
|
23 |
/*
|
24 |
* Author: Lasse Collin
|
25 |
*
|
26 |
* This file has been put into the public domain.
|
27 |
* You can do whatever you want with this file.
|
28 |
*/
|
29 |
|
30 |
#ifndef LZMA_H
|
31 |
#define LZMA_H
|
32 |
|
33 |
/*****************************
|
34 |
* Required standard headers *
|
35 |
*****************************/
|
36 |
|
37 |
/*
|
38 |
* liblzma API headers need some standard types and macros. To allow
|
39 |
* including lzma.h without requiring the application to include other
|
40 |
* headers first, lzma.h includes the required standard headers unless
|
41 |
* they already seem to be included already or if LZMA_MANUAL_HEADERS
|
42 |
* has been defined.
|
43 |
*
|
44 |
* Here's what types and macros are needed and from which headers:
|
45 |
* - stddef.h: size_t, NULL
|
46 |
* - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n),
|
47 |
* UINT32_MAX, UINT64_MAX
|
48 |
*
|
49 |
* However, inttypes.h is a little more portable than stdint.h, although
|
50 |
* inttypes.h declares some unneeded things compared to plain stdint.h.
|
51 |
*
|
52 |
* The hacks below aren't perfect, specifically they assume that inttypes.h
|
53 |
* exists and that it typedefs at least uint8_t, uint32_t, and uint64_t,
|
54 |
* and that, in case of incomplete inttypes.h, unsigned int is 32-bit.
|
55 |
* If the application already takes care of setting up all the types and
|
56 |
* macros properly (for example by using gnulib's stdint.h or inttypes.h),
|
57 |
* we try to detect that the macros are already defined and don't include
|
58 |
* inttypes.h here again. However, you may define LZMA_MANUAL_HEADERS to
|
59 |
* force this file to never include any system headers.
|
60 |
*
|
61 |
* Some could argue that liblzma API should provide all the required types,
|
62 |
* for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was
|
63 |
* seen as an unnecessary mess, since most systems already provide all the
|
64 |
* necessary types and macros in the standard headers.
|
65 |
*
|
66 |
* Note that liblzma API still has lzma_bool, because using stdbool.h would
|
67 |
* break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't
|
68 |
* necessarily the same as sizeof(bool) in C++.
|
69 |
*/
|
70 |
|
71 |
#ifndef LZMA_MANUAL_HEADERS
|
72 |
/*
|
73 |
* I suppose this works portably also in C++. Note that in C++,
|
74 |
* we need to get size_t into the global namespace.
|
75 |
*/
|
76 |
# include <stddef.h> |
77 |
|
78 |
/*
|
79 |
* Skip inttypes.h if we already have all the required macros. If we
|
80 |
* have the macros, we assume that we have the matching typedefs too.
|
81 |
*/
|
82 |
# if !defined(UINT32_C) || !defined(UINT64_C) \
|
83 |
|| !defined(UINT32_MAX) || !defined(UINT64_MAX) |
84 |
/*
|
85 |
* MSVC has no C99 support, and thus it cannot be used to
|
86 |
* compile liblzma. The liblzma API has to still be usable
|
87 |
* from MSVC, so we need to define the required standard
|
88 |
* integer types here.
|
89 |
*/
|
90 |
# if defined(_WIN32) && defined(_MSC_VER)
|
91 |
typedef unsigned __int8 uint8_t; |
92 |
typedef unsigned __int32 uint32_t; |
93 |
typedef unsigned __int64 uint64_t; |
94 |
# else
|
95 |
/* Use the standard inttypes.h. */
|
96 |
# ifdef __cplusplus
|
97 |
/*
|
98 |
* C99 sections 7.18.2 and 7.18.4 specify
|
99 |
* that C++ implementations define the limit
|
100 |
* and constant macros only if specifically
|
101 |
* requested. Note that if you want the
|
102 |
* format macros (PRIu64 etc.) too, you need
|
103 |
* to define __STDC_FORMAT_MACROS before
|
104 |
* including lzma.h, since re-including
|
105 |
* inttypes.h with __STDC_FORMAT_MACROS
|
106 |
* defined doesn't necessarily work.
|
107 |
*/
|
108 |
# ifndef __STDC_LIMIT_MACROS
|
109 |
# define __STDC_LIMIT_MACROS 1 |
110 |
# endif
|
111 |
# ifndef __STDC_CONSTANT_MACROS
|
112 |
# define __STDC_CONSTANT_MACROS 1 |
113 |
# endif
|
114 |
# endif
|
115 |
|
116 |
# include <inttypes.h> |
117 |
# endif
|
118 |
|
119 |
/*
|
120 |
* Some old systems have only the typedefs in inttypes.h, and
|
121 |
* lack all the macros. For those systems, we need a few more
|
122 |
* hacks. We assume that unsigned int is 32-bit and unsigned
|
123 |
* long is either 32-bit or 64-bit. If these hacks aren't
|
124 |
* enough, the application has to setup the types manually
|
125 |
* before including lzma.h.
|
126 |
*/
|
127 |
# ifndef UINT32_C
|
128 |
# if defined(_WIN32) && defined(_MSC_VER)
|
129 |
# define UINT32_C(n) n ## UI32 |
130 |
# else
|
131 |
# define UINT32_C(n) n ## U |
132 |
# endif
|
133 |
# endif
|
134 |
|
135 |
# ifndef UINT64_C
|
136 |
# if defined(_WIN32) && defined(_MSC_VER)
|
137 |
# define UINT64_C(n) n ## UI64 |
138 |
# else
|
139 |
/* Get ULONG_MAX. */
|
140 |
# include <limits.h> |
141 |
# if ULONG_MAX == 4294967295UL |
142 |
# define UINT64_C(n) n ## ULL |
143 |
# else
|
144 |
# define UINT64_C(n) n ## UL |
145 |
# endif
|
146 |
# endif
|
147 |
# endif
|
148 |
|
149 |
# ifndef UINT32_MAX
|
150 |
# define UINT32_MAX (UINT32_C(4294967295)) |
151 |
# endif
|
152 |
|
153 |
# ifndef UINT64_MAX
|
154 |
# define UINT64_MAX (UINT64_C(18446744073709551615)) |
155 |
# endif
|
156 |
# endif
|
157 |
#endif /* ifdef LZMA_MANUAL_HEADERS */ |
158 |
|
159 |
|
160 |
/******************
|
161 |
* LZMA_API macro *
|
162 |
******************/
|
163 |
|
164 |
/*
|
165 |
* Some systems require that the functions and function pointers are
|
166 |
* declared specially in the headers. LZMA_API_IMPORT is for importing
|
167 |
* symbols and LZMA_API_CALL is to specify the calling convention.
|
168 |
*
|
169 |
* By default it is assumed that the application will link dynamically
|
170 |
* against liblzma. #define LZMA_API_STATIC in your application if you
|
171 |
* want to link against static liblzma. If you don't care about portability
|
172 |
* to operating systems like Windows, or at least don't care about linking
|
173 |
* against static liblzma on them, don't worry about LZMA_API_STATIC. That
|
174 |
* is, most developers will never need to use LZMA_API_STATIC.
|
175 |
*
|
176 |
* The GCC variants are a special case on Windows (Cygwin and MinGW).
|
177 |
* We rely on GCC doing the right thing with its auto-import feature,
|
178 |
* and thus don't use __declspec(dllimport). This way developers don't
|
179 |
* need to worry about LZMA_API_STATIC. Also the calling convention is
|
180 |
* omitted on Cygwin but not on MinGW.
|
181 |
*/
|
182 |
#ifndef LZMA_API_IMPORT
|
183 |
# if !defined(LZMA_API_STATIC) && defined(_WIN32) && !defined(__GNUC__)
|
184 |
# define LZMA_API_IMPORT __declspec(dllimport)
|
185 |
# else
|
186 |
# define LZMA_API_IMPORT
|
187 |
# endif
|
188 |
#endif
|
189 |
|
190 |
#ifndef LZMA_API_CALL
|
191 |
# if defined(_WIN32) && !defined(__CYGWIN__)
|
192 |
# define LZMA_API_CALL __cdecl
|
193 |
# else
|
194 |
# define LZMA_API_CALL
|
195 |
# endif
|
196 |
#endif
|
197 |
|
198 |
#ifndef LZMA_API
|
199 |
# define LZMA_API(type) LZMA_API_IMPORT type LZMA_API_CALL
|
200 |
#endif
|
201 |
|
202 |
|
203 |
/***********
|
204 |
* nothrow *
|
205 |
***********/
|
206 |
|
207 |
/*
|
208 |
* None of the functions in liblzma may throw an exception. Even
|
209 |
* the functions that use callback functions won't throw exceptions,
|
210 |
* because liblzma would break if a callback function threw an exception.
|
211 |
*/
|
212 |
#ifndef lzma_nothrow
|
213 |
# if defined(__cplusplus)
|
214 |
# define lzma_nothrow throw()
|
215 |
# elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) |
216 |
# define lzma_nothrow __attribute__((__nothrow__))
|
217 |
# else
|
218 |
# define lzma_nothrow
|
219 |
# endif
|
220 |
#endif
|
221 |
|
222 |
|
223 |
/********************
|
224 |
* GNU C extensions *
|
225 |
********************/
|
226 |
|
227 |
/*
|
228 |
* GNU C extensions are used conditionally in the public API. It doesn't
|
229 |
* break anything if these are sometimes enabled and sometimes not, only
|
230 |
* affects warnings and optimizations.
|
231 |
*/
|
232 |
#if __GNUC__ >= 3 |
233 |
# ifndef lzma_attribute
|
234 |
# define lzma_attribute(attr) __attribute__(attr)
|
235 |
# endif
|
236 |
|
237 |
/* warn_unused_result was added in GCC 3.4. */
|
238 |
# ifndef lzma_attr_warn_unused_result
|
239 |
# if __GNUC__ == 3 && __GNUC_MINOR__ < 4 |
240 |
# define lzma_attr_warn_unused_result
|
241 |
# endif
|
242 |
# endif
|
243 |
|
244 |
#else
|
245 |
# ifndef lzma_attribute
|
246 |
# define lzma_attribute(attr)
|
247 |
# endif
|
248 |
#endif
|
249 |
|
250 |
|
251 |
#ifndef lzma_attr_pure
|
252 |
# define lzma_attr_pure lzma_attribute((__pure__))
|
253 |
#endif
|
254 |
|
255 |
#ifndef lzma_attr_const
|
256 |
# define lzma_attr_const lzma_attribute((__const__))
|
257 |
#endif
|
258 |
|
259 |
#ifndef lzma_attr_warn_unused_result
|
260 |
# define lzma_attr_warn_unused_result \
|
261 |
lzma_attribute((__warn_unused_result__)) |
262 |
#endif
|
263 |
|
264 |
|
265 |
/**************
|
266 |
* Subheaders *
|
267 |
**************/
|
268 |
|
269 |
#ifdef __cplusplus
|
270 |
extern "C" { |
271 |
#endif
|
272 |
|
273 |
/*
|
274 |
* Subheaders check that this is defined. It is to prevent including
|
275 |
* them directly from applications.
|
276 |
*/
|
277 |
#define LZMA_H_INTERNAL 1 |
278 |
|
279 |
/* Basic features */
|
280 |
#include "lzma/version.h" |
281 |
#include "lzma/base.h" |
282 |
#include "lzma/vli.h" |
283 |
#include "lzma/check.h" |
284 |
|
285 |
/* Filters */
|
286 |
#include "lzma/filter.h" |
287 |
#include "lzma/bcj.h" |
288 |
#include "lzma/delta.h" |
289 |
#include "lzma/lzma12.h" |
290 |
|
291 |
/* Container formats */
|
292 |
#include "lzma/container.h" |
293 |
|
294 |
/* Advanced features */
|
295 |
#include "lzma/stream_flags.h" |
296 |
#include "lzma/block.h" |
297 |
#include "lzma/index.h" |
298 |
#include "lzma/index_hash.h" |
299 |
|
300 |
/* Hardware information */
|
301 |
#include "lzma/hardware.h" |
302 |
|
303 |
/*
|
304 |
* All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
|
305 |
* re-including the subheaders.
|
306 |
*/
|
307 |
#undef LZMA_H_INTERNAL
|
308 |
|
309 |
#ifdef __cplusplus
|
310 |
} |
311 |
#endif
|
312 |
|
313 |
#endif /* ifndef LZMA_H */ |