RLE blitter, plus RLE encoding and decoding tools
[bootsplash] / rle / rle.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void emit(int c, int count);
5
6 int main(void)
7 {
8         int c, lastc, count;
9
10         lastc = -1;
11         count = 0;
12
13         while((c = getchar()) != -1) {
14                 if(c == lastc && count < 127) {
15                         count++;
16                 } else {
17                         emit(lastc, count);
18                         count = 1;
19                         lastc = c;
20                 }
21         }
22         emit(lastc, count);
23
24         return 0;
25 }
26
27 void emit(int c, int count)
28 {
29         if(count <= 0 || c < 0) return;
30
31         fprintf(stderr, "emit(%d, %d) -> ", c, count);
32         if(count > 2 || (c & 0x80)) {
33                 fprintf(stderr, "%02x %02x\n", (unsigned int)count | 0x80, (unsigned int)c);
34                 putchar(count | 0x80);
35                 putchar(c);
36         } else {
37                 while(count--) {
38                         fprintf(stderr, "%02x\n", (unsigned int)c & 0x7f);
39                         putchar(c);
40                 }
41         }
42 }