[comp.sources.sun] v01i042: Patch #1 to Calctool

mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (07/13/89)

Submitted-by: chuck@trantor.harris-atd.com (Chuck Musciano)
Posting-number: Volume 1, Issue 41
Archive-name: calctool/patch01

     This patch fixes code which causes the C compiler on 386i machines
to go into an infinite loop.  Apparently, the 386i compiler cannot handle
casting (double *) to (unsigned int) in some cases.  

     If there are any problems with this patch, please let me know, since I
do not have access to a 386i for testing purposes.

Chuck Musciano				ARPA  : chuck@trantor.harris-atd.com
Harris Corporation 			Usenet: ...!uunet!x102a!trantor!chuck
PO Box 37, MS 3A/1912			AT&T  : (407) 727-6131
Melbourne, FL 32902			FAX   : (407) 727-{5118,5227,4004}

Oh yeah, laugh now!  But when the millions start pouring in, I'll be the one
at Burger King, sucking down Whoppers at my own private table! --Al Bundy

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  patch
# Wrapped by chuck@melmac on Tue Jul 11 11:17:07 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patch' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patch'\"
else
echo shar: Extracting \"'patch'\" \(7011 characters\)
sed "s/^X//" >'patch' <<'END_OF_FILE'
X*** ops.c.orig	Tue Jul 11 10:56:04 1989
X--- ops.c	Tue Jul 11 11:07:49 1989
X***************
X*** 36,53 ****
X  
X  #define		low_order(b, x)		((((unsigned) 0xffffffff) >> (32 - (b))) & (x))
X  
X  PRIVATE	pop_op()
X  
X  {	int	i, temp;
X  
X  	if (curr_mode != SCIENTIFIC && o_stack[o_top - 1]) {
X! 	   v_stack[v_top] = (double) low_order(curr_width[index_of(curr_base)], (unsigned int) v_stack[v_top]);
X! 	   v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], (unsigned int) v_stack[v_top - 1]);
X  	   }
X  	switch (o_stack[--o_top]) {
X  	   case ADD_OP    : v_stack[v_top - 1] += v_stack[v_top];
X  	       		    break;
X! 	   case AND_OP    : temp = ((unsigned int) v_stack[v_top - 1]) & ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case DIV_OP    : v_stack[v_top - 1] /= v_stack[v_top];
X--- 36,62 ----
X  
X  #define		low_order(b, x)		((((unsigned) 0xffffffff) >> (32 - (b))) & (x))
X  
X+ /************************************************************************/
X+ /*	In the following code, the apparently extraneous assignments	*/
X+ /* to vt1 and vt2 are used to circumvent a bug in the 386i C compiler	*/
X+ /* which hangs when trying to compile code which casts a (double *) to	*/
X+ /* (unsigned int).  Sigh...						*/
X+ /************************************************************************/
X+ 
X+ PRIVATE	double	vt1, vt2;
X+ 
X  PRIVATE	pop_op()
X  
X  {	int	i, temp;
X  
X  	if (curr_mode != SCIENTIFIC && o_stack[o_top - 1]) {
X! 	   v_stack[v_top] = (double) low_order(curr_width[index_of(curr_base)], (unsigned int) (vt1 = v_stack[v_top]));
X! 	   v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], (unsigned int) (vt2 = v_stack[v_top - 1]));
X  	   }
X  	switch (o_stack[--o_top]) {
X  	   case ADD_OP    : v_stack[v_top - 1] += v_stack[v_top];
X  	       		    break;
X! 	   case AND_OP    : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) & ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case DIV_OP    : v_stack[v_top - 1] /= v_stack[v_top];
X***************
X*** 54,86 ****
X  	       		    break;
X  	   case LPAREN_OP : return;
X  	   		    break;
X! 	   case LSL_OP    : temp = ((unsigned int) v_stack[v_top - 1]) << ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case MUL_OP    : v_stack[v_top - 1] *= v_stack[v_top];
X  	       		    break;
X! 	   case OR_OP     : temp = ((unsigned int) v_stack[v_top - 1]) | ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X! 	   case ROL_OP    : for (i = (unsigned int) v_stack[v_top], temp = (unsigned int) v_stack[v_top - 1]; i; i--)
X  	   		       temp = (temp << 1) + ((((unsigned) temp) >> (curr_width[index_of(curr_base)] - 1)) & 1);
X  	   		    v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], temp);
X  	       		    break;
X  	   case ROOT_OP   : v_stack[v_top - 1] = pow(v_stack[v_top - 1], 1.0 / v_stack[v_top]);
X  	       		    break;
X! 	   case ROR_OP    : for (i = (unsigned int) v_stack[v_top], temp = (unsigned int) v_stack[v_top - 1]; i; i--)
X  	   		       temp = (((unsigned) temp) >> 1) + ((temp & 1) << (curr_width[index_of(curr_base)] - 1));
X  	   		    v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], temp);
X  	       		    break;
X! 	   case RSA_OP    : temp = ((unsigned int) v_stack[v_top - 1]) >> ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X! 	   case RSL_OP    : temp = ((unsigned int) ((unsigned int) v_stack[v_top - 1])) >> ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case SUB_OP    : v_stack[v_top - 1] -= v_stack[v_top];
X  	       		    break;
X! 	   case XOR_OP    : temp = ((unsigned int) v_stack[v_top - 1]) ^ ((unsigned int) v_stack[v_top]);
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case Y2X_OP    : v_stack[v_top - 1] = pow(v_stack[v_top - 1], v_stack[v_top]);
X--- 63,95 ----
X  	       		    break;
X  	   case LPAREN_OP : return;
X  	   		    break;
X! 	   case LSL_OP    : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) << ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case MUL_OP    : v_stack[v_top - 1] *= v_stack[v_top];
X  	       		    break;
X! 	   case OR_OP     : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) | ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X! 	   case ROL_OP    : for (i = (unsigned int) (vt1 = v_stack[v_top]), temp = (unsigned int) (vt2 = v_stack[v_top - 1]); i; i--)
X  	   		       temp = (temp << 1) + ((((unsigned) temp) >> (curr_width[index_of(curr_base)] - 1)) & 1);
X  	   		    v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], temp);
X  	       		    break;
X  	   case ROOT_OP   : v_stack[v_top - 1] = pow(v_stack[v_top - 1], 1.0 / v_stack[v_top]);
X  	       		    break;
X! 	   case ROR_OP    : for (i = (unsigned int) (vt1 = v_stack[v_top]), temp = (unsigned int) (vt2 = v_stack[v_top - 1]); i; i--)
X  	   		       temp = (((unsigned) temp) >> 1) + ((temp & 1) << (curr_width[index_of(curr_base)] - 1));
X  	   		    v_stack[v_top - 1] = (double) low_order(curr_width[index_of(curr_base)], temp);
X  	       		    break;
X! 	   case RSA_OP    : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) >> ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X! 	   case RSL_OP    : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) >> ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case SUB_OP    : v_stack[v_top - 1] -= v_stack[v_top];
X  	       		    break;
X! 	   case XOR_OP    : temp = ((unsigned int) (vt1 = v_stack[v_top - 1])) ^ ((unsigned int) (vt2 = v_stack[v_top]));
X  	       		    v_stack[v_top - 1] = (double) temp;
X  	       		    break;
X  	   case Y2X_OP    : v_stack[v_top - 1] = pow(v_stack[v_top - 1], v_stack[v_top]);
X***************
X*** 199,205 ****
X  	      		    break;
X  	   case LOG_OP    : v_stack[v_top] = log10(v_stack[v_top]);
X  	      		    break;
X! 	   case NOT_OP    : v_stack[v_top] = (double) low_order(curr_width[index_of(curr_base)], (~ (unsigned int) v_stack[v_top]));
X  	      		    break;
X  	   case OVER_OP   : v_stack[v_top] = 1.0 / v_stack[v_top];
X  	      		    break;
X--- 208,214 ----
X  	      		    break;
X  	   case LOG_OP    : v_stack[v_top] = log10(v_stack[v_top]);
X  	      		    break;
X! 	   case NOT_OP    : v_stack[v_top] = (double) low_order(curr_width[index_of(curr_base)], (~ (unsigned int) (vt1 = v_stack[v_top])));
X  	      		    break;
X  	   case OVER_OP   : v_stack[v_top] = 1.0 / v_stack[v_top];
X  	      		    break;
END_OF_FILE
if test 7011 -ne `wc -c <'patch'`; then
    echo shar: \"'patch'\" unpacked with wrong size!
fi
# end of 'patch'
fi
echo shar: End of shell archive.
exit 0

Chuck Musciano				ARPA  : chuck@trantor.harris-atd.com
Harris Corporation 			Usenet: ...!uunet!x102a!trantor!chuck
PO Box 37, MS 3A/1912			AT&T  : (407) 727-6131
Melbourne, FL 32902			FAX   : (407) 727-{5118,5227,4004}

Oh yeah, laugh now!  But when the millions start pouring in, I'll be the one
at Burger King, sucking down Whoppers at my own private table! --Al Bundy