Хотя наш алгоритм работает чудесно, но он довольно ограничен в
своих возможностях, так как может декомпрессировать только непосредственно на экран. Поскольку цикл while находится в функции, то
ограничения на время декомпрессии один шаг за цикл. Например, предположим вы хотите работать декомпрессором как фильтром (в стиле UNIX),
и пропускаете текст для декомпрессии один символ за цикл времени к
анализатору:
сжатый текст -> Декомп > Анализ. > лексемы
фильтр симв.
Это сделает наш декомпрессор весьма гибким и переносимым. Как мы
можем изменить наш алгоритм, написанный на Си?
Чтобы алгоритм на Си сделать более гибким необходимо воспользоваться возможностями ООП. Сперва дополним нашу функцию decomp() локальными переменными, и поместим их в структуру. Эта структура будет
также содержать указатель на строку, которую необходимо декомпрессировать, и длину этой строки:
typedef struct {
> int srclen, c, rcnt; <
> unsigned char *p;
} decompressor;
void decomp(unsigned char *s, int srclen)
{ ----------
int | c, rcnt; |
----------
...
}
Примечание:
Теперь попробуем расщепить нашу функцию decomp() на две части:
функцию инициализации и функцию возвращающую следующий символ, с автоматическим включением его в процесс декомпрессии. Далее передадим
указателю структуру, которую мы только что определили. Эта структура проинициализирована нашей функцией инициализации и хранит информацию, которая необходима нам между каждым вызовом функции.
Сначала опишем функцию инициализации:
void decompressor_init(decompressor* dc, unsigned char* s, int len)
{
dc->p = s; /* Место сжатия строки */
dc->srclen = len; /* Инициализация переменной содержащей длину */
dc->rcnt = 0; /* Обнуление счетчика длины строки */
}