aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/api/lzma.h
blob: 0f109eb35cef091ddebf6ba6325bef578d9dc9eb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/**
 * \file        lzma.h
 * \brief       The public API of liblzma
 *
 * liblzma is a LZMA compression library with a zlib-like API.
 * liblzma is based on LZMA SDK found from http://7-zip.org/sdk.html.
 *
 * \author      Copyright (C) 1999-2006 Igor Pavlov
 * \author      Copyright (C) 2007 Lasse Collin
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 */

#ifndef LZMA_H
#define LZMA_H

/*****************************
 * Required standard headers *
 *****************************/

/**
 * liblzma API headers need some standard types and macros. To allow
 * including lzma.h without requiring the application to include other
 * headers first, lzma.h includes the required standard headers unless
 * they already seem to be included.
 *
 * Here's what types and macros are needed and from which headers:
 *  - stddef.h: size_t, NULL
 *  - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n),
 *    UINT32_MAX, UINT64_MAX
 *
 * However, inttypes.h is a little more portable than stdint.h, although
 * inttypes.h declares some unneeded things compared to plain stdint.h.
 *
 * The hacks below aren't perfect, specifically they assume that inttypes.h
 * exists and that it typedefs at least uint8_t, uint32_t, and uint64_t,
 * and that unsigned int is 32-bit. If your application already takes care
 * of setting up all the types properly (for example by using gnulib's
 * stdint.h or inttypes.h), feel free to define LZMA_MANUAL_HEADERS before
 * including lzma.h.
 *
 * Some could argue that liblzma API should provide all the required types,
 * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was
 * seen unnecessary mess, since most systems already provide all the necessary
 * types and macros in the standard headers.
 *
 * Note that liblzma API still has lzma_bool, because using stdbool.h would
 * break C89 and C++ programs on many systems.
 */

/* stddef.h even in C++ so that we get size_t in global namespace. */
#include <stddef.h>

#if !defined(UINT32_C) || !defined(UINT64_C) \
		|| !defined(UINT32_MAX) || !defined(UINT64_MAX)
#	ifdef __cplusplus
		/*
		 * C99 sections 7.18.2 and 7.18.4 specify that in C++
		 * implementations define the limit and constant macros only
		 * if specifically requested. Note that if you want the
		 * format macros too, you need to define __STDC_FORMAT_MACROS
		 * before including lzma.h, since re-including inttypes.h
		 * with __STDC_FORMAT_MACROS defined doesn't necessarily work.
		 */
#		ifndef __STDC_LIMIT_MACROS
#			define __STDC_LIMIT_MACROS 1
#		endif
#		ifndef __STDC_CONSTANT_MACROS
#			define __STDC_CONSTANT_MACROS 1
#		endif
#	endif

#	include <inttypes.h>

	/*
	 * Some old systems have only the typedefs in inttypes.h, and lack
	 * all the macros. For those systems, we need a few more hacks.
	 * We assume that unsigned int is 32-bit and unsigned long is either
	 * 32-bit or 64-bit. If these hacks aren't enough, the application
	 * has to use setup the types manually before including lzma.h.
	 */
#	ifndef UINT32_C
#		define UINT32_C(n) n # U
#	endif

#	ifndef UINT64_C
		/* Get ULONG_MAX. */
#		ifndef __cplusplus
#			include <limits.h>
#		else
#			include <climits>
#		endif
#		if ULONG_MAX == 4294967295UL
#			define UINT64_C(n) n ## ULL
#		else
#			define UINT64_C(n) n ## UL
#		endif
#	endif

#	ifndef UINT32_MAX
#		define UINT32_MAX (UINT32_C(4294967295))
#	endif

#	ifndef UINT64_MAX
#		define UINT64_MAX (UINT64_C(18446744073709551615))
#	endif
#endif


/******************
 * GCC extensions *
 ******************/

/*
 * GCC extensions are used conditionally in the public API. It doesn't
 * break anything if these are sometimes enabled and sometimes not, only
 * affects warnings and optimizations.
 */
#if __GNUC__ >= 3
#	ifndef lzma_attribute
#		define lzma_attribute(attr) __attribute__(attr)
#	endif

#	ifndef lzma_restrict
#		define lzma_restrict __restrict__
#	endif

	/* warn_unused_result was added in GCC 3.4. */
#	ifndef lzma_attr_warn_unused_result
#		if __GNUC__ == 3 && __GNUC_MINOR__ < 4
#			define lzma_attr_warn_unused_result
#		endif
#	endif

#else
#	ifndef lzma_attribute
#		define lzma_attribute(attr)
#	endif

#	ifndef lzma_restrict
#		if __STDC_VERSION__ >= 199901L
#			define lzma_restrict restrict
#		else
#			define lzma_restrict
#		endif
#	endif

#	define lzma_attr_warn_unused_result
#endif


#ifndef lzma_attr_pure
#	define lzma_attr_pure lzma_attribute((__pure__))
#endif

#ifndef lzma_attr_const
#	define lzma_attr_const lzma_attribute((__const__))
#endif

#ifndef lzma_attr_warn_unused_result
#	define lzma_attr_warn_unused_result \
		lzma_attribute((__warn_unused_result__))
#endif


/**************
 * Subheaders *
 **************/

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Subheaders check that this is defined. It is to prevent including
 * them directly from applications.
 */
#define LZMA_H_INTERNAL 1

/* Basic features */
#include "lzma/version.h"
#include "lzma/init.h"
#include "lzma/base.h"
#include "lzma/vli.h"
#include "lzma/check.h"

/* Filters */
#include "lzma/filter.h"
#include "lzma/subblock.h"
#include "lzma/simple.h"
#include "lzma/delta.h"
#include "lzma/lzma.h"

/* Container formats */
#include "lzma/container.h"

/* Advanced features */
#include "lzma/alignment.h" /* FIXME */
#include "lzma/block.h"
#include "lzma/index.h"
#include "lzma/index_hash.h"
#include "lzma/stream_flags.h"
#include "lzma/memlimit.h"

/*
 * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
 * re-including the subheaders.
 */
#undef LZMA_H_INTERNAL

#ifdef __cplusplus
}
#endif

#endif /* ifndef LZMA_H */