Index: xz/tests/create_compress_files.c |
=================================================================== |
--- xz/tests/create_compress_files.c (revision 0) |
+++ xz/tests/create_compress_files.c (revision 0) |
@@ -0,0 +1,157 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \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) |
+ 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; |
+} |
Property changes on: xz/tests/create_compress_files.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |