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