|
|
1.1 root 1: /*-------------------------------------
2: HEXCALC.C -- Hexadecimal Calculator
3: -------------------------------------*/
4:
5: #define INCL_WIN
6: #include <os2.h>
7: #include <ctype.h>
8: #include <limits.h>
9: #include <stdlib.h>
10: #include <string.h>
11: #include "hexcalc.h"
12:
13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
14:
15: int main (void)
16: {
17: HAB hab ;
18: HMQ hmq ;
19: HWND hwndFrame ;
20: QMSG qmsg ;
21:
22: hab = WinInitialize (0) ;
23: hmq = WinCreateMsgQueue (hab, 0) ;
24:
25: WinRegisterClass (hab, CLIENTCLASS, ClientWndProc, 0L, 0) ;
26:
27: hwndFrame = WinLoadDlg (HWND_DESKTOP, HWND_DESKTOP,
28: NULL, NULL, ID_HEXCALC, NULL) ;
29:
30: WinSendMsg (hwndFrame, WM_SETICON,
31: WinLoadPointer (HWND_DESKTOP, NULL, ID_ICON), NULL) ;
32:
33: WinSetFocus (HWND_DESKTOP, WinWindowFromID (hwndFrame, FID_CLIENT)) ;
34:
35: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
36: WinDispatchMsg (hab, &qmsg) ;
37:
38: WinDestroyWindow (hwndFrame) ;
39: WinDestroyMsgQueue (hmq) ;
40: WinTerminate (hab) ;
41: return 0 ;
42: }
43:
44: void ShowNumber (HWND hwnd, ULONG ulNumber)
45: {
46: CHAR szBuffer [20] ;
47:
48: WinSetWindowText (WinWindowFromID (hwnd, ESCAPE),
49: strupr (ltoa (ulNumber, szBuffer, 16))) ;
50: }
51:
52: ULONG CalcIt (ULONG ulFirstNum, SHORT sOperation, ULONG ulNum)
53: {
54: switch (sOperation)
55: {
56: case '=' : return ulNum ;
57: case '+' : return ulFirstNum + ulNum ;
58: case '-' : return ulFirstNum - ulNum ;
59: case '*' : return ulFirstNum * ulNum ;
60: case '&' : return ulFirstNum & ulNum ;
61: case '|' : return ulFirstNum | ulNum ;
62: case '^' : return ulFirstNum ^ ulNum ;
63: case '<' : return ulFirstNum << ulNum ;
64: case '>' : return ulFirstNum >> ulNum ;
65: case '/' : return ulNum ? ulFirstNum / ulNum : ULONG_MAX ;
66: case '%' : return ulNum ? ulFirstNum % ulNum : ULONG_MAX ;
67: default : return 0L ;
68: }
69: }
70:
71: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
72: {
73: static BOOL fNewNumber = TRUE ;
74: static ULONG ulNumber, ulFirstNum ;
75: static SHORT sOperation = '=' ;
76: HWND hwndButton ;
77: SHORT idButton ;
78:
79: switch (msg)
80: {
81: case WM_CHAR:
82: if (CHARMSG(&msg)->fs & KC_KEYUP)
83: return 0 ;
84:
85: if (CHARMSG(&msg)->fs & KC_VIRTUALKEY)
86: switch (CHARMSG(&msg)->vkey)
87: {
88: case VK_LEFT:
89: if (!(CHARMSG(&msg)->fs & KC_CHAR))
90: {
91: CHARMSG(&msg)->chr = '\b' ;
92: CHARMSG(&msg)->fs |= KC_CHAR ;
93: }
94: break ;
95:
96: case VK_ESC:
97: CHARMSG(&msg)->chr = ESCAPE ;
98: CHARMSG(&msg)->fs |= KC_CHAR ;
99: break ;
100:
101: case VK_NEWLINE:
102: case VK_ENTER:
103: CHARMSG(&msg)->chr = '=' ;
104: CHARMSG(&msg)->fs |= KC_CHAR ;
105: break ;
106: }
107:
108: if (CHARMSG(&msg)->fs & KC_CHAR)
109: {
110: CHARMSG(&msg)->chr = toupper (CHARMSG(&msg)->chr) ;
111:
112: if (hwndButton = WinWindowFromID (hwnd,CHARMSG(&msg)->chr))
113: WinSendMsg (hwndButton, BM_CLICK, NULL, NULL) ;
114: else
115: WinAlarm (HWND_DESKTOP, WA_ERROR) ;
116: }
117: return 1 ;
118:
119: case WM_COMMAND:
120: idButton = COMMANDMSG(&msg)->cmd ;
121:
122: if (idButton == '\b') // backspace
123: ShowNumber (hwnd, ulNumber /= 16) ;
124:
125: else if (idButton == ESCAPE) // escape
126: ShowNumber (hwnd, ulNumber = 0L) ;
127:
128: else if (isxdigit (idButton)) // hex digit
129: {
130: if (fNewNumber)
131: {
132: ulFirstNum = ulNumber ;
133: ulNumber = 0L ;
134: }
135: fNewNumber = FALSE ;
136:
137: if (ulNumber <= ULONG_MAX >> 4)
138: ShowNumber (hwnd,
139: ulNumber = 16 * ulNumber + idButton -
140: (isdigit (idButton) ? '0' : 'A' - 10)) ;
141: else
142: WinAlarm (HWND_DESKTOP, WA_ERROR) ;
143: }
144: else // operation
145: {
146: if (!fNewNumber)
147: ShowNumber (hwnd, ulNumber =
148: CalcIt (ulFirstNum, sOperation, ulNumber)) ;
149: fNewNumber = TRUE ;
150: sOperation = idButton ;
151: }
152: return 0 ;
153:
154: case WM_BUTTON1DOWN:
155: WinAlarm (HWND_DESKTOP, WA_ERROR) ;
156: break ;
157:
158: case WM_ERASEBACKGROUND:
159: return 1 ;
160: }
161: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.