From 4674ec0e4b833ab0d0365225ba99228df14abe87 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 13 Jan 2017 09:05:08 +0100 Subject: Rename to blind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blind-arithm.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/blind-arithm.c (limited to 'src/blind-arithm.c') diff --git a/src/blind-arithm.c b/src/blind-arithm.c new file mode 100644 index 0000000..ce85287 --- /dev/null +++ b/src/blind-arithm.c @@ -0,0 +1,80 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include +#include +#include +#include +#include + +USAGE("right-hand-stream") + +/* Because the syntax for a function returning a function pointer is disgusting. */ +typedef void (*process_func)(struct stream *left, struct stream *right, size_t n); + +#define LIST_OPERATORS\ + X(add, *lh += rh)\ + X(sub, *lh -= rh)\ + X(mul, *lh *= rh)\ + X(div, *lh /= rh)\ + X(exp, *lh = pow(*lh, rh))\ + X(log, *lh = log(*lh) / log(rh))\ + X(min, *lh = *lh < rh ? *lh : rh)\ + X(max, *lh = *lh > rh ? *lh : rh) + +#define X(NAME, ALGO)\ + static void\ + process_lf_##NAME(struct stream *left, struct stream *right, size_t n)\ + {\ + size_t i;\ + double *lh, rh;\ + for (i = 0; i < n; i += 4 * sizeof(double)) {\ + lh = ((double *)(left->buf + i)) + 0, rh = ((double *)(right->buf + i))[0];\ + ALGO;\ + lh = ((double *)(left->buf + i)) + 1, rh = ((double *)(right->buf + i))[1];\ + ALGO;\ + lh = ((double *)(left->buf + i)) + 2, rh = ((double *)(right->buf + i))[2];\ + ALGO;\ + lh = ((double *)(left->buf + i)) + 3, rh = ((double *)(right->buf + i))[3];\ + ALGO;\ + }\ + } +LIST_OPERATORS +#undef X + +static process_func +get_lf_process(const char *operation) +{ +#define X(NAME, ALGO)\ + if (!strcmp(operation, #NAME)) return process_lf_##NAME; +LIST_OPERATORS +#undef X + eprintf("algorithm not recognised: %s\n", operation); + return NULL; +} + +int +main(int argc, char *argv[]) +{ + struct stream left, right; + process_func process = NULL; + + ENOFLAGS(argc != 1); + + left.file = ""; + left.fd = STDIN_FILENO; + einit_stream(&left); + + right.file = argv[1]; + right.fd = eopen(right.file, O_RDONLY); + einit_stream(&right); + + if (!strcmp(left.pixfmt, "xyza")) + process = get_lf_process(argv[0]); + else + eprintf("pixel format %s is not supported, try xyza\n", left.pixfmt); + + process_two_streams(&left, &right, STDOUT_FILENO, "", process); + return 0; +} -- cgit v1.2.3-70-g09d2