Import xz 5.2.2 (as of svn r86089)
This commit is contained in:
158
tests/create_compress_files.c
Normal file
158
tests/create_compress_files.c
Normal file
@@ -0,0 +1,158 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
/// \file create_compress_files.c
|
||||
/// \brief Creates bunch of test files to be compressed
|
||||
///
|
||||
/// Using a test file generator program saves space in the source code
|
||||
/// package considerably.
|
||||
//
|
||||
// Author: Lasse Collin
|
||||
//
|
||||
// This file has been put into the public domain.
|
||||
// You can do whatever you want with this file.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "sysdefs.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
// Avoid re-creating the test files every time the tests are run.
|
||||
#define create_test(name) \
|
||||
do { \
|
||||
if (!file_exists("compress_generated_" #name)) { \
|
||||
FILE *file = file_create("compress_generated_" #name); \
|
||||
write_ ## name(file); \
|
||||
file_finish(file, "compress_generated_" #name); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
static bool
|
||||
file_exists(const char *filename)
|
||||
{
|
||||
// Trying to be somewhat portable by avoiding stat().
|
||||
FILE *file = fopen(filename, "rb");
|
||||
bool ret;
|
||||
|
||||
if (file != NULL) {
|
||||
fclose(file);
|
||||
ret = true;
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static FILE *
|
||||
file_create(const char *filename)
|
||||
{
|
||||
FILE *file = fopen(filename, "wb");
|
||||
|
||||
if (file == NULL) {
|
||||
perror(filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
file_finish(FILE *file, const char *filename)
|
||||
{
|
||||
const bool ferror_fail = ferror(file);
|
||||
const bool fclose_fail = fclose(file);
|
||||
|
||||
if (ferror_fail || fclose_fail) {
|
||||
perror(filename);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// File that repeats "abc\n" a few thousand times. This is targeted
|
||||
// especially at Subblock filter's run-length encoder.
|
||||
static void
|
||||
write_abc(FILE *file)
|
||||
{
|
||||
for (size_t i = 0; i < 12345; ++i)
|
||||
if (fwrite("abc\n", 4, 1, file) != 1)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
// File that doesn't compress. We always use the same random seed to
|
||||
// generate identical files on all systems.
|
||||
static void
|
||||
write_random(FILE *file)
|
||||
{
|
||||
uint32_t n = 5;
|
||||
|
||||
for (size_t i = 0; i < 123456; ++i) {
|
||||
n = 101771 * n + 71777;
|
||||
|
||||
putc(n & 0xFF, file);
|
||||
putc((n >> 8) & 0xFF, file);
|
||||
putc((n >> 16) & 0xFF, file);
|
||||
putc(n >> 24, file);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Text file
|
||||
static void
|
||||
write_text(FILE *file)
|
||||
{
|
||||
static const char *lorem[] = {
|
||||
"Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur",
|
||||
"adipisicing", "elit,", "sed", "do", "eiusmod", "tempor",
|
||||
"incididunt", "ut", "labore", "et", "dolore", "magna",
|
||||
"aliqua.", "Ut", "enim", "ad", "minim", "veniam,", "quis",
|
||||
"nostrud", "exercitation", "ullamco", "laboris", "nisi",
|
||||
"ut", "aliquip", "ex", "ea", "commodo", "consequat.",
|
||||
"Duis", "aute", "irure", "dolor", "in", "reprehenderit",
|
||||
"in", "voluptate", "velit", "esse", "cillum", "dolore",
|
||||
"eu", "fugiat", "nulla", "pariatur.", "Excepteur", "sint",
|
||||
"occaecat", "cupidatat", "non", "proident,", "sunt", "in",
|
||||
"culpa", "qui", "officia", "deserunt", "mollit", "anim",
|
||||
"id", "est", "laborum."
|
||||
};
|
||||
|
||||
// Let the first paragraph be the original text.
|
||||
for (size_t w = 0; w < ARRAY_SIZE(lorem); ++w) {
|
||||
fprintf(file, "%s ", lorem[w]);
|
||||
|
||||
if (w % 7 == 6)
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
|
||||
// The rest shall be (hopefully) meaningless combinations of
|
||||
// the same words.
|
||||
uint32_t n = 29;
|
||||
|
||||
for (size_t p = 0; p < 500; ++p) {
|
||||
fprintf(file, "\n\n");
|
||||
|
||||
for (size_t w = 0; w < ARRAY_SIZE(lorem); ++w) {
|
||||
n = 101771 * n + 71777;
|
||||
|
||||
fprintf(file, "%s ", lorem[n % ARRAY_SIZE(lorem)]);
|
||||
|
||||
if (w % 7 == 6)
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
create_test(abc);
|
||||
create_test(random);
|
||||
create_test(text);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user