root/tests/create_compress_files.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. file_exists
  2. file_create
  3. file_finish
  4. write_abc
  5. write_random
  6. write_text
  7. main

///////////////////////////////////////////////////////////////////////////////
//
/// \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;
}

/* [<][>][^][v][top][bottom][index][help] */