Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / lzma.h @ 14

History | View | Annotate | Download (9.06 KB)

1 13 up20180614
/**
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 */