Create this branch to work on loading of different Kernel-Debugger DLL providers...
[reactos.git] / base / applications / calc / calc.h
1 #include <stdarg.h>
2 #include <windef.h>
3 #include <winbase.h>
4 #include <winuser.h>
5 #include <wingdi.h>
6 #include <winreg.h>
7 #include <tchar.h>
8 //#include <stdio.h>
9 //#include <string.h>
10 #include <math.h>
11 #include <float.h>
12 #include <malloc.h>
13 #ifndef DISABLE_HTMLHELP_SUPPORT
14 #include <htmlhelp.h>
15 #endif
16 #include <limits.h>
17
18 /* Messages reserved for the main dialog */
19 #define WM_CLOSE_STATS (WM_APP+1)
20 #define WM_HANDLE_CLIPBOARD (WM_APP+2)
21 #define WM_INSERT_STAT (WM_APP+3)
22 #define WM_LOAD_STAT (WM_APP+4)
23 #define WM_START_CONV (WM_APP+5)
24 #define WM_HANDLE_FROM (WM_APP+6)
25 #define WM_HANDLE_TO (WM_APP+7)
26
27 #ifdef ENABLE_MULTI_PRECISION
28 #include <mpfr.h>
29
30 #ifndef MPFR_DEFAULT_RND
31 #define MPFR_DEFAULT_RND mpfr_get_default_rounding_mode ()
32 #endif
33
34 #define LOCAL_EXP_SIZE 100000000L
35 #else
36
37 #define LOCAL_EXP_SIZE 10000L
38
39 #endif
40
41 #include "resource.h"
42
43 #ifndef IDC_STATIC
44 #define IDC_STATIC ((DWORD)-1)
45 #endif
46
47 #define CALC_VERSION TEXT("1.11")
48
49 #define MAX_CALC_SIZE 256
50
51 /*#define USE_KEYBOARD_HOOK*/
52
53 #define SIZEOF(_ar) (sizeof(_ar)/sizeof(_ar[1]))
54
55 // RPN.C
56
57 enum {
58 RPN_OPERATOR_PARENT,
59 RPN_OPERATOR_PERCENT,
60 RPN_OPERATOR_EQUAL,
61
62 RPN_OPERATOR_OR,
63 RPN_OPERATOR_XOR,
64 RPN_OPERATOR_AND,
65 RPN_OPERATOR_LSH,
66 RPN_OPERATOR_RSH,
67 RPN_OPERATOR_ADD,
68 RPN_OPERATOR_SUB,
69 RPN_OPERATOR_MULT,
70 RPN_OPERATOR_DIV,
71 RPN_OPERATOR_MOD,
72 RPN_OPERATOR_POW,
73 RPN_OPERATOR_SQR,
74
75 RPN_OPERATOR_NONE
76 };
77
78 typedef union {
79 #ifdef ENABLE_MULTI_PRECISION
80 mpfr_t mf;
81 #else
82 double f;
83 INT64 i;
84 UINT64 u;
85 #endif
86 } calc_number_t;
87
88 typedef struct {
89 calc_number_t number;
90 unsigned int operation;
91 DWORD base;
92 } calc_node_t;
93
94 void run_operator(calc_node_t *result, calc_node_t *a,
95 calc_node_t *b, unsigned int operation);
96 int exec_infix2postfix(calc_number_t *, unsigned int);
97 void exec_closeparent(calc_number_t *);
98 int eval_parent_count(void);
99 void flush_postfix(void);
100 void exec_change_infix(void);
101 void start_rpn_engine(void);
102 void stop_rpn_engine(void);
103
104 typedef struct {
105 char *data;
106 char *ptr;
107 UINT wm_msg;
108 } sequence_t;
109
110 typedef struct {
111 calc_number_t num;
112 DWORD base;
113 void *next;
114 } statistic_t;
115
116 enum {
117 CALC_LAYOUT_SCIENTIFIC=0,
118 CALC_LAYOUT_STANDARD,
119 CALC_LAYOUT_CONVERSION,
120 };
121
122 typedef struct {
123 HINSTANCE hInstance;
124 #ifdef USE_KEYBOARD_HOOK
125 HHOOK hKeyboardHook;
126 #endif
127 HWND hWnd;
128 DWORD layout;
129 TCHAR buffer[MAX_CALC_SIZE];
130 TCHAR source[MAX_CALC_SIZE];
131 TCHAR *ptr;
132 calc_number_t code;
133 calc_number_t prev;
134 calc_node_t memory;
135 statistic_t *stat;
136 BOOL is_memory;
137 BOOL is_nan;
138 BOOL sci_out;
139 BOOL sci_in;
140 BOOL usesep;
141 BOOL is_menu_on;
142 signed int esp;
143 DWORD base;
144 DWORD size;
145 DWORD degr;
146 DWORD action;
147 HWND hStatWnd;
148 HWND hConvWnd;
149 sequence_t Clipboard;
150 sequence_t Convert[2];
151 unsigned int last_operator;
152 unsigned int prev_operator;
153 TCHAR sDecimal[8];
154 TCHAR sThousand[8];
155 unsigned int sDecimal_len;
156 unsigned int sThousand_len;
157 signed int x_coord;
158 signed int y_coord;
159 } calc_t;
160
161 extern calc_t calc;
162
163 //
164 #define CALC_E 2.7182818284590452354
165
166 #define CALC_PI_2 1.57079632679489661923
167 #define CALC_PI 3.14159265358979323846
168 #define CALC_3_PI_2 4.71238898038468985769
169 #define CALC_2_PI 6.283185307179586476925
170
171 #define MODIFIER_INV 0x01
172 #define MODIFIER_HYP 0x02
173 #define NO_CHAIN 0x04
174
175 void apply_int_mask(calc_number_t *a);
176 #ifdef ENABLE_MULTI_PRECISION
177 void validate_rad2angle(calc_number_t *c);
178 void validate_angle2rad(calc_number_t *c);
179 #else
180 __int64 logic_dbl2int(calc_number_t *a);
181 double logic_int2dbl(calc_number_t *a);
182 double validate_rad2angle(double a);
183 double validate_angle2rad(calc_number_t *c);
184 #endif
185 void rpn_sin(calc_number_t *c);
186 void rpn_cos(calc_number_t *c);
187 void rpn_tan(calc_number_t *c);
188 void rpn_asin(calc_number_t *c);
189 void rpn_acos(calc_number_t *c);
190 void rpn_atan(calc_number_t *c);
191 void rpn_sinh(calc_number_t *c);
192 void rpn_cosh(calc_number_t *c);
193 void rpn_tanh(calc_number_t *c);
194 void rpn_asinh(calc_number_t *c);
195 void rpn_acosh(calc_number_t *c);
196 void rpn_atanh(calc_number_t *c);
197 BOOL rpn_validate_result(calc_number_t *c);
198 void rpn_int(calc_number_t *c);
199 void rpn_frac(calc_number_t *c);
200 void rpn_reci(calc_number_t *c);
201 void rpn_fact(calc_number_t *c);
202 void rpn_not(calc_number_t *c);
203 void rpn_pi(calc_number_t *c);
204 void rpn_2pi(calc_number_t *c);
205 void rpn_sign(calc_number_t *c);
206 void rpn_exp2(calc_number_t *c);
207 void rpn_exp3(calc_number_t *c);
208 void rpn_sqrt(calc_number_t *c);
209 void rpn_cbrt(calc_number_t *c);
210 void rpn_exp(calc_number_t *c);
211 void rpn_exp10(calc_number_t *c);
212 void rpn_ln(calc_number_t *c);
213 void rpn_log(calc_number_t *c);
214 void rpn_ave(calc_number_t *c);
215 void rpn_sum(calc_number_t *c);
216 void rpn_s(calc_number_t *c);
217 void rpn_s_m1(calc_number_t *c);
218 void rpn_dms2dec(calc_number_t *c);
219 void rpn_dec2dms(calc_number_t *c);
220 void rpn_zero(calc_number_t *c);
221 void rpn_copy(calc_number_t *dst, calc_number_t *src);
222 int rpn_is_zero(calc_number_t *c);
223 void rpn_alloc(calc_number_t *c);
224 void rpn_free(calc_number_t *c);
225
226 //
227
228 void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base);
229 void convert_text2number_2(calc_number_t *a);
230 void convert_real_integer(unsigned int base);
231
232 //
233
234 INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
235
236 //
237
238 void ConvExecute(HWND hWnd);
239 void ConvAdjust(HWND hWnd, int n_cat);
240 void ConvInit(HWND hWnd);