mirror of
https://github.com/Hizenberg469/Compression-Algorithm.git
synced 2026-04-20 02:12:26 +03:00
179 lines
3.3 KiB
C
179 lines
3.3 KiB
C
#ifdef _MSC_VER
|
|
#define _CRT_SECURE_NO_WARNINGS
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "bitio.h"
|
|
#include "errhand.h"
|
|
|
|
#define PACIFIER_COUNT 2047
|
|
|
|
BIT_FILE* OpenOutputBitFile(char* name) {
|
|
|
|
BIT_FILE* bit_file;
|
|
bit_file = (BIT_FILE*)calloc(1, sizeof(BIT_FILE));
|
|
if (bit_file == NULL)
|
|
return bit_file;
|
|
|
|
bit_file->file = fopen(name, "wb");
|
|
bit_file->rack = 0;
|
|
bit_file->mask = 0x80;
|
|
bit_file->pacifier_counter = 0;
|
|
return bit_file;
|
|
|
|
}
|
|
|
|
BIT_FILE* OpenInputBitFile(char* name) {
|
|
|
|
BIT_FILE* bit_file;
|
|
bit_file = (BIT_FILE*)calloc(1, sizeof(BIT_FILE));
|
|
if (bit_file == NULL)
|
|
return bit_file;
|
|
|
|
bit_file->file = fopen(name, "rb");
|
|
bit_file->rack = 0;
|
|
bit_file->mask = 0x80;
|
|
bit_file->pacifier_counter = 0;
|
|
return bit_file;
|
|
|
|
}
|
|
|
|
void CloseOutputBitFile(BIT_FILE* bit_file) {
|
|
|
|
if (bit_file->mask != 0x80) {
|
|
if (putc(bit_file->rack, bit_file->file) != bit_file->rack)
|
|
fatal_error("Fatal error in CloseBitFile!\n");
|
|
}
|
|
|
|
fclose(bit_file->file);
|
|
free((char*)bit_file);
|
|
|
|
}
|
|
|
|
void CloseInputBitFile(BIT_FILE* bit_file) {
|
|
|
|
fclose(bit_file->file);
|
|
free((char*)bit_file);
|
|
|
|
}
|
|
|
|
void OutputBit(BIT_FILE* bit_file, int bit) {
|
|
|
|
if (bit) {
|
|
bit_file->rack |= bit_file->mask;
|
|
}
|
|
|
|
bit_file->mask >>= 1;
|
|
|
|
if (bit_file->mask == 0) {
|
|
if (putc(bit_file->rack, bit_file->file) != bit_file->rack) {
|
|
fatal_error("Fatal error in OutputBit!\n");
|
|
}
|
|
else if ((bit_file->pacifier_counter++ & PACIFIER_COUNT) == 0) {
|
|
putc('.', stdout);
|
|
}
|
|
bit_file->rack = 0;
|
|
bit_file->mask = 0x80;
|
|
}
|
|
|
|
}
|
|
|
|
void OutputBits(BIT_FILE* bit_file, unsigned long code, int count) {
|
|
|
|
unsigned long mask;
|
|
|
|
mask = 1L << (count - 1);
|
|
|
|
while (mask != 0) {
|
|
if (mask & code) {
|
|
bit_file->rack |= bit_file->mask;
|
|
}
|
|
|
|
bit_file->mask >>= 1;
|
|
|
|
if (bit_file->mask == 0) {
|
|
if (putc(bit_file->rack, bit_file->file) != bit_file->rack) {
|
|
fatal_error("Fatal error in OuputBit!\n");
|
|
}
|
|
else if ((bit_file->pacifier_counter++ & PACIFIER_COUNT) == 0) {
|
|
putc('.', stdout);
|
|
}
|
|
|
|
bit_file->rack = 0;
|
|
bit_file->mask = 0x80;
|
|
}
|
|
|
|
mask >>= 1;
|
|
}
|
|
}
|
|
|
|
int InputBit(BIT_FILE* bit_file) {
|
|
|
|
int value;
|
|
|
|
if (bit_file->mask == 0x80) {
|
|
bit_file->rack = getc(bit_file->file);
|
|
if (bit_file->rack == EOF) {
|
|
fatal_error("Fatal error in InputBit!\n");
|
|
}
|
|
|
|
if ((bit_file->pacifier_counter++ & PACIFIER_COUNT) == 0) {
|
|
putc('.', stdout);
|
|
}
|
|
}
|
|
|
|
value = bit_file->rack & bit_file->mask;
|
|
bit_file->mask >>= 1;
|
|
if (bit_file->mask == 0) {
|
|
bit_file->mask = 0x80;
|
|
}
|
|
|
|
return value ? 1 : 0;
|
|
}
|
|
|
|
unsigned long InputBits(BIT_FILE* bit_file, int bit_count) {
|
|
|
|
unsigned long mask;
|
|
unsigned long return_value;
|
|
|
|
mask = 1L << (bit_count - 1);
|
|
return_value = 0;
|
|
|
|
while (mask != 0) {
|
|
if (bit_file->mask == 0x80) {
|
|
bit_file->rack = getc(bit_file->file);
|
|
if (bit_file->rack == EOF)
|
|
fatal_error("Fatal error in InputBits!\n");
|
|
|
|
if ((bit_file->pacifier_counter++ & PACIFIER_COUNT) == 0)
|
|
putc('.', stdout);
|
|
}
|
|
|
|
if (bit_file->rack & bit_file->mask)
|
|
return_value |= mask;
|
|
|
|
mask >>= 1;
|
|
bit_file->mask >>= 1;
|
|
if (bit_file->mask == 0)
|
|
bit_file->mask = 0x80;
|
|
}
|
|
|
|
return return_value;
|
|
}
|
|
|
|
|
|
void FilePrintBinary(FILE* file, unsigned int code, int bits) {
|
|
|
|
unsigned int mask;
|
|
mask = 1 << (bits - 1);
|
|
while (mask != 0) {
|
|
if (code & mask)
|
|
fputc('1', file);
|
|
else
|
|
fputc('0', file);
|
|
|
|
mask >>= 1;
|
|
}
|
|
}
|