vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

ebz2.c (2621B)


      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 void fatal(const char *fmt, ...)
     18 {
     19 	va_list ap;
     20 	va_start(ap, fmt);
     21 	vfprintf(stderr, fmt, ap);
     22 	va_end(ap);
     23 	fputc('\n', stderr);
     24 	exit(2);
     25 }
     26 
     27 void bz_internal_error (int errcode)
     28 {
     29 	fatal("Internal bzip2 error: %d", errcode);
     30 }
     31 
     32 int main(int argc, char **argv)
     33 {
     34 printf("malloc3: %08x\n", malloc(123));
     35 printf("malloc3: %08x\n", malloc(123));
     36 printf("malloc3: %08x\n", malloc(123));
     37 printf("malloc3: %08x\n", malloc(123));
     38 printf("malloc4: %08x\n", malloc(1234));
     39 printf("malloc4: %08x\n", malloc(1234));
     40 printf("malloc4: %08x\n", malloc(1234));
     41 printf("malloc4: %08x\n", malloc(1234));
     42 printf("malloc5: %08x\n", malloc(12345));
     43 printf("malloc5: %08x\n", malloc(12345));
     44 printf("malloc5: %08x\n", malloc(12345));
     45 printf("malloc5: %08x\n", malloc(12345));
     46 printf("malloc6: %08x\n", malloc(123456));
     47 printf("malloc6: %08x\n", malloc(123456));
     48 printf("malloc6: %08x\n", malloc(123456));
     49 printf("malloc6: %08x\n", malloc(123456));
     50 printf("malloc7: %08x\n", malloc(1234567));
     51 printf("malloc7: %08x\n", malloc(1234567));
     52 printf("malloc7: %08x\n", malloc(1234567));
     53 printf("malloc7: %08x\n", malloc(1234567));
     54 	int rc = BZ2_bzCompressInit(&s, 9, 0, 0);
     55 	if (rc != BZ_OK)
     56 		fatal("BZ2_bzCompressInit: %d", rc);
     57 
     58 	// Compress the input file
     59 	ssize_t inlen;
     60 	while ((inlen = read(STDIN_FILENO, inbuf, BUFSIZE)) > 0) {
     61 
     62 		// Compress this input block
     63 		s.next_in = inbuf;
     64 		s.avail_in = inlen;
     65 		do {
     66 			s.next_out = outbuf;
     67 			s.avail_out = BUFSIZE;
     68 			if ((rc = BZ2_bzCompress(&s, BZ_RUN)) != BZ_RUN_OK)
     69 				fatal("BZ2_bzCompress: %d", rc);
     70 
     71 			// Write any output the decompressor produced
     72 			ssize_t outlen = write(STDOUT_FILENO, outbuf,
     73 						BUFSIZE - s.avail_out);
     74 			if (outlen < 0)
     75 				fatal("write error: %d", errno);
     76 
     77 			// Continue decompressing the input block until done
     78 		} while (s.avail_in > 0);
     79 	}
     80 	if (inlen < 0)
     81 		fatal("read error: %d", errno);
     82 
     83 	// Flush the output
     84 	s.avail_in = 0;
     85 	int done = 0;
     86 	do {
     87 		s.next_out = outbuf;
     88 		s.avail_out = BUFSIZE;
     89 		int rc = BZ2_bzCompress(&s, BZ_FINISH);
     90 		if (rc == BZ_STREAM_END)
     91 			done = 1;
     92 		else if (rc != BZ_FINISH_OK)
     93 			fatal("BZ2_bzCompress: %d", rc);
     94 
     95 		// Write compressor output
     96 		ssize_t outlen = write(STDOUT_FILENO, outbuf,
     97 					BUFSIZE - s.avail_out);
     98 		if (outlen < 0)
     99 			fatal("write error: %d", errno);
    100 
    101 	} while (!done);
    102 
    103 	rc = BZ2_bzCompressEnd(&s);
    104 	if (rc != BZ_OK)
    105 		fatal("BZ2_bzCompressEnd: %d", rc);
    106 
    107 	return 0;
    108 }
    109