ref: 12c9d2fc728b51aa1eb9a70d0d331eb9464912d9
dir: /tools/lzpack.c/
#include "platform.h"
#include "brieflz.h"
int
main(int argc, char **argv)
{
unsigned long sz;
int n, level;
level = 9;
if(argc == 2 && argv[1][0] == '-' && isdigit(argv[1][1])){
level = atoi(argv[1]+1);
argc--;
}
if(argc != 1)
abort();
u8int *in = nil;
unsigned long max = 32768;
for(sz = 0;; sz += n){
if(max < sz+65536){
max *= 2;
if((in = realloc(in, max)) == nil)
abort();
}
if((n = read(0, in+sz, max-sz)) < 0)
abort();
if(n == 0)
break;
}
if(sz == sizeof(in))
abort();
u8int *out = malloc(1+4+blz_max_packed_size(sz));
if(out == nil)
abort();
u8int *w = malloc(blz_workmem_size_level(sz, level));
if(w == nil)
abort();
unsigned long osz = blz_pack_level(in, out+1+4, sz, w, level);
if(osz == BLZ_ERROR)
abort();
out[0] = 0;
out[1] = sz >> 0;
out[2] = sz >> 8;
out[3] = sz >> 16;
out[4] = sz >> 24;
osz += 1+4;
if((unsigned long)write(1, out, osz) != osz)
abort();
free(w);
free(out);
exit(0);
}