mirror of https://git.tukaani.org/xz.git
165 lines
3.8 KiB
C
165 lines
3.8 KiB
C
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
/// \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.
|
||
|
//
|
||
|
// Copyright (C) 2008 Lasse Collin
|
||
|
//
|
||
|
// This library is free software; you can redistribute it and/or
|
||
|
// modify it under the terms of the GNU Lesser General Public
|
||
|
// License as published by the Free Software Foundation; either
|
||
|
// version 2.1 of the License, or (at your option) any later version.
|
||
|
//
|
||
|
// This library is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
// Lesser General Public License for more details.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#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)
|
||
|
fwrite("abc\n", 4, 1, file);
|
||
|
}
|
||
|
|
||
|
|
||
|
// 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;
|
||
|
}
|