aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-interleave.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-06-02 21:30:19 +0200
committerMattias Andrée <maandree@kth.se>2017-06-02 21:30:19 +0200
commit4751eda976c09f2409e93364b6b76fdc950bcda6 (patch)
treeaba66f2cf647882953d54e98a2edf9df83317af0 /src/blind-interleave.c
parentAdd blind-disperse, blind-split-rows, and blind-split-cols (diff)
downloadblind-4751eda976c09f2409e93364b6b76fdc950bcda6.tar.gz
blind-4751eda976c09f2409e93364b6b76fdc950bcda6.tar.bz2
blind-4751eda976c09f2409e93364b6b76fdc950bcda6.tar.xz
Add blind-interleave, blind-cat-rows, and blind-cat-cols
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--src/blind-interleave.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/blind-interleave.c b/src/blind-interleave.c
new file mode 100644
index 0000000..bc3bcac
--- /dev/null
+++ b/src/blind-interleave.c
@@ -0,0 +1,44 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("(file frames) ...")
+
+int
+main(int argc, char *argv[])
+{
+ struct stream *streams;
+ size_t parts, length = 0, *frames, i;
+
+ UNOFLAGS(argc % 2 || !argc);
+
+ parts = (size_t)argc / 2;
+ streams = emalloc2(parts, sizeof(*streams));
+ frames = alloca(parts * sizeof(*frames));
+
+ for (i = 0; i < parts; i++) {
+ eopen_stream(streams + i, argv[i * 2]);
+ frames[i] = etozu_arg("frames", argv[i * 2 + 1], 1, SIZE_MAX);
+ if (i)
+ echeck_compat(streams, streams + i);
+ }
+ for (i = 0; i < parts; i++) {
+ if (!streams[i].frames || streams[i].frames > SIZE_MAX - length) {
+ length = 0;
+ break;
+ }
+ length += streams[i].frames;
+ }
+
+ streams->frames = length;
+ fprint_stream_head(stdout, streams);
+ efflush(stdout, "<stdout>");
+
+ for (i = 0; i < parts; i++, i = i == parts ? 0 : i)
+ if (esend_frames(streams + i, STDOUT_FILENO, frames[i], "<stdout>") != frames[i])
+ break;
+ for (i = 0; i < parts; i++)
+ close(streams[i].fd);
+
+ free(streams);
+ return 0;
+}