4
#include "mp-serializer.h"
5
#include "mp-equation.h"
6
#include "currency-manager.h" // FIXME: Move out of here
16
MpSerializer *serializer;
19
G_DEFINE_TYPE (Unit, unit, G_TYPE_OBJECT);
23
unit_new(const gchar *name,
24
const gchar *display_name,
26
const gchar *from_function,
27
const gchar *to_function,
30
Unit *unit = g_object_new(unit_get_type(), NULL);
34
unit->priv->name = g_strdup(name);
35
unit->priv->display_name = g_strdup(display_name);
36
unit->priv->format = g_strdup(format);
37
unit->priv->from_function = g_strdup(from_function);
38
unit->priv->to_function = g_strdup(to_function);
39
symbol_names = g_strsplit(symbols, ",", 0);
40
for (i = 0; symbol_names[i]; i++)
41
unit->priv->symbols = g_list_append(unit->priv->symbols, g_strdup(symbol_names[i]));
49
unit_get_name(Unit *unit)
51
return unit->priv->name;
56
unit_get_display_name(Unit *unit)
58
return unit->priv->display_name;
63
unit_matches_symbol(Unit *unit, const gchar *symbol)
67
for (iter = unit->priv->symbols; iter; iter = iter->next) {
68
gchar *s = iter->data;
69
if (strcmp(s, symbol) == 0)
78
unit_get_symbols(Unit *unit)
80
return unit->priv->symbols;
85
variable_is_defined(const char *name, void *data)
92
get_variable(const char *name, MPNumber *z, void *data)
101
solve_function(const gchar *function, const MPNumber *x, MPNumber *z)
103
MPEquationOptions options;
106
memset(&options, 0, sizeof(options));
108
options.wordlen = 32;
109
options.variable_is_defined = variable_is_defined;
110
options.get_variable = get_variable;
111
options.callback_data = (void *)x;
112
ret = mp_equation_parse(function, &options, z, NULL);
114
g_warning("Failed to convert value: %s", function);
123
unit_convert_from(Unit *unit, const MPNumber *x, MPNumber *z)
125
if (unit->priv->from_function)
126
return solve_function(unit->priv->from_function, x, z);
128
// FIXME: Hack to make currency work
130
r = currency_manager_get_value(currency_manager_get_default(), unit->priv->name);
141
unit_convert_to(Unit *unit, const MPNumber *x, MPNumber *z)
143
if (unit->priv->from_function)
144
return solve_function(unit->priv->to_function, x, z);
146
// FIXME: Hack to make currency work
148
r = currency_manager_get_value(currency_manager_get_default(), unit->priv->name);
151
mp_multiply(x, r, z);
159
unit_format(Unit *unit, MPNumber *x)
161
gchar *number_text, *text;
163
number_text = mp_serializer_to_string(unit->priv->serializer, x);
164
text = g_strdup_printf(unit->priv->format, number_text);
172
unit_class_init(UnitClass *klass)
174
g_type_class_add_private(klass, sizeof(UnitPrivate));
179
unit_init(Unit *unit)
181
unit->priv = G_TYPE_INSTANCE_GET_PRIVATE(unit, unit_get_type(), UnitPrivate);
182
unit->priv->serializer = mp_serializer_new(MP_DISPLAY_FORMAT_AUTOMATIC, 10, 2);