reman3/Rayman_X/cpa/tempgrp/CMP/PC/CMP_File.c

157 lines
4.2 KiB
C

#include <stdio.h>
#include <malloc.h>
#include "CMP_CPA.h"
#include "ErmCmp.h"
#include "CMP_File.h"
/**************************************************************************/
/*#define PACIFIER*/
#define PACIFIER_COUNT 2047
/**************************************************************************/
tdstBitFile *CMP_fn_p_stOpenOutputBitFile( char *name )
{
tdstBitFile *bit_file=NULL;
FILE *file=NULL;
if ((file = fopen( name, "wb" ))!=NULL)
{
bit_file = (tdstBitFile *) calloc( 1, sizeof( tdstBitFile ) );
if ( bit_file == NULL )
return( bit_file );
bit_file->file = file;
bit_file->rack = 0;
bit_file->mask = 0x80;
bit_file->pacifier_counter = 0;
}
return( bit_file );
}
/**************************************************************************/
tdstBitFile *CMP_fn_p_stOpenInputBitFile( char *name )
{
tdstBitFile *bit_file=NULL;
FILE *file=NULL;
if ((file = fopen( name, "rb" ))!=NULL)
{
bit_file = (tdstBitFile *) calloc( 1, sizeof( tdstBitFile ) );
if ( bit_file == NULL )
return( bit_file );
bit_file->file = file;
bit_file->rack = 0;
bit_file->mask = 0x80;
bit_file->pacifier_counter = 0;
}
return( bit_file );
}
/**************************************************************************/
void CMP_fn_vCloseOutputBitFile( tdstBitFile *bit_file )
{
if ( bit_file->mask != 0x80 )
if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )
M_CMPFatalError(E_uwCMPCloseFileError);
fclose( bit_file->file );
free( (char *) bit_file );
}
/**************************************************************************/
void CMP_fn_vCloseInputBitFile( tdstBitFile *bit_file )
{
fclose( bit_file->file );
free( (char *) bit_file );
}
/**************************************************************************/
void CMP_fn_vOutputBit( tdstBitFile *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 )
M_CMPFatalError(E_uwCMPOutputBitError);
#ifdef PACIFIER
else if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
putc( '.', stdout );
#endif /* PACIFIER */
bit_file->rack = 0;
bit_file->mask = 0x80;
}
}
/**************************************************************************/
void CMP_fn_vOutputBits( tdstBitFile *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 )
M_CMPFatalError(E_uwCMPOutputBitsError);
#ifdef PACIFIER
else if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
putc( '.', stdout );
#endif
bit_file->rack = 0;
bit_file->mask = 0x80;
}
mask >>= 1;
}
}
/**************************************************************************/
long CMP_fn_lInputBit( tdstBitFile *bit_file )
{
long value;
if ( bit_file->mask == 0x80 )
{
bit_file->rack = getc( bit_file->file );
if ( bit_file->rack == EOF )
M_CMPFatalError(E_uwCMPInputBitError);
#ifdef PACIFIER
if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
putc( '.', stdout );
#endif
}
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 CMP_fn_ulInputBits( tdstBitFile *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 )
M_CMPFatalError(E_uwCMPInputBitsError);
#ifdef PACIFIER
if ( ( bit_file->pacifier_counter++ & PACIFIER_COUNT ) == 0 )
putc( '.', stdout );
#endif
}
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 );
}
/**************************************************************************/