blind-flop.c - blind - suckless command-line video editing utility
 (HTM) git clone git://git.suckless.org/blind
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       blind-flop.c (1097B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include "common.h"
            3 
            4 USAGE("")
            5 
            6 static struct stream stream;
            7 static char *buf, *image;
            8 static size_t n, m, ps;
            9 
           10 #define PROCESS(TYPE)\
           11         do {\
           12                 size_t i, j;\
           13                 for (i = 0; i < ps; i++)\
           14                         for (j = 0; j < n; j += ps)\
           15                                 ((TYPE *)image)[m - j + i] = ((TYPE *)buf)[i + j];\
           16         } while (0)
           17 
           18 static void process_long(void) {PROCESS(long);}
           19 static void process_char(void) {PROCESS(char);}
           20 
           21 int
           22 main(int argc, char *argv[])
           23 {
           24         void (*process)(void) = process_char;
           25 
           26         UNOFLAGS(argc);
           27 
           28         eopen_stream(&stream, NULL);
           29         echeck_dimensions(&stream, WIDTH, NULL);
           30         fprint_stream_head(stdout, &stream);
           31         efflush(stdout, "<stdout>");
           32         buf   = emalloc(stream.row_size);
           33         image = emalloc(stream.row_size);
           34 
           35         m = (n = stream.row_size) - (ps = stream.pixel_size);
           36         if (!(stream.pixel_size % sizeof(long))) {
           37                 process = process_long;
           38                 m  /= sizeof(long);
           39                 n  /= sizeof(long);
           40                 ps /= sizeof(long);
           41         }
           42 
           43         while (eread_row(&stream, buf)) {
           44                 process();
           45                 ewriteall(STDOUT_FILENO, image, stream.row_size, "<stdout>");
           46         }
           47 
           48         free(buf);
           49         free(image);
           50         return 0;
           51 }