ReactOS 0.4.16-dev-122-g325d74c
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*/
46typedef struct {
48 const char *formula_from;
49 const char *formula_to;
50} conv_t;
51
52typedef struct {
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*/
72static 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*/
116static 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*/
159static 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
167static 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, PORTUGUESE_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*/
204static 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*/
268static 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*/
326static 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*/
344static 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*/
364static 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 */
382static 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*/
399static 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*/
446static 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/*
5121 chang = 20 tamlung
5131 tamlung = 4 baht
5141 baht = 4 saloung
5151 saloung =
516
5171 chang = 6/5 kg = 1200 g
5181 tamlung = 1/20 chang = 60 g
5191 baht = 1/4 tamlung = 15 g
5201 saloung = 1/4 bath = 15/4 g
521*/
522static 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
552static 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++) {
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
621void 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++) {
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
static const conv_t conv_ENERGY[]
Definition: convert.c:204
void ConvExecute(HWND hWnd)
Definition: convert.c:568
static const conv_t conv_VOLUME[]
Definition: convert.c:446
#define DECLARE_CONV_CAT(_category)
Definition: convert.c:57
void ConvInit(HWND hWnd)
Definition: convert.c:650
static const conv_t conv_VELOCITY[]
Definition: convert.c:399
static const conv_t conv_WEIGHT[]
Definition: convert.c:522
static const conv_t conv_TEMPERATURE[]
Definition: convert.c:382
static const conv_category_t conv_table[]
Definition: convert.c:552
static const conv_t conv_POWER[]
Definition: convert.c:326
static const conv_t conv_AREA[]
Definition: convert.c:116
void ConvAdjust(HWND hWnd, int n_cat)
Definition: convert.c:621
static const conv_t conv_ANGLE[]
Definition: convert.c:72
#define DECLARE_CONV_END
Definition: convert.c:63
static const conv_t conv_TIME[]
Definition: convert.c:364
static const conv_t conv_CONSUMPTION[]
Definition: convert.c:159
#define DECLARE_CONV_UNIT(_category, _unit, _from, _to)
Definition: convert.c:60
static const conv_t conv_PRESSURE[]
Definition: convert.c:344
static const conv_t conv_CURRENCY[]
Definition: convert.c:167
static const conv_t conv_LENGTH[]
Definition: convert.c:268
#define IDC_COMBO_TO
Definition: resource.h:111
#define IDC_COMBO_CATEGORY
Definition: resource.h:109
#define IDC_COMBO_FROM
Definition: resource.h:110
HWND hWnd
Definition: settings.c:17
#define WM_HANDLE_FROM
Definition: calc.h:29
#define SIZEOF(_ar)
Definition: calc.h:97
#define WM_START_CONV
Definition: calc.h:28
calc_t calc
Definition: winmain.c:247
#define WM_HANDLE_TO
Definition: calc.h:30
#define NULL
Definition: types.h:112
@ LENGTH
Definition: inflate.c:185
#define VOLUME
Definition: fatfs.h:186
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SE
Definition: ftp_var.h:28
GLdouble n
Definition: glext.h:7729
#define _tcscmp
Definition: tchar.h:1424
static ATOM item
Definition: dde.c:856
__int64 TIME
Definition: ms-dtyp.idl:32
#define SECONDS(seconds)
Definition: nfs41_driver.c:117
#define NANOSECONDS(nanos)
Definition: nfs41_driver.c:114
#define MICROSECONDS(micros)
Definition: nfs41_driver.c:115
#define MILLISECONDS(milli)
Definition: nfs41_driver.c:116
#define DWORD
Definition: nt_native.h:44
static TCHAR * items[]
Definition: page1.c:45
#define MACH
Definition: ruserpass.c:37
CardRegion * from
Definition: spigame.cpp:19
HINSTANCE hInstance
Definition: calc.h:167
sequence_t Convert[2]
Definition: calc.h:196
const conv_t * items
Definition: convert.c:54
const DWORD category
Definition: convert.c:53
Definition: convert.c:46
const char * formula_to
Definition: convert.c:49
DWORD unit
Definition: convert.c:47
const char * formula_from
Definition: convert.c:48
char * data
Definition: calc.h:149
UINT wm_msg
Definition: calc.h:151
Definition: inteng.h:14
Definition: compat.h:2255
LONG_PTR LPARAM
Definition: windef.h:208
#define CB_GETLBTEXT
Definition: winuser.h:1955
#define MAKELPARAM(l, h)
Definition: winuser.h:4011
#define CB_SETCURSEL
Definition: winuser.h:1964
#define CB_RESETCONTENT
Definition: winuser.h:1962
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define CB_ADDSTRING
Definition: winuser.h:1939
#define SendMessage
Definition: winuser.h:5855
#define PostMessage
Definition: winuser.h:5844
#define LoadString
Definition: winuser.h:5831
#define CB_GETCURSEL
Definition: winuser.h:1946
#define SendDlgItemMessage
Definition: winuser.h:5854
char TCHAR
Definition: xmlstorage.h:189
#define WEIGHT(stat, opt)
Definition: zstd_opt.c:38