1 /*******************************************************************************
2 
3     D bindings to zlib compression library.
4 
5     Needs -lz when linking.
6 
7     Copyright:
8         Copyright (c) 2004-2009 Tango contributors.
9         Some parts copyright (c) 2009-2016 dunnhumby Germany GmbH.
10         All rights reserved.
11 
12     License:
13         Tango Dual License: 3-Clause BSD License / Academic Free License v3.0.
14         See LICENSE_TANGO.txt for details.
15 
16         Bear in mind this module provides bindings to an external library that
17         has its own license, which might be more restrictive. Please check the
18         external library license to see which conditions apply for linking.
19 
20 *******************************************************************************/
21 
22 module ocean.util.compress.c.zlib;
23 
24 import ocean.meta.types.Qualifiers;
25 import ocean.meta.types.Typedef;
26 
27 /// See original's library documentation for details.
28 static immutable ZLIB_VERSION = "1.2.3".ptr;
29 /// See original's library documentation for details.
30 static immutable uint  ZLIB_VERNUM  = 0x1230;
31 /// See original's library documentation for details.
32 static immutable void* Z_NULL = null;
33 
34 extern (C):
35 private
36 {
37     import core.stdc.config : c_long, c_ulong;
38 
39     import core.sys.posix.sys.types : z_off_t = off_t;
40 
41     alias ubyte     Byte;
42     alias uint      uInt;
43     alias c_ulong   uLong;
44 
45     alias Byte      Bytef;
46     alias char      charf;
47     alias int       intf;
48     alias uInt      uIntf;
49     alias uLong     uLongf;
50 
51     alias void*     voidpc; // TODO: normally const
52     alias void*     voidpf;
53     alias void*     voidp;
54 
55     alias voidpf function(voidpf opaque, uInt items, uInt size) alloc_func;
56     alias void   function(voidpf opaque, voidpf address)        free_func;
57 
58     struct internal_state {}
59 }
60 
61 struct z_stream
62 {
63     Bytef*          next_in;
64     uInt            avail_in;
65     uLong           total_in;
66 
67     Bytef*          next_out;
68     uInt            avail_out;
69     uLong           total_out;
70 
71     char*           msg;
72     internal_state* state;
73 
74     alloc_func      zalloc;
75     free_func       zfree;
76     voidpf          opaque;
77 
78     int             data_type;
79     uLong           adler;
80     uLong           reserved;
81 }
82 
83 /// See original's library documentation for details.
84 alias z_stream* z_streamp;
85 
86 /// See original's library documentation for details.
87 struct gz_header
88 {
89     int     text;
90     uLong   time;
91     int     xflags;
92     int     os;
93     Bytef*  extra;
94     uInt    extra_len;
95     uInt    extra_max;
96     Bytef*  name;
97     uInt    name_max;
98     Bytef*  comment;
99     uInt    comm_max;
100     int     hcrc;
101     int     done;
102 }
103 
104 /// See original's library documentation for details.
105 alias gz_header* gz_headerp;
106 
107 
108 
109 /// See original's library documentation for details.
110 enum
111 {
112     Z_NO_FLUSH      = 0,
113     Z_PARTIAL_FLUSH = 1,
114     Z_SYNC_FLUSH    = 2,
115     Z_FULL_FLUSH    = 3,
116     Z_FINISH        = 4,
117     Z_BLOCK         = 5,
118 }
119 
120 /// See original's library documentation for details.
121 enum
122 {
123     Z_OK            = 0,
124     Z_STREAM_END    = 1,
125     Z_NEED_DICT     = 2,
126     Z_ERRNO         = -1,
127     Z_STREAM_ERROR  = -2,
128     Z_DATA_ERROR    = -3,
129     Z_MEM_ERROR     = -4,
130     Z_BUF_ERROR     = -5,
131     Z_VERSION_ERROR = -6,
132 }
133 
134 /// See original's library documentation for details.
135 enum
136 {
137     Z_NO_COMPRESSION      = 0,
138     Z_BEST_SPEED          = 1,
139     Z_BEST_COMPRESSION    = 9,
140     Z_DEFAULT_COMPRESSION = -1,
141 }
142 
143 /// See original's library documentation for details.
144 enum
145 {
146     Z_FILTERED            = 1,
147     Z_HUFFMAN_ONLY        = 2,
148     Z_RLE                 = 3,
149     Z_FIXED               = 4,
150     Z_DEFAULT_STRATEGY    = 0,
151 }
152 
153 /// See original's library documentation for details.
154 enum
155 {
156     Z_BINARY   = 0,
157     Z_TEXT     = 1,
158     Z_ASCII    = Z_TEXT,
159     Z_UNKNOWN  = 2,
160 }
161 
162 /// See original's library documentation for details.
163 enum
164 {
165     Z_DEFLATED = 8,
166 }
167 
168 /// See original's library documentation for details.
169 alias zlibVersion zlib_version;
170 
171 
172 /// See original's library documentation for details.
173 char* zlibVersion();
174 
175 
176 
177 /// See original's library documentation for details.
178 int deflate(z_streamp strm, int flush);
179 
180 
181 /// See original's library documentation for details.
182 int deflateEnd(z_streamp strm);
183 
184 
185 
186 
187 /// See original's library documentation for details.
188 int inflate(z_streamp strm, int flush);
189 
190 
191 /// See original's library documentation for details.
192 int inflateEnd(z_streamp strm);
193 
194 
195 
196 
197 /// See original's library documentation for details.
198 int deflateSetDictionary(z_streamp strm,
199                          Bytef*    dictionary,
200                          uInt      dictLength);
201 
202 /// See original's library documentation for details.
203 int deflateCopy(z_streamp dest,
204                 z_streamp source);
205 
206 /// See original's library documentation for details.
207 int deflateReset(z_streamp strm);
208 
209 /// See original's library documentation for details.
210 int deflateParams(z_streamp strm,
211                   int       level,
212                   int       strategy);
213 
214 /// See original's library documentation for details.
215 int deflateTune(z_streamp strm,
216                 int       good_length,
217                 int       max_lazy,
218                 int       nice_length,
219                 int       max_chain);
220 
221 /// See original's library documentation for details.
222 uLong deflateBound(z_streamp strm,
223                    uLong     sourceLen);
224 
225 /// See original's library documentation for details.
226 int deflatePrime(z_streamp strm,
227                  int       bits,
228                  int       value);
229 
230 /// See original's library documentation for details.
231 int deflateSetHeader(z_streamp  strm,
232                      gz_headerp head);
233 
234 
235 /// See original's library documentation for details.
236 int inflateSetDictionary(z_streamp strm,
237                          Bytef*    dictionary,
238                          uInt      dictLength);
239 
240 /// See original's library documentation for details.
241 int inflateSync(z_streamp strm);
242 
243 /// See original's library documentation for details.
244 int inflateCopy(z_streamp dest,
245                 z_streamp source);
246 
247 /// See original's library documentation for details.
248 int inflateReset(z_streamp strm);
249 
250 /// See original's library documentation for details.
251 int inflatePrime(z_streamp strm,
252                  int       bits,
253                  int       value);
254 
255 /// See original's library documentation for details.
256 int inflateGetHeader(z_streamp  strm,
257                      gz_headerp head);
258 
259 
260 alias uint function(void*, ubyte**)      in_func;
261 alias int  function(void*, ubyte*, uint) out_func;
262 
263 /// See original's library documentation for details.
264 int inflateBack(z_streamp strm,
265                 scope in_func   in_fn,
266                 void*     in_desc,
267                 scope out_func  out_fn,
268                 void*     out_desc);
269 
270 /// See original's library documentation for details.
271 int inflateBackEnd(z_streamp strm);
272 
273 /// See original's library documentation for details.
274 uLong zlibCompileFlags();
275 
276 
277 
278 
279 /// See original's library documentation for details.
280 int compress(Bytef*  dest,
281              uLongf* destLen,
282              Bytef*  source,
283              uLong   sourceLen);
284 
285 /// See original's library documentation for details.
286 int compress2(Bytef*  dest,
287               uLongf* destLen,
288               Bytef*  source,
289               uLong   sourceLen,
290               int     level);
291 
292 /// See original's library documentation for details.
293 uLong compressBound(uLong sourceLen);
294 
295 /// See original's library documentation for details.
296 int uncompress(Bytef*  dest,
297                uLongf* destLen,
298                Bytef*  source,
299                uLong   sourceLen);
300 
301 
302 /// See original's library documentation for details.
303 mixin(Typedef!(voidp, "gzFile"));
304 
305 /// See original's library documentation for details.
306 gzFile gzopen(char* path, char* mode);
307 
308 /// See original's library documentation for details.
309 gzFile gzdopen(int fd, char* mode);
310 
311 /// See original's library documentation for details.
312 int gzsetparams(gzFile file, int level, int strategy);
313 
314 /// See original's library documentation for details.
315 int gzread(gzFile file, voidp buf, uint len);
316 
317 /// See original's library documentation for details.
318 int gzwrite(gzFile file, voidpc buf, uint len);
319 
320 /// See original's library documentation for details.
321 int gzprintf (gzFile file, char* format, ...);
322 
323 /// See original's library documentation for details.
324 int gzputs(gzFile file, char* s);
325 
326 /// See original's library documentation for details.
327 char* gzgets(gzFile file, char* buf, int len);
328 
329 /// See original's library documentation for details.
330 int gzputc(gzFile file, int c);
331 
332 /// See original's library documentation for details.
333 int gzgetc (gzFile file);
334 
335 /// See original's library documentation for details.
336 int gzungetc(int c, gzFile file);
337 
338 /// See original's library documentation for details.
339 int gzflush(gzFile file, int flush);
340 
341 /// See original's library documentation for details.
342 z_off_t gzseek (gzFile file, z_off_t offset, int whence);
343 
344 /// See original's library documentation for details.
345 int gzrewind(gzFile file);
346 
347 /// See original's library documentation for details.
348 z_off_t gztell (gzFile file);
349 
350 /// See original's library documentation for details.
351 int gzeof(gzFile file);
352 
353 /// See original's library documentation for details.
354 int gzdirect(gzFile file);
355 
356 /// See original's library documentation for details.
357 int gzclose(gzFile file);
358 
359 /// See original's library documentation for details.
360 char* gzerror(gzFile file, int* errnum);
361 
362 /// See original's library documentation for details.
363 void gzclearerr(gzFile file);
364 
365                         /* checksum functions */
366 
367 
368 /// See original's library documentation for details.
369 uLong adler32(uLong adler, Bytef* buf, uInt len);
370 
371 /// See original's library documentation for details.
372 uLong adler32_combine(uLong adler1, uLong adler2, z_off_t len2);
373 
374 /// See original's library documentation for details.
375 uLong crc32(uLong crc, Bytef* buf, uInt len);
376 
377 /// See original's library documentation for details.
378 uLong crc32_combine(uLong crc1, uLong crc2, z_off_t len2);
379 
380 
381 
382                         /* various hacks, don't look :) */
383 
384 /// See original's library documentation for details.
385 int deflateInit_(z_streamp  strm,
386                  int        level,
387                  const(char)* ver,
388                  int        stream_size);
389 /// See original's library documentation for details.
390 int inflateInit_(z_streamp  strm,
391                  const(char)* ver,
392                  int        stream_size);
393 /// See original's library documentation for details.
394 int deflateInit2_(z_streamp strm,
395                   int       level,
396                   int       method,
397                   int       windowBits,
398                   int       memLevel,
399                   int       strategy,
400                   const(char)* ver,
401                   int       stream_size);
402 /// See original's library documentation for details.
403 int inflateInit2_(z_streamp strm,
404                   int       windowBits,
405                   const(char)* ver,
406                   int       stream_size);
407 /// See original's library documentation for details.
408 int inflateBackInit_(z_streamp strm,
409                      int       windowBits,
410                      ubyte*    window,
411                      const(char)* ver,
412                      int       stream_size);
413 
414 extern (D) int deflateInit(z_streamp  strm,
415                            int        level)
416 {
417     return deflateInit_(strm,
418                         level,
419                         ZLIB_VERSION,
420                         z_stream.sizeof);
421 }
422 
423 extern (D) int inflateInit(z_streamp  strm)
424 {
425     return inflateInit_(strm,
426                         ZLIB_VERSION,
427                         z_stream.sizeof);
428 }
429 
430 extern (D) int deflateInit2(z_streamp strm,
431                            int       level,
432                            int       method,
433                            int       windowBits,
434                            int       memLevel,
435                            int       strategy)
436 {
437     return deflateInit2_(strm,
438                          level,
439                          method,
440                          windowBits,
441                          memLevel,
442                          strategy,
443                          ZLIB_VERSION,
444                          z_stream.sizeof);
445 }
446 
447 extern (D) int inflateInit2(z_streamp strm,
448                             int       windowBits)
449 {
450     return inflateInit2_(strm,
451                          windowBits,
452                          ZLIB_VERSION,
453                          z_stream.sizeof);
454 }
455 
456 extern (D) int inflateBackInit(z_streamp strm,
457                                int       windowBits,
458                                ubyte*    window)
459 {
460     return inflateBackInit_(strm,
461                             windowBits,
462                             window,
463                             ZLIB_VERSION,
464                             z_stream.sizeof);
465 }
466 
467 /// See original's library documentation for details.
468 char*   zError(int);
469 /// See original's library documentation for details.
470 int     inflateSyncPoint(z_streamp z);
471 /// See original's library documentation for details.
472 uLongf* get_crc_table();