diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-04-09 11:19:31 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-04-09 11:19:31 +0200 |
| commit | 4a3ac9442a7e6fb810f3c56b4a00ffa120cae475 (patch) | |
| tree | 7699a4e06b038319317479676b1ab8dc3545363c /src/blind-skip-pattern.c | |
| parent | blind-next-frame: add -f flag: read multiple frames (diff) | |
| download | blind-4a3ac9442a7e6fb810f3c56b4a00ffa120cae475.tar.gz blind-4a3ac9442a7e6fb810f3c56b4a00ffa120cae475.tar.bz2 blind-4a3ac9442a7e6fb810f3c56b4a00ffa120cae475.tar.xz | |
Add blind-skip-pattern
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
| -rw-r--r-- | src/blind-skip-pattern.c | 84 |
1 files changed, 84 insertions, 0 deletions
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 <inttypes.h> +#include <string.h> +#include <unistd.h> + +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, "<stdout>"); + } + } +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 = "<stdin>"; + 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, "<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; +} |
