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
);
119 unit_convert_from(Unit
*unit
, const MPNumber
*x
, MPNumber
*z
)
121 if (unit
->priv
->from_function
)
122 solve_function(unit
->priv
->from_function
, x
, z
);
124 // FIXME: Hack to make currency work
126 r
= currency_manager_get_value(currency_manager_get_default(), unit
->priv
->name
);
133 unit_convert_to(Unit
*unit
, const MPNumber
*x
, MPNumber
*z
)
135 if (unit
->priv
->from_function
)
136 solve_function(unit
->priv
->to_function
, x
, z
);
138 // FIXME: Hack to make currency work
140 r
= currency_manager_get_value(currency_manager_get_default(), unit
->priv
->name
);
141 mp_multiply(x
, r
, z
);
147 unit_format(Unit
*unit
, MPNumber
*x
)
149 gchar
*number_text
, *text
;
151 number_text
= mp_serializer_to_string(unit
->priv
->serializer
, x
);
152 text
= g_strdup_printf(unit
->priv
->format
, number_text
);
160 unit_class_init(UnitClass
*klass
)
162 g_type_class_add_private(klass
, sizeof(UnitPrivate
));
167 unit_init(Unit
*unit
)
169 unit
->priv
= G_TYPE_INSTANCE_GET_PRIVATE(unit
, unit_get_type(), UnitPrivate
);
170 unit
->priv
->serializer
= mp_serializer_new(MP_DISPLAY_FORMAT_AUTOMATIC
, 10, 2);