1 #include <stdio.h>
2 #include "compress.h"
3
panic(const char * reason)4 static panic(const char *reason) {
5 fprintf(stderr,"\ncomptest ERROR: %s\n",reason);
6 exit(1);
7 }
8
main(int argc,char ** args)9 int main(int argc,char **args) {
10 char cmd, ch;
11 comp_buf_t *data;
12 void *action;
13 FILE *src, *dest;
14 // check_argc
15 if(argc != 4) goto do_usage;
16 cmd = args[1][0];
17 if(args[1][1] != '\0') goto do_usage;
18 // which cmd?
19 switch(cmd) {
20 case 'C':
21 case 'c':
22 action = &&do_compress;
23 break;
24 case 'D':
25 case 'd':
26 action = &&do_decompress;
27 break;
28 default:
29 goto do_usage;
30 }
31 // open files
32 data = (comp_buf_t*)malloc(sizeof(comp_buf_t));
33 if(data == 0) panic("m1");
34 src = fopen(args[2],"rb"); if(src == 0) panic("m2");
35 dest = fopen(args[3],"wb"); if(dest == 0) panic("m3");
36 // process files
37 goto *action;
38 do_compress:
39 data->f = dest;
40 ch = fgetc(src);
41 while(ch != EOF) {
42 write_compressed(data,ch);
43 ch = fgetc(src);
44 }
45 flush_compressed(data);
46 goto done;
47 do_decompress:
48 data->f = src;
49 do {
50 block_decompress(data);
51 if(data->len != fwrite(data->buf,sizeof(unsigned char),data->len,dest)) panic("m4");
52 } while(!feof(src));
53 goto done;
54 done:
55 // close files
56 fclose(src);
57 fclose(dest);
58 free(data);
59 return 0;
60 do_usage:
61 fprintf(stderr,
62 "USAGE:\n"
63 "\tcomptest cmd src_filename dest_filename\n"
64 "\t\tcmd: \'c\' to compress, \'d\' to decompress\n");
65 return 1;
66 }
67
68