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