// Á¦ ¸ñ: CompuServe RLE Encoder
// ÀÛ¼ºÀÚ: ±è¿µ´ë ( http://www.howto.pe.kr )
#include <stdio.h>
#include <fcntl.h>
main(int argc, char **argv) {
int ifd, ofd, i, j, rl, bk, fo;
char buffer[4];
if (argc != 4) {
fprintf(stderr, "»ç¿ë¹ý: %s [-e/-d] source targetn", argv[0]);
exit(1);
}
if (strcmp(argv[1], "-e") == 0) { // encode
if ((ifd = open(argv[2], O_RDONLY)) < 0) {
fprintf(stderr, "%s ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ùn", argv[2]);
exit(1);
}
if ((ofd = creat(argv[3], 0644)) < 0) {
fprintf(stderr, "%s ÆÄÀÏÀ» ¸¸µé ¼ö ¾ø½À´Ï´Ùn", argv[3]);
exit(1);
}
// header <ESC><G><H>
buffer[0] = 0x1B;
buffer[1] = 0x47;
buffer[2] = 0x48;
write(ofd, buffer, 3);
rl = 0;
while (1) {
bk = 32+rl; // rl Àº ÀÌÀüÀÇ look ahead
rl = 0;
fo = 32;
while (read(ifd, buffer, 1) > 0) {
if (buffer[0] == '0') {
if (fo > 32) { // bk, fo ÇѽÖÀÌ ÀÌ¹Ì ¸¸µé¾îÁü
rl = 1; // look ahead À̹ǷΠ´ÙÀ½¿¡ °¡»êÇϱâ À§ÇØ Ç¥½ÃÇØµÒ
break;
}
bk++;
if (bk == 126)
break;
} else if (buffer[0] == '1') {
fo++;
if (fo == 126)
break;
}
}
if (bk == 32 && fo == 32)
break;
write(ofd, &bk, 1); // background(black)ÀÇ Run Length
write(ofd, &fo, 1); // foreground(while)ÀÇ Run Length
}
// end of RLE <ESC><G><H> or <BEL><ESC><G><N>
buffer[0] = 0x07;
buffer[1] = 0x1B;
buffer[2] = 0x47;
buffer[3] = 0x4E;
write(ofd, buffer, 4);
} else if (strcmp(argv[1], "-d") == 0) { // decode
if ((ifd = open(argv[2], O_RDONLY)) < 0) {
fprintf(stderr, "%s ÆÄÀÏÀ» ÀÐÀ» ¼ö ¾ø½À´Ï´Ùn", argv[2]);
exit(1);
}
if ((ofd = creat(argv[3], 0644)) < 0) {
fprintf(stderr, "%s ÆÄÀÏÀ» ¸¸µé ¼ö ¾ø½À´Ï´Ùn", argv[3]);
exit(1);
}
read(ifd, buffer, 3); // header <ESC><G><H>
if (buffer[0] != 0x1B ||
buffer[1] != 0x47 ||
buffer[2] != 0x48) {
fprintf(stderr, "%s ÆÄÀÏÀº RLE ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ùn", argv[1]);
exit(1);
}
while (read(ifd, buffer, 2) > 0) {
if ((buffer[0] == 0x07 && buffer[1] == 0x1B) ||
(buffer[0] == 0x1B && buffer[1] == 0x47))
break;
for (i=0; i <= 1; i++) {
rl = buffer[i] - 32; // 0x20
for (j=1; j <= rl; j++)
if (i)
write(ofd, "1", 1); // foreground(while)
else
write(ofd, "0", 1); // background(black)
}
}
} else {
fprintf(stderr, "¿É¼ÇÀº -e: encoding ¶Ç´Â -d:decoding ÀÔ´Ï´Ùn");
exit(1);
}
close(ifd);
close(ofd);
}
|
|