ReactOS  0.4.14-dev-49-gfb4591c
convert.c
Go to the documentation of this file.
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 {
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;
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")
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")
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")
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")
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")
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")
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, "$", "$")
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")
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")
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")
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")
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")
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")
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)
557  DECLARE_CONV_CAT(ENERGY)
559  DECLARE_CONV_CAT(POWER)
560  DECLARE_CONV_CAT(PRESSURE)
562  DECLARE_CONV_CAT(TEMPERATURE)
563  DECLARE_CONV_CAT(VELOCITY)
566 };
567 
569 {
571  const conv_t *items = NULL;
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 */
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;
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  }
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;
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 
631  for (n=0; n<SIZEOF(conv_table); n++) {
632  item = conv_table[n].items;
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 
651 {
653  TCHAR txt[128];
654  unsigned int n;
655 
656  /* Fill category combo */
657  for (n=0; n<SIZEOF(conv_table); n++) {
659  SendMessage(hCatWnd, CB_ADDSTRING, 0, (LPARAM)txt);
660  }
661  SendMessage(hCatWnd, CB_SETCURSEL, 0, 0);
662  ConvAdjust(hWnd, 0);
663 }
664 
DWORD unit
Definition: convert.c:47
sequence_t Convert[2]
Definition: calc.h:196
Definition: convert.c:46
UINT wm_msg
Definition: calc.h:151
__int64 TIME
Definition: ms-dtyp.idl:32
static const conv_t conv_LENGTH[]
Definition: convert.c:268
#define DECLARE_CONV_END
Definition: convert.c:63
static const conv_t conv_TEMPERATURE[]
Definition: convert.c:382
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
Definition: tcscmp.h:8
#define CB_GETLBTEXT
Definition: winuser.h:1934
static const conv_t conv_PRESSURE[]
Definition: convert.c:344
void ConvAdjust(HWND hWnd, int n_cat)
Definition: convert.c:621
#define INCHES
Definition: imgedwnd.h:8
#define MAKELPARAM(l, h)
Definition: winuser.h:3947
static const conv_t conv_ANGLE[]
Definition: convert.c:72
HWND hWnd
Definition: settings.c:17
#define WM_HANDLE_FROM
Definition: calc.h:29
GLdouble n
Definition: glext.h:7729
static const conv_t conv_VOLUME[]
Definition: convert.c:446
#define SendDlgItemMessage
Definition: winuser.h:5743
static const conv_t conv_ENERGY[]
Definition: convert.c:204
const conv_t * items
Definition: convert.c:54
#define DWORD
Definition: nt_native.h:44
#define CB_GETCURSEL
Definition: winuser.h:1925
#define DECLARE_CONV_UNIT(_category, _unit, _from, _to)
Definition: convert.c:60
void ConvExecute(HWND hWnd)
Definition: convert.c:568
#define MICROSECONDS(micros)
Definition: nfs41_driver.c:115
Definition: compat.h:1896
#define SIZEOF(_ar)
Definition: calc.h:97
#define NANOSECONDS(nanos)
Definition: nfs41_driver.c:114
const char * formula_to
Definition: convert.c:49
static const conv_t conv_CURRENCY[]
Definition: convert.c:167
#define CB_ADDSTRING
Definition: winuser.h:1918
static const conv_t conv_AREA[]
Definition: convert.c:116
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
HINSTANCE hInstance
Definition: calc.h:167
Definition: inflate.h:48
#define IDC_COMBO_CATEGORY
Definition: resource.h:107
#define CB_RESETCONTENT
Definition: winuser.h:1941
#define DECLARE_CONV_CAT(_category)
Definition: convert.c:57
static const conv_t conv_VELOCITY[]
Definition: convert.c:399
#define PostMessage
Definition: winuser.h:5733
char TCHAR
Definition: xmlstorage.h:189
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
const char * formula_from
Definition: convert.c:48
unsigned long DWORD
Definition: ntddk_ex.h:95
void ConvInit(HWND hWnd)
Definition: convert.c:650
#define IDC_COMBO_FROM
Definition: resource.h:108
#define CB_SETCURSEL
Definition: winuser.h:1943
#define SE
Definition: ftp_var.h:28
#define WM_START_CONV
Definition: calc.h:28
const DWORD category
Definition: convert.c:53
char * data
Definition: calc.h:149
#define MACH
Definition: ruserpass.c:37
#define VOLUME
Definition: fatfs.h:186
static const conv_t conv_WEIGHT[]
Definition: convert.c:522
#define IDC_COMBO_TO
Definition: resource.h:109
static ATOM item
Definition: dde.c:856
#define WEIGHT(stat, opt)
Definition: zstd_opt.c:36
static const conv_category_t conv_table[]
Definition: convert.c:552
static const conv_t conv_TIME[]
Definition: convert.c:364
#define SendMessage
Definition: winuser.h:5744
static const conv_t conv_POWER[]
Definition: convert.c:326
#define WM_HANDLE_TO
Definition: calc.h:30
CardRegion * from
Definition: spigame.cpp:19
static TCHAR * items[]
Definition: page1.c:45
Definition: inteng.h:13
calc_t calc
Definition: winmain.c:247
#define SECONDS(seconds)
Definition: nfs41_driver.c:117
#define CENTIMETERS
Definition: imgedwnd.h:7
#define LoadString
Definition: winuser.h:5720
#define MILLISECONDS(milli)
Definition: nfs41_driver.c:116
static const conv_t conv_CONSUMPTION[]
Definition: convert.c:159