#include #include "compress.h" static panic(const char *reason) { fprintf(stderr,"\ncomptest ERROR: %s\n",reason); exit(1); } int main(int argc,char **args) { char cmd, ch; comp_buf_t *data; void *action; FILE *src, *dest; // check_argc if(argc != 4) goto do_usage; cmd = args[1][0]; if(args[1][1] != '\0') goto do_usage; // which cmd? switch(cmd) { case 'C': case 'c': action = &&do_compress; break; case 'D': case 'd': action = &&do_decompress; break; default: goto do_usage; } // open files data = (comp_buf_t*)malloc(sizeof(comp_buf_t)); if(data == 0) panic("m1"); src = fopen(args[2],"rb"); if(src == 0) panic("m2"); dest = fopen(args[3],"wb"); if(dest == 0) panic("m3"); // process files goto *action; do_compress: data->f = dest; ch = fgetc(src); while(ch != EOF) { write_compressed(data,ch); ch = fgetc(src); } flush_compressed(data); goto done; do_decompress: data->f = src; do { block_decompress(data); if(data->len != fwrite(data->buf,sizeof(unsigned char),data->len,dest)) panic("m4"); } while(!feof(src)); goto done; done: // close files fclose(src); fclose(dest); free(data); return 0; do_usage: fprintf(stderr, "USAGE:\n" "\tcomptest cmd src_filename dest_filename\n" "\t\tcmd: \'c\' to compress, \'d\' to decompress\n"); return 1; }