OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [or1ksim/] [or1ksim-0.4.0rc2/] [testsuite/] [test-code-or1k/] [mycompress/] [mycompress.c] - Diff between revs 90 and 128

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 90 Rev 128
/* mycompress.c. Test of Or1ksim compression program
/* mycompress.c. Test of Or1ksim compression program
 
 
   Copyright (C) 1999-2006 OpenCores
   Copyright (C) 1999-2006 OpenCores
   Copyright (C) 2010 Embecosm Limited
   Copyright (C) 2010 Embecosm Limited
 
 
   Contributors various OpenCores participants
   Contributors various OpenCores participants
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
   Contributor Jeremy Bennett <jeremy.bennett@embecosm.com>
 
 
   This file is part of OpenRISC 1000 Architectural Simulator.
   This file is part of OpenRISC 1000 Architectural Simulator.
 
 
   This program is free software; you can redistribute it and/or modify it
   This program is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by the Free
   under the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3 of the License, or (at your option)
   Software Foundation; either version 3 of the License, or (at your option)
   any later version.
   any later version.
 
 
   This program is distributed in the hope that it will be useful, but WITHOUT
   This program is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.
   more details.
 
 
   You should have received a copy of the GNU General Public License along
   You should have received a copy of the GNU General Public License along
   with this program.  If not, see <http:  www.gnu.org/licenses/>.  */
   with this program.  If not, see <http:  www.gnu.org/licenses/>.  */
 
 
/* ----------------------------------------------------------------------------
/* ----------------------------------------------------------------------------
   This code is commented throughout for use with Doxygen.
   This code is commented throughout for use with Doxygen.
   --------------------------------------------------------------------------*/
   --------------------------------------------------------------------------*/
 
 
#include <stdarg.h>
#include <stdarg.h>
#include "support.h"
#include "support.h"
 
 
#define BYTES_TO_COMPRESS 1000
#define BYTES_TO_COMPRESS 1000
 
 
/*
/*
 * Compress - data compression program
 * Compress - data compression program
 */
 */
#define min(a,b)        ((a>b) ? b : a)
#define min(a,b)        ((a>b) ? b : a)
 
 
/*
/*
 * machine variants which require cc -Dmachine:  pdp11, z8000, pcxt
 * machine variants which require cc -Dmachine:  pdp11, z8000, pcxt
 */
 */
 
 
/*
/*
 * Set USERMEM to the maximum amount of physical user memory available
 * Set USERMEM to the maximum amount of physical user memory available
 * in bytes.  USERMEM is used to determine the maximum BITS that can be used
 * in bytes.  USERMEM is used to determine the maximum BITS that can be used
 * for compression.
 * for compression.
 *
 *
 * SACREDMEM is the amount of physical memory saved for others; compress
 * SACREDMEM is the amount of physical memory saved for others; compress
 * will hog the rest.
 * will hog the rest.
 */
 */
#ifndef SACREDMEM
#ifndef SACREDMEM
#define SACREDMEM       0
#define SACREDMEM       0
#endif
#endif
 
 
/* #ifndef USERMEM */
/* #ifndef USERMEM */
#define USERMEM         60000   /* default user memory */
#define USERMEM         60000   /* default user memory */
/* #endif */
/* #endif */
 
 
#ifdef interdata                /* (Perkin-Elmer) */
#ifdef interdata                /* (Perkin-Elmer) */
#define SIGNED_COMPARE_SLOW     /* signed compare is slower than unsigned */
#define SIGNED_COMPARE_SLOW     /* signed compare is slower than unsigned */
#endif
#endif
 
 
#ifdef USERMEM
#ifdef USERMEM
# if USERMEM >= (433484+SACREDMEM)
# if USERMEM >= (433484+SACREDMEM)
#  define PBITS 16
#  define PBITS 16
# else
# else
#  if USERMEM >= (229600+SACREDMEM)
#  if USERMEM >= (229600+SACREDMEM)
#   define PBITS        15
#   define PBITS        15
#  else
#  else
#   if USERMEM >= (127536+SACREDMEM)
#   if USERMEM >= (127536+SACREDMEM)
#    define PBITS       14
#    define PBITS       14
#   else
#   else
#    if USERMEM >= (73464+SACREDMEM)
#    if USERMEM >= (73464+SACREDMEM)
#     define PBITS      13
#     define PBITS      13
#    else
#    else
#     define PBITS      12
#     define PBITS      12
#    endif
#    endif
#   endif
#   endif
#  endif
#  endif
# endif
# endif
# undef USERMEM
# undef USERMEM
#endif /* USERMEM */
#endif /* USERMEM */
 
 
#ifdef PBITS            /* Preferred BITS for this memory size */
#ifdef PBITS            /* Preferred BITS for this memory size */
# ifndef BITS
# ifndef BITS
#  define BITS PBITS
#  define BITS PBITS
# endif /* BITS */
# endif /* BITS */
#endif /* PBITS */
#endif /* PBITS */
 
 
#if BITS == 16
#if BITS == 16
# define HSIZE  69001           /* 95% occupancy */
# define HSIZE  69001           /* 95% occupancy */
#endif
#endif
#if BITS == 15
#if BITS == 15
# define HSIZE  35023           /* 94% occupancy */
# define HSIZE  35023           /* 94% occupancy */
#endif
#endif
#if BITS == 14
#if BITS == 14
# define HSIZE  18013           /* 91% occupancy */
# define HSIZE  18013           /* 91% occupancy */
#endif
#endif
#if BITS == 13
#if BITS == 13
# define HSIZE  9001            /* 91% occupancy */
# define HSIZE  9001            /* 91% occupancy */
#endif
#endif
#if BITS <= 12
#if BITS <= 12
# define HSIZE  5003            /* 80% occupancy */
# define HSIZE  5003            /* 80% occupancy */
#endif
#endif
 
 
/*
/*
 * a code_int must be able to hold 2**BITS values of type int, and also -1
 * a code_int must be able to hold 2**BITS values of type int, and also -1
 */
 */
#if BITS > 15
#if BITS > 15
typedef long int        code_int;
typedef long int        code_int;
#else
#else
typedef int             code_int;
typedef int             code_int;
#endif
#endif
 
 
#ifdef SIGNED_COMPARE_SLOW
#ifdef SIGNED_COMPARE_SLOW
typedef unsigned long int count_int;
typedef unsigned long int count_int;
typedef unsigned short int count_short;
typedef unsigned short int count_short;
#else
#else
typedef long int          count_int;
typedef long int          count_int;
#endif
#endif
 
 
#ifdef NO_UCHAR
#ifdef NO_UCHAR
 typedef char   char_type;
 typedef char   char_type;
#else
#else
 typedef        unsigned char   char_type;
 typedef        unsigned char   char_type;
#endif /* UCHAR */
#endif /* UCHAR */
char_type magic_header[] = { "\037\235" };      /* 1F 9D */
char_type magic_header[] = { "\037\235" };      /* 1F 9D */
 
 
/* Defines for third byte of header */
/* Defines for third byte of header */
#define BIT_MASK        0x1f
#define BIT_MASK        0x1f
#define BLOCK_MASK      0x80
#define BLOCK_MASK      0x80
/* Masks 0x40 and 0x20 are free.  I think 0x20 should mean that there is
/* Masks 0x40 and 0x20 are free.  I think 0x20 should mean that there is
   a fourth header byte (for expansion).
   a fourth header byte (for expansion).
*/
*/
#define INIT_BITS 9                     /* initial number of bits/code */
#define INIT_BITS 9                     /* initial number of bits/code */
 
 
/*
/*
 * compress.c - File compression ala IEEE Computer, June 1984.
 * compress.c - File compression ala IEEE Computer, June 1984.
 *
 *
 * Authors:     Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
 * Authors:     Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
 *              Jim McKie               (decvax!mcvax!jim)
 *              Jim McKie               (decvax!mcvax!jim)
 *              Steve Davies            (decvax!vax135!petsd!peora!srd)
 *              Steve Davies            (decvax!vax135!petsd!peora!srd)
 *              Ken Turkowski           (decvax!decwrl!turtlevax!ken)
 *              Ken Turkowski           (decvax!decwrl!turtlevax!ken)
 *              James A. Woods          (decvax!ihnp4!ames!jaw)
 *              James A. Woods          (decvax!ihnp4!ames!jaw)
 *              Joe Orost               (decvax!vax135!petsd!joe)
 *              Joe Orost               (decvax!vax135!petsd!joe)
 *
 *
 */
 */
 
 
#if i386
#if i386
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <ctype.h>
#include <ctype.h>
#include <signal.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/stat.h>
#endif
#endif
 
 
#define ARGVAL() (*++(*argv) || (--argc && *++argv))
#define ARGVAL() (*++(*argv) || (--argc && *++argv))
 
 
int n_bits;                             /* number of bits/code */
int n_bits;                             /* number of bits/code */
int maxbits = BITS;                     /* user settable max # bits/code */
int maxbits = BITS;                     /* user settable max # bits/code */
code_int maxcode;                       /* maximum code, given n_bits */
code_int maxcode;                       /* maximum code, given n_bits */
code_int maxmaxcode = 1L << BITS;       /* should NEVER generate this code */
code_int maxmaxcode = 1L << BITS;       /* should NEVER generate this code */
#ifdef COMPATIBLE               /* But wrong! */
#ifdef COMPATIBLE               /* But wrong! */
# define MAXCODE(n_bits)        (1L << (n_bits) - 1)
# define MAXCODE(n_bits)        (1L << (n_bits) - 1)
#else
#else
# define MAXCODE(n_bits)        ((1L << (n_bits)) - 1)
# define MAXCODE(n_bits)        ((1L << (n_bits)) - 1)
#endif /* COMPATIBLE */
#endif /* COMPATIBLE */
 
 
# ifdef sel
# ifdef sel
/* support gould base register problems */
/* support gould base register problems */
/*NOBASE*/
/*NOBASE*/
count_int htab [HSIZE];
count_int htab [HSIZE];
unsigned short codetab [HSIZE];
unsigned short codetab [HSIZE];
/*NOBASE*/
/*NOBASE*/
# else /* !gould */
# else /* !gould */
count_int htab [HSIZE];
count_int htab [HSIZE];
unsigned short codetab [HSIZE];
unsigned short codetab [HSIZE];
# endif /* !gould */
# endif /* !gould */
#define htabof(i)       htab[i]
#define htabof(i)       htab[i]
#define codetabof(i)    codetab[i]
#define codetabof(i)    codetab[i]
code_int hsize = HSIZE;                 /* for dynamic table sizing */
code_int hsize = HSIZE;                 /* for dynamic table sizing */
count_int fsize;
count_int fsize;
 
 
/*
/*
 * To save much memory, we overlay the table used by compress() with those
 * To save much memory, we overlay the table used by compress() with those
 * used by decompress().  The tab_prefix table is the same size and type
 * used by decompress().  The tab_prefix table is the same size and type
 * as the codetab.  The tab_suffix table needs 2**BITS characters.  We
 * as the codetab.  The tab_suffix table needs 2**BITS characters.  We
 * get this from the beginning of htab.  The output stack uses the rest
 * get this from the beginning of htab.  The output stack uses the rest
 * of htab, and contains characters.  There is plenty of room for any
 * of htab, and contains characters.  There is plenty of room for any
 * possible stack (stack used to be 8000 characters).
 * possible stack (stack used to be 8000 characters).
 */
 */
 
 
#define tab_prefixof(i) codetabof(i)
#define tab_prefixof(i) codetabof(i)
#ifdef XENIX_16
#ifdef XENIX_16
# define tab_suffixof(i)        ((char_type *)htab[(i)>>15])[(i) & 0x7fff]
# define tab_suffixof(i)        ((char_type *)htab[(i)>>15])[(i) & 0x7fff]
# define de_stack               ((char_type *)(htab2))
# define de_stack               ((char_type *)(htab2))
#else   /* Normal machine */
#else   /* Normal machine */
# define tab_suffixof(i)        ((char_type *)(htab))[i]
# define tab_suffixof(i)        ((char_type *)(htab))[i]
# define de_stack               ((char_type *)&tab_suffixof(1<<BITS))
# define de_stack               ((char_type *)&tab_suffixof(1<<BITS))
#endif  /* XENIX_16 */
#endif  /* XENIX_16 */
 
 
code_int free_ent = 0;                   /* first unused entry */
code_int free_ent = 0;                   /* first unused entry */
int exit_stat = 0;
int exit_stat = 0;
 
 
code_int getcode();
code_int getcode();
 
 
int nomagic = 0; /* Use a 3-byte magic number header, unless old file */
int nomagic = 0; /* Use a 3-byte magic number header, unless old file */
int zcat_flg = 0;        /* Write output on stdout, suppress messages */
int zcat_flg = 0;        /* Write output on stdout, suppress messages */
int quiet = 1;          /* don't tell me about compression */
int quiet = 1;          /* don't tell me about compression */
 
 
/*
/*
 * block compression parameters -- after all codes are used up,
 * block compression parameters -- after all codes are used up,
 * and compression rate changes, start over.
 * and compression rate changes, start over.
 */
 */
int block_compress = BLOCK_MASK;
int block_compress = BLOCK_MASK;
int clear_flg = 0;
int clear_flg = 0;
long int ratio = 0;
long int ratio = 0;
#define CHECK_GAP 10000 /* ratio check interval */
#define CHECK_GAP 10000 /* ratio check interval */
count_int checkpoint = CHECK_GAP;
count_int checkpoint = CHECK_GAP;
/*
/*
 * the next two codes should not be changed lightly, as they must not
 * the next two codes should not be changed lightly, as they must not
 * lie within the contiguous general code space.
 * lie within the contiguous general code space.
 */
 */
#define FIRST   257     /* first free entry */
#define FIRST   257     /* first free entry */
#define CLEAR   256     /* table clear output code */
#define CLEAR   256     /* table clear output code */
 
 
int force = 0;
int force = 0;
char ofname [100];
char ofname [100];
int (*bgnd_flag)();
int (*bgnd_flag)();
 
 
/* reset code table */
/* reset code table */
void cl_hash(register count_int hsize);
void cl_hash(register count_int hsize);
/* table clear for block compress */
/* table clear for block compress */
void cl_block ();
void cl_block ();
void output(code_int  code);
void output(code_int  code);
 
 
 
 
int do_decomp = 0;
int do_decomp = 0;
 
 
static int offset;
static int offset;
long int in_count = 1;                  /* length of input */
long int in_count = 1;                  /* length of input */
long int bytes_out;                     /* length of compressed output */
long int bytes_out;                     /* length of compressed output */
long int out_count = 0;                  /* # of codes output (for debugging) */
long int out_count = 0;                  /* # of codes output (for debugging) */
 
 
/*
/*
 * compress stdin to stdout
 * compress stdin to stdout
 *
 *
 * Algorithm:  use open addressing double hashing (no chaining) on the
 * Algorithm:  use open addressing double hashing (no chaining) on the
 * prefix code / next character combination.  We do a variant of Knuth's
 * prefix code / next character combination.  We do a variant of Knuth's
 * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
 * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
 * secondary probe.  Here, the modular division first probe is gives way
 * secondary probe.  Here, the modular division first probe is gives way
 * to a faster exclusive-or manipulation.  Also do block compression with
 * to a faster exclusive-or manipulation.  Also do block compression with
 * an adaptive reset, whereby the code table is cleared when the compression
 * an adaptive reset, whereby the code table is cleared when the compression
 * ratio decreases, but after the table fills.  The variable-length output
 * ratio decreases, but after the table fills.  The variable-length output
 * codes are re-sized at this point, and a special CLEAR code is generated
 * codes are re-sized at this point, and a special CLEAR code is generated
 * for the decompressor.  Late addition:  construct the table according to
 * for the decompressor.  Late addition:  construct the table according to
 * file size for noticeable speed improvement on small files.  Please direct
 * file size for noticeable speed improvement on small files.  Please direct
 * questions about this implementation to ames!jaw.
 * questions about this implementation to ames!jaw.
 */
 */
 
 
int main() {
int main() {
    register long fcode;
    register long fcode;
    register code_int i = 0;
    register code_int i = 0;
    register int c;
    register int c;
    register code_int ent;
    register code_int ent;
#ifdef XENIX_16
#ifdef XENIX_16
    register code_int disp;
    register code_int disp;
#else   /* Normal machine */
#else   /* Normal machine */
    register int disp;
    register int disp;
#endif
#endif
    register code_int hsize_reg;
    register code_int hsize_reg;
    register int hshift;
    register int hshift;
 
 
#ifndef COMPATIBLE
#ifndef COMPATIBLE
    if (nomagic == 0) {
    if (nomagic == 0) {
        /* putchar(magic_header[0]); putchar(magic_header[1]);
        /* putchar(magic_header[0]); putchar(magic_header[1]);
        putchar((char)(maxbits | block_compress)); */
        putchar((char)(maxbits | block_compress)); */
    }
    }
#endif /* COMPATIBLE */
#endif /* COMPATIBLE */
 
 
    offset = 0;
    offset = 0;
    bytes_out = 3;              /* includes 3-byte header mojo */
    bytes_out = 3;              /* includes 3-byte header mojo */
    out_count = 0;
    out_count = 0;
    clear_flg = 0;
    clear_flg = 0;
    ratio = 0;
    ratio = 0;
    in_count = 1;
    in_count = 1;
 
 
    printf("main: bytes_out %d... hsize %d\n", (int)bytes_out, (int)hsize);
    printf("main: bytes_out %d... hsize %d\n", (int)bytes_out, (int)hsize);
 
 
    checkpoint = CHECK_GAP;
    checkpoint = CHECK_GAP;
    maxcode = MAXCODE(n_bits = INIT_BITS);
    maxcode = MAXCODE(n_bits = INIT_BITS);
    free_ent = ((block_compress) ? FIRST : 256 );
    free_ent = ((block_compress) ? FIRST : 256 );
 
 
 
 
    ent = '\0'; /* getchar (); */
    ent = '\0'; /* getchar (); */
 
 
    hshift = 0;
    hshift = 0;
    for ( fcode = (long) hsize;  fcode < 65536L; fcode *= 2L )
    for ( fcode = (long) hsize;  fcode < 65536L; fcode *= 2L )
        hshift++;
        hshift++;
    hshift = 8 - hshift;                /* set hash code range bound */
    hshift = 8 - hshift;                /* set hash code range bound */
    printf("main: hshift %d...\n", hshift);
    printf("main: hshift %d...\n", hshift);
 
 
    hsize_reg = hsize;
    hsize_reg = hsize;
    cl_hash( (count_int) hsize_reg);            /* clear hash table */
    cl_hash( (count_int) hsize_reg);            /* clear hash table */
 
 
/*#ifdef SIGNED_COMPARE_SLOW
/*#ifdef SIGNED_COMPARE_SLOW
    while ( (c = getchar()) != (unsigned) EOF ) {
    while ( (c = getchar()) != (unsigned) EOF ) {
#else
#else
    while ( (c = getchar()) != EOF ) {
    while ( (c = getchar()) != EOF ) {
#endif*/
#endif*/
    printf("main: bytes_out %d...\n", (int)bytes_out);
    printf("main: bytes_out %d...\n", (int)bytes_out);
    printf("main: hsize_reg %d...\n", (int)hsize_reg);
    printf("main: hsize_reg %d...\n", (int)hsize_reg);
    printf("main: before compress %d...\n", (int)in_count);
    printf("main: before compress %d...\n", (int)in_count);
    while (in_count < BYTES_TO_COMPRESS) {
    while (in_count < BYTES_TO_COMPRESS) {
        c = in_count % 255;
        c = in_count % 255;
 
 
        printf("main: compressing %d...\n", (int)in_count);
        printf("main: compressing %d...\n", (int)in_count);
        in_count++;
        in_count++;
        fcode = (long) (((long) c << maxbits) + ent);
        fcode = (long) (((long) c << maxbits) + ent);
        i = (((long)c << hshift) ^ ent);        /* xor hashing */
        i = (((long)c << hshift) ^ ent);        /* xor hashing */
 
 
        if ( htabof (i) == fcode ) {
        if ( htabof (i) == fcode ) {
            ent = codetabof (i);
            ent = codetabof (i);
            continue;
            continue;
        } else if ( (long)htabof (i) < 0 )       /* empty slot */
        } else if ( (long)htabof (i) < 0 )       /* empty slot */
            goto nomatch;
            goto nomatch;
 
 
        disp = hsize_reg - i;           /* secondary hash (after G. Knott) */
        disp = hsize_reg - i;           /* secondary hash (after G. Knott) */
        if ( i == 0 )
        if ( i == 0 )
            disp = 1;
            disp = 1;
probe:
probe:
        if ( (i -= disp) < 0 )
        if ( (i -= disp) < 0 )
            i += hsize_reg;
            i += hsize_reg;
 
 
        if ( htabof (i) == fcode ) {
        if ( htabof (i) == fcode ) {
            ent = codetabof (i);
            ent = codetabof (i);
            continue;
            continue;
        }
        }
        if ( (long)htabof (i) > 0 )
        if ( (long)htabof (i) > 0 )
            goto probe;
            goto probe;
nomatch:
nomatch:
        output ( (code_int) ent );
        output ( (code_int) ent );
        out_count++;
        out_count++;
        ent = c;
        ent = c;
#ifdef SIGNED_COMPARE_SLOW
#ifdef SIGNED_COMPARE_SLOW
        if ( (unsigned) free_ent < (unsigned) maxmaxcode) {
        if ( (unsigned) free_ent < (unsigned) maxmaxcode) {
#else
#else
        if ( free_ent < maxmaxcode ) {
        if ( free_ent < maxmaxcode ) {
#endif
#endif
            codetabof (i) = free_ent++; /* code -> hashtable */
            codetabof (i) = free_ent++; /* code -> hashtable */
            htabof (i) = fcode;
            htabof (i) = fcode;
        }
        }
        else if ( (count_int)in_count >= checkpoint && block_compress )
        else if ( (count_int)in_count >= checkpoint && block_compress )
            cl_block ();
            cl_block ();
    }
    }
    /*
    /*
     * Put out the final code.
     * Put out the final code.
     */
     */
    printf("main: output...\n");
    printf("main: output...\n");
    output( (code_int)ent );
    output( (code_int)ent );
    out_count++;
    out_count++;
    output( (code_int)-1 );
    output( (code_int)-1 );
 
 
    if(bytes_out > in_count)    /* exit(2) if no savings */
    if(bytes_out > in_count)    /* exit(2) if no savings */
        exit_stat = 2;
        exit_stat = 2;
    printf("main: end...\n");
    printf("main: end...\n");
    report (0xdeaddead);
    report (0xdeaddead);
    return 0;
    return 0;
}
}
 
 
/*****************************************************************
/*****************************************************************
 * TAG( output )
 * TAG( output )
 *
 *
 * Output the given code.
 * Output the given code.
 * Inputs:
 * Inputs:
 *      code:   A n_bits-bit integer.  If == -1, then EOF.  This assumes
 *      code:   A n_bits-bit integer.  If == -1, then EOF.  This assumes
 *              that n_bits =< (long)wordsize - 1.
 *              that n_bits =< (long)wordsize - 1.
 * Outputs:
 * Outputs:
 *      Outputs code to the file.
 *      Outputs code to the file.
 * Assumptions:
 * Assumptions:
 *      Chars are 8 bits long.
 *      Chars are 8 bits long.
 * Algorithm:
 * Algorithm:
 *      Maintain a BITS character long buffer (so that 8 codes will
 *      Maintain a BITS character long buffer (so that 8 codes will
 * fit in it exactly).  Use the VAX insv instruction to insert each
 * fit in it exactly).  Use the VAX insv instruction to insert each
 * code in turn.  When the buffer fills up empty it and start over.
 * code in turn.  When the buffer fills up empty it and start over.
 */
 */
 
 
static char buf[BITS];
static char buf[BITS];
 
 
#ifndef vax
#ifndef vax
char_type lmask[9] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
char_type lmask[9] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
char_type rmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
char_type rmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
#endif /* vax */
#endif /* vax */
 
 
void output( code )
void output( code )
code_int  code;
code_int  code;
{
{
 
 
    /*
    /*
     * On the VAX, it is important to have the register declarations
     * On the VAX, it is important to have the register declarations
     * in exactly the order given, or the asm will break.
     * in exactly the order given, or the asm will break.
     */
     */
    register int r_off = offset, bits= n_bits;
    register int r_off = offset, bits= n_bits;
    register char * bp = buf;
    register char * bp = buf;
 
 
    if ( code >= 0 ) {
    if ( code >= 0 ) {
#ifdef vax
#ifdef vax
        /* VAX DEPENDENT!! Implementation on other machines is below.
        /* VAX DEPENDENT!! Implementation on other machines is below.
         *
         *
         * Translation: Insert BITS bits from the argument starting at
         * Translation: Insert BITS bits from the argument starting at
         * offset bits from the beginning of buf.
         * offset bits from the beginning of buf.
         */
         */
        0;       /* Work around for pcc -O bug with asm and if stmt */
        0;       /* Work around for pcc -O bug with asm and if stmt */
        asm( "insv      4(ap),r11,r10,(r9)" );
        asm( "insv      4(ap),r11,r10,(r9)" );
#else /* not a vax */
#else /* not a vax */
/*
/*
 * byte/bit numbering on the VAX is simulated by the following code
 * byte/bit numbering on the VAX is simulated by the following code
 */
 */
        /*
        /*
         * Get to the first byte.
         * Get to the first byte.
         */
         */
        bp += (r_off >> 3);
        bp += (r_off >> 3);
        r_off &= 7;
        r_off &= 7;
        /*
        /*
         * Since code is always >= 8 bits, only need to mask the first
         * Since code is always >= 8 bits, only need to mask the first
         * hunk on the left.
         * hunk on the left.
         */
         */
        *bp = (*bp & rmask[r_off]) | ((code << r_off) & lmask[r_off]);
        *bp = (*bp & rmask[r_off]) | ((code << r_off) & lmask[r_off]);
        bp++;
        bp++;
        bits -= (8 - r_off);
        bits -= (8 - r_off);
        code >>= 8 - r_off;
        code >>= 8 - r_off;
        /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
        /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
        if ( bits >= 8 ) {
        if ( bits >= 8 ) {
            *bp++ = code;
            *bp++ = code;
            code >>= 8;
            code >>= 8;
            bits -= 8;
            bits -= 8;
        }
        }
        /* Last bits. */
        /* Last bits. */
        if(bits)
        if(bits)
            *bp = code;
            *bp = code;
#endif /* vax */
#endif /* vax */
        offset += n_bits;
        offset += n_bits;
        if ( offset == (n_bits << 3) ) {
        if ( offset == (n_bits << 3) ) {
            bp = buf;
            bp = buf;
            bits = n_bits;
            bits = n_bits;
            bytes_out += bits;
            bytes_out += bits;
        /*    do
        /*    do
                putchar(*bp++); */
                putchar(*bp++); */
            while(--bits);
            while(--bits);
            offset = 0;
            offset = 0;
        }
        }
 
 
        /*
        /*
         * If the next entry is going to be too big for the code size,
         * If the next entry is going to be too big for the code size,
         * then increase it, if possible.
         * then increase it, if possible.
         */
         */
        if ( free_ent > maxcode || (clear_flg > 0))
        if ( free_ent > maxcode || (clear_flg > 0))
        {
        {
            /*
            /*
             * Write the whole buffer, because the input side won't
             * Write the whole buffer, because the input side won't
             * discover the size increase until after it has read it.
             * discover the size increase until after it has read it.
             */
             */
            if ( offset > 0 ) {
            if ( offset > 0 ) {
                /* if( fwrite( buf, 1, n_bits, stdout ) != n_bits)
                /* if( fwrite( buf, 1, n_bits, stdout ) != n_bits)
                        writeerr(); */
                        writeerr(); */
                bytes_out += n_bits;
                bytes_out += n_bits;
            }
            }
            offset = 0;
            offset = 0;
 
 
            if ( clear_flg ) {
            if ( clear_flg ) {
                maxcode = MAXCODE (n_bits = INIT_BITS);
                maxcode = MAXCODE (n_bits = INIT_BITS);
                clear_flg = 0;
                clear_flg = 0;
            }
            }
            else {
            else {
                n_bits++;
                n_bits++;
                if ( n_bits == maxbits )
                if ( n_bits == maxbits )
                    maxcode = maxmaxcode;
                    maxcode = maxmaxcode;
                else
                else
                    maxcode = MAXCODE(n_bits);
                    maxcode = MAXCODE(n_bits);
            }
            }
        }
        }
    } else {
    } else {
        /*
        /*
         * At EOF, write the rest of the buffer.
         * At EOF, write the rest of the buffer.
         */
         */
        /* if ( offset > 0 )
        /* if ( offset > 0 )
            fwrite( buf, 1, (offset + 7) / 8, stdout ); */
            fwrite( buf, 1, (offset + 7) / 8, stdout ); */
        bytes_out += (offset + 7) / 8;
        bytes_out += (offset + 7) / 8;
        offset = 0;
        offset = 0;
        /* fflush( stdout ); */
        /* fflush( stdout ); */
        /* if( ferror( stdout ) )
        /* if( ferror( stdout ) )
                writeerr(); */
                writeerr(); */
    }
    }
}
}
 
 
/*
/*
 * Decompress stdin to stdout.  This routine adapts to the codes in the
 * Decompress stdin to stdout.  This routine adapts to the codes in the
 * file building the "string" table on-the-fly; requiring no table to
 * file building the "string" table on-the-fly; requiring no table to
 * be stored in the compressed file.  The tables used herein are shared
 * be stored in the compressed file.  The tables used herein are shared
 * with those of the compress() routine.  See the definitions above.
 * with those of the compress() routine.  See the definitions above.
 */
 */
 
 
void decompress() {
void decompress() {
    register char_type *stackp;
    register char_type *stackp;
    register int finchar;
    register int finchar;
    register code_int code, oldcode, incode;
    register code_int code, oldcode, incode;
 
 
    /*
    /*
     * As above, initialize the first 256 entries in the table.
     * As above, initialize the first 256 entries in the table.
     */
     */
    maxcode = MAXCODE(n_bits = INIT_BITS);
    maxcode = MAXCODE(n_bits = INIT_BITS);
    for ( code = 255; code >= 0; code-- ) {
    for ( code = 255; code >= 0; code-- ) {
        tab_prefixof(code) = 0;
        tab_prefixof(code) = 0;
        tab_suffixof(code) = (char_type)code;
        tab_suffixof(code) = (char_type)code;
    }
    }
    free_ent = ((block_compress) ? FIRST : 256 );
    free_ent = ((block_compress) ? FIRST : 256 );
 
 
    finchar = oldcode = getcode();
    finchar = oldcode = getcode();
    if(oldcode == -1)   /* EOF already? */
    if(oldcode == -1)   /* EOF already? */
        return;                 /* Get out of here */
        return;                 /* Get out of here */
 /*   putchar( (char)finchar ); */      /* first code must be 8 bits = char */
 /*   putchar( (char)finchar ); */      /* first code must be 8 bits = char */
   /* if(ferror(stdout))
   /* if(ferror(stdout))
        writeerr(); */
        writeerr(); */
    stackp = de_stack;
    stackp = de_stack;
 
 
    while ( (code = getcode()) > -1 ) {
    while ( (code = getcode()) > -1 ) {
 
 
        if ( (code == CLEAR) && block_compress ) {
        if ( (code == CLEAR) && block_compress ) {
            for ( code = 255; code >= 0; code-- )
            for ( code = 255; code >= 0; code-- )
                tab_prefixof(code) = 0;
                tab_prefixof(code) = 0;
            clear_flg = 1;
            clear_flg = 1;
            free_ent = FIRST - 1;
            free_ent = FIRST - 1;
            if ( (code = getcode ()) == -1 )    /* O, untimely death! */
            if ( (code = getcode ()) == -1 )    /* O, untimely death! */
                break;
                break;
        }
        }
        incode = code;
        incode = code;
        /*
        /*
         * Special case for KwKwK string.
         * Special case for KwKwK string.
         */
         */
        if ( code >= free_ent ) {
        if ( code >= free_ent ) {
            *stackp++ = finchar;
            *stackp++ = finchar;
            code = oldcode;
            code = oldcode;
        }
        }
 
 
        /*
        /*
         * Generate output characters in reverse order
         * Generate output characters in reverse order
         */
         */
#ifdef SIGNED_COMPARE_SLOW
#ifdef SIGNED_COMPARE_SLOW
        while ( ((unsigned long)code) >= ((unsigned long)256) ) {
        while ( ((unsigned long)code) >= ((unsigned long)256) ) {
#else
#else
        while ( code >= 256 ) {
        while ( code >= 256 ) {
#endif
#endif
            *stackp++ = tab_suffixof(code);
            *stackp++ = tab_suffixof(code);
            code = tab_prefixof(code);
            code = tab_prefixof(code);
        }
        }
        *stackp++ = finchar = tab_suffixof(code);
        *stackp++ = finchar = tab_suffixof(code);
 
 
        /*
        /*
         * And put them out in forward order
         * And put them out in forward order
         */
         */
        /* do
        /* do
            putchar ( *--stackp );
            putchar ( *--stackp );
        while ( stackp > de_stack );*/
        while ( stackp > de_stack );*/
 
 
        /*
        /*
         * Generate the new entry.
         * Generate the new entry.
         */
         */
        if ( (code=free_ent) < maxmaxcode ) {
        if ( (code=free_ent) < maxmaxcode ) {
            tab_prefixof(code) = (unsigned short)oldcode;
            tab_prefixof(code) = (unsigned short)oldcode;
            tab_suffixof(code) = finchar;
            tab_suffixof(code) = finchar;
            free_ent = code+1;
            free_ent = code+1;
        }
        }
        /*
        /*
         * Remember previous code.
         * Remember previous code.
         */
         */
        oldcode = incode;
        oldcode = incode;
    }
    }
  /*  fflush( stdout ); */
  /*  fflush( stdout ); */
   /* if(ferror(stdout))
   /* if(ferror(stdout))
        writeerr(); */
        writeerr(); */
}
}
 
 
/*****************************************************************
/*****************************************************************
 * TAG( getcode )
 * TAG( getcode )
 *
 *
 * Read one code from the standard input.  If EOF, return -1.
 * Read one code from the standard input.  If EOF, return -1.
 * Inputs:
 * Inputs:
 *      stdin
 *      stdin
 * Outputs:
 * Outputs:
 *      code or -1 is returned.
 *      code or -1 is returned.
 */
 */
 
 
code_int
code_int
getcode() {
getcode() {
    /*
    /*
     * On the VAX, it is important to have the register declarations
     * On the VAX, it is important to have the register declarations
     * in exactly the order given, or the asm will break.
     * in exactly the order given, or the asm will break.
     */
     */
    register code_int code;
    register code_int code;
    static int offset = 0, size = 0;
    static int offset = 0, size = 0;
    static char_type buf[BITS];
    static char_type buf[BITS];
    register int r_off, bits;
    register int r_off, bits;
    register char_type *bp = buf;
    register char_type *bp = buf;
 
 
    if ( clear_flg > 0 || offset >= size || free_ent > maxcode ) {
    if ( clear_flg > 0 || offset >= size || free_ent > maxcode ) {
        /*
        /*
         * If the next entry will be too big for the current code
         * If the next entry will be too big for the current code
         * size, then we must increase the size.  This implies reading
         * size, then we must increase the size.  This implies reading
         * a new buffer full, too.
         * a new buffer full, too.
         */
         */
        if ( free_ent > maxcode ) {
        if ( free_ent > maxcode ) {
            n_bits++;
            n_bits++;
            if ( n_bits == maxbits )
            if ( n_bits == maxbits )
                maxcode = maxmaxcode;   /* won't get any bigger now */
                maxcode = maxmaxcode;   /* won't get any bigger now */
            else
            else
                maxcode = MAXCODE(n_bits);
                maxcode = MAXCODE(n_bits);
        }
        }
        if ( clear_flg > 0) {
        if ( clear_flg > 0) {
            maxcode = MAXCODE (n_bits = INIT_BITS);
            maxcode = MAXCODE (n_bits = INIT_BITS);
            clear_flg = 0;
            clear_flg = 0;
        }
        }
        /* size = fread( buf, 1, n_bits, stdin ); */
        /* size = fread( buf, 1, n_bits, stdin ); */
        if ( size <= 0 )
        if ( size <= 0 )
            return -1;                  /* end of file */
            return -1;                  /* end of file */
        offset = 0;
        offset = 0;
        /* Round size down to integral number of codes */
        /* Round size down to integral number of codes */
        size = (size << 3) - (n_bits - 1);
        size = (size << 3) - (n_bits - 1);
    }
    }
    r_off = offset;
    r_off = offset;
    bits = n_bits;
    bits = n_bits;
#ifdef vax
#ifdef vax
    asm( "extzv   r10,r9,(r8),r11" );
    asm( "extzv   r10,r9,(r8),r11" );
#else /* not a vax */
#else /* not a vax */
        /*
        /*
         * Get to the first byte.
         * Get to the first byte.
         */
         */
        bp += (r_off >> 3);
        bp += (r_off >> 3);
        r_off &= 7;
        r_off &= 7;
        /* Get first part (low order bits) */
        /* Get first part (low order bits) */
#ifdef NO_UCHAR
#ifdef NO_UCHAR
        code = ((*bp++ >> r_off) & rmask[8 - r_off]) & 0xff;
        code = ((*bp++ >> r_off) & rmask[8 - r_off]) & 0xff;
#else
#else
        code = (*bp++ >> r_off);
        code = (*bp++ >> r_off);
#endif /* NO_UCHAR */
#endif /* NO_UCHAR */
        bits -= (8 - r_off);
        bits -= (8 - r_off);
        r_off = 8 - r_off;              /* now, offset into code word */
        r_off = 8 - r_off;              /* now, offset into code word */
        /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
        /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
        if ( bits >= 8 ) {
        if ( bits >= 8 ) {
#ifdef NO_UCHAR
#ifdef NO_UCHAR
            code |= (*bp++ & 0xff) << r_off;
            code |= (*bp++ & 0xff) << r_off;
#else
#else
            code |= *bp++ << r_off;
            code |= *bp++ << r_off;
#endif /* NO_UCHAR */
#endif /* NO_UCHAR */
            r_off += 8;
            r_off += 8;
            bits -= 8;
            bits -= 8;
        }
        }
        /* high order bits. */
        /* high order bits. */
        code |= (*bp & rmask[bits]) << r_off;
        code |= (*bp & rmask[bits]) << r_off;
#endif /* vax */
#endif /* vax */
    offset += n_bits;
    offset += n_bits;
 
 
    return code;
    return code;
}
}
 
 
/* For those who don't have it in libc.a */
/* For those who don't have it in libc.a */
char *
char *
rindex(const char *s,
rindex(const char *s,
       int c)
       int c)
{
{
        const char *p;
        const char *p;
        for (p = NULL; *s; s++)
        for (p = NULL; *s; s++)
            if (*s == c)
            if (*s == c)
                p = s;
                p = s;
        return((char *)p);
        return((char *)p);
}
}
 
 
/*
/*
writeerr()
writeerr()
{
{
    perror ( ofname );
    perror ( ofname );
    unlink ( ofname );
    unlink ( ofname );
    exit ( 1 );
    exit ( 1 );
}
}
*/
*/
void cl_block ()                /* table clear for block compress */
void cl_block ()                /* table clear for block compress */
{
{
    register long int rat;
    register long int rat;
 
 
    checkpoint = in_count + CHECK_GAP;
    checkpoint = in_count + CHECK_GAP;
 
 
    if(in_count > 0x007fffff) { /* shift will overflow */
    if(in_count > 0x007fffff) { /* shift will overflow */
        rat = bytes_out >> 8;
        rat = bytes_out >> 8;
        if(rat == 0) {           /* Don't divide by zero */
        if(rat == 0) {           /* Don't divide by zero */
            rat = 0x7fffffff;
            rat = 0x7fffffff;
        } else {
        } else {
            rat = in_count / rat;
            rat = in_count / rat;
        }
        }
    } else {
    } else {
        rat = (in_count << 8) / bytes_out;      /* 8 fractional bits */
        rat = (in_count << 8) / bytes_out;      /* 8 fractional bits */
    }
    }
    if ( rat > ratio ) {
    if ( rat > ratio ) {
        ratio = rat;
        ratio = rat;
    } else {
    } else {
        ratio = 0;
        ratio = 0;
        cl_hash ( (count_int) hsize );
        cl_hash ( (count_int) hsize );
        free_ent = FIRST;
        free_ent = FIRST;
        clear_flg = 1;
        clear_flg = 1;
        output ( (code_int) CLEAR );
        output ( (code_int) CLEAR );
    }
    }
}
}
 
 
void cl_hash(hsize)             /* reset code table */
void cl_hash(hsize)             /* reset code table */
        register count_int hsize;
        register count_int hsize;
{
{
#ifndef XENIX_16        /* Normal machine */
#ifndef XENIX_16        /* Normal machine */
        register count_int *htab_p = htab+hsize;
        register count_int *htab_p = htab+hsize;
#else
#else
        register j;
        register j;
        register long k = hsize;
        register long k = hsize;
        register count_int *htab_p;
        register count_int *htab_p;
#endif
#endif
        register long i;
        register long i;
        register long m1 = -1;
        register long m1 = -1;
 
 
#ifdef XENIX_16
#ifdef XENIX_16
    for(j=0; j<=8 && k>=0; j++,k-=8192) {
    for(j=0; j<=8 && k>=0; j++,k-=8192) {
        i = 8192;
        i = 8192;
        if(k < 8192) {
        if(k < 8192) {
                i = k;
                i = k;
        }
        }
        htab_p = &(htab[j][i]);
        htab_p = &(htab[j][i]);
        i -= 16;
        i -= 16;
        if(i > 0) {
        if(i > 0) {
#else
#else
        i = hsize - 16;
        i = hsize - 16;
#endif
#endif
        do {                            /* might use Sys V memset(3) here */
        do {                            /* might use Sys V memset(3) here */
                *(htab_p-16) = m1;
                *(htab_p-16) = m1;
                *(htab_p-15) = m1;
                *(htab_p-15) = m1;
                *(htab_p-14) = m1;
                *(htab_p-14) = m1;
                *(htab_p-13) = m1;
                *(htab_p-13) = m1;
                *(htab_p-12) = m1;
                *(htab_p-12) = m1;
                *(htab_p-11) = m1;
                *(htab_p-11) = m1;
                *(htab_p-10) = m1;
                *(htab_p-10) = m1;
                *(htab_p-9) = m1;
                *(htab_p-9) = m1;
                *(htab_p-8) = m1;
                *(htab_p-8) = m1;
                *(htab_p-7) = m1;
                *(htab_p-7) = m1;
                *(htab_p-6) = m1;
                *(htab_p-6) = m1;
                *(htab_p-5) = m1;
                *(htab_p-5) = m1;
                *(htab_p-4) = m1;
                *(htab_p-4) = m1;
                *(htab_p-3) = m1;
                *(htab_p-3) = m1;
                *(htab_p-2) = m1;
                *(htab_p-2) = m1;
                *(htab_p-1) = m1;
                *(htab_p-1) = m1;
                htab_p -= 16;
                htab_p -= 16;
        } while ((i -= 16) >= 0);
        } while ((i -= 16) >= 0);
#ifdef XENIX_16
#ifdef XENIX_16
        }
        }
    }
    }
#endif
#endif
        for ( i += 16; i > 0; i-- )
        for ( i += 16; i > 0; i-- )
                *--htab_p = m1;
                *--htab_p = m1;
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.