[gnu.ghostscript.bug] string comparisons

hrp@boring.cray.com (Hal Peterson) (07/26/89)

I am using GhostScript 1.3 with the patches supplied by Tony Li and
snoopy's fix to interp.c.  My platform is an 8MB Sun 3/50 running
SunOS 3.5.  I am compiling with GCC 1.35.

String comparison was not producing lexical ordering.  The function
bytes_compare() was comparing string lengths first rather than last,
which resulted in the program

    %!
    (aardvark) (zebra) gt ==

returning true, which is wrong; aardvark does not come after zebra in
the dictionary.
--
Hal Peterson			Domain:  hrp@cray.com
Cray Research			Old style:  hrp%cray.com@uc.msc.umn.edu
1440 Northland Dr.		UUCP:  uunet!cray!hrp
Mendota Hts, MN  55120  USA	Telephone:  +1 612 681 3145

========================================================================
*** iutil-DIST.c	Tue Jun 20 07:07:59 1989
--- iutil.c	Tue Jul 25 16:20:33 1989
***************
*** 107,120 ****
  int
  bytes_compare(byte *s1, uint len1, byte *s2, uint len2)
  {	register uint len = len1;
! 	if ( len != len2 ) return (len < len2 ? -1 : 1);
! 	   {	register byte *p1 = s1;
! 		register byte *p2 = s2;
! 		while ( len-- )
! 			if ( *p1++ != *p2++ )
! 				return (p1[-1] < p2[-1] ? -1 : 1);
  	   }
! 	return 0;
  }
  
  /* Compute a hash for a string */
--- 107,125 ----
  int
  bytes_compare(byte *s1, uint len1, byte *s2, uint len2)
  {	register uint len = len1;
! 	if (len > len2) len = len2;
! 	/* Compare the contents */
! 	while (len--)
! 	   {	if (*s1 < *s2) return -1;
! 		else if (*(s1++) > *(s2++)) return 1;
  	   }
! 	/* Contents are identical; try the lengths. */
! 	if (len1 > len2)
! 		return 1;
! 	else if (len1 < len2)
! 		return -1;
! 	else
! 		return 0;
  }
  
  /* Compute a hash for a string */