You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.4 KiB
126 lines
2.4 KiB
3 months ago
|
#include <ucw/lib.h>
|
||
|
#include <ucw/getopt.h>
|
||
|
#include <ucw/fastbuf.h>
|
||
|
#include <ucw/ff-binary.h>
|
||
|
#include <ucw/lizard.h>
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <fcntl.h>
|
||
|
#include <unistd.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
static char *options = CF_SHORT_OPTS "cdtx";
|
||
|
static char *help = "\
|
||
|
Usage: lizard-test <options> input-file [output-file]\n\
|
||
|
\n\
|
||
|
Options:\n"
|
||
|
CF_USAGE
|
||
|
"-c\t\tCompress\n\
|
||
|
-d\t\tDecompress\n\
|
||
|
-t\t\tCompress, decompress, and compare (in memory only, default)\n\
|
||
|
-x\t\tLet the test crash by shrinking the output buffer\n\
|
||
|
";
|
||
|
|
||
|
static void NONRET
|
||
|
usage(void)
|
||
|
{
|
||
|
fputs(help, stderr);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char **argv)
|
||
|
{
|
||
|
int opt;
|
||
|
uint action = 't';
|
||
|
uint crash = 0;
|
||
|
log_init(argv[0]);
|
||
|
while ((opt = cf_getopt(argc, argv, options, CF_NO_LONG_OPTS, NULL)) >= 0)
|
||
|
switch (opt)
|
||
|
{
|
||
|
case 'c':
|
||
|
case 'd':
|
||
|
case 't':
|
||
|
action = opt;
|
||
|
break;
|
||
|
case 'x':
|
||
|
crash++;
|
||
|
break;
|
||
|
default:
|
||
|
usage();
|
||
|
}
|
||
|
if (action == 't' && argc != optind+1
|
||
|
|| action != 't' && argc != optind+2)
|
||
|
usage();
|
||
|
|
||
|
void *mi, *mo;
|
||
|
int li, lo;
|
||
|
uint adler = 0;
|
||
|
|
||
|
struct stat st;
|
||
|
stat(argv[optind], &st);
|
||
|
li = st.st_size;
|
||
|
struct fastbuf *fi = bopen(argv[optind], O_RDONLY, 1<<16);
|
||
|
if (action != 'd')
|
||
|
{
|
||
|
lo = li * LIZARD_MAX_MULTIPLY + LIZARD_MAX_ADD;
|
||
|
li += LIZARD_NEEDS_CHARS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lo = bgetl(fi);
|
||
|
adler = bgetl(fi);
|
||
|
li -= 8;
|
||
|
}
|
||
|
mi = xmalloc(li);
|
||
|
mo = xmalloc(lo);
|
||
|
li = bread(fi, mi, li);
|
||
|
bclose(fi);
|
||
|
|
||
|
printf("%d ", li);
|
||
|
if (action == 'd')
|
||
|
printf("->expected %d (%08x) ", lo, adler);
|
||
|
fflush(stdout);
|
||
|
if (action != 'd')
|
||
|
lo = lizard_compress(mi, li, mo);
|
||
|
else
|
||
|
{
|
||
|
lo = lizard_decompress(mi, mo);
|
||
|
if (adler32(mo, lo) != adler)
|
||
|
printf("wrong Adler32 ");
|
||
|
}
|
||
|
printf("-> %d ", lo);
|
||
|
fflush(stdout);
|
||
|
|
||
|
if (action != 't')
|
||
|
{
|
||
|
struct fastbuf *fo = bopen(argv[optind+1], O_CREAT | O_TRUNC | O_WRONLY, 1<<16);
|
||
|
if (action == 'c')
|
||
|
{
|
||
|
bputl(fo, li);
|
||
|
bputl(fo, adler32(mi, li));
|
||
|
}
|
||
|
bwrite(fo, mo, lo);
|
||
|
bclose(fo);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int smaller_li;
|
||
|
if (li >= (int) CPU_PAGE_SIZE)
|
||
|
smaller_li = li - CPU_PAGE_SIZE;
|
||
|
else
|
||
|
smaller_li = 0;
|
||
|
struct lizard_buffer *buf = lizard_alloc();
|
||
|
byte *ptr = lizard_decompress_safe(mo, buf, crash ? smaller_li : li);
|
||
|
if (!ptr)
|
||
|
printf("err: %m");
|
||
|
else if (memcmp(mi, ptr, li))
|
||
|
printf("WRONG");
|
||
|
else
|
||
|
printf("OK");
|
||
|
lizard_free(buf);
|
||
|
}
|
||
|
printf("\n");
|
||
|
}
|