]> mj.ucw.cz Git - libucw.git/blob - lib/lizard-test.c
improved the test tool, now it is easy to verify the compression
[libucw.git] / lib / lizard-test.c
1 #include "lib/lib.h"
2 #include "lib/conf.h"
3 #include "lib/fastbuf.h"
4 #include "lib/lizzard.h"
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9
10 static char *options = CF_SHORT_OPTS "cdt";
11 static char *help = "\
12 Usage: lizzard-test <options> input-file [output-file]\n\
13 \n\
14 Options:\n"
15 CF_USAGE
16 "-c\t\tCompress (default)\n\
17 -d\t\tDecompress\n\
18 -t\t\tCompress, decompress, and compare (in memory only)\n\
19 ";
20
21 static void NONRET
22 usage(void)
23 {
24   fputs(help, stderr);
25   exit(1);
26 }
27
28 int
29 main(int argc, char **argv)
30 {
31   int opt;
32   uns action = 'c';
33   log_init(argv[0]);
34   while ((opt = cf_getopt(argc, argv, options, CF_NO_LONG_OPTS, NULL)) >= 0)
35     switch (opt)
36     {
37       case 'c':
38       case 'd':
39       case 't':
40         action = opt;
41         break;
42       default:
43         usage();
44     }
45   if (action == 't' && argc != optind+1
46   || action != 't' && argc != optind+2)
47     usage();
48
49   void *mi, *mo;
50   uns li, lo;
51
52   struct stat st;
53   stat(argv[optind], &st);
54   li = st.st_size;
55   struct fastbuf *fi = bopen(argv[optind], O_RDONLY, 1<<16);
56   if (action != 'd')
57   {
58     lo = li * LIZZARD_MAX_MULTIPLY + LIZZARD_MAX_ADD;
59     li += LIZZARD_NEEDS_CHARS;
60   }
61   else
62   {
63     lo = bgetl(fi);
64     li -= 4;
65   }
66   mi = xmalloc(li);
67   mo = xmalloc(lo);
68   li = bread(fi, mi, li);
69   bclose(fi);
70
71   printf("%d ", li);
72   if (action == 'd')
73     printf("->expected %d ", lo);
74   fflush(stdout);
75   if (action != 'd')
76     lo = lizzard_compress(mi, li, mo);
77   else
78     lo = lizzard_decompress(mi, mo);
79   printf("-> %d ", lo);
80   fflush(stdout);
81
82   if (action != 't')
83   {
84     struct fastbuf *fo = bopen(argv[optind+1], O_CREAT | O_TRUNC | O_WRONLY, 1<<16);
85     if (action == 'c')
86       bputl(fo, li);
87     bwrite(fo, mo, lo);
88     bclose(fo);
89   }
90   else
91   {
92     void *mv;
93     uns lv;
94     mv = xmalloc(li);
95     lv = lizzard_decompress(mo, mv);
96     printf("-> %d ", lv);
97     fflush(stdout);
98     if (lv != li || memcmp(mi, mv, lv))
99       printf("WRONG");
100     else
101       printf("OK");
102   }
103   printf("\n");
104 }