blind-decompress.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-decompress.c (1318B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include "common.h"
            3 
            4 USAGE("")
            5 
            6 int
            7 main(int argc, char *argv[])
            8 {
            9         struct stream stream;
           10         char *buf;
           11         size_t m, fptr, sptr, same = 0, diff = 0;
           12 
           13         UNOFLAGS(argc);
           14 
           15         eopen_stream(&stream, NULL);
           16         echeck_dimensions(&stream, WIDTH | HEIGHT, NULL);
           17         fprint_stream_head(stdout, &stream);
           18         efflush(stdout, "<stdout>");
           19 
           20         buf = ecalloc(1, stream.frame_size);
           21 
           22         fptr = 0;
           23         do {
           24                 sptr = 0;
           25         again:
           26                 while (same) {
           27                         m = MIN(same, stream.frame_size - fptr);
           28                         ewriteall(STDOUT_FILENO, buf + fptr, m, "<stdout>");
           29                         fptr = (fptr + m) % stream.frame_size;
           30                         same -= m;
           31                 }
           32 
           33                 while (diff && sptr < stream.ptr) {
           34                         m = MIN(diff, stream.frame_size - fptr);
           35                         m = MIN(m, stream.ptr - sptr);
           36                         memcpy(buf + fptr, stream.buf + sptr, m);
           37                         ewriteall(STDOUT_FILENO, buf + fptr, m, "<stdout>");
           38                         fptr = (fptr + m) % stream.frame_size;
           39                         diff -= m;
           40                         sptr += m;
           41                 }
           42 
           43                 if (diff || sptr + 2 * sizeof(size_t) > stream.ptr) {
           44                         memmove(stream.buf, stream.buf + sptr, stream.ptr -= sptr);
           45                 } else {
           46                         same = ((size_t *)(stream.buf + sptr))[0];
           47                         diff = ((size_t *)(stream.buf + sptr))[1];
           48                         sptr += 2 * sizeof(size_t);
           49                         goto again;
           50                 }
           51         } while (eread_stream(&stream, SIZE_MAX));
           52 
           53         free(buf);
           54         if (same || diff)
           55                 eprintf("<stdin>: corrupt input\n");
           56         return 0;
           57 }