xref: /reactos/base/applications/calc/calc.h (revision 328a5d87)
1 #pragma once
2 
3 #define WIN32_LEAN_AND_MEAN
4 #include <windows.h>
5 #include <tchar.h>
6 #include <commctrl.h>
7 #include <shellapi.h>
8 
9 #include <stdio.h>
10 #include <string.h>
11 #include <math.h>
12 #include <float.h>
13 #include <malloc.h>
14 #ifndef DISABLE_HTMLHELP_SUPPORT
15 #include <htmlhelp.h>
16 #endif
17 #include <limits.h>
18 
19 /* RESOURCES */
20 #include "resource.h"
21 
22 /* Messages reserved for the main dialog */
23 #define WM_CLOSE_STATS      (WM_APP+1)
24 #define WM_HANDLE_CLIPBOARD (WM_APP+2)
25 #define WM_INSERT_STAT      (WM_APP+3)
26 #define WM_LOAD_STAT        (WM_APP+4)
27 #define WM_START_CONV       (WM_APP+5)
28 #define WM_HANDLE_FROM      (WM_APP+6)
29 #define WM_HANDLE_TO        (WM_APP+7)
30 
31 /* GNU MULTI-PRECISION LIBRARY support */
32 #ifdef ENABLE_MULTI_PRECISION
33 #include "mpfr.h"
34 
35 #ifndef MPFR_DEFAULT_RND
36 #define MPFR_DEFAULT_RND mpfr_get_default_rounding_mode ()
37 #endif
38 
39 #define LOCAL_EXP_SIZE  100000000L
40 #else
41 
42 #define LOCAL_EXP_SIZE  10000L
43 
44 #endif
45 
46 #define CALC_VERSION        _T("1.12")
47 
48 #define MAX_CALC_SIZE       256
49 
50 /* HTMLHELP SUPPORT */
51 typedef HWND (WINAPI* type_HtmlHelpA)(HWND, LPCSTR, UINT, DWORD);
52 typedef HWND (WINAPI* type_HtmlHelpW)(HWND, LPCWSTR, UINT, DWORD);
53 
54 extern type_HtmlHelpA calc_HtmlHelpA;
55 extern type_HtmlHelpW calc_HtmlHelpW;
56 
57 #ifndef UNICODE
58 #define calc_HtmlHelp   calc_HtmlHelpA
59 #else
60 #define calc_HtmlHelp   calc_HtmlHelpW
61 #endif
62 
63 void HtmlHelp_Start(HINSTANCE hInstance);
64 void HtmlHelp_Stop(void);
65 
66 /* THEMING SUPPORT */
67 #if (_WIN32_WINNT >= 0x0600)
68 #include <vssym32.h>
69 #include <vsstyle.h>
70 #else
71 #include <tmschema.h>
72 #endif
73 #include <uxtheme.h>
74 
75 void Theme_Start(HINSTANCE hInstance);
76 void Theme_Stop(void);
77 
78 typedef HTHEME   (WINAPI* type_OpenThemeData)(HWND,const WCHAR*);
79 typedef HRESULT  (WINAPI* type_CloseThemeData)(HTHEME);
80 typedef HRESULT  (WINAPI* type_DrawThemeBackground)(HTHEME,HDC,int,int,const RECT*,const RECT*);
81 typedef BOOL     (WINAPI* type_IsAppThemed)(void);
82 typedef BOOL     (WINAPI* type_IsThemeActive)(void);
83 typedef BOOL     (WINAPI* type_IsThemeBackgroundPartiallyTransparent)(HTHEME, int, int);
84 typedef HRESULT  (WINAPI* type_DrawThemeParentBackground)(HWND, HDC, RECT *);
85 
86 extern type_OpenThemeData                   calc_OpenThemeData;
87 extern type_CloseThemeData                  calc_CloseThemeData;
88 extern type_DrawThemeBackground             calc_DrawThemeBackground;
89 extern type_IsAppThemed                     calc_IsAppThemed;
90 extern type_IsThemeActive                   calc_IsThemeActive;
91 extern type_IsThemeBackgroundPartiallyTransparent calc_IsThemeBackgroundPartiallyTransparent;
92 extern type_DrawThemeParentBackground       calc_DrawThemeParentBackground;
93 
94 /*#define USE_KEYBOARD_HOOK*/
95 
96 #define SIZEOF(_ar)     (sizeof(_ar)/sizeof(_ar[1]))
97 
98 // RPN.C
99 
100 enum {
101     RPN_OPERATOR_PARENT,
102     RPN_OPERATOR_PERCENT,
103     RPN_OPERATOR_EQUAL,
104 
105     RPN_OPERATOR_OR,
106     RPN_OPERATOR_XOR,
107     RPN_OPERATOR_AND,
108     RPN_OPERATOR_LSH,
109     RPN_OPERATOR_RSH,
110     RPN_OPERATOR_ADD,
111     RPN_OPERATOR_SUB,
112     RPN_OPERATOR_MULT,
113     RPN_OPERATOR_DIV,
114     RPN_OPERATOR_MOD,
115     RPN_OPERATOR_POW,
116     RPN_OPERATOR_SQR,
117 
118     RPN_OPERATOR_NONE
119 };
120 
121 typedef union {
122 #ifdef ENABLE_MULTI_PRECISION
123     mpfr_t  mf;
124 #else
125     double  f;
126     INT64   i;
127     UINT64  u;
128 #endif
129 } calc_number_t;
130 
131 typedef struct {
132     calc_number_t number;
133     unsigned int  operation;
134     DWORD         base;
135 } calc_node_t;
136 
137 void run_operator(calc_node_t *result, calc_node_t *a,
138                   calc_node_t *b, unsigned int operation);
139 int  exec_infix2postfix(calc_number_t *, unsigned int);
140 void exec_closeparent(calc_number_t *);
141 int  eval_parent_count(void);
142 void flush_postfix(void);
143 void exec_change_infix(void);
144 void start_rpn_engine(void);
145 void stop_rpn_engine(void);
146 
147 typedef struct {
148     char *data;
149     char *ptr;
150     UINT  wm_msg;
151 } sequence_t;
152 
153 typedef struct {
154     calc_number_t    num;
155     DWORD            base;
156     void            *next;
157 } statistic_t;
158 
159 enum {
160     CALC_LAYOUT_SCIENTIFIC=0,
161     CALC_LAYOUT_STANDARD,
162     CALC_LAYOUT_CONVERSION,
163 };
164 
165 typedef struct {
166     HINSTANCE     hInstance;
167 #ifdef USE_KEYBOARD_HOOK
168     HHOOK         hKeyboardHook;
169 #endif
170     HWND          hWnd;
171     HICON         hBgIcon;
172     HICON         hSmIcon;
173     DWORD         layout;
174     TCHAR         buffer[MAX_CALC_SIZE];
175     TCHAR         source[MAX_CALC_SIZE];
176     TCHAR        *ptr;
177     calc_number_t code;
178     calc_number_t prev;
179     calc_node_t   memory;
180     statistic_t  *stat;
181     BOOL          is_memory;
182     BOOL          is_nan;
183     BOOL          sci_out;
184     BOOL          sci_in;
185     BOOL          usesep;
186     BOOL          is_menu_on;
187     signed int    esp;
188     DWORD         base;
189     DWORD         size;
190     DWORD         degr;
191     DWORD         action;
192     HWND          hStatWnd;
193     HWND          hConvWnd;
194     sequence_t    Clipboard;
195     sequence_t    Convert[2];
196     unsigned int  last_operator;
197     unsigned int  prev_operator;
198     TCHAR         sDecimal[8];
199     TCHAR         sThousand[8];
200     unsigned int  sDecimal_len;
201     unsigned int  sThousand_len;
202     signed int    x_coord;
203     signed int    y_coord;
204 } calc_t;
205 
206 extern calc_t calc;
207 
208 /* IEEE constants */
209 #define CALC_E      2.718281828459045235360
210 #define CALC_PI_2   1.570796326794896619231
211 #define CALC_PI     3.141592653589793238462
212 #define CALC_3_PI_2 4.712388980384689857694
213 #define CALC_2_PI   6.283185307179586476925
214 
215 #define MODIFIER_INV    0x01
216 #define MODIFIER_HYP    0x02
217 #define NO_CHAIN        0x04
218 
219 void apply_int_mask(calc_number_t *a);
220 #ifndef ENABLE_MULTI_PRECISION
221 __int64 logic_dbl2int(calc_number_t *a);
222 double logic_int2dbl(calc_number_t *a);
223 #endif
224 void rpn_sin(calc_number_t *c);
225 void rpn_cos(calc_number_t *c);
226 void rpn_tan(calc_number_t *c);
227 void rpn_asin(calc_number_t *c);
228 void rpn_acos(calc_number_t *c);
229 void rpn_atan(calc_number_t *c);
230 void rpn_sinh(calc_number_t *c);
231 void rpn_cosh(calc_number_t *c);
232 void rpn_tanh(calc_number_t *c);
233 void rpn_asinh(calc_number_t *c);
234 void rpn_acosh(calc_number_t *c);
235 void rpn_atanh(calc_number_t *c);
236 BOOL rpn_validate_result(calc_number_t *c);
237 void rpn_int(calc_number_t *c);
238 void rpn_frac(calc_number_t *c);
239 void rpn_reci(calc_number_t *c);
240 void rpn_fact(calc_number_t *c);
241 void rpn_not(calc_number_t *c);
242 void rpn_pi(calc_number_t *c);
243 void rpn_2pi(calc_number_t *c);
244 void rpn_sign(calc_number_t *c);
245 void rpn_exp2(calc_number_t *c);
246 void rpn_exp3(calc_number_t *c);
247 void rpn_sqrt(calc_number_t *c);
248 void rpn_cbrt(calc_number_t *c);
249 void rpn_exp(calc_number_t *c);
250 void rpn_exp10(calc_number_t *c);
251 void rpn_ln(calc_number_t *c);
252 void rpn_log(calc_number_t *c);
253 void rpn_ave(calc_number_t *c);
254 void rpn_ave2(calc_number_t *c);
255 void rpn_sum(calc_number_t *c);
256 void rpn_sum2(calc_number_t *c);
257 void rpn_s(calc_number_t *c);
258 void rpn_s_m1(calc_number_t *c);
259 void rpn_dms2dec(calc_number_t *c);
260 void rpn_dec2dms(calc_number_t *c);
261 void rpn_zero(calc_number_t *c);
262 void rpn_copy(calc_number_t *dst, calc_number_t *src);
263 int  rpn_is_zero(calc_number_t *c);
264 void rpn_alloc(calc_number_t *c);
265 void rpn_free(calc_number_t *c);
266 
267 //
268 
269 void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base);
270 void convert_text2number_2(calc_number_t *a);
271 void convert_real_integer(unsigned int base);
272 
273 //
274 
275 INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
276 
277 //
278 
279 void ConvExecute(HWND hWnd);
280 void ConvAdjust(HWND hWnd, int n_cat);
281 void ConvInit(HWND hWnd);
282