001: #include <stdio.h>
002:
003: class decompressor {
004: int srclen, c, rcnt;
005: unsigned char *p;
006: public:
007: decompressor(unsigned char *s, int len);
008: int next(void);
009: };
010:
011: decompressor::decompressor(unsigned char *s, int len)
012: {
013: p = s; srclen = len; rcnt = 0;
014: }
015:
016: int decompressor::next(void)
017: {
018: if (rcnt && rcnt-- > 0) return c; // Декомпрессия
019: if (!srclen srclen-- <= 0) return -1;
020:
021: c = *p++; // Поместить следующий символ в буфер
022: if (c == 0xff) {
023: rcnt = *p++ - 1; // Отсчитать один записанный символ
024: c = *p++; // Здесь символ повторен
025: srclen -= 2;
026: }
027: return c;
028: }
029:
030: unsigned char buff[] = {'a',0xff,3,'b','c'};
031:
032: main()
033: {
034: int c;
035: decompressor dc(buff, sizeof(buff));
036:
037: while ((c = dc.next()) != -1) putchar(c);
038: return 0;
039: }