[comp.unix.microport] compress for uport

samperi@mancol.UUCP (Dominick Samperi) (02/18/88)

The following patches for compress 4.0 will fix it for Microport's
System V/286. All but one of the patches are John Rupley's (thanks
John!). I had to add one patch (in the form of a type cast) to fix
a problem that came up when large files were compressed (usually
resulting in a Bus error). 

To apply the patches, change directory to the directory containing
compress.c (Version 4.0, as distributed), and type:
patch < file-containing-this-article. Here patch is Larry Walls
patch program. (No need to delete the headers from this article.)


*** compress4.0/compress.c	Sun Aug  9 13:18:18 1987
--- compress.c	Thu Feb 18 08:27:17 1988
***************
*** 1,6
  /* 
   * Compress - data compression program 
   */
  #define	min(a,b)	((a>b) ? b : a)
  
  /*

--- 1,34 -----
  /* 
   * Compress - data compression program 
   */
+ 
+ /*  Changes for sysV/286 - by John Rupley 12/5/87
+ *
+ *	cc -Ml ... ( UPORT_16 is defined below, for 16 bit compress)
+ *
+ *	John's original patches did not include the cast to long
+ *       that appears on line 803 below, and this led to problems
+ *       when large files were compressed. This patch was added by
+ *       Dominick Samperi, 2/18/88.
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+ 
+ #define UPORT_16
+ 
+ #ifdef UPORT
+ #define BITS 13
+ #endif
+ 
+ #ifdef UPORT_16
+ #define BITS 16
+ #define XENIX_16
+ #define min(a,b)	(((long)a>(long)b) ? (long)b : (long)a)
+ #else
  #define	min(a,b)	((a>b) ? b : a)
  #endif
  
***************
*** 2,7
   * Compress - data compression program 
   */
  #define	min(a,b)	((a>b) ? b : a)
  
  /*
   * machine variants which require cc -Dmachine:  pdp11, z8000, pcxt

--- 30,36 -----
  #define min(a,b)	(((long)a>(long)b) ? (long)b : (long)a)
  #else
  #define	min(a,b)	((a>b) ? b : a)
+ #endif
  
  /*
   * machine variants which require cc -Dmachine:  pdp11, z8000, pcxt
***************
*** 71,76
  # endif BITS
  #endif /* PBITS */
  
  #if BITS == 16
  # define HSIZE	69001		/* 95% occupancy */
  #endif

--- 100,106 -----
  # endif BITS
  #endif /* PBITS */
  
+ 
  #if BITS == 16
  # define HSIZE	69001L		/* 95% occupancy */
  #endif
***************
*** 72,78
  #endif /* PBITS */
  
  #if BITS == 16
! # define HSIZE	69001		/* 95% occupancy */
  #endif
  #if BITS == 15
  # define HSIZE	35023		/* 94% occupancy */

--- 102,108 -----
  
  
  #if BITS == 16
! # define HSIZE	69001L		/* 95% occupancy */
  #endif
  #if BITS == 15
  # define HSIZE	35023L		/* 94% occupancy */
***************
*** 75,81
  # define HSIZE	69001		/* 95% occupancy */
  #endif
  #if BITS == 15
! # define HSIZE	35023		/* 94% occupancy */
  #endif
  #if BITS == 14
  # define HSIZE	18013		/* 91% occupancy */

--- 105,111 -----
  # define HSIZE	69001L		/* 95% occupancy */
  #endif
  #if BITS == 15
! # define HSIZE	35023L		/* 94% occupancy */
  #endif
  #if BITS == 14
  # define HSIZE	18013L		/* 91% occupancy */
***************
*** 78,84
  # define HSIZE	35023		/* 94% occupancy */
  #endif
  #if BITS == 14
! # define HSIZE	18013		/* 91% occupancy */
  #endif
  #if BITS == 13
  # define HSIZE	9001		/* 91% occupancy */

--- 108,114 -----
  # define HSIZE	35023L		/* 94% occupancy */
  #endif
  #if BITS == 14
! # define HSIZE	18013L		/* 91% occupancy */
  #endif
  #if BITS == 13
  # define HSIZE	9001L		/* 91% occupancy */
***************
*** 81,87
  # define HSIZE	18013		/* 91% occupancy */
  #endif
  #if BITS == 13
! # define HSIZE	9001		/* 91% occupancy */
  #endif
  #if BITS <= 12
  # define HSIZE	5003		/* 80% occupancy */

--- 111,117 -----
  # define HSIZE	18013L		/* 91% occupancy */
  #endif
  #if BITS == 13
! # define HSIZE	9001L		/* 91% occupancy */
  #endif
  #if BITS <= 12
  # define HSIZE	5003L		/* 80% occupancy */
***************
*** 84,90
  # define HSIZE	9001		/* 91% occupancy */
  #endif
  #if BITS <= 12
! # define HSIZE	5003		/* 80% occupancy */
  #endif
  
  #ifdef M_XENIX			/* Stupid compiler can't handle arrays with */

--- 114,120 -----
  # define HSIZE	9001L		/* 91% occupancy */
  #endif
  #if BITS <= 12
! # define HSIZE	5003L		/* 80% occupancy */
  #endif
  
  #ifdef M_XENIX			/* Stupid compiler can't handle arrays with */
***************
*** 263,269
  int n_bits;				/* number of bits/code */
  int maxbits = BITS;			/* user settable max # bits/code */
  code_int maxcode;			/* maximum code, given n_bits */
! code_int maxmaxcode = 1 << BITS;	/* should NEVER generate this code */
  #ifdef COMPATIBLE		/* But wrong! */
  # define MAXCODE(n_bits)	(1 << (n_bits) - 1)
  #else

--- 293,299 -----
  int n_bits;				/* number of bits/code */
  int maxbits = BITS;			/* user settable max # bits/code */
  code_int maxcode;			/* maximum code, given n_bits */
! code_int maxmaxcode = 1L << BITS;	/* should NEVER generate this code */
  #ifdef COMPATIBLE		/* But wrong! */
  # define MAXCODE(n_bits)	(1L << (n_bits) - 1)
  #else
***************
*** 265,271
  code_int maxcode;			/* maximum code, given n_bits */
  code_int maxmaxcode = 1 << BITS;	/* should NEVER generate this code */
  #ifdef COMPATIBLE		/* But wrong! */
! # define MAXCODE(n_bits)	(1 << (n_bits) - 1)
  #else
  # define MAXCODE(n_bits)	((1 << (n_bits)) - 1)
  #endif /* COMPATIBLE */

--- 295,301 -----
  code_int maxcode;			/* maximum code, given n_bits */
  code_int maxmaxcode = 1L << BITS;	/* should NEVER generate this code */
  #ifdef COMPATIBLE		/* But wrong! */
! # define MAXCODE(n_bits)	(1L << (n_bits) - 1)
  #else
  # define MAXCODE(n_bits)	((1L << (n_bits)) - 1)
  #endif /* COMPATIBLE */
***************
*** 267,273
  #ifdef COMPATIBLE		/* But wrong! */
  # define MAXCODE(n_bits)	(1 << (n_bits) - 1)
  #else
! # define MAXCODE(n_bits)	((1 << (n_bits)) - 1)
  #endif /* COMPATIBLE */
  
  #ifdef XENIX_16

--- 297,303 -----
  #ifdef COMPATIBLE		/* But wrong! */
  # define MAXCODE(n_bits)	(1L << (n_bits) - 1)
  #else
! # define MAXCODE(n_bits)	((1L << (n_bits)) - 1)
  #endif /* COMPATIBLE */
  
  #ifdef XENIX_16
***************
*** 279,285
  count_int htab5[8192];
  count_int htab6[8192];
  count_int htab7[8192];
! count_int htab8[HSIZE-65536];
  count_int * htab[9] = {
  	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
  

--- 309,315 -----
  count_int htab5[8192];
  count_int htab6[8192];
  count_int htab7[8192];
! count_int htab8[HSIZE-65536L];
  count_int * htab[9] = {
  	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
  
***************
*** 283,288
  count_int * htab[9] = {
  	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
  
  #define htabof(i)	(htab[(i) >> 13][(i) & 0x1fff])
  unsigned short code0tab[16384];
  unsigned short code1tab[16384];

--- 313,321 -----
  count_int * htab[9] = {
  	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
  
+ #ifdef UPORT_16
+ #define htabof(i)	(htab[((long)i) >> 13][((long)i) & 0x1fff])
+ #else
  #define htabof(i)	(htab[(i) >> 13][(i) & 0x1fff])
  #endif
  
***************
*** 284,289
  	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
  
  #define htabof(i)	(htab[(i) >> 13][(i) & 0x1fff])
  unsigned short code0tab[16384];
  unsigned short code1tab[16384];
  unsigned short code2tab[16384];

--- 317,324 -----
  #define htabof(i)	(htab[((long)i) >> 13][((long)i) & 0x1fff])
  #else
  #define htabof(i)	(htab[(i) >> 13][(i) & 0x1fff])
+ #endif
+ 
  unsigned short code0tab[16384];
  unsigned short code1tab[16384];
  unsigned short code2tab[16384];
***************
*** 292,297
  unsigned short * codetab[5] = {
  	code0tab, code1tab, code2tab, code3tab, code4tab };
  
  #define codetabof(i)	(codetab[(i) >> 14][(i) & 0x3fff])
  
  #else	/* Normal machine */

--- 327,335 -----
  unsigned short * codetab[5] = {
  	code0tab, code1tab, code2tab, code3tab, code4tab };
  
+ #ifdef UPORT_16
+ #define codetabof(i)	(codetab[((long)i) >> 14][((long)i) & 0x3fff])
+ #else
  #define codetabof(i)	(codetab[(i) >> 14][(i) & 0x3fff])
  #endif
  
***************
*** 293,298
  	code0tab, code1tab, code2tab, code3tab, code4tab };
  
  #define codetabof(i)	(codetab[(i) >> 14][(i) & 0x3fff])
  
  #else	/* Normal machine */
  count_int htab [HSIZE];

--- 331,337 -----
  #define codetabof(i)	(codetab[((long)i) >> 14][((long)i) & 0x3fff])
  #else
  #define codetabof(i)	(codetab[(i) >> 14][(i) & 0x3fff])
+ #endif
  
  #else	/* Normal machine */
  count_int htab [HSIZE];
***************
*** 314,319
  
  #define tab_prefixof(i)	codetabof(i)
  #ifdef XENIX_16
  # define tab_suffixof(i)	((char_type *)htab[(i)>>15])[(i) & 0x7fff]
  # define de_stack		((char_type *)(htab2))
  #else	/* Normal machine */

--- 353,361 -----
  
  #define tab_prefixof(i)	codetabof(i)
  #ifdef XENIX_16
+ #ifdef UPORT_16
+ #define  tab_suffixof(i)  ((char_type *)htab[((long)i)>>15])[((long)i) & 0x7fff]
+ #else
  # define tab_suffixof(i)	((char_type *)htab[(i)>>15])[(i) & 0x7fff]
  #endif
  # define de_stack		((char_type *)(htab2))
***************
*** 315,320
  #define tab_prefixof(i)	codetabof(i)
  #ifdef XENIX_16
  # define tab_suffixof(i)	((char_type *)htab[(i)>>15])[(i) & 0x7fff]
  # define de_stack		((char_type *)(htab2))
  #else	/* Normal machine */
  # define tab_suffixof(i)	((char_type *)(htab))[i]

--- 357,363 -----
  #define  tab_suffixof(i)  ((char_type *)htab[((long)i)>>15])[((long)i) & 0x7fff]
  #else
  # define tab_suffixof(i)	((char_type *)htab[(i)>>15])[(i) & 0x7fff]
+ #endif
  # define de_stack		((char_type *)(htab2))
  #else	/* Normal machine */
  # define tab_suffixof(i)	((char_type *)(htab))[i]
***************
*** 520,526
  
      if(maxbits < INIT_BITS) maxbits = INIT_BITS;
      if (maxbits > BITS) maxbits = BITS;
!     maxmaxcode = 1 << maxbits;
  
      if (*filelist != NULL) {
  	for (fileptr = filelist; *fileptr; fileptr++) {

--- 563,569 -----
  
      if(maxbits < INIT_BITS) maxbits = INIT_BITS;
      if (maxbits > BITS) maxbits = BITS;
!     maxmaxcode = 1L << maxbits;
  
      if (*filelist != NULL) {
  	for (fileptr = filelist; *fileptr; fileptr++) {
***************
*** 548,554
  		    maxbits = getchar();	/* set -b from file */
  		    block_compress = maxbits & BLOCK_MASK;
  		    maxbits &= BIT_MASK;
! 		    maxmaxcode = 1 << maxbits;
  		    if(maxbits > BITS) {
  			fprintf(stderr,
  			"%s: compressed with %d bits, can only handle %d bits\n",

--- 591,597 -----
  		    maxbits = getchar();	/* set -b from file */
  		    block_compress = maxbits & BLOCK_MASK;
  		    maxbits &= BIT_MASK;
! 		    maxmaxcode = 1L << maxbits;
  		    if(maxbits > BITS) {
  			fprintf(stderr,
  			"%s: compressed with %d bits, can only handle %d bits\n",
***************
*** 577,583
  		 * serve as upper bounds on the number of output codes. 
  		 */
  		hsize = HSIZE;
! 		if ( fsize < (1 << 12) )
  		    hsize = min ( 5003, HSIZE );
  		else if ( fsize < (1 << 13) )
  		    hsize = min ( 9001, HSIZE );

--- 620,626 -----
  		 * serve as upper bounds on the number of output codes. 
  		 */
  		hsize = HSIZE;
! 		if ( fsize < (1L << 12) )
  		    hsize = min ( 5003, HSIZE );
  		else if ( fsize < (1L << 13) )
  		    hsize = min ( 9001, HSIZE );
***************
*** 579,585
  		hsize = HSIZE;
  		if ( fsize < (1 << 12) )
  		    hsize = min ( 5003, HSIZE );
! 		else if ( fsize < (1 << 13) )
  		    hsize = min ( 9001, HSIZE );
  		else if ( fsize < (1 << 14) )
  		    hsize = min ( 18013, HSIZE );

--- 622,628 -----
  		hsize = HSIZE;
  		if ( fsize < (1L << 12) )
  		    hsize = min ( 5003, HSIZE );
! 		else if ( fsize < (1L << 13) )
  		    hsize = min ( 9001, HSIZE );
  		else if ( fsize < (1L << 14) )
  		    hsize = min ( 18013, HSIZE );
***************
*** 581,587
  		    hsize = min ( 5003, HSIZE );
  		else if ( fsize < (1 << 13) )
  		    hsize = min ( 9001, HSIZE );
! 		else if ( fsize < (1 << 14) )
  		    hsize = min ( 18013, HSIZE );
  		else if ( fsize < (1 << 15) )
  		    hsize = min ( 35023, HSIZE );

--- 624,630 -----
  		    hsize = min ( 5003, HSIZE );
  		else if ( fsize < (1L << 13) )
  		    hsize = min ( 9001, HSIZE );
! 		else if ( fsize < (1L << 14) )
  		    hsize = min ( 18013, HSIZE );
  		else if ( fsize < (1L << 15) )
  		    hsize = min ( 35023, HSIZE );
***************
*** 583,589
  		    hsize = min ( 9001, HSIZE );
  		else if ( fsize < (1 << 14) )
  		    hsize = min ( 18013, HSIZE );
! 		else if ( fsize < (1 << 15) )
  		    hsize = min ( 35023, HSIZE );
  		else if ( fsize < 47000 )
  		    hsize = min ( 50021, HSIZE );

--- 626,632 -----
  		    hsize = min ( 9001, HSIZE );
  		else if ( fsize < (1L << 14) )
  		    hsize = min ( 18013, HSIZE );
! 		else if ( fsize < (1L << 15) )
  		    hsize = min ( 35023, HSIZE );
  		else if ( fsize < 47000 )
  		    hsize = min ( 50021, HSIZE );
***************
*** 666,672
  		maxbits = getchar();	/* set -b from file */
  		block_compress = maxbits & BLOCK_MASK;
  		maxbits &= BIT_MASK;
! 		maxmaxcode = 1 << maxbits;
  		fsize = 100000;		/* assume stdin large for USERMEM */
  		if(maxbits > BITS) {
  			fprintf(stderr,

--- 709,715 -----
  		maxbits = getchar();	/* set -b from file */
  		block_compress = maxbits & BLOCK_MASK;
  		maxbits &= BIT_MASK;
! 		maxmaxcode = 1L << maxbits;
  		fsize = 100000;		/* assume stdin large for USERMEM */
  		if(maxbits > BITS) {
  			fprintf(stderr,
***************
*** 757,763
  #endif
  	in_count++;
  	fcode = (long) (((long) c << maxbits) + ent);
!  	i = ((c << hshift) ^ ent);	/* xor hashing */
  
  	if ( htabof (i) == fcode ) {
  	    ent = codetabof (i);

--- 800,807 -----
  #endif
  	in_count++;
  	fcode = (long) (((long) c << maxbits) + ent);
!  	i = (((long) c << hshift) ^ ent);	/* xor hashing */
! 	/*      ^ Rupley forgot this cast, resulting in i < 0. */	
  
  	if ( htabof (i) == fcode ) {
  	    ent = codetabof (i);
***************
*** 1177,1183
      exit( 0 );
  }
  
! code_int sorttab[1<<BITS];	/* sorted pointers into htab */
  
  dump_tab()	/* dump string table */
  {

--- 1221,1227 -----
      exit( 0 );
  }
  
! code_int sorttab[1L<<BITS];	/* sorted pointers into htab */
  
  dump_tab()	/* dump string table */
  {
***************
*** 1181,1186
  
  dump_tab()	/* dump string table */
  {
      register int i, first;
      register ent;
  #define STACK_SIZE	15000

--- 1225,1234 -----
  
  dump_tab()	/* dump string table */
  {
+ #ifdef UPORT_16
+     long i, first ;
+     long ent ;
+ #else
      register int i, first;
      register ent;
  #endif
***************
*** 1183,1188
  {
      register int i, first;
      register ent;
  #define STACK_SIZE	15000
      int stack_top = STACK_SIZE;
      register c;

--- 1231,1237 -----
  #else
      register int i, first;
      register ent;
+ #endif
  #define STACK_SIZE	15000
      int stack_top = STACK_SIZE;
      register c;
***************
*** 1202,1208
  		de_stack[--stack_top] = '"';
  		stack_top = in_stack((htabof(sorttab[i])>>maxbits)&0xff, 
                                       stack_top);
! 		for(ent=htabof(sorttab[i]) & ((1<<maxbits)-1);
  		    ent > 256;
  		    ent=htabof(sorttab[ent]) & ((1<<maxbits)-1)) {
  			stack_top = in_stack(htabof(sorttab[ent]) >> maxbits,

--- 1251,1257 -----
  		de_stack[--stack_top] = '"';
  		stack_top = in_stack((htabof(sorttab[i])>>maxbits)&0xff, 
                                       stack_top);
! 		for(ent=htabof(sorttab[i]) & ((1L<<maxbits)-1);
  		    ent > 256;
  		    ent=htabof(sorttab[ent]) & ((1L<<maxbits)-1)) {
  			stack_top = in_stack(htabof(sorttab[ent]) >> maxbits,
***************
*** 1204,1210
                                       stack_top);
  		for(ent=htabof(sorttab[i]) & ((1<<maxbits)-1);
  		    ent > 256;
! 		    ent=htabof(sorttab[ent]) & ((1<<maxbits)-1)) {
  			stack_top = in_stack(htabof(sorttab[ent]) >> maxbits,
  						stack_top);
  		}

--- 1253,1259 -----
                                       stack_top);
  		for(ent=htabof(sorttab[i]) & ((1L<<maxbits)-1);
  		    ent > 256;
! 		    ent=htabof(sorttab[ent]) & ((1L<<maxbits)-1)) {
  			stack_top = in_stack(htabof(sorttab[ent]) >> maxbits,
  						stack_top);
  		}
***************
*** 1460,1465
  version()
  {
  	fprintf(stderr, "%s\n", rcs_ident);
  	fprintf(stderr, "Options: ");
  #ifdef vax
  	fprintf(stderr, "vax, ");

--- 1509,1515 -----
  version()
  {
  	fprintf(stderr, "%s\n", rcs_ident);
+ 	fprintf(stderr, "\tModified for Microport SysV/286, 12/5/87\n") ;
  	fprintf(stderr, "Options: ");
  #ifdef vax
  	fprintf(stderr, "vax, ");
***************
*** 1471,1476
  	fprintf(stderr, "SIGNED_COMPARE_SLOW, ");
  #endif
  #ifdef XENIX_16
  	fprintf(stderr, "XENIX_16, ");
  #endif
  #ifdef COMPATIBLE

--- 1521,1529 -----
  	fprintf(stderr, "SIGNED_COMPARE_SLOW, ");
  #endif
  #ifdef XENIX_16
+ #ifdef UPORT_16
+ 	fprintf(stderr, "UPORT_16, ") ;
+ #else
  	fprintf(stderr, "XENIX_16, ");
  #endif
  #endif
***************
*** 1472,1477
  #endif
  #ifdef XENIX_16
  	fprintf(stderr, "XENIX_16, ");
  #endif
  #ifdef COMPATIBLE
  	fprintf(stderr, "COMPATIBLE, ");

--- 1525,1531 -----
  	fprintf(stderr, "UPORT_16, ") ;
  #else
  	fprintf(stderr, "XENIX_16, ");
+ #endif
  #endif
  #ifdef COMPATIBLE
  	fprintf(stderr, "COMPATIBLE, ");
-- 
Dominick Samperi, Manhattan College, NYC
    manhat!samperi@NYU.EDU           ihnp4!rutgers!nyu.edu!manhat!samperi
    philabs!cmcl2!manhat!samperi     ihnp4!rutgers!hombre!samperi
              (^ that's an ell)      uunet!swlabs!mancol!samperi