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