From dd8fa3e8ddb970fd92550d6e833870a813e4b164 Mon Sep 17 00:00:00 2001 From: Eugene Kliuchnikov Date: Thu, 22 Sep 2016 11:32:23 +0200 Subject: Update research * don't use `assert` when side-effect is desired * use `gflags` to pick options from args Other changes: * teach stub `Makefile` to do partial rebuild * remove obsolete `tools/version.h` --- research/Makefile | 2 +- research/draw_diff.cc | 11 ++++++++--- research/draw_histogram.cc | 38 +++++++++++++++++++------------------- research/find_opt_references.cc | 10 +++++++--- research/read_dist.h | 30 ++++++++++++++++++++---------- 5 files changed, 55 insertions(+), 36 deletions(-) (limited to 'research') diff --git a/research/Makefile b/research/Makefile index 9574072..751b316 100644 --- a/research/Makefile +++ b/research/Makefile @@ -11,7 +11,7 @@ $(BINDIR): mkdir -p $@ $(EXECUTABLES): $(BINDIR) - $(CC) $(CFLAGS) $(CPPFLAGS) $(addsuffix .cc, $@) -o $(BINDIR)/$@ + $(CC) $(CFLAGS) $(CPPFLAGS) $(addsuffix .cc, $@) -o $(BINDIR)/$@ -lgflags_nothreads clean: rm -rf $(BINDIR) diff --git a/research/draw_diff.cc b/research/draw_diff.cc index 3759c35..837e5d2 100644 --- a/research/draw_diff.cc +++ b/research/draw_diff.cc @@ -1,5 +1,5 @@ /* Copyright 2016 Google Inc. All Rights Reserved. - Author: vanickulin@google.com (Ivan Nikulin) + Author: zip753@gmail.com (Ivan Nikulin) Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT @@ -13,16 +13,21 @@ #include #include #include +#include /* exit, EXIT_FAILURE */ #include +#ifndef CHECK +#define CHECK(X) if (!(X)) exit(EXIT_FAILURE); +#endif + void ReadPGM(FILE* f, uint8_t*** image, size_t* height, size_t* width) { int colors; - assert(fscanf(f, "P5\n%lu %lu\n%d\n", width, height, &colors) == 3); + CHECK(fscanf(f, "P5\n%lu %lu\n%d\n", width, height, &colors) == 3); assert(colors == 255); *image = new uint8_t*[*height]; for (int i = *height - 1; i >= 0; --i) { (*image)[i] = new uint8_t[*width]; - assert(fread((*image)[i], 1, *width, f) == *width); + CHECK(fread((*image)[i], 1, *width, f) == *width); } } diff --git a/research/draw_histogram.cc b/research/draw_histogram.cc index a7eddb6..b0192a2 100644 --- a/research/draw_histogram.cc +++ b/research/draw_histogram.cc @@ -1,5 +1,5 @@ /* Copyright 2016 Google Inc. All Rights Reserved. - Author: vanickulin@google.com (Ivan Nikulin) + Author: zip753@gmail.com (Ivan Nikulin) Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT @@ -15,18 +15,21 @@ #include /* fscanf, fprintf */ #include +#include +using gflags::ParseCommandLineFlags; + #include "./read_dist.h" -const int FLAGS_height = 1000; // Height of the resulting histogam. -const int FLAGS_width = 1000; // Width of the resulting histogam. -int FLAGS_size; // Size of the compressed file. -const int FLAGS_brotli_window = 0; // Size of brotli window in bits. -const uint64_t FLAGS_min_distance = 0; // Minimum distance. -uint64_t FLAGS_max_distance = 0; // Maximum distance. -const bool FLAGS_with_copies = false; // True if input contains copy length. -const bool FLAGS_simple = false; // True if using only black and white pixels. -const bool FLAGS_linear = true; // True if using linear distance mapping. -const uint64_t FLAGS_skip = 0; // Number of bytes to skip. +DEFINE_int32(height, 1000, "Height of the resulting histogam."); +DEFINE_int32(width, 8000, "Width of the resulting histogam."); +DEFINE_int32(size, 1e8, "Size of the compressed file."); +DEFINE_int32(brotli_window, -1, "Size of brotli window in bits."); +DEFINE_uint64(min_distance, 0, "Minimum distance."); +DEFINE_uint64(max_distance, 1 << 30, "Maximum distance."); +DEFINE_bool(with_copies, false, "True if input contains copy length."); +DEFINE_bool(simple, false, "True if using only black and white pixels."); +DEFINE_bool(linear, false, "True if using linear distance mapping."); +DEFINE_uint64(skip, 0, "Number of bytes to skip."); inline double DistanceTransform(double x) { static bool linear = FLAGS_linear; @@ -83,7 +86,7 @@ void BuildHistogram(FILE* fin, int** histo) { while (ReadBackwardReference(fin, ©, &pos, &distance)) { if (pos == -1) continue; // In case when only insert is present. if (distance < min_distance || distance >= GetMaxDistance()) continue; - if (FLAGS_brotli_window != 0) { + if (FLAGS_brotli_window != -1) { AdjustPosition(&pos); } if (pos >= skip && distance <= pos) { @@ -163,8 +166,9 @@ void DrawPixels(uint8_t** pixel, FILE* fout) { } int main(int argc, char* argv[]) { - if (argc != 4) { - printf("usage: draw_histogram.cc dist_file input_size output_file\n"); + ParseCommandLineFlags(&argc, &argv, true); + if (argc != 3) { + printf("usage: draw_histogram.cc data output_file\n"); return 1; } @@ -172,11 +176,7 @@ int main(int argc, char* argv[]) { int width = FLAGS_width; FILE* fin = fopen(argv[1], "r"); - FILE* fout = fopen(argv[3], "wb"); - - FLAGS_size = atoi(argv[2]); - - if (FLAGS_max_distance == 0) FLAGS_max_distance = FLAGS_size; + FILE* fout = fopen(argv[2], "wb"); uint8_t** pixel = new uint8_t*[height]; int** histo = new int*[height]; diff --git a/research/find_opt_references.cc b/research/find_opt_references.cc index b719317..beab5b6 100644 --- a/research/find_opt_references.cc +++ b/research/find_opt_references.cc @@ -1,5 +1,5 @@ /* Copyright 2016 Google Inc. All Rights Reserved. - Author: vanickulin@google.com (Ivan Nikulin) + Author: zip753@gmail.com (Ivan Nikulin) Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT @@ -13,10 +13,13 @@ #include #include +#include +using gflags::ParseCommandLineFlags; + #include "./esaxx/sais.hxx" -const int FLAGS_min_length = 1; // Minimal length of found backward references. -const int FLAGS_skip = 1; // Number of bytes to skip. +DEFINE_int32(min_length, 1, "Minimal length of found backward references."); +DEFINE_int32(skip, 1, "Number of bytes to skip."); const size_t kFileBufferSize = (1 << 16); // 64KB @@ -112,6 +115,7 @@ void ProcessReferences(input_type* storage, sarray_type* sarray, lcp_type* lcp, } int main(int argc, char* argv[]) { + ParseCommandLineFlags(&argc, &argv, true); if (argc != 3) { printf("usage: %s input_file output_file\n", argv[0]); return 1; diff --git a/research/read_dist.h b/research/read_dist.h index dd5ade3..3cac473 100644 --- a/research/read_dist.h +++ b/research/read_dist.h @@ -1,37 +1,47 @@ /* Copyright 2016 Google Inc. All Rights Reserved. - Author: vanickulin@google.com (Ivan Nikulin) + Author: zip753@gmail.com (Ivan Nikulin) Distributed under MIT license. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT */ -/* API for reading distances from *.dist file. */ - -#include -#include +/* API for reading distances from *.dist file. + The format of *.dist file is as follows: for each backward reference there is + a position-distance pair, also a copy length may be specified. Copy length is + prefixed with flag byte 0, position-distance pair is prefixed with flag + byte 1. Each number is a 32-bit integer. Copy length always comes before + position-distance pair. Standalone copy length is allowed, in this case it is + ignored. */ #ifndef BROTLI_RESEARCH_READ_DIST_H_ #define BROTLI_RESEARCH_READ_DIST_H_ +#include +#include /* exit, EXIT_FAILURE */ + +#ifndef CHECK +#define CHECK(X) if (!(X)) exit(EXIT_FAILURE); +#endif + /* Reads backwards reference from .dist file. Sets all missing fields to -1. Returns false when EOF is met or input is corrupt. */ bool ReadBackwardReference(FILE* fin, int* copy, int* pos, int* dist) { int c = getc(fin); if (c == EOF) return false; if (c == 0) { - assert(fread(copy, sizeof(int), 1, fin) == 1); + CHECK(fread(copy, sizeof(int), 1, fin) == 1); if ((c = getc(fin)) != 1) { ungetc(c, fin); *pos = *dist = -1; } else { - assert(fread(pos, sizeof(int), 1, fin) == 1); - assert(fread(dist, sizeof(int), 1, fin) == 1); + CHECK(fread(pos, sizeof(int), 1, fin) == 1); + CHECK(fread(dist, sizeof(int), 1, fin) == 1); } } else if (c != 1) { return false; } else { - assert(fread(pos, sizeof(int), 1, fin) == 1); - assert(fread(dist, sizeof(int), 1, fin) == 1); + CHECK(fread(pos, sizeof(int), 1, fin) == 1); + CHECK(fread(dist, sizeof(int), 1, fin) == 1); *copy = -1; } return true; -- cgit v1.1