--- pmsdk/samples/calc/calcmath.c 2018/08/09 12:28:12 1.1 +++ pmsdk/samples/calc/calcmath.c 2018/08/09 12:28:19 1.1.1.2 @@ -1,38 +1,39 @@ -/****************************** Module Header ******************************\ -* Module Name: calcmath.c - Calc application -* -* OS/2 Presentation Manager version of Calc, ported from Windows version -* -* Created by Microsoft Corporation, 1987 -* -\***************************************************************************/ +/****************************** Module Header *********************************/ +/* */ +/* Module Name: calcmath.c - Calc application */ +/* */ +/* OS/2 Presentation Manager version of Calc, ported from Windows version */ +/* */ +/* Created by Microsoft Corporation, 1987 */ +/* */ +/******************************************************************************/ -#define INCL_PM +#define INCL_WINCLIPBOARD #include #include #include #include #include -BOOL fReadNumber; extern BOOL fValueInMemory; -extern char currkey; -extern char szreg1[20], szreg2[20], szmem[20]; -char PendingOperation; +extern CHAR chLastKey; +extern CHAR szreg1[20], szreg2[20], szmem[20]; extern HWND hwndCalc; +extern CHAR szregx[]; +extern HAB hab; +BOOL fReadNumber; +CHAR PendingOperation; BOOL fFirstOperand, fError; -extern char lastkey; -char temp[30]; -char szresult[20]; -extern char szregx[]; -SEL sel; +CHAR szresult[20]; +SEL sel; #define tolower(x) (((x) >= 'A') && ((x)<='Z')) ? (x) - 'A' + 'a' : (x) #define MAXINT (double)999999999 #define MININT (double)-999999999 #define ABS(x) (((x) >= (double)0) ? (x) : (-(x))) -extern VOID FarStrcpy( PSZ, PSZ); + +/******************************************************************************/ extern VOID UpdateDisplay( VOID); extern BOOL InterpretChar( CHAR); @@ -43,6 +44,7 @@ VOID DataXCopy( VOID); VOID DataXPaste( VOID); VOID Equilibrate( VOID); VOID Evaluate( BYTE); +VOID FarStrcpy( PSZ, PSZ); NPCH ftoa( double); VOID InitCalc( VOID); VOID MClear( VOID); @@ -56,381 +58,416 @@ VOID Simplify( VOID); VOID SquareRoot( VOID); -VOID reverse(s) +/******************************************************************************/ +VOID FarStrcpy( pszDest, pszSrc) +PSZ pszDest, pszSrc; +{ + while( *pszDest++ = *pszSrc++); +} + +/******************************************************************************/ +VOID +reverse( s) + NPCH s; { - CHAR c; - register int i, j; + CHAR ch; + register INT iHead, iTail; - for (i = 0, j = strlen(s) - 1; i 2)) { - sztemp[0] = '-'; - strcpy(&sztemp[1], szreg1); - strcpy(szreg1, sztemp); - } + if (szreg1[0] == '-') + strcpy(szreg1, (&szreg1[1])); /* get rid of minus sign */ + else if (szreg1[0] != '0' || (strlen(szreg1) > 2)) { /* can't negate zero */ + sztemp[0] = '-'; + strcpy(&sztemp[1], szreg1); + strcpy(szreg1, sztemp); + } } -VOID Number( n ) -CHAR n; +/******************************************************************************/ +VOID +Number( ch) + +CHAR ch; { - register int len, size; + register INT iLen, iSize; - size = 9; - if (szreg1[0] == '-') size++; - if (strchr(szreg1, '.')) size++; - len = strlen(szreg1 ); - if (len == size) return; - if (len == 1 && szreg1[0] == '0') len--; - szreg1[ len ] = n; - szreg1[min(len + 1, 11)] = 0; + iSize = 9; + if (szreg1[0] == '-') iSize++; + if (strchr(szreg1, '.')) iSize++; + iLen = strlen(szreg1 ); + if (iLen == iSize) return; + if (iLen == 1 && szreg1[0] == '0') iLen--; + szreg1[ iLen ] = ch; + szreg1[min(iLen + 1, 11)] = 0; } -VOID AppendNumber ( num ) -BYTE num; +/******************************************************************************/ +VOID +AppendNumber ( b) + +BYTE b; { - if (num == '.') { /* if no decimal, add one at end */ + if (b == '.') { /* if no decimal, add one at end */ if (!strchr(szreg1, '.')) strcat(szreg1, "."); - } - else if ( num == 0xb1 ) { - Negate(); - } - else { - Number(num); - } -} - -VOID Equilibrate() -{ - double result; - double x1, x2; - - if (lastkey == '=') return; - result = (double)atof(szreg1); - x1 = (double)atof(szreg1); - x2 = (double)atof(szreg2); + } + else if ( b == 0xb1 ) + Negate(); + else + Number(b); +} + +/******************************************************************************/ +VOID +Equilibrate() +{ + double dblResult; + double dblX1, dblX2; + + if (chLastKey == '=') return; + dblResult = (double)atof(szreg1); + dblX1 = (double)atof(szreg1); + dblX2 = (double)atof(szreg2); switch (PendingOperation) { case '+': - if (x2>(double)0) { /* check for overflow */ - if (x1>(double)0) { - if (x1 > (MAXINT - x2)) - fError = TRUE; - } - } - else if (x2 < (double)0) { - if (x1 < (double)0) { - if ( x1 < (MININT - x2)) + if (dblX2>(double)0) { /* check for overflow */ + if (dblX1>(double)0) { + if (dblX1 > (MAXINT - dblX2)) fError = TRUE; - } - } - if (!fError) { - result = x2 + x1; - } + } + } + else if (dblX2 < (double)0) { + if (dblX1 < (double)0) { + if ( dblX1 < (MININT - dblX2)) + fError = TRUE; + } + } + if (!fError) + dblResult = dblX2 + dblX1; break; case '-': - if (x2 < (double)0) { - if (x1 > (double)0) { - if (x1 > (x2 - MININT)) + if (dblX2 < (double)0) { + if (dblX1 > (double)0) { + if (dblX1 > (dblX2 - MININT)) fError = TRUE; - } - } - else if (x2 > (double)0) { - if (x1 < (double)0) { - if (x1 < (x2 - MAXINT)) + } + } + else if (dblX2 > (double)0) { + if (dblX1 < (double)0) { + if (dblX1 < (dblX2 - MAXINT)) fError = TRUE; - } - } + } + } if (!fError) - result = x2 - x1; + dblResult = dblX2 - dblX1; break; case '/': - if (x1 == (double)0.0) + if (dblX1 == (double)0.0) fError = TRUE; - else if (x2 > (double)0) { - if (x1 > (double)0) { - if (x1 < (x2 / MAXINT)) - fError = TRUE; - } - else { /* x1 < 0 here */ - if (x1 > (x2 / MININT)) - fError = TRUE; - } - } - else { /* x2 < 0 here */ - if (x1 < (double)0) { - if (x1 > (x2 / MAXINT)) - fError = TRUE; - } - else { /* x1 > 0 here */ - if (x1 < (x2 / MININT)) - fError = TRUE; - } - } - if (!fError) result = x2 / x1; + else if (dblX2 > (double)0) { + if (dblX1 > (double)0) { + if (dblX1 < (dblX2 / MAXINT)) + fError = TRUE; + } + else { /* dblX1 < 0 here */ + if (dblX1 > (dblX2 / MININT)) + fError = TRUE; + } + } + else { /* dblX2 < 0 here */ + if (dblX1 < (double)0) { + if (dblX1 > (dblX2 / MAXINT)) + fError = TRUE; + } + else { /* dblX1 > 0 here */ + if (dblX1 < (dblX2 / MININT)) + fError = TRUE; + } + } + if (!fError) + dblResult = dblX2 / dblX1; break; case '*': - if (x1 == (double)0) return; - if (ABS(x2) > (double)1) { - if (ABS(x1) > (double)1) { - if (ABS(x1) > (MAXINT / ABS(x2))) + if (dblX1 == (double)0) return; + if (ABS(dblX2) > (double)1) { + if (ABS(dblX1) > (double)1) { + if (ABS(dblX1) > (MAXINT / ABS(dblX2))) fError = TRUE; } } - if (!fError) result = x2 * x1; + if (!fError) dblResult = dblX2 * dblX1; break; } if (!fError) { - strcpy(szreg1, ftoa((double)result)); + strcpy(szreg1, ftoa((double)dblResult)); strcpy( szreg2, szreg1 ); } Simplify(); } -VOID SquareRoot() +/******************************************************************************/ +VOID +SquareRoot() { - double result; + double dblResult; - result = (double)atof(szreg1); - if (result < 0.0) { + dblResult = (double)atof(szreg1); + if (dblResult < 0.0) { fError = TRUE; return; - } - - if ((result == 0.0) || ((lastkey == 'q') && (result == 1.0))) + } + if ((dblResult == 0.0) || ((chLastKey == 'q') && (dblResult == 1.0))) return; - - if ((result < (double) 1.00000002) && (result > (double) 1.0)) - result = (double)1.0; + if ((dblResult < (double) 1.00000002) && (dblResult > (double) 1.0)) + dblResult = (double)1.0; else - result = sqrt(result); - - strcpy( szreg1, ftoa((double)result)); - + dblResult = sqrt(dblResult); + strcpy( szreg1, ftoa((double)dblResult)); if (atof( szreg1 ) == 0.0) strcpy(szreg1, "0."); - Simplify(); } -VOID BinaryOperator( op ) -CHAR op; +/******************************************************************************/ +VOID +BinaryOperator( ch) + +CHAR ch; { if (fFirstOperand) { fFirstOperand = FALSE; strcpy(szreg2, szreg1); - } + } else { Equilibrate(); - } - PendingOperation = op; + } + PendingOperation = ch; } -VOID Clear() +/******************************************************************************/ +VOID +Clear() { fReadNumber = FALSE; fFirstOperand = TRUE; strcpy(szreg1, "0."); - if (fError || lastkey == 'c'){ + if (fError || chLastKey == 'c'){ strcpy(szreg2, "0."); PendingOperation = NULL; - } + } fError = FALSE; } - /* trash out trailing zeros, if a '.' is in the number */ - /* and leading zeros in all cases. */ -VOID Simplify() -{ - register int len; - char local[20]; - register int count; - - count = 0; - strcpy(local, szreg1); - if (atof(local) != 0.0) { - while (local[count++] == '0'); - strcpy(szreg1, &local[count-1] ); - } +/******************************************************************************/ +/* trash out trailing zeros, if a '.' is in the number */ +/* and leading zeros in all cases. */ +/******************************************************************************/ +VOID +Simplify() +{ + register INT iLen, iCount; + CHAR achLocal[20]; + + iCount = 0; + strcpy(achLocal, szreg1); + if (atof(achLocal) != 0.0) { + while (achLocal[iCount++] == '0'); + strcpy(szreg1, &achLocal[iCount-1] ); + } if (strchr(szreg1, '.')) { - len = strlen(szreg1); - while (szreg1[--len] == '0'); - szreg1[min(len + 1, 11)] = 0; /* null terminate */ - } + iLen = strlen(szreg1); + while (szreg1[--iLen] == '0'); + szreg1[min( iLen + 1, 11)] = 0; /* null terminate */ + } } -VOID DataXPaste() -{ - PSZ lp; - register char c; +/******************************************************************************/ +VOID +DataXPaste() +{ + PSZ psz; + ULONG ulText; + register CHAR ch; - if (WinOpenClipbrd(NULL)) + if (WinOpenClipbrd( hab)) { - lp = (PSZ)WinQueryClipbrdData(NULL, CF_TEXT); - if (lp) - { - while (*lp) + ulText = WinQueryClipbrdData( hab, CF_TEXT); + if (ulText) + { + psz = MAKEP( (SEL)ulText, 0); + while (*psz) { - c = tolower(*lp); - if (c == 'm') + ch = tolower(*psz); + if (ch == 'm') { - lp++; - switch (tolower(*lp)) + psz++; + switch (tolower(*psz)) { - case '-': - c = '\271'; - break; - case '+': - c = '\272'; - break; - case 'r': - c = '\273'; - break; - case 'c': - c = '\274'; - break; - default: - c = ' '; - break; + case '-': + ch = '\271'; + break; + case '+': + ch = '\272'; + break; + case 'r': + ch = '\273'; + break; + case 'c': + ch = '\274'; + break; + default: + ch = ' '; + break; } } - lp++; - InterpretChar(c); + psz++; + InterpretChar(ch); UpdateDisplay(); } } } - WinCloseClipbrd(NULL); + WinCloseClipbrd( hab); InterpretChar('='); UpdateDisplay(); } -VOID DataXCopy() +/******************************************************************************/ +VOID +DataXCopy() { - PSZ lpsztext; + PSZ pszText; - if (WinOpenClipbrd(NULL)) + if (WinOpenClipbrd( hab)) { - WinEmptyClipbrd(NULL); - DosAllocSeg(20, (SEL FAR *)&sel, 2L); /* SEG_GETTABLE */ + WinEmptyClipbrd( hab); + DosAllocSeg( 20, (SEL FAR *)&sel, SEG_GIVEABLE); if (sel == NULL) return; - lpsztext = MAKEP(sel, 0); - FarStrcpy(lpsztext, (PSZ)szreg1); - WinSetClipbrdData(NULL, (ULONG)sel, CF_TEXT, CFI_SELECTOR); - WinCloseClipbrd(NULL); + pszText = MAKEP(sel, 0); + FarStrcpy( pszText, (PSZ)szreg1); + WinSetClipbrdData( hab, (ULONG)sel, CF_TEXT, CFI_SELECTOR); + WinCloseClipbrd( hab); } } -VOID MPlus() -{ - double x2, x1, result; - - x2 = atof(szmem); - x1 = atof(szreg1); - - if (x2>(double)0) { /* check for overflow */ - if (x1>(double)0) { - if (x1 > (MAXINT - x2)) +/******************************************************************************/ +VOID +MPlus() +{ + double dblX1, dblX2, dblResult; + + dblX2 = atof(szmem); + dblX1 = atof(szreg1); + + if (dblX2>(double)0) { /* check for overflow */ + if (dblX1>(double)0) { + if (dblX1 > (MAXINT - dblX2)) fError = TRUE; - } - } - else if (x2 < (double)0) { - if (x1 < (double)0) { - if ( x1 < (MININT - x2)) - fError = TRUE; - } - } + } + } + else if (dblX2 < (double)0) { + if (dblX1 < (double)0) { + if ( dblX1 < (MININT - dblX2)) + fError = TRUE; + } + } if (!fError) { - result = x2 + x1; - strcpy( szmem, ftoa((double)result)); - } - if (result == (double)0.0) + dblResult = dblX2 + dblX1; + strcpy( szmem, ftoa((double)dblResult)); + } + if (dblResult == (double)0.0) fValueInMemory = FALSE; else fValueInMemory = TRUE; } -VOID MClear() +/******************************************************************************/ +VOID +MClear() { strcpy(szmem, "0."); fValueInMemory = FALSE; } -VOID MMinus() -{ - double x1, x2, result; - - x2 = atof(szmem); - x1 = atof(szreg1); - if (x2 < (double)0) { - if (x1 > (double)0) { - if (x1 > (x2 - MININT)) +/******************************************************************************/ +VOID +MMinus() +{ + double dblX1, dblX2, dblResult; + + dblX2 = atof(szmem); + dblX1 = atof(szreg1); + if (dblX2 < (double)0) { + if (dblX1 > (double)0) { + if (dblX1 > (dblX2 - MININT)) fError = TRUE; - } - } - else if (x2 > (double)0) { - if (x1 < (double)0) { - if (x1 < (x2 - MAXINT)) + } + } + else if (dblX2 > (double)0) { + if (dblX1 < (double)0) { + if (dblX1 < (dblX2 - MAXINT)) fError = TRUE; - } - } + } + } if (!fError) { - result = x2 - x1; - strcpy( szmem, ftoa((double)result)); - } - if (result == (double)0.0) + dblResult = dblX2 - dblX1; + strcpy( szmem, ftoa((double)dblResult)); + } + if (dblResult == (double)0.0) fValueInMemory = FALSE; else fValueInMemory = TRUE; } -VOID Evaluate( command ) -BYTE command; +/******************************************************************************/ +VOID +Evaluate( bCommand) + +BYTE bCommand; { - currkey = command; - switch( command ) { + switch( bCommand ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': case 0xb1: case 'n': /* n = 'negate' from keyboard */ - if ( fReadNumber ) { - AppendNumber( command ); - } + if ( fReadNumber ) + AppendNumber( bCommand ); else { /* if starting a new number */ - if (command != 0xb1) + if (bCommand != 0xb1) strcpy(szreg1, "0"); - AppendNumber( command ); - } - if (command != 0xb1) + AppendNumber( bCommand ); + } + if (bCommand != 0xb1) fReadNumber = TRUE; break; case '+': case '-': case '/': case '*': case 'p': - BinaryOperator(command); + BinaryOperator(bCommand); fReadNumber = FALSE; break; case '=': @@ -470,26 +507,30 @@ BYTE command; } } -VOID Percent() -{ - double x1, x2, result; - - x1 = atof(szreg1) / 100.0; - x2 = atof(szreg2); - if (ABS(x2) > (double)1) { - if (ABS(x1) > (double)1) { - if (x1 > (MAXINT / x2)) +/******************************************************************************/ +VOID +Percent() +{ + double dblX1, dblX2, dblResult; + + dblX1 = atof(szreg1) / 100.0; + dblX2 = atof(szreg2); + if (ABS(dblX2) > (double)1) { + if (ABS(dblX1) > (double)1) { + if (dblX1 > (MAXINT / dblX2)) fError = TRUE; - } - } + } + } if (!fError) { - result = x2 * x1; - strcpy( szreg1, ftoa((double)result)); - } + dblResult = dblX2 * dblX1; + strcpy( szreg1, ftoa((double)dblResult)); + } Simplify(); } -VOID InitCalc() +/******************************************************************************/ +VOID +InitCalc() { fReadNumber = FALSE; fError = FALSE;