::: 강좌/소스/문서 :::

강좌/소스/문서 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-18 22:35:57, Hit : 6172, Vote : 1438
 [소스] CompuServe RLE Encoder

// 제  목: 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);
}





13   [컴퓨터 전공] [소스] 이진 트리(Binary Tree)  김영대 2004/06/18 9785 1823
12   [컴퓨터 전공] [소스] MASM 간단한 계산기 어셈블리 프로그램 소스  김영대 2003/07/11 9635 1505
11   [컴퓨터 전공] [소스] Top-down parsing by Recursive-Descent 을 이용한 계산기 MASM 어셈블리 생성기  김영대 2003/07/11 7482 1603
10   [컴퓨터 전공] [소스] Huffman Code Encoder  김영대 2003/03/18 7818 1503
9   [컴퓨터 전공] [소스] Windows RLE(BMP) Encoder  김영대 2003/03/18 7511 1326
  [컴퓨터 전공] [소스] CompuServe RLE Encoder  김영대 2003/03/18 6172 1438
7   [컴퓨터 전공] [소스] 계산기를 위한 Lex & Yacc  김영대 2003/03/15 9807 1599
6   [컴퓨터 전공] [소스] ANSI-C 파서를 위한 Lex & Yacc  김영대 2003/03/13 8645 1931
5   [컴퓨터 전공] [소스] PL/0 Compiler 구현  김영대 2003/03/13 7436 1693
4   [컴퓨터 전공] [소스] Recursive-Descent 파싱을 이용한 계산기 구현  김영대 2003/03/13 10277 1613
3   [컴퓨터 전공] [소스] POSIX thread를 사용한 행렬계산  김영대 2003/03/13 7357 1510
2   [컴퓨터 전공] [소스] 0/1 배낭 문제(Knapsack Problem)  김영대 2003/03/13 9028 1601
1   [컴퓨터 전공] [소스] SIC/XE 어셈블러 구현  김영대 2003/03/13 18546 1858

1
 

Copyright 1999-2017 Zeroboard / skin by zero