[gcalctool] Support arbitrary variable names, e.g. set with "name=55"



commit ac35b39525452b0a3e01520415ec324faa77ad2a
Author: Robert Ancell <robert ancell gmail com>
Date:   Wed Oct 28 13:06:01 2009 +1100

    Support arbitrary variable names, e.g. set with "name=55"
    Fix scientific display for numbers with exponent 0
    Fix missing translator comments

 ChangeLog         |    4 +
 data/gcalctool.ui |   90 +++--------------------
 src/calctool.h    |    3 -
 src/display.c     |   57 +++++-----------
 src/gtk.c         |   32 ++++-----
 src/register.c    |  203 ++++++++++++++++++++---------------------------------
 src/register.h    |   10 +--
 7 files changed, 125 insertions(+), 274 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 0d8218b..9d1ba7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,10 @@
 gcalctool change history.
 =========================
 
+2009-10-28 Robert Ancell <robert ancell gmail com>
+
+    * Support arbitrary varible names, e.g. set with "name=55"
+
 2009-10-27 Robert Ancell <robert ancell gmail com>
 
     * Support conversions in display (e.g. "1 AUD in USD" or "6.2 inches in meters")
diff --git a/data/gcalctool.ui b/data/gcalctool.ui
index 7580791..22acfef 100644
--- a/data/gcalctool.ui
+++ b/data/gcalctool.ui
@@ -30,7 +30,6 @@
                       <object class="GtkImageMenuItem" id="copy_menu">
                         <property name="label">gtk-copy</property>
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Copy selection</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
@@ -41,7 +40,6 @@
                       <object class="GtkImageMenuItem" id="paste_menu">
                         <property name="label">gtk-paste</property>
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Paste selection</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
@@ -71,7 +69,6 @@
                       <object class="GtkImageMenuItem" id="quit_menu">
                         <property name="label">gtk-quit</property>
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Quit the calculator</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
@@ -92,7 +89,6 @@
                     <child>
                       <object class="GtkRadioMenuItem" id="view_basic_menu">
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Basic</property>
                         <property name="label" translatable="yes" comments="View|Basic menu item">_Basic</property>
                         <property name="use_underline">True</property>
                         <property name="active">True</property>
@@ -102,7 +98,6 @@
                     <child>
                       <object class="GtkRadioMenuItem" id="view_advanced_menu">
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Advanced</property>
                         <property name="label" translatable="yes" comments="View|Advanced menu item">_Advanced</property>
                         <property name="use_underline">True</property>
                         <property name="group">view_basic_menu</property>
@@ -112,7 +107,6 @@
                     <child>
                       <object class="GtkRadioMenuItem" id="view_financial_menu">
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Financial</property>
                         <property name="label" translatable="yes" comments="View|Financial menu item">_Financial</property>
                         <property name="use_underline">True</property>
                         <property name="group">view_basic_menu</property>
@@ -122,7 +116,6 @@
                     <child>
                       <object class="GtkRadioMenuItem" id="view_scientific_menu">
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Scientific</property>
                         <property name="label" translatable="yes" comments="View|Scientific menu item">_Scientific</property>
                         <property name="use_underline">True</property>
                         <property name="group">view_basic_menu</property>
@@ -132,7 +125,6 @@
                     <child>
                       <object class="GtkRadioMenuItem" id="view_programming_menu">
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Programming</property>
                         <property name="label" translatable="yes" comments="View|Programming menu item">_Programming</property>
                         <property name="use_underline">True</property>
                         <property name="group">view_basic_menu</property>
@@ -154,7 +146,6 @@
                       <object class="GtkImageMenuItem" id="help_menu">
                         <property name="label" comments="Help|Contents menu">_Contents</property>
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Show help contents</property>
                         <property name="use_underline">True</property>
                         <property name="image">image1</property>
                         <property name="use_stock">False</property>
@@ -167,7 +158,6 @@
                       <object class="GtkImageMenuItem" id="about_menu">
                         <property name="label">gtk-about</property>
                         <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Show the About Gcalctool dialog</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
@@ -901,7 +891,7 @@
                   <object class="GtkLabel" id="bit_marker_label5">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label" translatable="yes">0</property>
+                    <property name="label">0</property>
                     <property name="justify">center</property>
                   </object>
                   <packing>
@@ -3996,7 +3986,7 @@
                 </child>
                 <child>
                   <object class="GtkButton" id="calc_currency_button">
-                    <property name="label" translatable="yes">&#xA4;$&#x20AC;</property>
+                    <property name="label" translatable="yes" comments="The label on the currency button">&#xA4;$&#x20AC;</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
@@ -4331,27 +4321,27 @@
     </columns>
     <data>
       <row>
-        <col id="0" translatable="yes">Decimal</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Decimal, e.g. 1234">Decimal</col>
         <col id="1">decimal</col>
       </row>
       <row>
-        <col id="0" translatable="yes">Scientific</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Scientific, e.g. 1.234Ã?10^3">Scientific</col>
         <col id="1">scientific</col>
       </row>
       <row>
-        <col id="0" translatable="yes">Engineering</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Engineering, e.g. 1.234k">Engineering</col>
         <col id="1">engineering</col>
       </row>
       <row>
-        <col id="0" translatable="yes">Binary</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Binary, e.g. 10011010010â??">Binary</col>
         <col id="1">binary</col>
       </row>
       <row>
-        <col id="0" translatable="yes">Octal</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Octal, e.g. 2322â??">Octal</col>
         <col id="1">octal</col>
       </row>
       <row>
-        <col id="0" translatable="yes">Hexadecimal</col>
+        <col id="0" translatable="yes" comments="Number display mode combo: Hexadecimal, e.g. 4D2â??â??">Hexadecimal</col>
         <col id="1">hexadecimal</col>
       </row>
     </data>
@@ -4365,19 +4355,19 @@
     </columns>
     <data>
       <row>
-        <col id="0" translatable="yes">8-bit</col>
+        <col id="0" translatable="yes" comments="Word size combo: 8 bits">8-bit</col>
         <col id="1">8</col>
       </row>
       <row>
-        <col id="0" translatable="yes">16-bit</col>
+        <col id="0" translatable="yes" comments="Word size combo: 16 bits">16-bit</col>
         <col id="1">16</col>
       </row>
       <row>
-        <col id="0" translatable="yes">32-bit</col>
+        <col id="0" translatable="yes" comments="Word size combo: 32 bits">32-bit</col>
         <col id="1">32</col>
       </row>
       <row>
-        <col id="0" translatable="yes">64-bit</col>
+        <col id="0" translatable="yes" comments="Word size combo: 64 bits">64-bit</col>
         <col id="1">64</col>
       </row>
     </data>
@@ -4425,34 +4415,6 @@
         <signal name="activate" handler="store_menu_cb"/>
       </object>
     </child>
-    <child>
-      <object class="GtkMenuItem" id="store_menu_item6">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="store_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="store_menu_item7">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="store_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="store_menu_item8">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="store_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="store_menu_item9">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="store_menu_cb"/>
-      </object>
-    </child>
   </object>
   <object class="GtkMenu" id="memory_recall_popup">
     <child>
@@ -4497,34 +4459,6 @@
         <signal name="activate" handler="recall_menu_cb"/>
       </object>
     </child>
-    <child>
-      <object class="GtkMenuItem" id="recall_menu_item6">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="recall_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="recall_menu_item7">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="recall_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="recall_menu_item8">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="recall_menu_cb"/>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="recall_menu_item9">
-        <property name="visible">True</property>
-        <property name="use_underline">True</property>
-        <signal name="activate" handler="recall_menu_cb"/>
-      </object>
-    </child>
   </object>
   <object class="GtkDialog" id="ascii_dialog">
     <property name="border_width">6</property>
diff --git a/src/calctool.h b/src/calctool.h
index aa35ef9..f945057 100644
--- a/src/calctool.h
+++ b/src/calctool.h
@@ -37,9 +37,6 @@
 #define MAXLINE        512        /* Length of character strings. */
 #endif
 
-#define MAX_FUNCTIONS 10
-#define MAX_REGISTERS 10         /* Maximum number of memory registers. */
-
 #ifndef RCNAME
 #define RCNAME         ".gcalctoolrc"
 #endif
diff --git a/src/display.c b/src/display.c
index 08f9240..07ebf63 100644
--- a/src/display.c
+++ b/src/display.c
@@ -615,10 +615,9 @@ void display_set_angle_unit(GCDisplay *display, MPAngleUnit angle_unit)
 static void
 make_eng_sci(GCDisplay *display, char *target, int target_len, const MPNumber *x, int base_)
 {
-    static char digits[] = "0123456789ABCDEF";
     char fixed[MAX_DIGITS];
     MPNumber t, z, base, base3, base10, base10inv, mantissa;
-    int ddig, eng, exponent = 0;
+    int eng, exponent = 0;
     GString *string;
 
     string = g_string_sized_new(target_len);
@@ -662,30 +661,7 @@ make_eng_sci(GCDisplay *display, char *target, int target_len, const MPNumber *x
 
     mp_cast_to_string(&mantissa, base_, display->accuracy, !display->show_zeroes, fixed, MAX_DIGITS);
     g_string_append(string, fixed);
-    g_string_append(string, "Ã?10^");
-
-    if (exponent < 0) {
-        exponent = -exponent;
-        g_string_append(string, "â??");
-    } else {
-        g_string_append(string, "+");
-    }
-
-    mp_set_from_string("0.5", &t);
-    mp_add_integer(&t, exponent, &z);
-    mp_set_from_integer(1, &t);
-    for (ddig = 0; mp_is_greater_equal(&z, &t); ddig++) {
-        mp_divide(&z, &base, &z);
-    }
-
-    while (ddig-- > 0) {
-        int dval;
-
-        mp_multiply(&z, &base, &z);
-        dval = mp_cast_to_int(&z);
-        g_string_append_c(string, digits[dval]);
-        mp_add_integer(&z, -dval, &z);
-    }
+    g_string_append_printf(string, "Ã?10^%d", exponent);
 
     strncpy(target, string->str, target_len);
     g_string_free(string, TRUE);
@@ -724,6 +700,7 @@ get_variable(const char *name, MPNumber *z, void *data)
     char *c, *lower_name;
     int result = 1;
     GCDisplay *display = data;
+    MPNumber *t;
 
     lower_name = strdup(name);
     for (c = lower_name; *c; c++)
@@ -731,12 +708,15 @@ get_variable(const char *name, MPNumber *z, void *data)
 
     if (strcmp(lower_name, "rand") == 0)
         mp_set_from_random(z);
-    else if (lower_name[0] == 'r')
-        mp_set_from_mp(register_get_value(atoi(name+1)), z);
     else if (strcmp(lower_name, "ans") == 0)
         mp_set_from_mp(display_get_answer(display), z);
-    else
-        result = 0;
+    else {
+        t = register_get_value(name);
+        if (t)
+            mp_set_from_mp(t, z);
+        else
+            result = 0;
+    }
 
     free(lower_name);
 
@@ -748,8 +728,7 @@ static void
 set_variable(const char *name, const MPNumber *x, void *data)
 {
     /* FIXME: Don't allow writing to built-in variables, e.g. ans, rand, sin, ... */
-    if (name[0] == 'R' || name[0] == 'r')
-        register_set_value(atoi(name+1), x);
+    register_set_value(name, x);
 }
 
 
@@ -1068,21 +1047,20 @@ do_factorize()
 
 
 static void
-do_sto(GCDisplay *display, int index)
+do_sto(GCDisplay *display, const char *name)
 {
-    MPNumber temp;
+    MPNumber t;
 
-    if (!display_is_usable_number(display, &temp))
+    if (!display_is_usable_number(display, &t))
         ui_set_statusbar(_("No sane value to store"));
     else
-        register_set_value(index, &temp);
+        register_set_value(name, &t);
 }
 
 
 void
 display_do_function(GCDisplay *display, int function, gpointer arg, int cursor_start, int cursor_end)
 {
-    char buf[MAXLINE];
     MPNumber *ans;
     int enabled;
     guint64 bit_value;
@@ -1130,12 +1108,11 @@ display_do_function(GCDisplay *display, int function, gpointer arg, int cursor_s
             return;
 
         case FN_STORE:
-            do_sto(display, GPOINTER_TO_INT (arg));
+            do_sto(display, (const char *)arg);
             return;
 
         case FN_RECALL:
-            SNPRINTF(buf, MAXLINE, "R%s", (const char *)arg);
-            display_insert(display, cursor_start, cursor_end, buf);
+            display_insert(display, cursor_start, cursor_end, (const char *)arg);
             break;
 
         case FN_BACKSPACE:
diff --git a/src/gtk.c b/src/gtk.c
index 39c9c72..d032a0c 100644
--- a/src/gtk.c
+++ b/src/gtk.c
@@ -92,6 +92,9 @@ static ButtonData button_data[] = {
     {NULL, NULL}
 };
 
+static char *registers[] = {"a", "b", "c", "x", "y", "z", NULL};
+#define MAX_REGISTERS 6
+
 /* Window titles dependant on mode */
 static char *titles[] = {
     /* Translators: The window title when in basic mode */
@@ -654,7 +657,7 @@ G_MODULE_EXPORT
 void
 recall_menu_cb(GtkMenuItem *menu)
 {
-    do_button(FN_RECALL, g_object_get_data(G_OBJECT(menu), "register_digit"));
+    do_button(FN_RECALL, g_object_get_data(G_OBJECT(menu), "register_id"));
 }
 
 
@@ -828,22 +831,16 @@ set_subscript_cb(GtkWidget *widget)
 static void
 update_memory_menus()
 {
-    char mstr[MAXLINE], value[MAXLINE];
     int i;
 
-    for (i = 0; i < MAX_REGISTERS; i++) {
-        const char *name, *register_prefix;
-
-        name = register_get_name(i);
-
-        /* Translators: R is the short form of register used inter alia in popup menus */
-        register_prefix = _("R");
+    for (i = 0; registers[i] != NULL; i++) {
+        char value[MAXLINE] = "", mstr[MAXLINE];
+        MPNumber *t;
 
-        display_make_number(&v->display, value, MAXLINE, register_get_value(i));
-        if (name[0] != '\0')
-            SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s%s:</span>    %s [%s]", register_prefix, subscript_digits[i], value, name);
-        else
-            SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s%s:</span>    %s", register_prefix, subscript_digits[i], value);
+        t = register_get_value(registers[i]);
+        if (t)
+            display_make_number(&v->display, value, MAXLINE, t);
+        SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s</span> = %s", registers[i], value);
         gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.memory_store_labels[i]), mstr);
         gtk_label_set_markup_with_mnemonic(GTK_LABEL(X.memory_recall_labels[i]), mstr);
     }
@@ -1555,7 +1552,6 @@ create_main_window()
 
     /* Connect super and subscript */
     for (i = 0; i < 10; i++) {
-
         SNPRINTF(name, MAXLINE, "calc_%d_button", i);
         set_string_data(X.ui, name, "calc_subscript_text", subscript_digits[i]);
         set_string_data(X.ui, name, "calc_superscript_text", superscript_digits[i]);
@@ -1568,15 +1564,15 @@ create_main_window()
     set_data(X.ui, "calc_recall_button", "calc_menu", GET_WIDGET("memory_recall_popup"));
 
     /* Get labels from popup menus */
-    for (i = 0; i < MAX_REGISTERS; i++) {
+    for (i = 0; registers[i]; i++) {
         SNPRINTF(name, MAXLINE, "store_menu_item%d", i);
         widget = GET_WIDGET(name);
-        g_object_set_data(G_OBJECT(widget), "register_id", GINT_TO_POINTER(i));
+        g_object_set_data(G_OBJECT(widget), "register_id", registers[i]);
         X.memory_store_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
 
         SNPRINTF(name, MAXLINE, "recall_menu_item%d", i);
         widget = GET_WIDGET(name);
-        g_object_set_data(G_OBJECT(widget), "register_digit", (gpointer) subscript_digits[i]);
+        g_object_set_data(G_OBJECT(widget), "register_id", registers[i]);
         X.memory_recall_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
     }
 
diff --git a/src/register.c b/src/register.c
index 9912ed7..d3189ac 100644
--- a/src/register.c
+++ b/src/register.c
@@ -17,155 +17,104 @@
  */
 
 #include <stdio.h>
+#include <string.h>
+#include <glib.h>
 
 #include "register.h"
-#include "calctool.h"
-#include "get.h"
-#include "mp.h"
 
-static char function_names[MAX_FUNCTIONS][MAXLINE];  /* Function names from .gcalctoolcf. */
-static char function_values[MAX_FUNCTIONS][MAXLINE];   /* Function defs from .gcalctoolcf. */
 
-static MPNumber registers[MAX_REGISTERS];     /* Memory register values. */
-static char register_names[MAX_REGISTERS][MAXLINE];  /* Memory register names */
+static gchar *file_name = NULL;
+static GHashTable *registers = NULL;
 
 
-static const char *default_registers[][2] =
+static void
+registers_load()
 {
-    /* Translators: This is the label for the default constant, the number of miles in one kilometer (0.621) */
-    { N_("Kilometer-to-mile conversion factor"), "0.621" },
-    /* Translators: This is the label for the default constant, the square root of 2 (1.41421) */
-    { N_("square root of 2"), "1.4142135623" },
-    /* Translators: This is the label for the default constant, Euler's number (2.71828) */
-    { N_("Euler's Number (e)"), "2.7182818284" },
-    /* Translators: This is the label for the default constant, Ï? (3.14159) */
-    { N_("Ï?"), "3.1415926536" },
-    /* Translators: This is the label for the default constant, the number of inches in a centimeter (0.39370) */
-    { N_("Centimeter-to-inch conversion factor"), "0.3937007" },
-    /* Translators: This is the label for the default constant, the number of degrees in a radian (57.2958) */
-    { N_("degrees in a radian"), "57.295779513" },
-    /* Translators: This is the label for the default constant, 2 to the power of 20 (1048576) */
-    { N_("2 ^ 20"), "1048576.0" },
-    /* Translators: This is the label for the default constant, the number of ounces in one gram (0.0353) */
-    { N_("Gram-to-ounce conversion factor"), "0.0353" },
-    /* Translators: This is the label for the default constant, the number of British Thermal Units in one Kilojoule (0.948) */
-    { N_("Kilojoule-to-British-thermal-unit conversion factor"), "0.948" },
-    /* Translators: This is the label for the default constant, the number of cubic inches in one cubic centimeter (0.0610) */
-    { N_("Cubic-centimeter-to-cubic-inch conversion factor"), "0.0610" }
-};
-
-void register_init()
-{
-    int i;
-
-    for (i = 0; i < MAX_REGISTERS; i++) {
-        char nkey[MAXLINE], *nline;
-        char vkey[MAXLINE], *vline = NULL;
-        MPNumber value;
-
-        SNPRINTF(nkey, MAXLINE, "registger%1dname", i);
-        nline = get_resource(nkey);
-        if (nline) {
-            SNPRINTF(vkey, MAXLINE, "register%1d", i);
-            vline = get_resource(vkey);
-            if (vline == NULL)
-                g_free(nline);
-        }
-
-        if (nline && vline) {
-            mp_set_from_string(vline, &value);
-            register_set_name(i, nline);
-            register_set_value(i, &value);
-            g_free(nline);
-            g_free(vline);
-        }
-        else {
-            mp_set_from_string(default_registers[i][1], &value);
-            register_set_name(i, default_registers[i][0]);
-            register_set_value(i, &value);
-        }
-    }
-
-    for (i = 0; i < MAX_FUNCTIONS; i++) {
-        char nkey[MAXLINE], *nline;
-        char vkey[MAXLINE], *vline;
-
-        SNPRINTF(nkey, MAXLINE, "function%1dname", i);
-        nline = get_resource(nkey);
-        if (nline) {
-            SNPRINTF(vkey, MAXLINE, "function%1dvalue", i);
-            vline = get_resource(vkey);
-            if (vline == NULL)
-                g_free(nline);
-        }
-
-        if (nline && vline) {
-            function_set(i, nline, vline);
-            g_free(nline);
-            g_free(vline);
-        }
-        else {
-            function_set(i, "", "");
-        }
+    FILE *f;
+    char line[1024];
+    
+    f = fopen(file_name, "r");
+    if (!f)
+        return;
+    
+    g_hash_table_remove_all(registers);
+    
+    while (fgets(line, 1024, f) != NULL)
+    {
+        char *name, *value;
+        MPNumber *t;
+        
+        value = strchr(line, '=');
+        if (!value)
+            continue;
+        *value = '\0';
+        value = value + 1;
+        
+        name = g_strstrip(line);
+        value = g_strstrip(value);
+
+        t = g_malloc(sizeof(MPNumber));
+        if (mp_set_from_string(value, t) == 0)
+            g_hash_table_insert(registers, g_strdup(name), t);
+        else
+            g_free(t);
     }
+    fclose(f);
 }
 
 
-void
-register_set_value(int index, const MPNumber *value)
-{
-    if ((index >= 0) && (index <= 10))
-        mp_set_from_mp(value, &registers[index]);
-}
-
-
-const MPNumber *
-register_get_value(int index)
-{
-    if ((index >= 0) && (index <= 10))
-        return &registers[index];
-    else
-        return NULL;
-}
-
-
-void register_set_name(int index, const char *name)
-{
-    char key[MAXLINE];
-
-    STRNCPY(register_names[index], name, MAXLINE - 1);
-    SNPRINTF(key, MAXLINE, "register%1dname", index);
-    set_resource(key, name);
-}
-
-
-const char *register_get_name(int index)
+static void
+registers_save()
 {
-    return register_names[index];
+    gchar *dir;
+    FILE *f;
+    GHashTableIter iter;
+    gpointer key, val;
+    
+    dir = g_path_get_dirname(file_name);
+    g_mkdir_with_parents(dir, 0700);
+    g_free(dir);
+
+    f = fopen(file_name, "w");
+    if (!f)
+        return;
+    
+    g_hash_table_iter_init(&iter, registers);
+    while (g_hash_table_iter_next(&iter, &key, &val))
+    {
+        gchar *name = key;
+        MPNumber *value = val;
+        char number[1024];
+
+        mp_cast_to_string(value, 10, 50, TRUE, number, 1024);
+        fprintf(f, "%s=%s\n", name, number);
+    }
+    fclose(f);
 }
 
 
-void function_set(int index, const char *name, const char *value)
+void
+register_init()
 {
-    char key[MAXLINE];
-
-    STRNCPY(function_names[index], name, MAXLINE - 1);
-    STRNCPY(function_values[index], value, MAXLINE - 1);
-
-    SNPRINTF(key, MAXLINE, "function%1dname", index);
-    set_resource(key, name);
-    SNPRINTF(key, MAXLINE, "function%1dvalue", index);
-    set_resource(key, value);
+    registers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+    file_name = g_build_filename(g_get_user_data_dir(), "gcalctool", "registers", NULL);
+    registers_load();
 }
 
 
-const char *function_get_name(int index)
+void
+register_set_value(const char *name, const MPNumber *value)
 {
-    return function_names[index];
+    MPNumber *t;
+    t = g_malloc(sizeof(MPNumber));
+    mp_set_from_mp(value, t);
+    g_hash_table_insert(registers, g_strdup(name), t);
+    registers_save();
 }
 
 
-const char *function_get_value(int index)
+MPNumber *
+register_get_value(const char *name)
 {
-    return function_values[index];
+    return g_hash_table_lookup(registers, name);
 }
diff --git a/src/register.h b/src/register.h
index 5daae75..4c9a9bf 100644
--- a/src/register.h
+++ b/src/register.h
@@ -22,13 +22,7 @@
 #include "mp.h"
 
 void register_init();
-void register_set_value(int index, const MPNumber *value);
-void register_set_name(int index, const char *name);
-const MPNumber *register_get_value(int index);
-const char *register_get_name(int index);
-
-void function_set(int index, const char *name, const char *value);
-const char *function_get_name(int index);
-const char *function_get_value(int index);
+void register_set_value(const char *name, const MPNumber *value);
+MPNumber *register_get_value(const char *name);
 
 #endif /*REGISTER_H*/



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