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)
页面执行时间:4.667毫秒