From 4a3ac9442a7e6fb810f3c56b4a00ffa120cae475 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 9 Apr 2017 11:19:31 +0200 Subject: Add blind-skip-pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blind-skip-pattern.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/blind-skip-pattern.c (limited to 'src') diff --git a/src/blind-skip-pattern.c b/src/blind-skip-pattern.c new file mode 100644 index 0000000..1debeca --- /dev/null +++ b/src/blind-skip-pattern.c @@ -0,0 +1,84 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include +#include +#include + +USAGE("(skipped-frames | +included-frames) ...") + +static int +process_frame(struct stream *stream, int include, size_t rown) +{ + size_t h, n; + int anything = 0; + + for (h = stream->height; h;) { + h--; + for (n = rown; n; n -= stream->ptr) { + stream->ptr = 0; + if (!eread_stream(stream, n)) + goto done; + anything = 1; + if (include) + ewriteall(STDOUT_FILENO, stream->buf, stream->ptr, ""); + } + } +done: + + if (anything && (h || n || stream->frames)) + eprintf("%s: is shorted than expected\n", stream->file); + + return !anything; +} + +int +main(int argc, char *argv[]) +{ + struct stream stream; + int i, include; + size_t f, n, rown, total = 0; + char *includes; + size_t *ns; + + UNOFLAGS(!argc); + + stream.fd = STDIN_FILENO; + stream.file = ""; + einit_stream(&stream); + + includes = emalloc((size_t)argc); + ns = ecalloc((size_t)argc, sizeof(*ns)); + + for (i = 0; i < argc; i++) { + include = argv[i][0] == '+'; + n = etozu_arg(include ? "included frame count" : "skipped frame count", + argv[i] + include, 0, SIZE_MAX); + ns[i] = n; + includes[i] = (char)include; + } + if (!total) + eprintf("null pattern is not allowed"); + + for (i = 0, total = 0, f = stream.frames;; i = (i + 1) % argc) { + include = (int)includes[i]; + for (n = ns[i]; n-- && f--;) + total += (size_t)include; + } + + stream.frames = total; + fprint_stream_head(stdout, &stream); + efflush(stdout, ""); + + rown = stream.width * stream.pixel_size; + for (i = 0;; i = (i + 1) % argc) { + include = (int)includes[i]; + n = ns[i]; + while (n-- && process_frame(&stream, include, rown)); + } + + free(includes); + free(ns); + return 0; +} -- cgit v1.2.3-70-g09d2