/**************************************************************************/ /*** SCICALC Scientific Calculator for Windows 3.00.12 ***/ /*** By Kraig Brockschmidt, Microsoft Co-op, Contractor, 1988-1989 ***/ /*** (c)1989 Microsoft Corporation. All Rights Reserved. ***/ /*** ***/ /*** scioper.c ***/ /*** ***/ /*** Functions contained: ***/ /*** DoOperation--Does common operations. ***/ /*** ***/ /*** Functions called: ***/ /*** DisplayError ***/ /*** ***/ /*** Last modification Thu 31-Aug-1989 ***/ /**************************************************************************/ #include "scicalc.h" extern BOOL bInv; extern LONG nPrecision; /****************************************************************************\ * HNUMOBJ NEAR DoOperation (short nOperation, HNUMOBJ fpx) * * Routines to perform standard operations &|^~<<>>+-/*% and pwr. * \****************************************************************************/ void DoOperation (INT nOperation, HNUMOBJ *phnoNum, HNUMOBJ hnoX) { // NOTE: volatile is used here because of a compiler bug! vc 5 AND 6. This has no effect on the funcationality. volatile PRAT hno = NULL; try { switch (nOperation) { /* Buncha ops. Hope *this* doesn't confuse anyone . */ case IDC_AND: andrat( phnoNum, hnoX ); return; case IDC_OR: orrat( phnoNum, hnoX ); return; case IDC_XOR: xorrat( phnoNum, hnoX ); return; case RSHF: NumObjAssign( &hno, *phnoNum ); NumObjAssign( phnoNum, hnoX ); rshrat( phnoNum, hno ); break; case IDC_LSHF: NumObjAssign( &hno, *phnoNum ); NumObjAssign( phnoNum, hnoX ); lshrat( phnoNum, hno ); break; case IDC_ADD: addrat( phnoNum, hnoX ); return; case IDC_SUB: // in order to do ( hnoX - phnoNum ) we actually do -(phnoNum - hnoX ) cause it's quicker subrat( phnoNum, hnoX ); NumObjNegate( phnoNum ); return; case IDC_MUL: mulrat( phnoNum, hnoX ); return; case IDC_DIV: case IDC_MOD: { // REVIEW: These lengthly number assignments can be replaced with some quick pointer swaps. // the swaps cannot change the value of hnoX unless we also modify the code that calls // the DoOperation function. NumObjAssign( &hno, *phnoNum ); NumObjAssign( phnoNum, hnoX ); if (nOperation==IDC_DIV) { divrat(phnoNum, hno ); /* Do division. */ } else { modrat( phnoNum, hno ); } break; } case IDC_PWR: /* Calculates hnoX to the hnoNum(th) power or root. */ { NumObjAssign( &hno, *phnoNum ); NumObjAssign( phnoNum, hnoX ); if (bInv) /* Switch for hnoNum(th) root. Null root illegal. */ { SetBox (IDC_INV, bInv=FALSE); rootrat( phnoNum, hno); /* Root. */ } else { powrat( phnoNum, hno ); /* Power. */ } break; } } if ( hno != NULL ) NumObjDestroy( &hno ); } catch ( DWORD dwErrCode ) { // if ratpak throws an error, we may need to free the memory used by hno if ( hno != NULL ) NumObjDestroy( &hno ); DisplayError( dwErrCode ); } return; }