[CALC] Added "Minute of arc" and "Second of arc" to the "Angles" units. CORE-5939
[reactos.git] / base / applications / calc / convert.c
1 /*
2 * ReactOS Calc (Unit conversion engine)
3 *
4 * Copyright 2007-2017, Carlo Bramini
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include "calc.h"
22
23 /*
24 The conversion is made by converting the "from" unit
25 into the I.S. unit and then the I.S. unit is converted
26 into the "from" one.
27
28 The base units for all categories are:
29
30 ANGLE..........degrees
31 AREA...........square meters
32 CONSUMPTION....kilometers per liter
33 CURRENCY.......Euro
34 ENERGY.........joule
35 LENGTHS........meters
36 POWER..........Watt
37 PRESSURE.......Pascal
38 TEMPERATURE....kelvin
39 TIME...........seconds
40 VELOCITY.......meters per second
41 VOLUME.........liter
42 WEIGHT.........gram
43
44 The '$' character is used as "what you read into the display".
45 */
46 typedef struct {
47 DWORD unit;
48 const char *formula_from;
49 const char *formula_to;
50 } conv_t;
51
52 typedef struct {
53 const DWORD category;
54 const conv_t *items;
55 } conv_category_t;
56
57 #define DECLARE_CONV_CAT(_category) \
58 { IDS_CONV_##_category, conv_##_category },
59
60 #define DECLARE_CONV_UNIT(_category, _unit, _from, _to ) \
61 { IDS_##_category##_##_unit, _from, _to },
62
63 #define DECLARE_CONV_END \
64 { 0, NULL, NULL },
65
66 /*
67 1 arcminute ....... = 1/60 deg
68 1 arcsecond ....... = 1/3600 deg
69 1 gradian ......... = 0.9 deg
70 1 radian .......... = 57.29577951308233 deg
71 */
72 static const conv_t conv_ANGLE[] = {
73 DECLARE_CONV_UNIT(ANGLE, ARCMINUTES, "$/60", "$*60")
74 DECLARE_CONV_UNIT(ANGLE, ARCSECONDS, "$/3600", "$*3600")
75 DECLARE_CONV_UNIT(ANGLE, DEGREES, "$", "$")
76 DECLARE_CONV_UNIT(ANGLE, GRADIANS, "$*0.9", "$/0.9")
77 DECLARE_CONV_UNIT(ANGLE, RADIANS, "$/P*180", "$*P/180")
78 DECLARE_CONV_END
79 };
80
81 /*
82 1 acre ................ = 4840 square yd = 4046,8564224 mq
83 1 acre brazil ......... =
84 1 acre france ......... =
85 1 acre scots .......... = 5000 mq
86 1 acre us ............. = 4840*(36/39.37)^2 m = 6272640/1549.9969 m
87 1 are ................. = 100 mq
88 1 chou ................ = 108000*(10/33)^2 mq
89 1 danbo ............... = 991.74 mq
90 1 ha .................. = 10000 mq
91 1 jeongbo ............. = 9917.4 mq
92 1 morgen hungary ...... = 5754.642 mq
93 1 mu .................. = 2000/3 mq
94 1 ping ................ =
95 1 pyeong .............. = 400/121 mq
96 1 pyeongbangja ........ =
97 1 rai ................. = 1600 mq
98 1 se .................. = 1080*(10/33)^2 mq
99 1 square cm ........... = 0.0001 mq
100 1 square chr .......... =
101 1 square fathom ....... = 1.8288^2 = 3.34450944 mq
102 1 square fathom hungary = 1.8964838^2 = 3.59665080366244 mq
103 1 square ft ........... = 0,09290304 mq
104 1 square in ........... = 0,00064516 mq
105 1 square km ........... = 1000000 mq
106 1 square lar .......... =
107 1 square mile ......... = 1609.344^2 = 2589988.110336 mq
108 1 square mm ........... = 0,000001 mq
109 1 square shaku ........ = (10/33)^2 mq
110 1 square tsuen ........ =
111 1 square va ........... = 4 mq
112 1 square yard ......... = 0,83612736 mq
113 1 tan ................. = 10800*(10/33)^2 mq
114 1 tsubo ............... = 36*(10/33)^2 mq
115 */
116 static const conv_t conv_AREA[] = {
117 DECLARE_CONV_UNIT(AREA, ACRES, "$*4046,8564224", "$/4046,8564224")
118 // DECLARE_CONV_UNIT(AREA, ACRES_BRAZIL, "$", "$")
119 // DECLARE_CONV_UNIT(AREA, ACRES_FRANCE, "$", "$")
120 DECLARE_CONV_UNIT(AREA, ACRES_US, "$*627264/154.99969", "$/627264*154.99969")
121 DECLARE_CONV_UNIT(AREA, ACRES_SCOTS, "$*5000", "$/5000")
122 DECLARE_CONV_UNIT(AREA, ARES, "$*100", "$/100")
123 DECLARE_CONV_UNIT(AREA, CHOU, "$*10800000/1089", "$*1089/10800000")
124 DECLARE_CONV_UNIT(AREA, DANBO, "$*991.74", "$/991.74")
125 DECLARE_CONV_UNIT(AREA, HECTARES, "$*10000", "$/10000")
126 DECLARE_CONV_UNIT(AREA, JEONGBO, "$*9917.4", "$/9917.4")
127 // DECLARE_CONV_UNIT(AREA, MORGEN_HUNGARY, "$", "$")
128 DECLARE_CONV_UNIT(AREA, MU, "$*(2000/3)", "$/(2000/3)")
129 // DECLARE_CONV_UNIT(AREA, PING, "$", "$")
130 DECLARE_CONV_UNIT(AREA, PYEONG, "$*400/121", "$*121/400")
131 // DECLARE_CONV_UNIT(AREA, PYEONGBANGJA, "$", "$")
132 DECLARE_CONV_UNIT(AREA, RAI, "$*1600", "$/1600")
133 DECLARE_CONV_UNIT(AREA, SE, "$*108000/1089", "$*1089/108000")
134 DECLARE_CONV_UNIT(AREA, SQUARE_CENTIMETERS, "$*0,0001", "$/0,0001")
135 // DECLARE_CONV_UNIT(AREA, SQUARE_CHR, "$", "$")
136 DECLARE_CONV_UNIT(AREA, SQUARE_FATHOMS, "$*3.34450944", "$/3.34450944")
137 DECLARE_CONV_UNIT(AREA, SQUARE_FATHOMS_HUNGARY, "$*3.59665080366244", "$/3.59665080366244")
138 DECLARE_CONV_UNIT(AREA, SQUARE_FEET, "$*0,09290304", "$/0,09290304")
139 DECLARE_CONV_UNIT(AREA, SQUARE_INCHES, "$*0,00064516", "$/0.00064516")
140 DECLARE_CONV_UNIT(AREA, SQUARE_KILOMETERS, "$*1000000", "$/1000000")
141 // DECLARE_CONV_UNIT(AREA, SQUARE_LAR, "$", "$")
142 DECLARE_CONV_UNIT(AREA, SQUARE_METER, "$", "$")
143 DECLARE_CONV_UNIT(AREA, SQUARE_MILES, "$*2589988.110336", "$/2589988.110336")
144 DECLARE_CONV_UNIT(AREA, SQUARE_MILLIMETERS, "$*1000000", "$/1000000")
145 DECLARE_CONV_UNIT(AREA, SQUARE_SHAKU, "$*100/1089", "$/1089*100")
146 // DECLARE_CONV_UNIT(AREA, SQUARE_TSUEN, "$", "$")
147 DECLARE_CONV_UNIT(AREA, SQUARE_VA, "$*4", "$/4")
148 DECLARE_CONV_UNIT(AREA, SQUARE_YARD, "$*0,83612736", "$/0,83612736")
149 DECLARE_CONV_UNIT(AREA, TAN, "$*1080000/1089", "$*1089/1080000")
150 DECLARE_CONV_UNIT(AREA, TSUBO, "$*1188/1089", "$*1089/1188")
151 DECLARE_CONV_END
152 };
153
154 /*
155 1 l/100Km = 100 km/l -> y = 100/x
156 1 miles/gal uk = 1.609344/4.54609 km/l
157 1 miles/gal us = 1.609344/3.785411784 km/l
158 */
159 static const conv_t conv_CONSUMPTION[] = {
160 DECLARE_CONV_UNIT(CONSUMPTION, KM_PER_L, "$", "$")
161 DECLARE_CONV_UNIT(CONSUMPTION, L_PER_100_KM, "100/$", "100/$")
162 DECLARE_CONV_UNIT(CONSUMPTION, MILES_GALLON_UK, "$*1.609344/4.54609", "$/1.609344*4.54609")
163 DECLARE_CONV_UNIT(CONSUMPTION, MILES_GALLON_US, "$*1.609344/3.785411784", "$/1.609344*3.785411784")
164 DECLARE_CONV_END
165 };
166
167 static const conv_t conv_CURRENCY[] = {
168 DECLARE_CONV_UNIT(CURRENCY, AUSTRIAN_SCHILLING, "$/13,7603", "$*13,7603")
169 DECLARE_CONV_UNIT(CURRENCY, BELGIAN_FRANC, "$/40,3399", "$*40,3399")
170 DECLARE_CONV_UNIT(CURRENCY, CYPRIOT_POUND, "$/0,585274","$*0,585274")
171 DECLARE_CONV_UNIT(CURRENCY, DEUTSCHE_MARK, "$/1,95583", "$*1,95583")
172 DECLARE_CONV_UNIT(CURRENCY, DUTCH_GUILDER, "$/2,20371", "$*2,20371")
173 DECLARE_CONV_UNIT(CURRENCY, ESTONIAN_KROON, "$/15,6466", "$*15,6466")
174 DECLARE_CONV_UNIT(CURRENCY, EURO, "$", "$")
175 DECLARE_CONV_UNIT(CURRENCY, FINNISH_MARKKA, "$/5,94573", "$*5,94573")
176 DECLARE_CONV_UNIT(CURRENCY, FRENCH_FRANC, "$/6,55957", "$*6,55957")
177 DECLARE_CONV_UNIT(CURRENCY, GREEK_DRACHMA, "$/340,751", "$*340,751")
178 DECLARE_CONV_UNIT(CURRENCY, IRISH_POUND, "$/0,787564","$*0,787564")
179 DECLARE_CONV_UNIT(CURRENCY, ITALIAN_LIRA, "$/1936.27", "$*1936.27")
180 DECLARE_CONV_UNIT(CURRENCY, LATVIAN_LATS, "$/0,7028", "$*0,7028")
181 DECLARE_CONV_UNIT(CURRENCY, LITHUANIAN_LITAS, "$/3,45280", "$*3,45280")
182 DECLARE_CONV_UNIT(CURRENCY, LUXEMBOURG_FRANC, "$/40,3399", "$*40,3399")
183 DECLARE_CONV_UNIT(CURRENCY, MALTESE_LIRA, "$/0.42930", "$*0.42930")
184 DECLARE_CONV_UNIT(CURRENCY, PORTOGUESE_ESCUDO, "$/200,482", "$*200,482")
185 DECLARE_CONV_UNIT(CURRENCY, SLOVAK_KORUNA, "$/30,126", "$*30,126")
186 DECLARE_CONV_UNIT(CURRENCY, SLOVENIAN_TOLAR, "$/239,640", "$*239,640")
187 DECLARE_CONV_UNIT(CURRENCY, SPANISH_PESETA, "$/166,386", "$*166,386")
188 DECLARE_CONV_END
189 };
190
191 /*
192 1 cal15 .... = 4.1855 J
193 1 BTU ...... = 1055.056 J
194 1 ERG ...... = 0.0000001 J
195 1 eV ....... = 0.000000000000000000160217653 J
196 1 Foot-Pound = 1.3558179483314004 J
197 1 IT calorie = 4.1868 J
198 1 KCa ...... = 4186.8 J
199 1 KJ ....... = 1000 J
200 1 KWh ...... = 3600 J
201 1 IUNS ..... = 4.182 J
202 1 calth .... = 4.184 J
203 */
204 static const conv_t conv_ENERGY[] = {
205 DECLARE_CONV_UNIT(ENERGY, 15_C_CALORIES, "$*4.1855", "$/4.1855")
206 DECLARE_CONV_UNIT(ENERGY, BTUS, "$*1055.056", "$/1055.056")
207 DECLARE_CONV_UNIT(ENERGY, ERGS, "$*.0000001", "$/.0000001")
208 DECLARE_CONV_UNIT(ENERGY, EVS, "$*1.60217653/1X19", "$/1.60217653*1X19")
209 DECLARE_CONV_UNIT(ENERGY, FOOT_POUNDS, "$*1.3558179483314004", "$/1.3558179483314004")
210 DECLARE_CONV_UNIT(ENERGY, IT_CALORIES, "$*4.1868", "$/4.1868")
211 DECLARE_CONV_UNIT(ENERGY, IT_KILOCALORIES, "$*4186.8", "$/4186.8")
212 DECLARE_CONV_UNIT(ENERGY, JOULES, "$", "$")
213 DECLARE_CONV_UNIT(ENERGY, KILOJOULES, "$*1000", "$/1000")
214 DECLARE_CONV_UNIT(ENERGY, KILOWATT_HOURS, "$*3600", "$/3600")
215 DECLARE_CONV_UNIT(ENERGY, NUTRITION_CALORIES, "$*4.182", "$/4.182")
216 DECLARE_CONV_UNIT(ENERGY, TH_CALORIES, "$*4.184", "$/4.184")
217 DECLARE_CONV_END
218 };
219
220 /*
221 1 angstrom ....... = 0.0000000001 m
222 1 astronomical unit= 149598000000 m
223 1 barleycorn ..... = 1/3 inch = 0.9144/108 m
224 1 cm ............. = 1/100 m
225 1 chain uk ....... = 22 yards = 22*0.9144 m
226 1 chi ............ = 1/3 m
227 1 chou ........... = 3600/33 m
228 1 chr ............ =
229 1 cun ............ = 1/10 chi = 1/30 m
230 1 fathom ......... = 2 yard = 2*0.9144 m
231 1 fathom ungary .. = 1.8964838 m (fixed)
232 1 feet ........... = 12 inch = 0.9144/3 m
233 1 furlong ........ = 10 chains = 220*0.9144 m
234 1 gan ............ =
235 1 hand ........... = 4 inches = 0.9144/9 m
236 1 hunh ........... = 1/8 nieu = 9.144/3456 m
237 1 inch ........... = yard/36 = 0.9144/36 m
238 1 ja ............. =
239 1 jeong .......... =
240 1 kabiet ......... = 1/4 nieu = 9.144/1728 m
241 1 ken ............ = 60/33 m
242 1 keub ........... = 12 nieu = 10 inch = 9.144/36 m
243 1 km ............. = 1000 m
244 1 lar ............ =
245 1 light year ..... = 9460730472580800 m
246 1 link uk ........ = 0.01 chains = 0.22*0.9144 m
247 1 micron ......... = 0.000001 m
248 1 mile ........... = 1760 yards = 1609.344 m
249 1 millimeter ..... = 1/1000 m
250 1 nautical mile .. = 1852 m
251 1 nieu ........... = 10/12 inch = 9.144/432 m
252 1 parsec ......... = 30856800000000000 m
253 1 pica ........... = yard/216 = 0.9144/216 m
254 1 ri japan ....... = 129600/33 m
255 1 ri korea ....... = 12960/33 m
256 1 rod ............ = 5.0292 m
257 1 sawk ........... = 2 keub = 20 inch = 9.144/18 m
258 1 sen ............ = 20 va = 40.64 m
259 1 shaku .......... = 10/33 m
260 1 span ........... = 9 inches = 0.9144/4 m
261 1 sun ............ = 1/33 m
262 1 tsuen .......... =
263 1 va ............. = 4 sawk = 80 inch = 2.032 m
264 1 yard ........... = 0.9144 m
265 1 yote ........... = 400 sen = 16256 m
266 1 zhang .......... = 3+1/3 m = 10/3 m
267 */
268 static const conv_t conv_LENGTH[] = {
269 DECLARE_CONV_UNIT(LENGTH, ANGSTROMS, "$/1X10", "$*1X10")
270 DECLARE_CONV_UNIT(LENGTH, ASTRONOMICAL_UNITS, "$*149598000000", "$/149598000000")
271 DECLARE_CONV_UNIT(LENGTH, BARLEYCORNS, "$*0.9144/108", "$/0.9144*108")
272 DECLARE_CONV_UNIT(LENGTH, CENTIMETERS, "$/100", "$*100")
273 DECLARE_CONV_UNIT(LENGTH, CHAINS_UK, "$*20.1168", "$/20.1168")
274 DECLARE_CONV_UNIT(LENGTH, CHI, "$/3", "$*3")
275 DECLARE_CONV_UNIT(LENGTH, CHOU, "$*3600/33", "$*33/3600")
276 // DECLARE_CONV_UNIT(LENGTH, CHR, "$", "$")
277 DECLARE_CONV_UNIT(LENGTH, CUN, "$/30", "$*30")
278 DECLARE_CONV_UNIT(LENGTH, FATHOMS, "$*1.8288", "$/1.8288")
279 DECLARE_CONV_UNIT(LENGTH, FATHOMS_HUNGARY, "$*1.8964838", "$/1.8964838")
280 DECLARE_CONV_UNIT(LENGTH, FEET, "$*0.3048", "$/0.3048")
281 DECLARE_CONV_UNIT(LENGTH, FURLONGS, "$*201.168", "$/201.168")
282 // DECLARE_CONV_UNIT(LENGTH, GAN, "$", "$")
283 DECLARE_CONV_UNIT(LENGTH, HANDS, "$*0,1016", "$/0,1016")
284 DECLARE_CONV_UNIT(LENGTH, HUNH, "$*9.144/3456", "$/9.144*3456")
285 DECLARE_CONV_UNIT(LENGTH, INCHES, "$*0.0254", "$/0.0254")
286 // DECLARE_CONV_UNIT(LENGTH, JA, "$", "$")
287 // DECLARE_CONV_UNIT(LENGTH, JEONG, "$", "$")
288 DECLARE_CONV_UNIT(LENGTH, KABIET, "$*9.144/1728", "$/9.144*1728")
289 DECLARE_CONV_UNIT(LENGTH, KEN, "$*60/33", "$*33/60")
290 DECLARE_CONV_UNIT(LENGTH, KEUB, "$*9.144/36", "$/9.144*36")
291 DECLARE_CONV_UNIT(LENGTH, KILOMETERS, "$*1000", "$/1000")
292 // DECLARE_CONV_UNIT(LENGTH, LAR, "$", "$")
293 DECLARE_CONV_UNIT(LENGTH, LIGHT_YEARS, "$*9460730472580800", "$/9460730472580800")
294 DECLARE_CONV_UNIT(LENGTH, LINKS_UK, "$*0.201168", "$/0.201168")
295 DECLARE_CONV_UNIT(LENGTH, METERS, "$", "$")
296 DECLARE_CONV_UNIT(LENGTH, MICRONS, "$*0.000001", "$/0.000001")
297 DECLARE_CONV_UNIT(LENGTH, MILES, "$*1609.344", "$/1609.344")
298 DECLARE_CONV_UNIT(LENGTH, MILLIMETERS, "$/1000", "$*1000")
299 DECLARE_CONV_UNIT(LENGTH, NAUTICAL_MILES, "$*1852", "$/1852")
300 DECLARE_CONV_UNIT(LENGTH, NIEU, "$*9.144/432", "$/9.144*432")
301 DECLARE_CONV_UNIT(LENGTH, PARSECS, "$*3.085678X16", "$/3.085678X16")
302 DECLARE_CONV_UNIT(LENGTH, PICAS, "$*0.9144/216", "$/0.9144*216")
303 DECLARE_CONV_UNIT(LENGTH, RODS, "$*5.0292", "$/5.0292")
304 DECLARE_CONV_UNIT(LENGTH, RI_JAPAN, "$*129600/33", "$*33/129600")
305 DECLARE_CONV_UNIT(LENGTH, RI_KOREA, "$*12960/33", "$*33/12960")
306 DECLARE_CONV_UNIT(LENGTH, SAWK, "$*9.144/18", "$/9.144*18")
307 DECLARE_CONV_UNIT(LENGTH, SEN, "$*40.64", "$/40.64")
308 DECLARE_CONV_UNIT(LENGTH, SHAKU, "$*10/33", "$*33/10")
309 DECLARE_CONV_UNIT(LENGTH, SPAN, "$*0.9144/4", "$*4/0.9144")
310 DECLARE_CONV_UNIT(LENGTH, SUN, "$*1/33", "$*33")
311 // DECLARE_CONV_UNIT(LENGTH, TSUEN, "$", "$")
312 DECLARE_CONV_UNIT(LENGTH, VA, "$*2.032", "$/2.032")
313 DECLARE_CONV_UNIT(LENGTH, YARDS, "$*0.9144", "$/0.9144")
314 DECLARE_CONV_UNIT(LENGTH, YOTE, "$*16256", "$/16256")
315 DECLARE_CONV_UNIT(LENGTH, ZHANG, "$/0.3", "$*0.3")
316 DECLARE_CONV_END
317 };
318
319 /*
320 1 BTU/min = 17.5842642 W
321 1 Foot-pound/minute = 0.02259696580552333 W
322 1 hp = 745.69987158227022 W
323 1 KW = 1000 W
324 1 MW = 1000000 W
325 */
326 static const conv_t conv_POWER[] = {
327 DECLARE_CONV_UNIT(POWER, BTUS_PER_MINUTE, "$*17.5842642", "$/17.5842642")
328 DECLARE_CONV_UNIT(POWER, FPS_PER_MINUTE, "$*0.02259696580552333", "$/0.02259696580552333")
329 DECLARE_CONV_UNIT(POWER, HORSEPOWER, "$*745.69987158227022", "$/745.69987158227022")
330 DECLARE_CONV_UNIT(POWER, KILOWATTS, "$*1000", "$/1000")
331 DECLARE_CONV_UNIT(POWER, MEGAWATTS, "$*1000000", "$/1000000")
332 DECLARE_CONV_UNIT(POWER, WATTS, "$", "$")
333 DECLARE_CONV_END
334 };
335
336 /*
337 1 ATM = 101325 Pa
338 1 BAR = 100000 Pa
339 1 hPa = 100 Pa
340 1 kPa = 1000 Pa
341 1 mm HG = 133.322 Pa
342 1 psi = 6894.757 Pa
343 */
344 static const conv_t conv_PRESSURE[] = {
345 DECLARE_CONV_UNIT(PRESSURE, ATMOSPHERES, "$*101325", "$/101325")
346 DECLARE_CONV_UNIT(PRESSURE, BARS, "$*100000", "$/100000")
347 DECLARE_CONV_UNIT(PRESSURE, HECTOPASCALS, "$*100", "$/100")
348 DECLARE_CONV_UNIT(PRESSURE, KILOPASCALS, "$*1000", "$/1000")
349 DECLARE_CONV_UNIT(PRESSURE, MM_OF_MERCURY, "$*133.322", "$/133.322")
350 DECLARE_CONV_UNIT(PRESSURE, PASCALS, "$", "$")
351 DECLARE_CONV_UNIT(PRESSURE, PSI, "$*6894.757", "$/6894.757")
352 DECLARE_CONV_END
353 };
354
355 /*
356 1 day ....... = 86400 s
357 1 hour ...... = 3600 s
358 1 microsecond = 0.000001 s
359 1 millisecond = 0.001 s
360 1 nanosecond. = 0.000000001 s
361 1 minute .... = 60 s
362 1 week ...... = 669600 s
363 */
364 static const conv_t conv_TIME[] = {
365 DECLARE_CONV_UNIT(TIME, MINUTES, "$*60", "$/60")
366 DECLARE_CONV_UNIT(TIME, DAYS, "$*86400", "$/86400")
367 DECLARE_CONV_UNIT(TIME, HOURS, "$*3600", "$/3600")
368 DECLARE_CONV_UNIT(TIME, MILLISECONDS, "$*0.001", "$/0.001")
369 DECLARE_CONV_UNIT(TIME, MICROSECONDS, "$*0.000001", "$/0.000001")
370 DECLARE_CONV_UNIT(TIME, NANOSECONDS, "$*0.000000001", "$/0.000000001")
371 DECLARE_CONV_UNIT(TIME, SECONDS, "$", "$")
372 DECLARE_CONV_UNIT(TIME, WEEKS, "$*604800", "$/604800")
373 DECLARE_CONV_UNIT(TIME, YEARS, "$*31556952", "$/31556952")
374 DECLARE_CONV_END
375 };
376
377 /*
378 C = K - 273.15
379 F = K * 9/5 - 459.67
380 R = K * 9/5
381 */
382 static const conv_t conv_TEMPERATURE[] = {
383 DECLARE_CONV_UNIT(TEMPERATURE, CELSIUS, "$+273.15", "$-273.15")
384 DECLARE_CONV_UNIT(TEMPERATURE, FAHRENHEIT, "($+459.67)*5/9", "$*9/5-459.67")
385 DECLARE_CONV_UNIT(TEMPERATURE, KELVIN, "$", "$")
386 DECLARE_CONV_UNIT(TEMPERATURE, RANKINE, "$*5/9", "$*9/5")
387 DECLARE_CONV_END
388 };
389
390 /*
391 1 cm/s = 0.01 m/s
392 1 f/h = 0.0000846666667 m/s
393 1 f/s = 0.3048 m/s
394 1 Km/h = 10/36 m/s -> 0.27778 m/s
395 1 knot = 18.52/36 m/s -> 0.51444444 m/s
396 1 mach = 340.3 m/s
397 1 mph = 0.44704 m/s
398 */
399 static const conv_t conv_VELOCITY[] = {
400 DECLARE_CONV_UNIT(VELOCITY, CMS_SECOND, "$*.01", "$/.01")
401 DECLARE_CONV_UNIT(VELOCITY, FEET_SECOND, "$*.3048", "$/.3048")
402 DECLARE_CONV_UNIT(VELOCITY, FEET_HOUR, "$*.0000846666667", "$/.0000846666667")
403 DECLARE_CONV_UNIT(VELOCITY, KILOMETERS_HOUR, "$*10/36", "$*36/10")
404 DECLARE_CONV_UNIT(VELOCITY, KNOTS, "$*18.52/36", "$*36/18.52")
405 DECLARE_CONV_UNIT(VELOCITY, MACH, "$*340.3", "$/340.3")
406 DECLARE_CONV_UNIT(VELOCITY, METERS_SECOND, "$", "$")
407 DECLARE_CONV_UNIT(VELOCITY, MILES_HOUR, "$*.44704", "$/.44704")
408 DECLARE_CONV_END
409 };
410
411 /*
412 1 barrel uk ...... = 163.65924 l
413 1 barrel oil ..... = 158.987295 l
414 1 bun ............ = 1000 l
415 1 bushel uk ...... = 36.36872 l
416 1 bushel us ...... = 35.23907017 l
417 1 cubic cm ...... = 0.001 l
418 1 cubic feet ..... = 28.316846 l
419 1 cubic inch ..... = 0.016387064 l
420 1 cubic meter .... = 1000 l
421 1 cubic yard ..... = 764.554857 l
422 1 doe ............ =
423 1 fluid ounce uk = 0.0284130625 l
424 1 fluid ounce us = 0.0295735295625 l
425 1 gallon uk ...... = 4.54609 l
426 1 gallon dry us .. = 4.40488377086 l
427 1 gallon liquid us = 3.785411784 l
428 1 gou ............ = 0.1809 l
429 1 hop ............ =
430 1 icce ........... =
431 1 kwian .......... = 2000 l
432 1 mal ............ =
433 1 milliliter ..... = 0.001 l
434 1 pint uk ........ = 0.56826125 l
435 1 pint dry us .... = 0.5506104713575 l
436 1 pint liquid us = 0.473176473 l
437 1 quart uk ....... = 1.1365225 l
438 1 quart dry us ... = 1.101220942715 l
439 1 quart liquid us = 0.946352946 l
440 1 seki ........... =
441 1 syou ........... =
442 1 tananloung ..... = 1 l
443 1 tang ........... = 20 l
444 1 to ............. = 18040 l
445 */
446 static const conv_t conv_VOLUME[] = {
447 DECLARE_CONV_UNIT(VOLUME, BARRELS_UK, "$*163.65924", "$/163.65924")
448 DECLARE_CONV_UNIT(VOLUME, BARRELS_OIL, "$*158.987295", "$/158.987295")
449 DECLARE_CONV_UNIT(VOLUME, BUN, "$*1000", "$/1000")
450 DECLARE_CONV_UNIT(VOLUME, BUSHELS_UK, "$*36.36872", "$/36.36872")
451 DECLARE_CONV_UNIT(VOLUME, BUSHELS_US, "$*35.23907017", "$/35.23907017")
452 DECLARE_CONV_UNIT(VOLUME, CUBIC_CENTIMETERS, "$*0.001", "$/0.001")
453 DECLARE_CONV_UNIT(VOLUME, CUBIC_FEET, "$*28.316846", "$/28.316846")
454 DECLARE_CONV_UNIT(VOLUME, CUBIC_INCHES, "$*0.016387064", "$/0.016387064")
455 DECLARE_CONV_UNIT(VOLUME, CUBIC_METERS, "$*1000", "$/1000")
456 DECLARE_CONV_UNIT(VOLUME, CUBIC_YARDS, "$*764.554857", "$/764.554857")
457 // DECLARE_CONV_UNIT(VOLUME, DOE, "$", "$")
458 DECLARE_CONV_UNIT(VOLUME, FLUID_OUNCES_UK, "$*0.0284130625", "$/0.0284130625")
459 DECLARE_CONV_UNIT(VOLUME, FLUID_OUNCES_US, "$*0.0295735295625", "$/0.0295735295625")
460 DECLARE_CONV_UNIT(VOLUME, GALLONS_UK, "$*4.54609", "$/4.54609")
461 DECLARE_CONV_UNIT(VOLUME, GALLONS_DRY_US, "$*4.40488377086", "$/4.40488377086")
462 DECLARE_CONV_UNIT(VOLUME, GALLONS_LIQUID_US, "$*3.785411784", "$/3.785411784")
463 DECLARE_CONV_UNIT(VOLUME, GOU, "$*0.1809", "$/0.1809")
464 // DECLARE_CONV_UNIT(VOLUME, HOP, "$", "$")
465 // DECLARE_CONV_UNIT(VOLUME, ICCE, "$", "$")
466 DECLARE_CONV_UNIT(VOLUME, KWIAN, "$*2000", "$/2000")
467 DECLARE_CONV_UNIT(VOLUME, LITERS, "$", "$")
468 // DECLARE_CONV_UNIT(VOLUME, MAL, "$", "$")
469 DECLARE_CONV_UNIT(VOLUME, MILLILITERS, "$*0.001", "$/0.001")
470 DECLARE_CONV_UNIT(VOLUME, PINTS_UK, "$*0.56826125", "$/0.56826125")
471 DECLARE_CONV_UNIT(VOLUME, PINTS_DRY_US, "$*0.5506104713575", "$/0.5506104713575")
472 DECLARE_CONV_UNIT(VOLUME, PINTS_LIQUID_US, "$*0.473176473", "$/0.473176473")
473 DECLARE_CONV_UNIT(VOLUME, QUARTS_UK, "$*1.1365225", "$/1.1365225")
474 DECLARE_CONV_UNIT(VOLUME, QUARTS_DRY_US, "$*1.101220942715", "$/1.101220942715")
475 DECLARE_CONV_UNIT(VOLUME, QUARTS_LIQUID_US, "$*0.946352946", "$/0.946352946")
476 // DECLARE_CONV_UNIT(VOLUME, SEKI, "$", "$")
477 // DECLARE_CONV_UNIT(VOLUME, SYOU, "$", "$")
478 DECLARE_CONV_UNIT(VOLUME, TANANLOUNG, "$", "$")
479 DECLARE_CONV_UNIT(VOLUME, TANG, "$*20", "$/20")
480 DECLARE_CONV_UNIT(VOLUME, TO, "$*18040", "$/18040")
481 DECLARE_CONV_END
482 };
483
484 /*
485 1 baht ............ = 12.244 g
486 1 carat ........... = 0.2 g
487 1 chung ........... =
488 1 don ............. =
489 1 geun ............ =
490 1 gwan ............ =
491 1 harb ............ =
492 1 jin china ....... =
493 1 jin taiwan ...... =
494 1 Kan ............. = 3750 g
495 1 Kilograms ....... = 1000 g
496 1 Kin ............. = 600 g
497 1 Liang China ..... =
498 1 Liang Taiwan .... =
499 1 monme ........... = 3.75 g
500 1 ounce avoirdupois = 28.349523125 g
501 1 ounce troy ...... = 31.1034768 g
502 1 pound ........... = 453.59237 g
503 1 quintal metric .. = 100000 g
504 1 saloung ......... =
505 1 stone ........... = 6350.29318 g
506 1 tamlung ......... =
507 1 ton ............. = 1000000 g
508 1 ton uk .......... = 1016046.9088 g // long ton
509 1 ton us .......... = 907184.74 g // short ton
510 */
511 /*
512 1 chang = 20 tamlung
513 1 tamlung = 4 baht
514 1 baht = 4 saloung
515 1 saloung =
516
517 1 chang = 6/5 kg = 1200 g
518 1 tamlung = 1/20 chang = 60 g
519 1 baht = 1/4 tamlung = 15 g
520 1 saloung = 1/4 bath = 15/4 g
521 */
522 static const conv_t conv_WEIGHT[] = {
523 DECLARE_CONV_UNIT(WEIGHT, BAHT, "$*12.244", "$/12.244")
524 DECLARE_CONV_UNIT(WEIGHT, CARATS, "$*0.2", "$/0.2")
525 // DECLARE_CONV_UNIT(WEIGHT, CHUNG, "$", "$")
526 // DECLARE_CONV_UNIT(WEIGHT, DON, "$", "$")
527 // DECLARE_CONV_UNIT(WEIGHT, GEUN, "$", "$")
528 DECLARE_CONV_UNIT(WEIGHT, GRAMS, "$", "$")
529 // DECLARE_CONV_UNIT(WEIGHT, GWAN, "$", "$")
530 // DECLARE_CONV_UNIT(WEIGHT, HARB, "$", "$")
531 // DECLARE_CONV_UNIT(WEIGHT, JIN_CHINA, "$", "$")
532 // DECLARE_CONV_UNIT(WEIGHT, JIN_TAIWAN, "$", "$")
533 DECLARE_CONV_UNIT(WEIGHT, KAN, "$*3750", "$/3750")
534 DECLARE_CONV_UNIT(WEIGHT, KILOGRAMS, "$*1000", "$/1000")
535 DECLARE_CONV_UNIT(WEIGHT, KIN, "$*600", "$/600")
536 // DECLARE_CONV_UNIT(WEIGHT, LIANG_CHINA, "$", "$")
537 // DECLARE_CONV_UNIT(WEIGHT, LIANG_TAIWAN, "$", "$")
538 DECLARE_CONV_UNIT(WEIGHT, MONME, "$*3.75", "$/3.75")
539 DECLARE_CONV_UNIT(WEIGHT, OUNCES_AVOIRDUPOIS, "$*28.349523125", "$/28.349523125")
540 DECLARE_CONV_UNIT(WEIGHT, OUNCES_TROY, "$*31.1034768", "$/31.1034768")
541 DECLARE_CONV_UNIT(WEIGHT, POUNDS, "$*453.59237", "$/453.59237")
542 DECLARE_CONV_UNIT(WEIGHT, QUINTAL_METRIC, "$*100000", "$/100000")
543 // DECLARE_CONV_UNIT(WEIGHT, SALOUNG, "$", "$")
544 DECLARE_CONV_UNIT(WEIGHT, STONES, "$*6350.29318", "$/6350.29318")
545 // DECLARE_CONV_UNIT(WEIGHT, TAMLUNG, "$", "$")
546 DECLARE_CONV_UNIT(WEIGHT, TONNES, "$*1000000", "$/1000000")
547 DECLARE_CONV_UNIT(WEIGHT, TONS_UK, "$*1016046.9088", "$/1016046.9088")
548 DECLARE_CONV_UNIT(WEIGHT, TONS_US, "$*907184.74", "$/907184.74")
549 DECLARE_CONV_END
550 };
551
552 static const conv_category_t conv_table[] = {
553 DECLARE_CONV_CAT(ANGLE)
554 DECLARE_CONV_CAT(AREA)
555 DECLARE_CONV_CAT(CONSUMPTION)
556 DECLARE_CONV_CAT(CURRENCY)
557 DECLARE_CONV_CAT(ENERGY)
558 DECLARE_CONV_CAT(LENGTH)
559 DECLARE_CONV_CAT(POWER)
560 DECLARE_CONV_CAT(PRESSURE)
561 DECLARE_CONV_CAT(TIME)
562 DECLARE_CONV_CAT(TEMPERATURE)
563 DECLARE_CONV_CAT(VELOCITY)
564 DECLARE_CONV_CAT(VOLUME)
565 DECLARE_CONV_CAT(WEIGHT)
566 };
567
568 void ConvExecute(HWND hWnd)
569 {
570 DWORD c_cat = (DWORD)SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETCURSEL, 0, 0);
571 const conv_t *items = NULL;
572 DWORD from = SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETCURSEL, 0, 0);
573 DWORD to = SendDlgItemMessage(hWnd, IDC_COMBO_TO, CB_GETCURSEL, 0, 0);
574 TCHAR txt_cb[128];
575 TCHAR txt[128];
576 const conv_t *item;
577
578 /* do nothing if the indexes point to the same unit */
579 if (from == to)
580 return;
581
582 /* Search correct category, since it can be sorted too */
583 SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETLBTEXT, c_cat, (LPARAM)txt_cb);
584 for (c_cat=0; c_cat < SIZEOF(conv_table); c_cat++) {
585 LoadString(calc.hInstance, conv_table[c_cat].category, txt, SIZEOF(txt));
586 if (!_tcscmp(txt_cb, txt)) {
587 items = conv_table[c_cat].items;
588 break;
589 }
590 }
591
592 /* The units can be sorted, so I must search the exact match */
593 item = items;
594 SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETLBTEXT, from, (LPARAM)txt_cb);
595 while (item->unit) {
596 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
597 if (!_tcscmp(txt_cb, txt)) {
598 from = item-items;
599 break;
600 }
601 item++;
602 }
603 SendDlgItemMessage(hWnd, IDC_COMBO_TO, CB_GETLBTEXT, to, (LPARAM)txt_cb);
604 item = items;
605 while (item->unit) {
606 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
607 if (!_tcscmp(txt_cb, txt)) {
608 to = item-items;
609 break;
610 }
611 item++;
612 }
613
614 calc.Convert[0].data = (char *)items[from].formula_from;
615 calc.Convert[1].data = (char *)items[to].formula_to;
616 calc.Convert[0].wm_msg = WM_HANDLE_FROM;
617 calc.Convert[1].wm_msg = WM_HANDLE_TO;
618 PostMessage(hWnd, WM_START_CONV, 0, MAKELPARAM(0, WM_HANDLE_FROM));
619 }
620
621 void ConvAdjust(HWND hWnd, int n_cat)
622 {
623 TCHAR txt[128];
624 TCHAR txt_cat[128];
625 HWND hFromWnd = GetDlgItem(hWnd, IDC_COMBO_FROM);
626 HWND hToWnd = GetDlgItem(hWnd, IDC_COMBO_TO);
627 const conv_t *item;
628 unsigned int n;
629
630 SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETLBTEXT, n_cat, (LPARAM)txt_cat);
631 for (n=0; n<SIZEOF(conv_table); n++) {
632 item = conv_table[n].items;
633 LoadString(calc.hInstance, conv_table[n].category, txt, SIZEOF(txt));
634 if (!_tcscmp(txt_cat, txt))
635 break;
636 }
637
638 SendMessage(hFromWnd, CB_RESETCONTENT, 0, 0);
639 SendMessage(hToWnd, CB_RESETCONTENT, 0, 0);
640 while (item->unit) {
641 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
642 SendMessage(hFromWnd, CB_ADDSTRING, 0, (LPARAM)txt);
643 SendMessage(hToWnd, CB_ADDSTRING, 0, (LPARAM)txt);
644 item++;
645 }
646 SendMessage(hFromWnd, CB_SETCURSEL, 0, 0);
647 SendMessage(hToWnd, CB_SETCURSEL, 0, 0);
648 }
649
650 void ConvInit(HWND hWnd)
651 {
652 HWND hCatWnd = GetDlgItem(hWnd, IDC_COMBO_CATEGORY);
653 TCHAR txt[128];
654 unsigned int n;
655
656 /* Fill category combo */
657 for (n=0; n<SIZEOF(conv_table); n++) {
658 LoadString(calc.hInstance, conv_table[n].category, txt, SIZEOF(txt));
659 SendMessage(hCatWnd, CB_ADDSTRING, 0, (LPARAM)txt);
660 }
661 SendMessage(hCatWnd, CB_SETCURSEL, 0, 0);
662 ConvAdjust(hWnd, 0);
663 }
664