ezlib.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
ezlib.c (1686B)
---
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdarg.h>
5 #include <unistd.h>
6 #include <errno.h>
7
8 #include "zlib.h"
9
10
11 #define BUFSIZE (64*1024)
12
13 static z_stream s;
14 static char inbuf[BUFSIZE];
15 static char outbuf[BUFSIZE];
16
17
18 void fatal(const char *fmt, ...)
19 {
20 va_list ap;
21 va_start(ap, fmt);
22 vfprintf(stderr, fmt, ap);
23 va_end(ap);
24 fputc('\n', stderr);
25 exit(2);
26 }
27
28 int main(int argc, char **argv)
29 {
30 int rc = deflateInit2(&s, Z_DEFAULT_COMPRESSION, Z_DEFLATED,
31 -15, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
32 if (rc != Z_OK)
33 fatal("deflateInit: %d", rc);
34
35 // Compress the input file
36 ssize_t inlen;
37 while ((inlen = read(STDIN_FILENO, inbuf, BUFSIZE)) > 0) {
38
39 // Compress this input block
40 s.next_in = inbuf;
41 s.avail_in = inlen;
42 do {
43 s.next_out = outbuf;
44 s.avail_out = BUFSIZE;
45 if ((rc = deflate(&s, 0)) != Z_OK)
46 fatal("deflate: %d", rc);
47
48 // Write any output the decompressor produced
49 ssize_t outlen = write(STDOUT_FILENO, outbuf,
50 BUFSIZE - s.avail_out);
51 if (outlen < 0)
52 fatal("write error: %d", errno);
53
54 // Continue decompressing the input block until done
55 } while (s.avail_in > 0);
56 }
57 if (inlen < 0)
58 fatal("read error: %d", errno);
59
60 // Flush the output
61 s.avail_in = 0;
62 int done = 0;
63 do {
64 s.next_out = outbuf;
65 s.avail_out = BUFSIZE;
66 int rc = deflate(&s, Z_FINISH);
67 if (rc == Z_STREAM_END)
68 done = 1;
69 else if (rc != Z_OK)
70 fatal("deflate: %d", rc);
71
72 // Write compressor output
73 ssize_t outlen = write(STDOUT_FILENO, outbuf,
74 BUFSIZE - s.avail_out);
75 if (outlen < 0)
76 fatal("write error: %d", errno);
77
78 } while (!done);
79
80 rc = deflateEnd(&s);
81 if (rc != Z_OK)
82 fatal("deflateEnd: %d", rc);
83
84 return 0;
85 }
86