[gcalctool] Parser expects registers to be subscripted. Explain that to UI code and fix register parsing code to



commit ec909bee64cc48061a08fd60f6177616f96ea997
Author: Robin Sonefors <ozamosi flukkost nu>
Date:   Wed Oct 7 23:59:53 2009 +0200

    Parser expects registers to be subscripted. Explain that to UI code and fix register parsing code to understand the subscrpted indexes.

 src/display.c           |    4 ++--
 src/gtk.c               |   13 +++++++------
 src/mp-equation-lexer.l |   33 +--------------------------------
 src/mp-equation.c       |   21 +++++++++++++++++++--
 src/mp-equation.h       |    2 ++
 5 files changed, 31 insertions(+), 42 deletions(-)
---
diff --git a/src/display.c b/src/display.c
index 9172a8d..a1a35ea 100644
--- a/src/display.c
+++ b/src/display.c
@@ -729,7 +729,7 @@ get_variable(const char *name, MPNumber *z, void *data)
         *c = tolower(*c);
 
     if (lower_name[0] == 'r')
-        mp_set_from_mp(register_get_value(atoi(name+1)), z);
+        mp_set_from_mp(register_get_value(sub_atoi(name+1)), z);
     else if (strcmp(lower_name, "ans") == 0)
         mp_set_from_mp(display_get_answer(display), z);
     else
@@ -960,7 +960,7 @@ display_do_function(GCDisplay *display, int function, gpointer arg, int cursor_s
             return;
 
         case FN_RECALL:
-            SNPRINTF(buf, MAXLINE, "R%d", GPOINTER_TO_INT (arg));
+            SNPRINTF(buf, MAXLINE, "R%s", (const char *)arg);
             display_insert(display, cursor_start, cursor_end, buf);
             break;
 
diff --git a/src/gtk.c b/src/gtk.c
index 71779ee..efb30bb 100644
--- a/src/gtk.c
+++ b/src/gtk.c
@@ -216,6 +216,9 @@ typedef enum {
     CURRENCY_TARGET_LOWER
 } CurrencyTargetRow;
 
+static const char *subscript_digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??"};
+static const char *superscript_digits[] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�"};
+
 static void load_ui(GtkBuilder *ui, const gchar *filename)
 {
     GError *error = NULL;
@@ -651,7 +654,7 @@ G_MODULE_EXPORT
 void
 recall_menu_cb(GtkMenuItem *menu)
 {
-    do_button(FN_RECALL, g_object_get_data(G_OBJECT(menu), "register_id"));
+    do_button(FN_RECALL, g_object_get_data(G_OBJECT(menu), "register_digit"));
 }
 
 
@@ -838,9 +841,9 @@ update_memory_menus()
 
         display_make_number(&v->display, value, MAXLINE, register_get_value(i));
         if (name[0] != '\0')
-            SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s_%d:</span>    %s [%s]", register_prefix, i, value, name);
+            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_%d:</span>    %s", register_prefix, i, value);
+            SNPRINTF(mstr, MAXLINE, "<span weight=\"bold\">%s%s:</span>    %s", register_prefix, subscript_digits[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);
     }
@@ -1553,8 +1556,6 @@ create_main_window()
 
     /* Connect super and subscript */
     for (i = 0; i < 10; i++) {
-        static const char *subscript_digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??"};
-        static const char *superscript_digits[] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�"};
 
         SNPRINTF(name, MAXLINE, "calc_%d_button", i);
         set_string_data(X.ui, name, "calc_subscript_text", subscript_digits[i]);
@@ -1576,7 +1577,7 @@ create_main_window()
 
         SNPRINTF(name, MAXLINE, "recall_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_digit", (gpointer) subscript_digits[i]);
         X.memory_recall_labels[i] = gtk_bin_get_child(GTK_BIN(widget));
     }
 
diff --git a/src/mp-equation-lexer.l b/src/mp-equation-lexer.l
index 668b975..172cce6 100644
--- a/src/mp-equation-lexer.l
+++ b/src/mp-equation-lexer.l
@@ -32,38 +32,7 @@
 
 #include "mp-equation-private.h"
 #include "mp-equation-parser.h"
-
-static int super_atoi(const char *data)
-{
-   int i, value = 0;
-   const char *digits[11] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�", NULL};
-
-   while(*data != '\0') {
-      for(i = 0; digits[i] != NULL && strncmp(data, digits[i], strlen(digits[i])) != 0; i++);
-      if(digits[i] == NULL)
-         return 0;
-      value = value * 10 + i;
-      data += strlen(digits[i]);
-   }
-
-   return value;
-}
-
-static int sub_atoi(const char *data)
-{
-   int i, value = 0;
-   const char *digits[11] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", NULL};
-
-   while(*data != '\0') {
-      for(i = 0; digits[i] != NULL && strncmp(data, digits[i], strlen(digits[i])) != 0; i++);
-      if(digits[i] == NULL)
-         return 0;
-      data += strlen(digits[i]);
-      value = value * 10 + i;
-   }
-
-   return value;
-}
+#include "mp-equation.h"
 %}
 
 
diff --git a/src/mp-equation.c b/src/mp-equation.c
index c60e78f..e7d2c10 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -58,7 +58,8 @@ set_variable(MPEquationParserState *state, const char *name, const MPNumber *x)
 // letters+numbers = numbers+letters+numbers = function
 
 
-static int sub_atoi(const char *data)
+int
+sub_atoi(const char *data)
 {
     int i, value = 0;
     const char *digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", NULL};
@@ -66,7 +67,7 @@ static int sub_atoi(const char *data)
     do {
         for(i = 0; digits[i] != NULL && strncmp(data, digits[i], strlen(digits[i])) != 0; i++);
         if(digits[i] == NULL)
-            return -1;
+            return 0;
         data += strlen(digits[i]);
         value = value * 10 + i;
     } while(*data != '\0');
@@ -74,6 +75,22 @@ static int sub_atoi(const char *data)
     return value;
 }
 
+int
+super_atoi(const char *data)
+{
+   int i, value = 0;
+   const char *digits[11] = {"�", "¹", "²", "³", "�", "�", "�", "�", "�", "�", NULL};
+
+   do {
+      for(i = 0; digits[i] != NULL && strncmp(data, digits[i], strlen(digits[i])) != 0; i++);
+      if(digits[i] == NULL)
+         return 0;
+      value = value * 10 + i;
+      data += strlen(digits[i]);
+   } while(*data != '\0');
+
+   return value;
+}
 
 static int
 get_function(MPEquationParserState *state, const char *name, const MPNumber *x, MPNumber *z)
diff --git a/src/mp-equation.h b/src/mp-equation.h
index b4a0a57..b698e0f 100644
--- a/src/mp-equation.h
+++ b/src/mp-equation.h
@@ -54,4 +54,6 @@ typedef struct {
 
 int mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *result, char **error_token);
 
+int sub_atoi(const char *data);
+int super_atoi(const char *data);
 #endif



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