dbz2.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dbz2.c (1673B)
       ---
            1 
            2 #include <stdio.h>
            3 #include <stdlib.h>
            4 #include <stdarg.h>
            5 #include <unistd.h>
            6 #include <errno.h>
            7 
            8 #include "bzlib.h"
            9 
           10 
           11 #define BUFSIZE (64*1024)
           12 
           13 static bz_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 void bz_internal_error (int errcode)
           29 {
           30         fatal("Internal bzip2 error: %d", errcode);
           31 }
           32 
           33 int main(int argc, char **argv)
           34 {
           35         while (1) {
           36                 int rc;
           37                 if ((rc = BZ2_bzDecompressInit(&s, 0, 0)) != BZ_OK)
           38                         fatal("BZ2_bzDecompressInit: %d", rc);
           39 
           40                 // Decompress the input file
           41                 int done = 0;
           42                 do {
           43                         // Read a block of input data
           44                         ssize_t inlen = read(STDIN_FILENO, inbuf, BUFSIZE);
           45                         if (inlen < 0)
           46                                 fatal("read error: %d", errno);
           47                         if (inlen == 0)
           48                                 fatal("compressed data appears to be truncated");
           49 
           50                         // Decompress this input block
           51                         s.next_in = inbuf;
           52                         s.avail_in = inlen;
           53                         do {
           54                                 s.next_out = outbuf;
           55                                 s.avail_out = BUFSIZE;
           56                                 rc = BZ2_bzDecompress(&s);
           57                                 if (rc == BZ_STREAM_END)
           58                                         done = 1;
           59                                 else if (rc != BZ_OK)
           60                                         fatal("BZ2_bzDecompress: %d", rc);
           61 
           62                                 // Write any output the decompressor produced
           63                                 ssize_t outlen = write(STDOUT_FILENO, outbuf,
           64                                                         BUFSIZE - s.avail_out);
           65                                 if (outlen < 0)
           66                                         fatal("write error: %d", errno);
           67 
           68                                 // Continue decompressing the input block until done
           69                         } while (s.avail_in > 0 && !done);
           70                 } while (!done);
           71 
           72                 if ((rc = BZ2_bzDecompressEnd(&s)) != BZ_OK)
           73                         fatal("BZ2_bzDecompressEnd: %d", rc);
           74 
           75                 // Indicate to parent that we're done
           76                 //asm volatile("syscall" : : "a" (VXAPC_DONE) : "ecx");
           77                 return 0;
           78         }
           79 }
           80