ign="justify"> ======== Функція запису =========
============================== */putbits (int data, int nbits) p>
{int bitcounter = 0; int outdata = 0; bit, error; <<= (16-nbits); (; nbits> 0; nbits -)
{(bitcounter == 8)
{= 0; = putc (outdata, second_file); (error == EOF)
{("Error writing to Second file."); -5;
}
} <<= 1; = (data & 0x8000)? 1:0; + = bit; + +; <<= 1;
}
}
/* ==============================
====== Функція Архівування =====
============================== */compress_stud ()
{stat buf; char * position, * pointer;// байт у файлі, байт в буфереi, dist, offset = 0, last = NO, cnt, maxleng; ("Compress started." ;);
// Записуємо розмір початкового файлу
fstat (fileno (first_file), & buf);
fileleng = buf.st_size; (fileno (second_file), & fileleng, sizeof (long));
// Читаємо файл у буфер по частинах розміру TEXTSIZE ((srcleng = fread (srcstart + offset, 1, TEXTSIZE, first_file))> 0)
{(srcleng
{= YES;
} = srcstart; = srcbuf; + = offset; (srcleng> 0)
{(" n nStep -% d n", srcleng); = 0; ((last == NO) && (srcleng
{(srcbuf, pointer, DICSIZE + (int) srcleng); = (int) srcleng;;
} (i = DICSIZE-1; i> = 0; i -)// Шукаємо найдовшу збігається рядок у словнику
{(cnt = 0; cnt
{= DICSIZE-1-i;// позиція = STRMAX;// довжина;
} (cnt> maxleng)// Якщо черговий рядок довший вже знайдених, зберігає її довжину і позицію
{= DICSIZE-1-i;// позиція = cnt;// довжина
}
} ((last == YES) && (maxleng> srcleng))// Перевіряємо, щоб не було виходу за межі файлу
{= (int) srcleng;// обрізаємо довжину по кордон буфера
} (maxleng> THRESHOLD)// Якщо рядок досить довга, формуємо pointer-код
{("link! n"); (1,1);// позначаємо як посилання (dist, DICBITS);// записуємо позицію (maxleng-THRESHOLD-1, STRBITS); // записуємо довжину + = maxleng; = maxleng; + = maxleng;
}// Інакше - chr-код
{("Cha...