dzlib.c - vx32 - Local 9vx git repository for patches.
(HTM) git clone git://r-36.net/vx32
(DIR) Log
(DIR) Files
(DIR) Refs
---
dzlib.c (1591B)
---
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <stdint.h>
5 #include <stdarg.h>
6 #include <unistd.h>
7 #include <errno.h>
8
9 //#include <vxa/vxa.h>
10
11 #include "zlib.h"
12
13
14 #define BUFSIZE (64*1024)
15
16 static z_stream s;
17 static uint8_t inbuf[BUFSIZE];
18 static uint8_t outbuf[BUFSIZE];
19
20
21 void fatal(const char *fmt, ...)
22 {
23 va_list ap;
24 va_start(ap, fmt);
25 vfprintf(stderr, fmt, ap);
26 va_end(ap);
27 fputc('\n', stderr);
28 exit(2);
29 }
30
31 int main(int argc, char **argv)
32 {
33 int rc;
34 if ((rc = inflateInit2(&s, -15)) != Z_OK)
35 fatal("inflateInit: %d", rc);
36
37 while (1) {
38 // Decompress the input file
39 int done = 0;
40 do {
41 // Read a block of input data
42 ssize_t inlen = read(STDIN_FILENO, inbuf, BUFSIZE);
43 if (inlen < 0)
44 fatal("read error: %d", errno);
45 if (inlen == 0)
46 fatal("compressed data truncated");
47
48 // Decompress this input block
49 s.next_in = inbuf;
50 s.avail_in = inlen;
51 do {
52 s.next_out = outbuf;
53 s.avail_out = BUFSIZE;
54 rc = inflate(&s, 0);
55 if (rc == Z_STREAM_END)
56 done = 1;
57 else if (rc != Z_OK)
58 fatal("inflate: %d", rc);
59
60 // Write any output the decompressor produced
61 ssize_t outlen = write(STDOUT_FILENO, outbuf,
62 BUFSIZE - s.avail_out);
63 if (outlen < 0)
64 fatal("write error: %d", errno);
65
66 // Continue decompressing until done
67 } while (s.avail_in > 0 && !done);
68 } while (!done);
69
70 // Indicate to parent that we're done
71 //asm volatile("syscall" : : "a" (VXAPC_DONE) : "ecx");
72 return(0);
73
74 // Get zlib ready for the next stream
75 if ((rc = inflateReset(&s)) != Z_OK)
76 fatal("inflateReset: %d", rc);
77 }
78 }
79