Algorithm 版 (精华区)
发信人: lofe ()感激生活(), 信区: Algorithm
标 题: Comp -- comp-1.c
发信站: 哈工大紫丁香 (Sun Sep 3 08:32:11 2000), 转信
/*
* Listing 6 -- comp-1.c
*
* This listing is the driver program for an order 0 fixed context
* compression program. It follows the model shown in BILL.C
* for a compression program, by reading in symbols from a file,
* converting them to a high, low, range set, then encoding them.
* The order 0 modeling code for this routine is found Listing 9,
* model-1.c.
*
* To build this program:
*
* Turbo C: tcc -w comp-1.c model-1.c bitio.c coder.c
* QuickC: qcl /W3 comp-1.c model-1.c bitio.c coder.c
* Zortech: ztc comp-1.c model-1.c bitio.c coder.c
* *NIX: cc -o comp-1 comp-1.c model-1.c bitio.c coder.c
*
* Command line options:
*
* -f text_file_name [defaults to test.inp]
* -c compressed_file_name [defaults to test.cmp]
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "coder.h"
#include "model.h"
#include "bitio.h"
FILE *text_file; /* These variables are used by several */
FILE *compressed_file; /* of the modules in this routine. */
/*
* Local declarations.
*/
void initialize_options( int argc, char **argv );
void print_compression( void );
/*
* The main() procedure for this routine is very simple. After
* initializing the command line options, model, I/O, and arithmetic
* coder, it sits in a loop reading in characters from the input
* file, converting them to type SYMBOL, then encoding them for
* output. When done, everything is shut down properly.
*
*/
void main( int argc, char **argv )
{
SYMBOL s;
int c;
long int text_count = 0;
initialize_options( --argc, ++argv );
initialize_model();
initialize_output_bitstream();
initialize_arithmetic_encoder();
/*
* This is the main compression loop. It gets a character, converts
* it to SYMBOL, then encodes it. Finally, the model is updated.
* One potential portability problem: EOF is assumed to be -1.
*/
for ( ; ; )
{
if (( ++text_count & 0x0ff ) == 0 )
print_compression();
c = getc( text_file );
convert_int_to_symbol( c, &s );
encode_symbol( compressed_file, &s );
if ( c == EOF )
break;
update_model( c );
}
/*
* This is just some code that is needed to clean up loose ends before
* the program can exit.
*/
flush_arithmetic_encoder( compressed_file );
flush_output_bitstream( compressed_file );
print_compression();
fputc( '\n', stderr );
exit( 0 );
}
/*
* This routine has the job of reading in all of the command line
* options. For this program, the only options are the input file
* name and the output file name. After the names are read in,
* the files are opened.
*/
void initialize_options( int argc, char **argv )
{
char text_file_name[ 81 ];
char compressed_file_name[ 81 ];
strcpy( compressed_file_name, "test.cmp" );
strcpy( text_file_name, "test.inp" );
while ( argc-- > 0 )
{
if ( strcmp( *argv, "-f" ) == 0 )
{
argc--;
strcpy( text_file_name, *++argv );
}
else if ( strcmp( *argv, "-c" ) == 0 )
{
argc--;
strcpy( compressed_file_name, *++argv );
}
else
{
fprintf( stderr,
"\nUsage: COMP-1 [-f text file] [-c compressed file]\n" );
exit( -1 );
}
argc--;
argv++;
}
text_file = fopen( text_file_name, "rb" );
compressed_file = fopen( compressed_file_name, "wb" );
if ( text_file == NULL || compressed_file == NULL )
{
printf( "Had trouble opening one of the files!\n" );
exit( -1 );
}
setvbuf( text_file, NULL, _IOFBF, 4096 );
setbuf( stdout, NULL );
printf( "Compressing %s to %s\n", text_file_name, compressed_file_name
);
}
/*
* This routine is a "bell and whistle" type thing. It just prints
* out the current input and output byte counts, and the current number
* of bits being used per byte.
*/
void print_compression()
{
long input_bytes;
long output_bytes;
input_bytes = ftell( text_file );
if ( input_bytes == 0 )
input_bytes = 1;
output_bytes = bit_ftell_output( compressed_file );
fprintf( stderr,
"\r%ld/%ld, %2.3f ",
input_bytes,
output_bytes,
8.0 * output_bytes / input_bytes );
}
--
_____________________________
Every problem has a solution.
optooff@mail.hust.edu.cn
www.netease.com/~hansen
※ 修改:.haojs 于 Sep 3 08:29:48 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.293毫秒