diff options
Diffstat (limited to 'src/mp-serializer.c')
-rw-r--r-- | src/mp-serializer.c | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/src/mp-serializer.c b/src/mp-serializer.c index 3967cbc..4c04f64 100644 --- a/src/mp-serializer.c +++ b/src/mp-serializer.c @@ -41,7 +41,6 @@ struct MpSerializerPrivate gint tsep_count; /* Number of digits between separator. */ }; - G_DEFINE_TYPE_WITH_PRIVATE (MpSerializer, mp_serializer, G_TYPE_OBJECT); MpSerializer * @@ -54,7 +53,6 @@ mp_serializer_new(MpDisplayFormat format, int base, int trailing_digits) return serializer; } - static void mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolean force_sign, int *n_digits, GString *string) { @@ -63,7 +61,8 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea MPNumber integer_component = mp_new(); MPNumber fractional_component = mp_new(); MPNumber temp = mp_new(); - int i, last_non_zero; + int i; + gsize last_non_zero; if (mp_is_negative(x)) mp_abs(x, &number); @@ -88,11 +87,11 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea /* Write out the integer component least significant digit to most */ mp_set_from_mp(&integer_component, &temp); i = 0; + MPNumber t = mp_new(); + MPNumber t2 = mp_new(); + MPNumber t3 = mp_new(); do { - MPNumber t = mp_new(); - MPNumber t2 = mp_new(); - MPNumber t3 = mp_new(); - int64_t d; + long d; if (serializer->priv->base == 10 && serializer->priv->show_tsep && i == serializer->priv->tsep_count) { g_string_prepend_unichar(string, serializer->priv->tsep); @@ -118,10 +117,10 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea (*n_digits)++; mp_set_from_mp(&t, &temp); - mp_clear(&t); - mp_clear(&t2); - mp_clear(&t3); } while (!mp_is_zero(&temp)); + mp_clear(&t); + mp_clear(&t2); + mp_clear(&t3); last_non_zero = string->len; @@ -129,9 +128,9 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea /* Write out the fractional component */ mp_set_from_mp(&fractional_component, &temp); + MPNumber digit = mp_new(); for (i = serializer->priv->trailing_digits; i > 0 && !mp_is_zero(&temp); i--) { int d; - MPNumber digit = mp_new(); mp_multiply_integer(&temp, base, &temp); mp_floor(&temp, &digit); @@ -142,8 +141,8 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea if(d != 0) last_non_zero = string->len; mp_subtract(&temp, &digit, &temp); - mp_clear(&digit); } + mp_clear(&digit); /* Strip trailing zeroes */ if (!serializer->priv->show_zeroes || serializer->priv->trailing_digits == 0) @@ -179,7 +178,6 @@ mp_to_string_real(MpSerializer *serializer, const MPNumber *x, int base, gboolea mp_clear(&temp); } - static gchar * mp_to_string(MpSerializer *serializer, const MPNumber *x, int *n_digits) { @@ -242,7 +240,6 @@ mp_to_string(MpSerializer *serializer, const MPNumber *x, int *n_digits) return result; } - static int mp_to_exponential_string_real(MpSerializer *serializer, const MPNumber *x, GString *string, gboolean eng_format, int *n_digits) { @@ -306,7 +303,6 @@ mp_to_exponential_string_real(MpSerializer *serializer, const MPNumber *x, GStri return exponent; } - static void append_exponent(GString *string, int exponent) { @@ -328,7 +324,6 @@ append_exponent(GString *string, int exponent) g_free (super_value); } - static gchar * mp_to_exponential_string(MpSerializer *serializer, const MPNumber *x, gboolean eng_format, int *n_digits) { @@ -391,7 +386,6 @@ mp_to_exponential_string(MpSerializer *serializer, const MPNumber *x, gboolean e return result; } - gchar * mp_serializer_to_string(MpSerializer *serializer, const MPNumber *x) { @@ -417,133 +411,114 @@ mp_serializer_to_string(MpSerializer *serializer, const MPNumber *x) } } - gboolean mp_serializer_from_string(MpSerializer *serializer, const gchar *str, MPNumber *z) { return mp_set_from_string(str, serializer->priv->base, z); } - void mp_serializer_set_base(MpSerializer *serializer, gint base) { serializer->priv->base = base; } - int mp_serializer_get_base(MpSerializer *serializer) { return serializer->priv->base; } - void mp_serializer_set_radix(MpSerializer *serializer, gunichar radix) { serializer->priv->radix = radix; } - gunichar mp_serializer_get_radix(MpSerializer *serializer) { return serializer->priv->radix; } - void mp_serializer_set_thousands_separator(MpSerializer *serializer, gunichar separator) { serializer->priv->tsep = separator; } - gunichar mp_serializer_get_thousands_separator(MpSerializer *serializer) { return serializer->priv->tsep; } - gint mp_serializer_get_thousands_separator_count(MpSerializer *serializer) { return serializer->priv->tsep_count; } - void mp_serializer_set_show_thousands_separators(MpSerializer *serializer, gboolean visible) { serializer->priv->show_tsep = visible; } - gboolean mp_serializer_get_show_thousands_separators(MpSerializer *serializer) { return serializer->priv->show_tsep; } - void mp_serializer_set_show_trailing_zeroes(MpSerializer *serializer, gboolean visible) { serializer->priv->show_zeroes = visible; } - gboolean mp_serializer_get_show_trailing_zeroes(MpSerializer *serializer) { return serializer->priv->show_zeroes; } - int mp_serializer_get_leading_digits(MpSerializer *serializer) { return serializer->priv->leading_digits; } - void mp_serializer_set_leading_digits(MpSerializer *serializer, int leading_digits) { serializer->priv->leading_digits = leading_digits; } - int mp_serializer_get_trailing_digits(MpSerializer *serializer) { return serializer->priv->trailing_digits; } - void mp_serializer_set_trailing_digits(MpSerializer *serializer, int trailing_digits) { serializer->priv->trailing_digits = trailing_digits; } - MpDisplayFormat mp_serializer_get_number_format(MpSerializer *serializer) { return serializer->priv->format; } - void mp_serializer_set_number_format(MpSerializer *serializer, MpDisplayFormat format) { serializer->priv->format = format; } - static void mp_serializer_set_property(GObject *object, guint prop_id, @@ -568,7 +543,6 @@ mp_serializer_set_property(GObject *object, } } - static void mp_serializer_get_property(GObject *object, guint prop_id, @@ -593,7 +567,6 @@ mp_serializer_get_property(GObject *object, } } - static void mp_serializer_class_init(MpSerializerClass *klass) { @@ -632,18 +605,23 @@ mp_serializer_class_init(MpSerializerClass *klass) G_PARAM_READWRITE)); } - static void mp_serializer_init(MpSerializer *serializer) { - gchar *radix, *tsep; + gchar *radix, *utf8_radix, *tsep; serializer->priv = mp_serializer_get_instance_private (serializer); radix = nl_langinfo(RADIXCHAR); - serializer->priv->radix = radix ? g_utf8_get_char(g_locale_to_utf8(radix, -1, NULL, NULL, NULL)) : '.'; + utf8_radix = g_locale_to_utf8(radix, -1, NULL, NULL, NULL); + serializer->priv->radix = radix ? g_utf8_get_char(utf8_radix) : '.'; + g_free(utf8_radix); tsep = nl_langinfo(THOUSEP); if (tsep && tsep[0] != '\0') - serializer->priv->tsep = g_utf8_get_char(g_locale_to_utf8(tsep, -1, NULL, NULL, NULL)); + { + gchar *utf8_tsep = g_locale_to_utf8(tsep, -1, NULL, NULL, NULL); + serializer->priv->tsep = g_utf8_get_char(utf8_tsep); + g_free(utf8_tsep); + } else serializer->priv->tsep = ' '; serializer->priv->tsep_count = 3; |