git subrepo pull (merge) --force deps/libchdr
[pcsx_rearmed.git] / deps / libchdr / deps / zstd-1.5.6 / zlibWrapper / examples / example_original.c
CommitLineData
9e052883 1/* example.c -- usage example of the zlib compression library
9e052883 2 */
648db22b 3/*
4 Copyright (c) 1995-2006, 2011 Jean-loup Gailly
5
6This software is provided 'as-is', without any express or implied
7warranty. In no event will the authors be held liable for any damages
8arising from the use of this software.
9
10Permission is granted to anyone to use this software for any purpose,
11including commercial applications, and to alter it and redistribute it
12freely, subject to the following restrictions:
13
141. The origin of this software must not be misrepresented; you must not
15 claim that you wrote the original software. If you use this software
16 in a product, an acknowledgement in the product documentation would be
17 appreciated but is not required.
182. Altered source versions must be plainly marked as such, and must not be
19 misrepresented as being the original software.
203. This notice may not be removed or altered from any source distribution.
21*/
9e052883 22
23/* @(#) $Id$ */
24
25#include "zlib.h"
26#include <stdio.h>
27
28#ifdef STDC
29# include <string.h>
30# include <stdlib.h>
31#endif
32
33#if defined(VMS) || defined(RISCOS)
34# define TESTFILE "foo-gz"
35#else
36# define TESTFILE "foo.gz"
37#endif
38
39#define CHECK_ERR(err, msg) { \
40 if (err != Z_OK) { \
41 fprintf(stderr, "%s error: %d\n", msg, err); \
42 exit(1); \
43 } \
44}
45
648db22b 46z_const char hello[] = "hello, hello!";
9e052883 47/* "hello world" would be more standard, but the repeated "hello"
48 * stresses the compression code better, sorry...
49 */
50
648db22b 51const char dictionary[] = "hello";
52uLong dictId; /* Adler32 value of the dictionary */
9e052883 53
648db22b 54void test_deflate _Z_OF((Byte *compr, uLong comprLen));
55void test_inflate _Z_OF((Byte *compr, uLong comprLen,
9e052883 56 Byte *uncompr, uLong uncomprLen));
648db22b 57void test_large_deflate _Z_OF((Byte *compr, uLong comprLen,
9e052883 58 Byte *uncompr, uLong uncomprLen));
648db22b 59void test_large_inflate _Z_OF((Byte *compr, uLong comprLen,
9e052883 60 Byte *uncompr, uLong uncomprLen));
648db22b 61void test_flush _Z_OF((Byte *compr, uLong *comprLen));
62void test_sync _Z_OF((Byte *compr, uLong comprLen,
9e052883 63 Byte *uncompr, uLong uncomprLen));
648db22b 64void test_dict_deflate _Z_OF((Byte *compr, uLong comprLen));
65void test_dict_inflate _Z_OF((Byte *compr, uLong comprLen,
9e052883 66 Byte *uncompr, uLong uncomprLen));
648db22b 67int main _Z_OF((int argc, char *argv[]));
9e052883 68
69
70#ifdef Z_SOLO
71
648db22b 72void *myalloc _Z_OF((void *, unsigned, unsigned));
73void myfree _Z_OF((void *, void *));
9e052883 74
75void *myalloc(q, n, m)
76 void *q;
77 unsigned n, m;
78{
648db22b 79 q = Z_NULL;
9e052883 80 return calloc(n, m);
81}
82
83void myfree(void *q, void *p)
84{
648db22b 85 q = Z_NULL;
9e052883 86 free(p);
87}
88
89static alloc_func zalloc = myalloc;
90static free_func zfree = myfree;
91
92#else /* !Z_SOLO */
93
94static alloc_func zalloc = (alloc_func)0;
95static free_func zfree = (free_func)0;
96
648db22b 97void test_compress _Z_OF((Byte *compr, uLong comprLen,
9e052883 98 Byte *uncompr, uLong uncomprLen));
648db22b 99void test_gzio _Z_OF((const char *fname,
9e052883 100 Byte *uncompr, uLong uncomprLen));
101
102/* ===========================================================================
103 * Test compress() and uncompress()
104 */
f535537f 105void test_compress(Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)
9e052883 106{
107 int err;
108 uLong len = (uLong)strlen(hello)+1;
109
110 err = compress(compr, &comprLen, (const Bytef*)hello, len);
111 CHECK_ERR(err, "compress");
112
113 strcpy((char*)uncompr, "garbage");
114
115 err = uncompress(uncompr, &uncomprLen, compr, comprLen);
116 CHECK_ERR(err, "uncompress");
117
118 if (strcmp((char*)uncompr, hello)) {
119 fprintf(stderr, "bad uncompress\n");
120 exit(1);
121 } else {
122 printf("uncompress(): %s\n", (char *)uncompr);
123 }
124}
125
126/* ===========================================================================
127 * Test read/write of .gz files
128 */
f535537f 129void test_gzio(const char *fname /* compressed file name */, Byte *uncompr,
130 uLong uncomprLen)
9e052883 131{
132#ifdef NO_GZCOMPRESS
133 fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
134#else
135 int err;
136 int len = (int)strlen(hello)+1;
137 gzFile file;
138 z_off_t pos;
139
140 file = gzopen(fname, "wb");
141 if (file == NULL) {
142 fprintf(stderr, "gzopen error\n");
143 exit(1);
144 }
145 gzputc(file, 'h');
146 if (gzputs(file, "ello") != 4) {
147 fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
148 exit(1);
149 }
150 if (gzprintf(file, ", %s!", "hello") != 8) {
151 fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
152 exit(1);
153 }
154 gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
155 gzclose(file);
156
157 file = gzopen(fname, "rb");
158 if (file == NULL) {
159 fprintf(stderr, "gzopen error\n");
160 exit(1);
161 }
162 strcpy((char*)uncompr, "garbage");
163
164 if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
165 fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
166 exit(1);
167 }
168 if (strcmp((char*)uncompr, hello)) {
169 fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
170 exit(1);
171 } else {
172 printf("gzread(): %s\n", (char*)uncompr);
173 }
174
175 pos = gzseek(file, -8L, SEEK_CUR);
176 if (pos != 6 || gztell(file) != pos) {
177 fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
178 (long)pos, (long)gztell(file));
179 exit(1);
180 }
181
182 if (gzgetc(file) != ' ') {
183 fprintf(stderr, "gzgetc error\n");
184 exit(1);
185 }
186
187 if (gzungetc(' ', file) != ' ') {
188 fprintf(stderr, "gzungetc error\n");
189 exit(1);
190 }
191
192 gzgets(file, (char*)uncompr, (int)uncomprLen);
193 if (strlen((char*)uncompr) != 7) { /* " hello!" */
194 fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
195 exit(1);
196 }
197 if (strcmp((char*)uncompr, hello + 6)) {
198 fprintf(stderr, "bad gzgets after gzseek\n");
199 exit(1);
200 } else {
201 printf("gzgets() after gzseek: %s\n", (char*)uncompr);
202 }
203
204 gzclose(file);
205#endif
206}
207
208#endif /* Z_SOLO */
209
210/* ===========================================================================
211 * Test deflate() with small buffers
212 */
f535537f 213void test_deflate(Byte *compr, uLong comprLen)
9e052883 214{
215 z_stream c_stream; /* compression stream */
216 int err;
217 uLong len = (uLong)strlen(hello)+1;
218
219 c_stream.zalloc = zalloc;
220 c_stream.zfree = zfree;
221 c_stream.opaque = (voidpf)0;
222
223 err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
224 CHECK_ERR(err, "deflateInit");
225
226 c_stream.next_in = (z_const unsigned char *)hello;
227 c_stream.next_out = compr;
228
229 while (c_stream.total_in != len && c_stream.total_out < comprLen) {
230 c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
231 err = deflate(&c_stream, Z_NO_FLUSH);
232 CHECK_ERR(err, "deflate");
233 }
234 /* Finish the stream, still forcing small buffers: */
235 for (;;) {
236 c_stream.avail_out = 1;
237 err = deflate(&c_stream, Z_FINISH);
238 if (err == Z_STREAM_END) break;
239 CHECK_ERR(err, "deflate");
240 }
241
242 err = deflateEnd(&c_stream);
243 CHECK_ERR(err, "deflateEnd");
244}
245
246/* ===========================================================================
247 * Test inflate() with small buffers
248 */
f535537f 249void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)
9e052883 250{
251 int err;
252 z_stream d_stream; /* decompression stream */
253
254 strcpy((char*)uncompr, "garbage");
255
256 d_stream.zalloc = zalloc;
257 d_stream.zfree = zfree;
258 d_stream.opaque = (voidpf)0;
259
260 d_stream.next_in = compr;
261 d_stream.avail_in = 0;
262 d_stream.next_out = uncompr;
263
264 err = inflateInit(&d_stream);
265 CHECK_ERR(err, "inflateInit");
266
267 while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
268 d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
269 err = inflate(&d_stream, Z_NO_FLUSH);
270 if (err == Z_STREAM_END) break;
271 CHECK_ERR(err, "inflate");
272 }
273
274 err = inflateEnd(&d_stream);
275 CHECK_ERR(err, "inflateEnd");
276
277 if (strcmp((char*)uncompr, hello)) {
278 fprintf(stderr, "bad inflate\n");
279 exit(1);
280 } else {
281 printf("inflate(): %s\n", (char *)uncompr);
282 }
283}
284
285/* ===========================================================================
286 * Test deflate() with large buffers and dynamic change of compression level
287 */
f535537f 288void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr,
289 uLong uncomprLen)
9e052883 290{
291 z_stream c_stream; /* compression stream */
292 int err;
293
294 c_stream.zalloc = zalloc;
295 c_stream.zfree = zfree;
296 c_stream.opaque = (voidpf)0;
297
298 err = deflateInit(&c_stream, Z_BEST_SPEED);
299 CHECK_ERR(err, "deflateInit");
300
301 c_stream.next_out = compr;
302 c_stream.avail_out = (uInt)comprLen;
303
304 /* At this point, uncompr is still mostly zeroes, so it should compress
305 * very well:
306 */
307 c_stream.next_in = uncompr;
308 c_stream.avail_in = (uInt)uncomprLen;
309 err = deflate(&c_stream, Z_NO_FLUSH);
310 CHECK_ERR(err, "deflate");
311 if (c_stream.avail_in != 0) {
312 fprintf(stderr, "deflate not greedy\n");
313 exit(1);
314 }
315
316 /* Feed in already compressed data and switch to no compression: */
317 deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
318 c_stream.next_in = compr;
319 c_stream.avail_in = (uInt)comprLen/2;
320 err = deflate(&c_stream, Z_NO_FLUSH);
321 CHECK_ERR(err, "deflate");
322
323 /* Switch back to compressing mode: */
324 deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
325 c_stream.next_in = uncompr;
326 c_stream.avail_in = (uInt)uncomprLen;
327 err = deflate(&c_stream, Z_NO_FLUSH);
328 CHECK_ERR(err, "deflate");
329
330 err = deflate(&c_stream, Z_FINISH);
331 if (err != Z_STREAM_END) {
332 fprintf(stderr, "deflate should report Z_STREAM_END\n");
333 exit(1);
334 }
335 err = deflateEnd(&c_stream);
336 CHECK_ERR(err, "deflateEnd");
337}
338
339/* ===========================================================================
340 * Test inflate() with large buffers
341 */
f535537f 342void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
343 uLong uncomprLen)
9e052883 344{
345 int err;
346 z_stream d_stream; /* decompression stream */
347
348 strcpy((char*)uncompr, "garbage");
349
350 d_stream.zalloc = zalloc;
351 d_stream.zfree = zfree;
352 d_stream.opaque = (voidpf)0;
353
354 d_stream.next_in = compr;
355 d_stream.avail_in = (uInt)comprLen;
356
357 err = inflateInit(&d_stream);
358 CHECK_ERR(err, "inflateInit");
359
360 for (;;) {
361 d_stream.next_out = uncompr; /* discard the output */
362 d_stream.avail_out = (uInt)uncomprLen;
363 err = inflate(&d_stream, Z_NO_FLUSH);
364 if (err == Z_STREAM_END) break;
365 CHECK_ERR(err, "large inflate");
366 }
367
368 err = inflateEnd(&d_stream);
369 CHECK_ERR(err, "inflateEnd");
370
371 if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
372 fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
373 exit(1);
374 } else {
375 printf("large_inflate(): OK\n");
376 }
377}
378
379/* ===========================================================================
380 * Test deflate() with full flush
381 */
f535537f 382void test_flush(Byte *compr, uLong comprLen)
9e052883 383{
384 z_stream c_stream; /* compression stream */
385 int err;
386 uInt len = (uInt)strlen(hello)+1;
387
388 c_stream.zalloc = zalloc;
389 c_stream.zfree = zfree;
390 c_stream.opaque = (voidpf)0;
391
392 err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
393 CHECK_ERR(err, "deflateInit");
394
395 c_stream.next_in = (z_const unsigned char *)hello;
396 c_stream.next_out = compr;
397 c_stream.avail_in = 3;
398 c_stream.avail_out = (uInt)*comprLen;
399 err = deflate(&c_stream, Z_FULL_FLUSH);
400 CHECK_ERR(err, "deflate");
401
402 compr[3]++; /* force an error in first compressed block */
403 c_stream.avail_in = len - 3;
404
405 err = deflate(&c_stream, Z_FINISH);
406 if (err != Z_STREAM_END) {
407 CHECK_ERR(err, "deflate");
408 }
409 err = deflateEnd(&c_stream);
410 CHECK_ERR(err, "deflateEnd");
411
412 *comprLen = c_stream.total_out;
413}
414
415/* ===========================================================================
416 * Test inflateSync()
417 */
f535537f 418void test_sync(Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)
9e052883 419{
420 int err;
421 z_stream d_stream; /* decompression stream */
422
423 strcpy((char*)uncompr, "garbage");
424
425 d_stream.zalloc = zalloc;
426 d_stream.zfree = zfree;
427 d_stream.opaque = (voidpf)0;
428
429 d_stream.next_in = compr;
430 d_stream.avail_in = 2; /* just read the zlib header */
431
432 err = inflateInit(&d_stream);
433 CHECK_ERR(err, "inflateInit");
434
435 d_stream.next_out = uncompr;
436 d_stream.avail_out = (uInt)uncomprLen;
437
648db22b 438 inflate(&d_stream, Z_NO_FLUSH);
9e052883 439 CHECK_ERR(err, "inflate");
440
441 d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */
442 err = inflateSync(&d_stream); /* but skip the damaged part */
443 CHECK_ERR(err, "inflateSync");
444
445 err = inflate(&d_stream, Z_FINISH);
648db22b 446 if (err != Z_DATA_ERROR) {
447 fprintf(stderr, "inflate should report DATA_ERROR\n");
448 /* Because of incorrect adler32 */
9e052883 449 exit(1);
450 }
451 err = inflateEnd(&d_stream);
452 CHECK_ERR(err, "inflateEnd");
453
454 printf("after inflateSync(): hel%s\n", (char *)uncompr);
455}
456
457/* ===========================================================================
458 * Test deflate() with preset dictionary
459 */
f535537f 460void test_dict_deflate(Byte *compr, uLong comprLen)
9e052883 461{
462 z_stream c_stream; /* compression stream */
463 int err;
464
465 c_stream.zalloc = zalloc;
466 c_stream.zfree = zfree;
467 c_stream.opaque = (voidpf)0;
468
469 err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
470 CHECK_ERR(err, "deflateInit");
471
472 err = deflateSetDictionary(&c_stream,
473 (const Bytef*)dictionary, (int)sizeof(dictionary));
474 CHECK_ERR(err, "deflateSetDictionary");
475
476 dictId = c_stream.adler;
477 c_stream.next_out = compr;
478 c_stream.avail_out = (uInt)comprLen;
479
480 c_stream.next_in = (z_const unsigned char *)hello;
481 c_stream.avail_in = (uInt)strlen(hello)+1;
482
483 err = deflate(&c_stream, Z_FINISH);
484 if (err != Z_STREAM_END) {
485 fprintf(stderr, "deflate should report Z_STREAM_END\n");
486 exit(1);
487 }
488 err = deflateEnd(&c_stream);
489 CHECK_ERR(err, "deflateEnd");
490}
491
492/* ===========================================================================
493 * Test inflate() with a preset dictionary
494 */
f535537f 495void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr,
496 uLong uncomprLen)
9e052883 497{
498 int err;
499 z_stream d_stream; /* decompression stream */
500
501 strcpy((char*)uncompr, "garbage");
502
503 d_stream.zalloc = zalloc;
504 d_stream.zfree = zfree;
505 d_stream.opaque = (voidpf)0;
506
507 d_stream.next_in = compr;
508 d_stream.avail_in = (uInt)comprLen;
509
510 err = inflateInit(&d_stream);
511 CHECK_ERR(err, "inflateInit");
512
513 d_stream.next_out = uncompr;
514 d_stream.avail_out = (uInt)uncomprLen;
515
516 for (;;) {
517 err = inflate(&d_stream, Z_NO_FLUSH);
518 if (err == Z_STREAM_END) break;
519 if (err == Z_NEED_DICT) {
520 if (d_stream.adler != dictId) {
521 fprintf(stderr, "unexpected dictionary");
522 exit(1);
523 }
524 err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
525 (int)sizeof(dictionary));
526 }
527 CHECK_ERR(err, "inflate with dict");
528 }
529
530 err = inflateEnd(&d_stream);
531 CHECK_ERR(err, "inflateEnd");
532
533 if (strcmp((char*)uncompr, hello)) {
534 fprintf(stderr, "bad inflate with dict\n");
535 exit(1);
536 } else {
537 printf("inflate with dictionary: %s\n", (char *)uncompr);
538 }
539}
540
541/* ===========================================================================
542 * Usage: example [output.gz [input.gz]]
543 */
544
f535537f 545int main(int argc, char *argv[])
9e052883 546{
547 Byte *compr, *uncompr;
548 uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
549 uLong uncomprLen = comprLen;
550 static const char* myVersion = ZLIB_VERSION;
551
552 if (zlibVersion()[0] != myVersion[0]) {
553 fprintf(stderr, "incompatible zlib version\n");
554 exit(1);
555
556 } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
648db22b 557 fprintf(stderr, "warning: different zlib version\n");
9e052883 558 }
559
560 printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
561 ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
562
563 compr = (Byte*)calloc((uInt)comprLen, 1);
564 uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
565 /* compr and uncompr are cleared to avoid reading uninitialized
566 * data and to ensure that uncompr compresses well.
567 */
568 if (compr == Z_NULL || uncompr == Z_NULL) {
569 printf("out of memory\n");
570 exit(1);
571 }
572
573#ifdef Z_SOLO
648db22b 574 argc = strlen(argv[0]);
9e052883 575#else
576 test_compress(compr, comprLen, uncompr, uncomprLen);
577
578 test_gzio((argc > 1 ? argv[1] : TESTFILE),
579 uncompr, uncomprLen);
580#endif
581
582 test_deflate(compr, comprLen);
583 test_inflate(compr, comprLen, uncompr, uncomprLen);
584
585 test_large_deflate(compr, comprLen, uncompr, uncomprLen);
586 test_large_inflate(compr, comprLen, uncompr, uncomprLen);
587
588 test_flush(compr, &comprLen);
589 test_sync(compr, comprLen, uncompr, uncomprLen);
590 comprLen = uncomprLen;
591
592 test_dict_deflate(compr, comprLen);
593 test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
594
595 free(compr);
596 free(uncompr);
597
598 return 0;
599}