X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=bootsplash;a=blobdiff_plain;f=rle%2Frle.c;fp=rle%2Frle.c;h=4acb24c7ad612dc8a72521f3868f6606e88dcb4d;hp=0000000000000000000000000000000000000000;hb=5731d2abe8e8c4b838f8d1b0eefdc25754f6ad78;hpb=2438014abcc5a367e917a8be9210eb393a676ccb diff --git a/rle/rle.c b/rle/rle.c new file mode 100644 index 0000000..4acb24c --- /dev/null +++ b/rle/rle.c @@ -0,0 +1,42 @@ +#include +#include + +void emit(int c, int count); + +int main(void) +{ + int c, lastc, count; + + lastc = -1; + count = 0; + + while((c = getchar()) != -1) { + if(c == lastc && count < 127) { + count++; + } else { + emit(lastc, count); + count = 1; + lastc = c; + } + } + emit(lastc, count); + + return 0; +} + +void emit(int c, int count) +{ + if(count <= 0 || c < 0) return; + + fprintf(stderr, "emit(%d, %d) -> ", c, count); + if(count > 2 || (c & 0x80)) { + fprintf(stderr, "%02x %02x\n", (unsigned int)count | 0x80, (unsigned int)c); + putchar(count | 0x80); + putchar(c); + } else { + while(count--) { + fprintf(stderr, "%02x\n", (unsigned int)c & 0x7f); + putchar(c); + } + } +}