[gcalctool] Kill mp_serializer_to_specific_string



commit 6fb9508e6befab09ae3e076aa992ef38b2dafea0
Author: Robert Ancell <robert ancell canonical com>
Date:   Mon Nov 29 14:09:03 2010 +1100

    Kill mp_serializer_to_specific_string

 src/gcalccmd.c       |    8 ++++++--
 src/gcalctool.c      |    3 +--
 src/math-buttons.c   |   17 +++++++++++------
 src/math-equation.c  |   18 +++++++++---------
 src/math-variables.c |    5 ++++-
 src/mp-binary.c      |   20 +++++++++++++++++---
 src/mp-serializer.c  |   41 +++++++++++++++++++++--------------------
 src/mp-serializer.h  |   30 +++++++++++++++++++-----------
 src/unittest.c       |    7 ++++++-
 9 files changed, 94 insertions(+), 55 deletions(-)
---
diff --git a/src/gcalccmd.c b/src/gcalccmd.c
index 414fc60..190df8f 100644
--- a/src/gcalccmd.c
+++ b/src/gcalccmd.c
@@ -30,13 +30,15 @@
 
 #define MAXLINE 1024
 
+static MpSerializer *result_serializer;
+
 static void
 solve(const char *equation)
 {
     int ret;
     MPEquationOptions options;
     MPNumber z;
-    char *result_str;
+    gchar *result_str = NULL;
     
     memset(&options, 0, sizeof(options));
     options.base = 10;
@@ -50,7 +52,7 @@ solve(const char *equation)
     else if (ret)        
         fprintf(stderr, "Error %d\n", ret);
     else {
-        mp_serializer_to_specific_string(&z, 10, 9, true, true, &result_str);
+        result_str = mp_serializer_to_string(result_serializer, &z);
         printf("%s\n", result_str);
     }
     g_free(result_str);
@@ -85,6 +87,8 @@ main(int argc, char **argv)
     g_type_init ();
     setlocale(LC_ALL, "");
 
+    result_serializer = mp_serializer_new(10, 9);
+
     equation = (char *) malloc(MAXLINE * sizeof(char));
     while (1) {
         printf("> ");
diff --git a/src/gcalctool.c b/src/gcalctool.c
index 146f270..8cb8f94 100644
--- a/src/gcalctool.c
+++ b/src/gcalctool.c
@@ -62,9 +62,8 @@ solve(const char *equation)
         exit(1);
     }
     else {
-        mp_serializer_to_specific_string(&result, options.base, 9, true, true, &result_str);
+        result_str = mp_serializer_to_string(mp_serializer_new(10, 9), &result);
         printf("%s\n", result_str);
-        g_free(result_str);
         exit(0);
     }
 }
diff --git a/src/math-buttons.c b/src/math-buttons.c
index a0d096d..697606a 100644
--- a/src/math-buttons.c
+++ b/src/math-buttons.c
@@ -57,6 +57,7 @@ struct MathButtonsPrivate
 
     GtkWidget *convert_from_combo;
     GtkWidget *convert_to_combo;
+    MpSerializer *units_serializer;
     GtkWidget *convert_result_label;
 
     GtkWidget *base_combo;
@@ -66,6 +67,7 @@ struct MathButtonsPrivate
 
     GtkWidget *source_currency_combo;
     GtkWidget *target_currency_combo;
+    MpSerializer *currency_serializer;
     GtkWidget *currency_label;
 
     GtkWidget *character_code_dialog;
@@ -594,8 +596,8 @@ update_currency_label(MathButtons *buttons)
         const char *source_symbol, *target_symbol;
         int i;
 
-        mp_serializer_to_specific_string(&x, 10, 2, false, true, &input_text);
-        mp_serializer_to_specific_string(&value, 10, 2, false, true, &output_text);
+        input_text = mp_serializer_to_string(buttons->priv->currency_serializer, &x);
+        output_text = mp_serializer_to_string(buttons->priv->currency_serializer, &value);
 
         for (i = 0; strcmp(math_equation_get_source_currency(buttons->priv->equation), currency_names[i].short_name) != 0; i++);
         source_symbol = currency_names[i].symbol;
@@ -641,9 +643,9 @@ update_conversion_bar(MathButtons *buttons)
     gtk_widget_set_sensitive(buttons->priv->convert_result_label, enabled);
     if (!enabled)
         return;
-  
-    mp_serializer_to_specific_string(&x, 10, 2, TRUE, TRUE, &source_value);
-    mp_serializer_to_specific_string(&z, 10, 2, TRUE, TRUE, &target_value);
+
+    source_value = mp_serializer_to_string(buttons->priv->units_serializer, &x);
+    target_value = mp_serializer_to_string(buttons->priv->units_serializer, &z);
 
     label = g_strdup_printf("%s %s = %s %s", source_value, source_units, target_value, target_units);
     gtk_label_set_text(GTK_LABEL(buttons->priv->convert_result_label), label);
@@ -1028,7 +1030,7 @@ load_mode(MathButtons *buttons, ButtonMode mode)
         MpSerializer *serializer = math_equation_get_serializer(buttons->priv->equation);
         gchar buffer[7];
         gint len;
-        len = g_unichar_to_utf8(mp_serializer_get_numeric_point_text(serializer), buffer);
+        len = g_unichar_to_utf8(mp_serializer_get_radix(serializer), buffer);
         buffer[len] = '\0';
         gtk_button_set_label(GTK_BUTTON(widget), buffer);
     }
@@ -1053,6 +1055,7 @@ load_mode(MathButtons *buttons, ButtonMode mode)
         int i, j;
 
         buttons->priv->convert_result_label = GET_WIDGET(builder, "convert_result_label");
+        buttons->priv->units_serializer = mp_serializer_new(10, 2);
 
         buttons->priv->convert_from_combo = GET_WIDGET(builder, "convert_from_combo");
         from_model = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
@@ -1144,6 +1147,8 @@ load_mode(MathButtons *buttons, ButtonMode mode)
         buttons->priv->target_currency_combo = GET_WIDGET(builder, "target_currency_combo");
         buttons->priv->currency_label = GET_WIDGET(builder, "currency_label");
 
+        buttons->priv->currency_serializer = mp_serializer_new(10, 2);
+
         model = gtk_list_store_new(1, G_TYPE_STRING);
 
         for (i = 0; currency_names[i].short_name != NULL; i++) {
diff --git a/src/math-equation.c b/src/math-equation.c
index d7bc7e8..2d8da54 100644
--- a/src/math-equation.c
+++ b/src/math-equation.c
@@ -197,7 +197,7 @@ count_digits(MathEquation *equation, const gchar *text)
         read_iter = g_utf8_next_char(read_iter);
 
         /* Allow a thousands separator between digits follow a digit */
-        if (g_utf8_get_char(read_iter) == mp_serializer_get_thousands_separator_text(equation->priv->serializer)) {
+        if (g_utf8_get_char(read_iter) == mp_serializer_get_thousands_separator(equation->priv->serializer)) {
             read_iter = g_utf8_next_char(read_iter);
             if (!g_unichar_isdigit(g_utf8_get_char(read_iter)))
                 return count;
@@ -252,7 +252,7 @@ reformat_separators(MathEquation *equation)
                 gint len;
 
                 gtk_text_buffer_get_iter_at_offset(GTK_TEXT_BUFFER(equation), &iter, offset);
-                len = g_unichar_to_utf8(mp_serializer_get_thousands_separator_text(equation->priv->serializer), buffer);
+                len = g_unichar_to_utf8(mp_serializer_get_thousands_separator(equation->priv->serializer), buffer);
                 buffer[len] = '\0';
                 gtk_text_buffer_insert(GTK_TEXT_BUFFER(equation), &iter, buffer, -1);
                 offset++;
@@ -261,10 +261,10 @@ reformat_separators(MathEquation *equation)
 
             digit_offset--;
         }
-        else if (c == mp_serializer_get_numeric_point_text(equation->priv->serializer)) {
+        else if (c == mp_serializer_get_radix(equation->priv->serializer)) {
             in_number = in_radix = TRUE;
         }
-        else if (c == mp_serializer_get_thousands_separator_text(equation->priv->serializer)) {
+        else if (c == mp_serializer_get_thousands_separator(equation->priv->serializer)) {
             /* Didn't expect thousands separator - delete it */
             if (!expect_tsep) {
                 GtkTextIter start, end;
@@ -799,10 +799,10 @@ math_equation_get_equation(MathEquation *equation)
         }
 
         /* Ignore thousands separators */
-        if (c == mp_serializer_get_thousands_separator_text(equation->priv->serializer) && last_is_digit && next_is_digit)
+        if (c == mp_serializer_get_thousands_separator(equation->priv->serializer) && last_is_digit && next_is_digit)
             ;
         /* Substitute radix character */
-        else if (c == mp_serializer_get_numeric_point_text(equation->priv->serializer) && (last_is_digit || next_is_digit))
+        else if (c == mp_serializer_get_radix(equation->priv->serializer) && (last_is_digit || next_is_digit))
             g_string_append_unichar(eq_text, '.');
         else
             g_string_append_unichar(eq_text, c);
@@ -978,7 +978,7 @@ math_equation_insert_numeric_point(MathEquation *equation)
 {
     gchar buffer[7];
     gint len;
-    len = g_unichar_to_utf8( mp_serializer_get_numeric_point_text(equation->priv->serializer), buffer);
+    len = g_unichar_to_utf8( mp_serializer_get_radix(equation->priv->serializer), buffer);
     buffer[len] = '\0';
     math_equation_insert(equation, buffer);
 }
@@ -1719,7 +1719,7 @@ pre_insert_text_cb(MathEquation  *equation,
     /* Clear result on next digit entered if cursor at end of line */
     // FIXME Cursor
     c = g_utf8_get_char(text);
-    if ((g_unichar_isdigit(c) || c == mp_serializer_get_numeric_point_text(equation->priv->serializer)) &&
+    if ((g_unichar_isdigit(c) || c == mp_serializer_get_radix(equation->priv->serializer)) &&
          math_equation_is_result(equation)) {
         gtk_text_buffer_set_text(GTK_TEXT_BUFFER(equation), "", -1);
         clear_ans(equation, FALSE);
@@ -1853,7 +1853,7 @@ math_equation_init(MathEquation *equation)
     equation->priv->target_currency = g_strdup(currency_names[0].short_name);
     equation->priv->source_units = g_strdup("");
     equation->priv->target_units = g_strdup("");
-    equation->priv->serializer = mp_serializer_new();
+    equation->priv->serializer = mp_serializer_new(10, 9);
     equation->priv->queue = g_async_queue_new();
 
     mp_set_from_integer(0, &equation->priv->state.ans);
diff --git a/src/math-variables.c b/src/math-variables.c
index 77207b6..a57a509 100644
--- a/src/math-variables.c
+++ b/src/math-variables.c
@@ -27,6 +27,7 @@ struct MathVariablesPrivate
 {
     gchar *file_name;
     GHashTable *registers;
+    MpSerializer *serializer;
 };
 
 G_DEFINE_TYPE (MathVariables, math_variables, G_TYPE_OBJECT);
@@ -98,7 +99,7 @@ registers_save(MathVariables *variables)
         MPNumber *value = val;
         char *number;
 
-        mp_serializer_to_specific_string(value, 10, 50, true, false, &number);
+        number = mp_serializer_to_string(variables->priv->serializer, value);
         fprintf(f, "%s=%s\n", name, number);
         g_free(number);
     }
@@ -161,5 +162,7 @@ math_variables_init(MathVariables *variables)
     variables->priv = G_TYPE_INSTANCE_GET_PRIVATE (variables, math_variables_get_type(), MathVariablesPrivate);
     variables->priv->registers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
     variables->priv->file_name = g_build_filename(g_get_user_data_dir(), "gcalctool", "registers", NULL);
+    variables->priv->serializer = mp_serializer_new(10, 50);
+    mp_serializer_set_radix(variables->priv->serializer, '.');
     registers_load(variables);
 }
diff --git a/src/mp-binary.c b/src/mp-binary.c
index f16470b..7f033db 100644
--- a/src/mp-binary.c
+++ b/src/mp-binary.c
@@ -40,14 +40,28 @@ static int hex_to_int(char digit)
 }
 
 
+static gchar *
+to_hex_string(const MPNumber *x)
+{
+    MpSerializer *serializer;
+    gchar *result;
+
+    serializer = mp_serializer_new(16, 0);
+    result = mp_serializer_to_string(serializer, x);
+    g_object_unref(serializer);
+
+    return result;
+}
+
+
 static void
 mp_bitwise(const MPNumber *x, const MPNumber *y, int (*bitwise_operator)(int, int), MPNumber *z, int wordlen)
 {
     char *text1, *text2, text_out[MAX_DIGITS], text_out2[MAX_DIGITS];
     int offset1, offset2, offset_out;
 
-    mp_serializer_to_specific_string(x, 16, 0, false, false, &text1);
-    mp_serializer_to_specific_string(y, 16, 0, false, false, &text2);
+    text1 = to_hex_string(x);
+    text2 = to_hex_string(y);
     offset1 = strlen(text1) - 1;
     offset2 = strlen(text2) - 1;
     offset_out = wordlen / 4 - 1;
@@ -161,7 +175,7 @@ mp_mask(const MPNumber *x, int wordlen, MPNumber *z)
     size_t len, offset;
 
     /* Convert to a hexadecimal string and use last characters */
-    mp_serializer_to_specific_string(x, 16, 0, false, false, &text);
+    text = to_hex_string(x);
     len = strlen(text);
     offset = wordlen / 4;
     offset = len > offset ? len - offset: 0;
diff --git a/src/mp-serializer.c b/src/mp-serializer.c
index 6df3015..0dc3fdb 100644
--- a/src/mp-serializer.c
+++ b/src/mp-serializer.c
@@ -54,9 +54,12 @@ struct MpSerializerPrivate
 G_DEFINE_TYPE(MpSerializer, mp_serializer, G_TYPE_OBJECT);
 
 MpSerializer *
-mp_serializer_new()
+mp_serializer_new(int base, int accuracy)
 {
-    return g_object_new(mp_serializer_get_type(), NULL);
+    MpSerializer *serializer = g_object_new(mp_serializer_get_type(), NULL);
+    mp_serializer_set_base(serializer, base);
+    mp_serializer_set_accuracy(serializer, accuracy);
+    return serializer;
 }
 
 
@@ -302,22 +305,6 @@ mp_serializer_to_string(MpSerializer *serializer, const MPNumber *x)
 }
 
 
-void
-mp_serializer_to_specific_string(const MPNumber *x, int base, int accuracy, gboolean trim_zeroes, gboolean localize, gchar **target)
-{
-    MpSerializer *serializer = mp_serializer_new();
-    if (!localize) {
-        serializer->priv->radix = '.';
-        serializer->priv->show_tsep = FALSE;
-    }
-    serializer->priv->base = base;
-    serializer->priv->accuracy = accuracy;
-    serializer->priv->show_zeroes = !trim_zeroes;
-    *target = mp_serializer_to_string(serializer, x);
-    g_object_unref(serializer);
-}
-
-
 gboolean
 mp_serializer_from_string(MpSerializer *serializer, const gchar *str, MPNumber *z)
 {
@@ -339,15 +326,29 @@ mp_serializer_get_base(MpSerializer *serializer)
 }
 
 
+void
+mp_serializer_set_radix(MpSerializer *serializer, gunichar radix)
+{
+    serializer->priv->radix = radix;
+}
+
+
 gunichar
-mp_serializer_get_numeric_point_text(MpSerializer *serializer)
+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_text(MpSerializer *serializer)
+mp_serializer_get_thousands_separator(MpSerializer *serializer)
 {
     return serializer->priv->tsep;
 }
diff --git a/src/mp-serializer.h b/src/mp-serializer.h
index bee4260..2998b94 100644
--- a/src/mp-serializer.h
+++ b/src/mp-serializer.h
@@ -48,26 +48,34 @@ typedef enum {
 } DisplayFormat;
 
 GType mp_serializer_get_type(void);
-MpSerializer *mp_serializer_new(void);
 
-void mp_serializer_to_specific_string(const MPNumber *z, int base, int accuracy, gboolean trim_zeroes, gboolean localize, char **target);
+MpSerializer *mp_serializer_new(int base, int accuracy);
 
 gchar *mp_serializer_to_string(MpSerializer *serializer, const MPNumber *z);
 gboolean mp_serializer_from_string(MpSerializer *serializer, const gchar *str, MPNumber *z);
 
-gunichar mp_serializer_get_thousands_separator_text(MpSerializer *serializer);
-gint mp_serializer_get_thousands_separator_count(MpSerializer *serializer);
-gunichar mp_serializer_get_numeric_point_text(MpSerializer *serializer);
 void mp_serializer_set_base(MpSerializer *serializer, int base);
 int mp_serializer_get_base(MpSerializer *serializer);
-gboolean mp_serializer_get_show_trailing_zeroes(MpSerializer *serializer);
-void mp_serializer_set_show_trailing_zeroes(MpSerializer *serializer, gboolean visible);
-gboolean mp_serializer_get_show_thousands_separators(MpSerializer *serializer);
-void mp_serializer_set_show_thousands_separators(MpSerializer *serializer, gboolean visible);
-int mp_serializer_get_accuracy(MpSerializer *serializer);
+
 void mp_serializer_set_accuracy(MpSerializer *serializer, int accuracy);
-DisplayFormat mp_serializer_get_number_format(MpSerializer *serializer);
+int mp_serializer_get_accuracy(MpSerializer *serializer);
+
 void mp_serializer_set_number_format(MpSerializer *serializer, DisplayFormat format);
+DisplayFormat mp_serializer_get_number_format(MpSerializer *serializer);
+
+void mp_serializer_set_radix(MpSerializer *serializer, gunichar radix);
+gunichar mp_serializer_get_radix(MpSerializer *serializer);
+
+void mp_serializer_set_thousands_separator(MpSerializer *serializer, gunichar separator);
+gunichar mp_serializer_get_thousands_separator(MpSerializer *serializer);
+
+gint mp_serializer_get_thousands_separator_count(MpSerializer *serializer);
+
+void mp_serializer_set_show_trailing_zeroes(MpSerializer *serializer, gboolean visible);
+gboolean mp_serializer_get_show_trailing_zeroes(MpSerializer *serializer);
+
+void mp_serializer_set_show_thousands_separators(MpSerializer *serializer, gboolean visible);
+gboolean mp_serializer_get_show_thousands_separators(MpSerializer *serializer);
 
 G_END_DECLS
 
diff --git a/src/unittest.c b/src/unittest.c
index 8701218..9251121 100644
--- a/src/unittest.c
+++ b/src/unittest.c
@@ -84,7 +84,12 @@ test(char *expression, char *expected, int expected_error)
 
     if(error == 0) {
         char *result_str;
-        mp_serializer_to_specific_string(&result, options.base, 9, true, false, &result_str);
+        MpSerializer *serializer;
+
+        serializer = mp_serializer_new(options.base, 9);
+        result_str = mp_serializer_to_string(serializer, &result);
+        g_object_unref(serializer);
+
         if(expected_error != 0)
             fail("'%s' -> %s, expected error %s", expression, result_str, error_code_to_string(expected_error));
         else if(strcmp(result_str, expected) != 0)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]