Lars Martin Hambro <lars_martin4 AT hotmail DOT com>
[reactos.git] / reactos / base / applications / calc / convert.c
1 #include "calc.h"
2
3 /*
4 The conversion is made by converting the "from" unit
5 into the I.S. unit and then the I.S. unit is converted
6 into the "from" one.
7
8 The base units for all categories are:
9
10 AREA...........square meters
11 CONSUMPTION....kilometers per liter
12 CURRENCY.......Euro
13 ENERGY.........joule
14 LENGTHS........meters
15 POWER..........Watt
16 PRESSURE.......Pascal
17 TEMPERATURE....kelvin
18 VELOCITY.......meters per second
19 VOLUME.........liter
20 WEIGHT.........kilogram
21
22 The '$' character is used as "what you read into the display".
23 */
24 typedef struct {
25 DWORD unit;
26 const char *formula_from;
27 const char *formula_to;
28 } conv_t;
29
30 typedef struct {
31 const DWORD category;
32 const conv_t *items;
33 } conv_category_t;
34
35 #define DECLARE_CONV_CAT(_category) \
36 { IDS_CONV_##_category, conv_##_category },
37
38 #define DECLARE_CONV_UNIT(_category, _unit, _from, _to ) \
39 { IDS_##_category##_##_unit, _from, _to },
40
41 #define DECLARE_CONV_END \
42 { 0, NULL, NULL },
43
44 /*
45 1 acre ................ = 4840 square yd = 4046,8564224 mq
46 1 acre brazil ......... =
47 1 acre france ......... =
48 1 acre scots .......... = 5000 mq
49 1 acre us ............. = 4840*(36/39.37)^2 m = 6272640/1549.9969 m
50 1 are ................. = 100 mq
51 1 chou ................ = 108000*(10/33)^2 mq
52 1 danbo ............... =
53 1 ha .................. = 10000 mq
54 1 jeongbo ............. =
55 1 morgen hungary ...... =
56 1 mu .................. =
57 1 ping ................ =
58 1 pyeong .............. =
59 1 pyeongbangja ........ =
60 1 rai ................. =
61 1 se .................. = 1080*(10/33)^2 mq
62 1 square cm ........... = 0.0001 mq
63 1 square chr .......... =
64 1 square fathom ....... = 1.8288^2 = 3.34450944 mq
65 1 square fathom hungary = 1.8964838^2 = 3.59665080366244 mq
66 1 square ft ........... = 0,09290304 mq
67 1 square in ........... = 0,00064516 mq
68 1 square km ........... = 1000000 mq
69 1 square lar .......... =
70 1 square mile ......... = 1609.344^2 = 2589988.110336 mq
71 1 square mm ........... = 0,000001 mq
72 1 square shaku ........ = (10/33)^2 mq
73 1 square tsuen ........ =
74 1 square va ........... =
75 1 square yard ......... = 0,83612736 mq
76 1 tan ................. = 10800*(10/33)^2 mq
77 1 tsubo ............... = 36*(10/33)^2 mq
78 */
79 static const conv_t conv_AREA[] = {
80 DECLARE_CONV_UNIT(AREA, ACRES, "$*4046,8564224", "$/4046,8564224")
81 // DECLARE_CONV_UNIT(AREA, ACRES_BRAZIL, "$", "$")
82 // DECLARE_CONV_UNIT(AREA, ACRES_FRANCE, "$", "$")
83 DECLARE_CONV_UNIT(AREA, ACRES_US, "$*627264/154.99969", "$/627264*154.99969")
84 DECLARE_CONV_UNIT(AREA, ACRES_SCOTS, "$*5000", "$/5000")
85 DECLARE_CONV_UNIT(AREA, ARES, "$*100", "$/100")
86 DECLARE_CONV_UNIT(AREA, CHOU, "$*10800000/1089", "$*1089/10800000")
87 // DECLARE_CONV_UNIT(AREA, DANBO, "$", "$")
88 DECLARE_CONV_UNIT(AREA, HECTARES, "$*10000", "$/10000")
89 // DECLARE_CONV_UNIT(AREA, JEONGBO, "$", "$")
90 // DECLARE_CONV_UNIT(AREA, MORGEN_HUNGARY, "$", "$")
91 // DECLARE_CONV_UNIT(AREA, MU, "$", "$")
92 // DECLARE_CONV_UNIT(AREA, PING, "$", "$")
93 // DECLARE_CONV_UNIT(AREA, PYEONG, "$", "$")
94 // DECLARE_CONV_UNIT(AREA, PYEONGBANGJA, "$", "$")
95 // DECLARE_CONV_UNIT(AREA, RAI, "$", "$")
96 DECLARE_CONV_UNIT(AREA, SE, "$*108000/1089", "$*1089/108000")
97 DECLARE_CONV_UNIT(AREA, SQUARE_CENTIMETERS, "$*0,0001", "$/0,0001")
98 // DECLARE_CONV_UNIT(AREA, SQUARE_CHR, "$", "$")
99 DECLARE_CONV_UNIT(AREA, SQUARE_FATHOMS, "$*3.34450944", "$/3.34450944")
100 DECLARE_CONV_UNIT(AREA, SQUARE_FATHOMS_HUNGARY, "$*3.59665080366244", "$/3.59665080366244")
101 DECLARE_CONV_UNIT(AREA, SQUARE_FEET, "$*0,09290304", "$/0,09290304")
102 DECLARE_CONV_UNIT(AREA, SQUARE_INCHES, "$*0,00064516", "$/0.00064516")
103 DECLARE_CONV_UNIT(AREA, SQUARE_KILOMETERS, "$*1000000", "$/1000000")
104 // DECLARE_CONV_UNIT(AREA, SQUARE_LAR, "$", "$")
105 DECLARE_CONV_UNIT(AREA, SQUARE_METER, "$", "$")
106 DECLARE_CONV_UNIT(AREA, SQUARE_MILES, "$*2589988.110336", "$/2589988.110336")
107 DECLARE_CONV_UNIT(AREA, SQUARE_MILLIMETERS, "$*1000000", "$/1000000")
108 DECLARE_CONV_UNIT(AREA, SQUARE_SHAKU, "$*100/1089", "$/1089*100")
109 // DECLARE_CONV_UNIT(AREA, SQUARE_TSUEN, "$", "$")
110 // DECLARE_CONV_UNIT(AREA, SQUARE_VA, "$", "$")
111 DECLARE_CONV_UNIT(AREA, SQUARE_YARD, "$*0,83612736", "$/0,83612736")
112 DECLARE_CONV_UNIT(AREA, TAN, "$*1080000/1089", "$*1089/1080000")
113 DECLARE_CONV_UNIT(AREA, TSUBO, "$*1188/1089", "$*1089/1188")
114 DECLARE_CONV_END
115 };
116
117 /*
118 1 l/100Km = 100 km/l -> y = 100/x
119 1 miles/gal uk = 1.609344/4.54609 km/l
120 1 miles/gal us = 1.609344/3.785411784 km/l
121 */
122 static const conv_t conv_CONSUMPTION[] = {
123 DECLARE_CONV_UNIT(CONSUMPTION, KM_PER_L, "$", "$")
124 DECLARE_CONV_UNIT(CONSUMPTION, L_PER_100_KM, "100/$", "100/$")
125 DECLARE_CONV_UNIT(CONSUMPTION, MILES_GALLON_UK, "$*1.609344/4.54609", "$/1.609344*4.54609")
126 DECLARE_CONV_UNIT(CONSUMPTION, MILES_GALLON_US, "$*1.609344/3.785411784", "$/1.609344*3.785411784")
127 DECLARE_CONV_END
128 };
129
130 static const conv_t conv_CURRENCY[] = {
131 DECLARE_CONV_UNIT(CURRENCY, AUSTRIAN_SCHILLING, "$/13,7603", "$*13,7603")
132 DECLARE_CONV_UNIT(CURRENCY, BELGIAN_FRANC, "$/40,3399", "$*40,3399")
133 DECLARE_CONV_UNIT(CURRENCY, CYPRIOT_POUND, "$/0,585274","$*0,585274")
134 DECLARE_CONV_UNIT(CURRENCY, DEUTSCHE_MARK, "$/1,9558", "$*1,9558")
135 DECLARE_CONV_UNIT(CURRENCY, DUTCH_GUILDER, "$/2,20371", "$*2,20371")
136 DECLARE_CONV_UNIT(CURRENCY, EURO, "$", "$")
137 DECLARE_CONV_UNIT(CURRENCY, FINNISH_MARKKA, "$/5,9457", "$*5,9457")
138 DECLARE_CONV_UNIT(CURRENCY, FRENCH_FRANC, "$/6,5596", "$*6,5596")
139 DECLARE_CONV_UNIT(CURRENCY, GREEK_DRACHMA, "$/340,75", "$*340,75")
140 DECLARE_CONV_UNIT(CURRENCY, IRISH_POUND, "$/0,7876", "$*0,7876")
141 DECLARE_CONV_UNIT(CURRENCY, ITALIAN_LIRA, "$/1936.27", "$*1936.27")
142 DECLARE_CONV_UNIT(CURRENCY, LUXEMBOURG_FRANC, "$/40,3399", "$*40,3399")
143 DECLARE_CONV_UNIT(CURRENCY, MALTESE_LIRA, "$/0.42930", "$*0.42930")
144 DECLARE_CONV_UNIT(CURRENCY, PORTOGUESE_ESCUDO, "$/200,482", "$*200,482")
145 DECLARE_CONV_UNIT(CURRENCY, SLOVENIAN_TOLAR, "$/239,640", "$*239,640")
146 DECLARE_CONV_UNIT(CURRENCY, SPANISH_PESETA, "$/166,386", "$*166,386")
147 DECLARE_CONV_END
148 };
149
150 /*
151 1 15^C ..... = 4.1855 J
152 1 ERG ...... = 0.0000001 J
153 1 IT calorie = 4.1868 J
154 1 KJ ....... = 1000 J
155 1 KWh ...... = 3600 J
156 1 IUNS ..... = 4.182 J
157 1 calth .... = 4.184 J
158 */
159 static const conv_t conv_ENERGY[] = {
160 DECLARE_CONV_UNIT(ENERGY, 15_C_CALORIES, "$*4.1855", "$/4.1855")
161 DECLARE_CONV_UNIT(ENERGY, ERGS, "$*.0000001", "$/.0000001")
162 DECLARE_CONV_UNIT(ENERGY, IT_CALORIES, "$*4.1868", "$/4.1868")
163 DECLARE_CONV_UNIT(ENERGY, JOULES, "$", "$")
164 DECLARE_CONV_UNIT(ENERGY, KILOJOULES, "$*1000", "$/1000")
165 DECLARE_CONV_UNIT(ENERGY, KILOWATT_HOURS, "$*3600", "$/3600")
166 DECLARE_CONV_UNIT(ENERGY, NUTRITION_CALORIES, "$*4.182", "$/4.182")
167 DECLARE_CONV_UNIT(ENERGY, TH_CALORIES, "$*4.184", "$/4.184")
168 DECLARE_CONV_END
169 };
170
171 /*
172 1 angstrom ....... = 0.0000000001 m
173 1 astronomila unit = 149598000000 m
174 1 barleycorn ..... = 1/3 inch = 0.9144/108 m
175 1 cm ............. = 1/100 m
176 1 chain uk ....... = 22 yards = 22*0.9144 m
177 1 chi ............ =
178 1 chou ........... = 3600/33 m
179 1 chr ............ =
180 1 fathom ......... = 2 yard = 2*0.9144 m
181 1 fathom ungary .. = 1.8964838 m (fixed)
182 1 feet ........... = 12 inch = 0.9144/3 m
183 1 furlong ........ = 10 chains = 220*0.9144 m
184 1 gan ............ =
185 1 hand ........... = 4 inches = 0.9144/9 m
186 1 hunh ........... =
187 1 inch ........... = yard/36 = 0.9144/36 m
188 1 ja ............. =
189 1 jeong .......... =
190 1 kabiet ......... =
191 1 ken ............ = 60/33 m
192 1 keub ........... =
193 1 km ............. = 1000 m
194 1 lar ............ =
195 1 light year ..... = 9460730472580800 m
196 1 link uk ........ = 0.01 chains = 0.22*0.9144 m
197 1 mile ........... = 1760 yards = 1609.344 m
198 1 millimeter ..... = 1/1000 m
199 1 nautical mile .. = 1852 m
200 1 nieu ........... =
201 1 parsec ......... = 30856800000000000 m
202 1 pica ........... = yard/216 = 0.9144/216 m
203 1 ri japan ....... =
204 1 ri korea ....... =
205 1 sawk ........... =
206 1 sen ............ =
207 1 shaku .......... = 10/33 m
208 1 span ........... = 9 inches = 0.9144/4 m
209 1 sun ............ = 10/330 m
210 1 tsuen .......... =
211 1 va ............. =
212 1 yard ........... = 0.9144 m
213 1 yote ........... =
214 1 zhang .......... =
215 */
216 static const conv_t conv_LENGTH[] = {
217 DECLARE_CONV_UNIT(LENGTH, ANGSTROMS, "$*0.0000000001", "$/0.0000000001")
218 DECLARE_CONV_UNIT(LENGTH, ASTRONOMILA_UNITS, "$*149598000000", "$/149598000000")
219 DECLARE_CONV_UNIT(LENGTH, BARLEYCORNS, "$*0.9144/108", "$/0.9144*108")
220 DECLARE_CONV_UNIT(LENGTH, CENTIMETERS, "$/100", "$*100")
221 DECLARE_CONV_UNIT(LENGTH, CHAINS_UK, "$*20.1168", "$/20.1168")
222 // DECLARE_CONV_UNIT(LENGTH, CHI, "$", "$")
223 DECLARE_CONV_UNIT(LENGTH, CHOU, "$*3600/33", "$*33/3600")
224 // DECLARE_CONV_UNIT(LENGTH, CHR, "$", "$")
225 // DECLARE_CONV_UNIT(LENGTH, CUN, "$", "$")
226 DECLARE_CONV_UNIT(LENGTH, FATHOMS, "$*1.8288", "$/1.8288")
227 DECLARE_CONV_UNIT(LENGTH, FATHOMS_HUNGARY, "$*1.8964838", "$/1.8964838")
228 DECLARE_CONV_UNIT(LENGTH, FEET, "$*0.3048", "$/0.3048")
229 DECLARE_CONV_UNIT(LENGTH, FURLONGS, "$*201.168", "$/201.168")
230 // DECLARE_CONV_UNIT(LENGTH, GAN, "$", "$")
231 DECLARE_CONV_UNIT(LENGTH, HANDS, "$*0,1016", "$/0,1016")
232 // DECLARE_CONV_UNIT(LENGTH, HUNH, "$", "$")
233 DECLARE_CONV_UNIT(LENGTH, INCHES, "$*0.0254", "$/0.0254")
234 // DECLARE_CONV_UNIT(LENGTH, JA, "$", "$")
235 // DECLARE_CONV_UNIT(LENGTH, JEONG, "$", "$")
236 // DECLARE_CONV_UNIT(LENGTH, KABIET, "$", "$")
237 DECLARE_CONV_UNIT(LENGTH, KEN, "$*60/33", "$*33/60")
238 // DECLARE_CONV_UNIT(LENGTH, KEUB, "$", "$")
239 DECLARE_CONV_UNIT(LENGTH, KILOMETERS, "$*1000", "$/1000")
240 // DECLARE_CONV_UNIT(LENGTH, LAR, "$", "$")
241 DECLARE_CONV_UNIT(LENGTH, LIGHT_YEARS, "$*9460730472580800", "$/9460730472580800")
242 DECLARE_CONV_UNIT(LENGTH, LINKS_UK, "$*0.201168", "$/0.201168")
243 DECLARE_CONV_UNIT(LENGTH, METERS, "$", "$")
244 DECLARE_CONV_UNIT(LENGTH, MILES, "$*1609.344", "$/1609.344")
245 DECLARE_CONV_UNIT(LENGTH, MILLIMETERS, "$/1000", "$*1000")
246 DECLARE_CONV_UNIT(LENGTH, NAUTICAL_MILES, "$*1852", "$/1852")
247 // DECLARE_CONV_UNIT(LENGTH, NIEU, "$", "$")
248 DECLARE_CONV_UNIT(LENGTH, PARSECS, "$*30856800000000000", "$/30856800000000000")
249 DECLARE_CONV_UNIT(LENGTH, PICAS, "$*0.9144/216", "$/0.9144*216")
250 // DECLARE_CONV_UNIT(LENGTH, RI_JAPAN, "$", "$")
251 // DECLARE_CONV_UNIT(LENGTH, RI_KOREA, "$", "$")
252 // DECLARE_CONV_UNIT(LENGTH, SAWK, "$", "$")
253 // DECLARE_CONV_UNIT(LENGTH, SEN, "$", "$")
254 DECLARE_CONV_UNIT(LENGTH, SHAKU, "$*10/33", "$*33/10")
255 DECLARE_CONV_UNIT(LENGTH, SPAN, "$*0.9144/4", "$*4/0.9144")
256 DECLARE_CONV_UNIT(LENGTH, SUN, "$*10/330", "$*330/10")
257 // DECLARE_CONV_UNIT(LENGTH, TSUEN, "$", "$")
258 // DECLARE_CONV_UNIT(LENGTH, VA, "$", "$")
259 DECLARE_CONV_UNIT(LENGTH, YARDS, "$*0.9144", "$/0.9144")
260 // DECLARE_CONV_UNIT(LENGTH, YOTE, "$", "$")
261 // DECLARE_CONV_UNIT(LENGTH, ZHANG, "$", "$")
262 DECLARE_CONV_END
263 };
264
265 /*
266 1 hp = 745.69987158227022 W
267 1 KW = 1000 W
268 1 MW = 1000000 W
269 */
270 static const conv_t conv_POWER[] = {
271 DECLARE_CONV_UNIT(POWER, HORSEPOWER, "$*745.69987158227022", "$/745.69987158227022")
272 DECLARE_CONV_UNIT(POWER, KILOWATTS, "$*1000", "$/1000")
273 DECLARE_CONV_UNIT(POWER, MEGAWATTS, "$*1000000", "$/1000000")
274 DECLARE_CONV_UNIT(POWER, WATTS, "$", "$")
275 DECLARE_CONV_END
276 };
277
278 /*
279 1 ATM = 101325 Pa
280 1 BAR = 100000 Pa
281 1 mm HG = 133.322 Pa
282 1 psi = 6894.757 Pa
283 */
284 static const conv_t conv_PRESSURE[] = {
285 DECLARE_CONV_UNIT(PRESSURE, ATMOSPHERES, "$*101325", "$/101325")
286 DECLARE_CONV_UNIT(PRESSURE, BARS, "$*100000", "$/100000")
287 DECLARE_CONV_UNIT(PRESSURE, MM_OF_MERCURY, "$*133.322", "$/133.322")
288 DECLARE_CONV_UNIT(PRESSURE, PASCALS, "$", "$")
289 DECLARE_CONV_UNIT(PRESSURE, PSI, "$*6894.757", "$/6894.757")
290 DECLARE_CONV_END
291 };
292
293 /*
294 C = K - 273.15
295 F = K * 9/5 - 459.67
296 R = K * 9/5
297 */
298 static const conv_t conv_TEMPERATURE[] = {
299 DECLARE_CONV_UNIT(TEMPERATURE, CELSIUS, "$+273.15", "$-273.15")
300 DECLARE_CONV_UNIT(TEMPERATURE, FAHRENHEIT, "($-459.67)*5/9", "$*9/5-459.67")
301 DECLARE_CONV_UNIT(TEMPERATURE, KELVIN, "$", "$")
302 DECLARE_CONV_UNIT(TEMPERATURE, RANKINE, "$*5/9", "$*9/5")
303 DECLARE_CONV_END
304 };
305
306 /*
307 1 f/h = 0.3048 m/s
308 1 Km/h = 10/36 m/s -> 0.27778 m/s
309 1 knot = 18.52/36 m/s -> 0.51444444 m/s
310 1 mach = 340.3 m/s
311 1 mph = 0.44704 m/s
312 */
313 static const conv_t conv_VELOCITY[] = {
314 DECLARE_CONV_UNIT(VELOCITY, FEET_HOUR, "$*.3048", "$/.3048")
315 DECLARE_CONV_UNIT(VELOCITY, KILOMETERS_HOUR, "$*10/36", "$*36/10")
316 DECLARE_CONV_UNIT(VELOCITY, KNOTS, "$*18.52/36", "$*36/18.52")
317 DECLARE_CONV_UNIT(VELOCITY, MACH, "$*340.3", "$/340.3")
318 DECLARE_CONV_UNIT(VELOCITY, METERS_SECOND, "$", "$")
319 DECLARE_CONV_UNIT(VELOCITY, MILES_HOUR, "$*.44704", "$/.44704")
320 DECLARE_CONV_END
321 };
322
323 /*
324 1 barrel uk ...... = 163.65924 l
325 1 barrel oil ..... = 158.987295 l
326 1 bun ............ =
327 1 bushel uk ...... = 36.36872 l
328 1 bushel us ...... = 35.23907017 l
329 1 cubic cm ...... = 0.001 l
330 1 cubic feet ..... = 28.316846 l
331 1 cubic inch ..... = 0.016387064 l
332 1 cubic meter .... = 1000 l
333 1 cubic yard ..... = 764.554857 l
334 1 doe ............ =
335 1 fluid ounce uk = 0.0284130625 l
336 1 fluid ounce us = 0.0295735295625 l
337 1 gallon uk ...... = 4.54609 l
338 1 gallon dry us .. = 4.40488377086 l
339 1 gallon liquid us = 3.785411784 l
340 1 gou ............ = 0.1809 l
341 1 hop ............ =
342 1 icce ........... =
343 1 kwian .......... =
344 1 mal ............ =
345 1 milliliter ..... = 0.001 l
346 1 pint uk ........ = 0.56826125 l
347 1 pint dry us .... = 0.5506104713575 l
348 1 pint liquid us = 0.473176473 l
349 1 quart uk ....... = 1.1365225 l
350 1 quart dry us ... = 1.101220942715 l
351 1 quart liquid us = 0.946352946 l
352 1 seki ........... =
353 1 syou ........... =
354 1 tananloung ..... =
355 1 tang ........... =
356 1 to ............. = 18040 l
357 */
358 static const conv_t conv_VOLUME[] = {
359 DECLARE_CONV_UNIT(VOLUME, BARRELS_UK, "$*163.65924", "$/163.65924")
360 DECLARE_CONV_UNIT(VOLUME, BARRELS_OIL, "$*158.987295", "$/158.987295")
361 // DECLARE_CONV_UNIT(VOLUME, BUN, "$", "$")
362 DECLARE_CONV_UNIT(VOLUME, BUSHELS_UK, "$*36.36872", "$/36.36872")
363 DECLARE_CONV_UNIT(VOLUME, BUSHELS_US, "$*35.23907017", "$/35.23907017")
364 DECLARE_CONV_UNIT(VOLUME, CUBIC_CENTIMETERS, "$*0.001", "$/0.001")
365 DECLARE_CONV_UNIT(VOLUME, CUBIC_FEET, "$*28.316846", "$/28.316846")
366 DECLARE_CONV_UNIT(VOLUME, CUBIC_INCHES, "$*0.016387064", "$/0.016387064")
367 DECLARE_CONV_UNIT(VOLUME, CUBIC_METERS, "$*1000", "$/1000")
368 DECLARE_CONV_UNIT(VOLUME, CUBIC_YARDS, "$*764.554857", "$/764.554857")
369 // DECLARE_CONV_UNIT(VOLUME, DOE, "$", "$")
370 DECLARE_CONV_UNIT(VOLUME, FLUID_OUNCES_UK, "$*0.0284130625", "$/0.0284130625")
371 DECLARE_CONV_UNIT(VOLUME, FLUID_OUNCES_US, "$*0.0295735295625", "$/0.0295735295625")
372 DECLARE_CONV_UNIT(VOLUME, GALLONS_UK, "$*4.54609", "$/4.54609")
373 DECLARE_CONV_UNIT(VOLUME, GALLONS_DRY_US, "$*4.40488377086", "$/4.40488377086")
374 DECLARE_CONV_UNIT(VOLUME, GALLONS_LIQUID_US, "$*3.785411784", "$/3.785411784")
375 DECLARE_CONV_UNIT(VOLUME, GOU, "$*0.1809", "$/0.1809")
376 // DECLARE_CONV_UNIT(VOLUME, HOP, "$", "$")
377 // DECLARE_CONV_UNIT(VOLUME, ICCE, "$", "$")
378 // DECLARE_CONV_UNIT(VOLUME, KWIAN, "$", "$")
379 DECLARE_CONV_UNIT(VOLUME, LITERS, "$", "$")
380 // DECLARE_CONV_UNIT(VOLUME, MAL, "$", "$")
381 DECLARE_CONV_UNIT(VOLUME, MILLILITERS, "$*0.001", "$/0.001")
382 DECLARE_CONV_UNIT(VOLUME, PINTS_UK, "$*0.56826125", "$/0.56826125")
383 DECLARE_CONV_UNIT(VOLUME, PINTS_DRY_US, "$*0.5506104713575", "$/0.5506104713575")
384 DECLARE_CONV_UNIT(VOLUME, PINTS_LIQUID_US, "$*0.473176473", "$/0.473176473")
385 DECLARE_CONV_UNIT(VOLUME, QUARTS_UK, "$*1.1365225", "$/1.1365225")
386 DECLARE_CONV_UNIT(VOLUME, QUARTS_DRY_US, "$*1.101220942715", "$/1.101220942715")
387 DECLARE_CONV_UNIT(VOLUME, QUARTS_LIQUID_US, "$*0.946352946", "$/0.946352946")
388 // DECLARE_CONV_UNIT(VOLUME, SEKI, "$", "$")
389 // DECLARE_CONV_UNIT(VOLUME, SYOU, "$", "$")
390 // DECLARE_CONV_UNIT(VOLUME, TANANLOUNG, "$", "$")
391 // DECLARE_CONV_UNIT(VOLUME, TANG, "$", "$")
392 DECLARE_CONV_UNIT(VOLUME, TO, "$*18040", "$/18040")
393 DECLARE_CONV_END
394 };
395
396 /*
397 1 baht ............ = 12.244 g
398 1 carat ........... = 0.2 g
399 1 chung ........... =
400 1 don ............. =
401 1 geun ............ =
402 1 gwan ............ =
403 1 harb ............ =
404 1 jin china ....... =
405 1 jin taiwan ...... =
406 1 Kan ............. =
407 1 Kilograms ....... = 1000 g
408 1 Kin ............. =
409 1 Liang China ..... =
410 1 Liang Taiwan .... =
411 1 monme ........... = 3.75 g
412 1 ounce avoirdupois = 28.349523125 g
413 1 ounce troy ...... = 31.1034768 g
414 1 pound ........... = 453.59237 g
415 1 quintal metric .. = 100000 g
416 1 saloung ......... =
417 1 stone ........... = 6350.29318 g
418 1 tamlung ......... =
419 1 ton ............. = 1000000 g
420 1 ton uk .......... = 1016046.9088 g
421 1 ton us .......... = 907184.74 g
422 */
423 static const conv_t conv_WEIGHT[] = {
424 DECLARE_CONV_UNIT(WEIGHT, BAHT, "$*12.244", "$/12.244")
425 DECLARE_CONV_UNIT(WEIGHT, CARATS, "$*0.2", "$/0.2")
426 // DECLARE_CONV_UNIT(WEIGHT, CHUNG, "$", "$")
427 // DECLARE_CONV_UNIT(WEIGHT, DON, "$", "$")
428 // DECLARE_CONV_UNIT(WEIGHT, GEUN, "$", "$")
429 DECLARE_CONV_UNIT(WEIGHT, GRAMS, "$", "$")
430 // DECLARE_CONV_UNIT(WEIGHT, GWAN, "$", "$")
431 // DECLARE_CONV_UNIT(WEIGHT, HARB, "$", "$")
432 // DECLARE_CONV_UNIT(WEIGHT, JIN_CHINA, "$", "$")
433 // DECLARE_CONV_UNIT(WEIGHT, JIN_TAIWAN, "$", "$")
434 // DECLARE_CONV_UNIT(WEIGHT, KAN, "$", "$")
435 DECLARE_CONV_UNIT(WEIGHT, KILOGRAMS, "$*1000", "$/1000")
436 // DECLARE_CONV_UNIT(WEIGHT, KIN, "$", "$")
437 // DECLARE_CONV_UNIT(WEIGHT, LIANG_CHINA, "$", "$")
438 // DECLARE_CONV_UNIT(WEIGHT, LIANG_TAIWAN, "$", "$")
439 DECLARE_CONV_UNIT(WEIGHT, MONME, "$*3.75", "$/3.75")
440 DECLARE_CONV_UNIT(WEIGHT, OUNCES_AVOIRDUPOIS, "$*28.349523125", "$/28.349523125")
441 DECLARE_CONV_UNIT(WEIGHT, OUNCES_TROY, "$*31.1034768", "$/31.1034768")
442 DECLARE_CONV_UNIT(WEIGHT, POUNDS, "$*453.59237", "$/453.59237")
443 DECLARE_CONV_UNIT(WEIGHT, QUINTAL_METRIC, "$*100000", "$/100000")
444 // DECLARE_CONV_UNIT(WEIGHT, SALOUNG, "$", "$")
445 DECLARE_CONV_UNIT(WEIGHT, STONES, "$*6350.29318", "$/6350.29318")
446 // DECLARE_CONV_UNIT(WEIGHT, TAMLUNG, "$", "$")
447 DECLARE_CONV_UNIT(WEIGHT, TONNES, "$*1000000", "$/1000000")
448 DECLARE_CONV_UNIT(WEIGHT, TONS_UK, "$*1016046.9088", "$/1016046.9088")
449 DECLARE_CONV_UNIT(WEIGHT, TONS_US, "$*907184.74", "$/907184.74")
450 DECLARE_CONV_END
451 };
452
453 static const conv_category_t conv_table[] = {
454 DECLARE_CONV_CAT(AREA)
455 DECLARE_CONV_CAT(CONSUMPTION)
456 DECLARE_CONV_CAT(CURRENCY)
457 DECLARE_CONV_CAT(ENERGY)
458 DECLARE_CONV_CAT(LENGTH)
459 DECLARE_CONV_CAT(POWER)
460 DECLARE_CONV_CAT(PRESSURE)
461 DECLARE_CONV_CAT(TEMPERATURE)
462 DECLARE_CONV_CAT(VELOCITY)
463 DECLARE_CONV_CAT(VOLUME)
464 DECLARE_CONV_CAT(WEIGHT)
465 };
466
467 void ConvExecute(HWND hWnd)
468 {
469 DWORD c_cat = (DWORD)SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETCURSEL, 0, 0);
470 const conv_t *items = NULL;
471 DWORD from = SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETCURSEL, 0, 0);
472 DWORD to = SendDlgItemMessage(hWnd, IDC_COMBO_TO, CB_GETCURSEL, 0, 0);
473 TCHAR txt_cb[128];
474 TCHAR txt[128];
475 const conv_t *item;
476
477 /* do nothing if the indexes point to the same unit */
478 if (from == to)
479 return;
480
481 /* Search correct category, since it can be sorted too */
482 SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETLBTEXT, c_cat, (LPARAM)txt_cb);
483 for (c_cat=0; c_cat < SIZEOF(conv_table); c_cat++) {
484 LoadString(calc.hInstance, conv_table[c_cat].category, txt, SIZEOF(txt));
485 if (!_tcscmp(txt_cb, txt)) {
486 items = conv_table[c_cat].items;
487 break;
488 }
489 }
490
491 /* The units can be sorted, so I must search the exact match */
492 item = items;
493 SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETLBTEXT, from, (LPARAM)txt_cb);
494 while (item->unit) {
495 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
496 if (!_tcscmp(txt_cb, txt)) {
497 from = item-items;
498 break;
499 }
500 item++;
501 }
502 SendDlgItemMessage(hWnd, IDC_COMBO_TO, CB_GETLBTEXT, to, (LPARAM)txt_cb);
503 item = items;
504 while (item->unit) {
505 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
506 if (!_tcscmp(txt_cb, txt)) {
507 to = item-items;
508 break;
509 }
510 item++;
511 }
512
513 calc.Convert[0].data = (char *)items[from].formula_from;
514 calc.Convert[1].data = (char *)items[to].formula_to;
515 calc.Convert[0].wm_msg = WM_HANDLE_FROM;
516 calc.Convert[1].wm_msg = WM_HANDLE_TO;
517 PostMessage(hWnd, WM_START_CONV, 0, MAKELPARAM(0, WM_HANDLE_FROM));
518 }
519
520 void ConvAdjust(HWND hWnd, int n_cat)
521 {
522 TCHAR txt[128];
523 TCHAR txt_cat[128];
524 HWND hFromWnd = GetDlgItem(hWnd, IDC_COMBO_FROM);
525 HWND hToWnd = GetDlgItem(hWnd, IDC_COMBO_TO);
526 const conv_t *item;
527 unsigned int n;
528
529 SendDlgItemMessage(hWnd, IDC_COMBO_CATEGORY, CB_GETLBTEXT, n_cat, (LPARAM)txt_cat);
530 for (n=0; n<SIZEOF(conv_table); n++) {
531 item = conv_table[n].items;
532 LoadString(calc.hInstance, conv_table[n].category, txt, SIZEOF(txt));
533 if (!_tcscmp(txt_cat, txt))
534 break;
535 }
536
537 SendMessage(hFromWnd, CB_RESETCONTENT, 0, 0);
538 SendMessage(hToWnd, CB_RESETCONTENT, 0, 0);
539 while (item->unit) {
540 LoadString(calc.hInstance, item->unit, txt, SIZEOF(txt));
541 SendMessage(hFromWnd, CB_ADDSTRING, 0, (LPARAM)txt);
542 SendMessage(hToWnd, CB_ADDSTRING, 0, (LPARAM)txt);
543 item++;
544 }
545 SendMessage(hFromWnd, CB_SETCURSEL, 0, 0);
546 SendMessage(hToWnd, CB_SETCURSEL, 0, 0);
547 }
548
549 void ConvInit(HWND hWnd)
550 {
551 HWND hCatWnd = GetDlgItem(hWnd, IDC_COMBO_CATEGORY);
552 TCHAR txt[128];
553 unsigned int n;
554
555 /* Fill category combo */
556 for (n=0; n<SIZEOF(conv_table); n++) {
557 LoadString(calc.hInstance, conv_table[n].category, txt, SIZEOF(txt));
558 SendMessage(hCatWnd, CB_ADDSTRING, 0, (LPARAM)txt);
559 }
560 SendMessage(hCatWnd, CB_SETCURSEL, 0, 0);
561 ConvAdjust(hWnd, 0);
562 }
563
564