?? bitio.c
字號:
/************************** Start of BITIO.C ************************* * * This utility file contains all of the routines needed to impement * bit oriented routines under either ANSI or K&R C. It needs to be * linked with every program used in the entire book. * */#include <stdio.h>#include <stdlib.h>#include "bitio.h"#include "errhand.h"#define PACIFIER_COUNT 2047BIT_FILE *OpenOutputBitFile( name )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( name )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 *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 *bit_file;{ fclose( bit_file->file ); free( (char *) bit_file );}void OutputBit( bit_file, bit )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, code, count )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 OutputBit!\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 *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_count )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 InputBit!\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, code, bits )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; }}/*************************** End of BITIO.C **************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -