diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-01-26 07:26:42 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-01-26 07:26:42 +0100 |
| commit | f757761b310a899dc8ece7ad7845ed0a22ff752b (patch) | |
| tree | ea350791ac1e2ec0bf6d68ae449ec4e012780cdb /src/blind-decompress.c | |
| parent | blind-arithm: add abs (diff) | |
| download | blind-f757761b310a899dc8ece7ad7845ed0a22ff752b.tar.gz blind-f757761b310a899dc8ece7ad7845ed0a22ff752b.tar.bz2 blind-f757761b310a899dc8ece7ad7845ed0a22ff752b.tar.xz | |
Add blind-compress and blind-decompress
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/blind-decompress.c')
| -rw-r--r-- | src/blind-decompress.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/blind-decompress.c b/src/blind-decompress.c new file mode 100644 index 0000000..ea24fc6 --- /dev/null +++ b/src/blind-decompress.c @@ -0,0 +1,64 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include <string.h> +#include <unistd.h> + +USAGE("") + +int +main(int argc, char *argv[]) +{ + struct stream stream; + char *buf; + size_t n, m, fptr, sptr, same = 0, diff = 0; + + ENOFLAGS(argc); + + stream.file = "<stdin>"; + stream.fd = STDIN_FILENO; + einit_stream(&stream); + fprint_stream_head(stdout, &stream); + efflush(stdout, "<stdout>"); + + echeck_frame_size(stream.width, stream.height, stream.pixel_size, 0, "<stdin>"); + n = stream.width * stream.height * stream.pixel_size; + buf = ecalloc(1, n); + + fptr = 0; + do { + sptr = 0; + again: + while (same) { + m = same < n - fptr ? same : n - fptr; + ewriteall(STDOUT_FILENO, buf + fptr, m, "<stdout>"); + fptr = (fptr + m) % n; + same -= m; + } + + while (diff && sptr < stream.ptr) { + m = diff < n - fptr ? diff : n - fptr; + m = m < stream.ptr - sptr ? m : stream.ptr - sptr; + memcpy(buf + fptr, stream.buf + sptr, m); + ewriteall(STDOUT_FILENO, buf + fptr, m, "<stdout>"); + fptr = (fptr + m) % n; + diff -= m; + sptr += m; + } + + if (diff || sptr + 2 * sizeof(size_t) > stream.ptr) { + memmove(stream.buf, stream.buf + sptr, stream.ptr -= sptr); + } else { + same = ((size_t *)(stream.buf + sptr))[0]; + diff = ((size_t *)(stream.buf + sptr))[1]; + sptr += 2 * sizeof(size_t); + goto again; + } + } while (eread_stream(&stream, SIZE_MAX)); + + free(buf); + if (same || diff) + eprintf("<stdin>: corrupt input\n"); + return 0; +} |
