#ifdef _MSC_VER #define _CRT_SECURE_NO_WARNINGS #endif #include #include #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; } }