[gcalctool] Fix base conversions



commit f085f3c1f497e7cf725399907ad2e4ca05e23108
Author: Robert Ancell <robert ancell gmail com>
Date:   Mon Aug 31 09:57:44 2009 +1000

    Fix base conversions

 ChangeLog        |    4 ++++
 src/display.c    |   36 +++++++++---------------------------
 src/display.h    |    1 -
 src/functions.c  |   14 +++++---------
 src/mp-convert.c |    6 ++++--
 src/mp.h         |    6 ++++--
 6 files changed, 26 insertions(+), 41 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 890d465..d48424e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,10 @@
 gcalctool change history.
 =========================
 
+2009-08-31 Robert Ancell <robert ancell gmail com>
+
+    * Fix base conversions (Robert Ancell)
+
 2009-08-28 Robert Ancell <robert ancell gmail com>
 
     * Fix duplicate object names in data/financial.ui (Robert Ancell, Bug #593277)
diff --git a/src/display.c b/src/display.c
index cdabf1a..71aa18c 100644
--- a/src/display.c
+++ b/src/display.c
@@ -206,7 +206,6 @@ gboolean display_get_unsigned_integer(GCDisplay *display, guint64 *value)
     const char *text;
     char buf[MAX_DISPLAY];
     gchar *endptr;
-    guint bases[] = {2, 8, 10, 16};
 
     text = display_get_text(display);
     if (text[0] == '\0') {
@@ -221,7 +220,7 @@ gboolean display_get_unsigned_integer(GCDisplay *display, guint64 *value)
     if(strncmp(text, "-", strlen("-")) == 0 || strncmp(text, "â??", strlen("â??")) == 0)
         return FALSE;
 
-    *value = g_ascii_strtoull(text, &endptr, bases[v->base]);
+    *value = g_ascii_strtoull(text, &endptr, v->base);
     if(*endptr != '\0' || (*value == G_MAXUINT64 && errno == ERANGE))
         return FALSE;
     return TRUE;
@@ -594,8 +593,11 @@ display_is_usable_number(GCDisplay *display, MPNumber *z)
     if (display_is_empty(display)) {
         mp_set_from_integer(0, z);
         return TRUE;
+    } else if (display_is_result(display)) {
+        mp_set_from_mp(display_get_answer(display), z);
+        return TRUE;
     } else {
-        return display_solve(display, z) == 0; // FIXME: Change to MP
+        return mp_set_from_string(display_get_text(display), v->base, z) == 0;
     }
 }
 
@@ -672,26 +674,6 @@ void display_set_format(GCDisplay *display, DisplayFormat type)
 }
 
 
-// FIXME: Obsolete
-int
-display_solve(GCDisplay *display, MPNumber *result)
-{
-    MPEquationOptions options;
-    const char *text;
-    int errorCode;
-    
-    memset(&options, 0, sizeof(options));
-    options.base = v->base;
-    options.wordlen = v->wordlen;
-    options.angle_units = v->ttype;
-
-    text = display_get_text(display);
-    errorCode = mp_equation_parse(text, &options, result);
-    
-    return errorCode;
-}
-
-
 /* Convert engineering or scientific number in the given base. */
 static void
 make_eng_sci(GCDisplay *display, char *target, int target_len, const MPNumber *MPnumber, int base)
@@ -790,7 +772,7 @@ make_eng_sci(GCDisplay *display, char *target, int target_len, const MPNumber *M
 
 /* Convert MP number to character string in the given base. */
 void
-display_make_number(GCDisplay *display, char *target, int target_len, const MPNumber *MPnumber, int base, int ignoreError)
+display_make_number(GCDisplay *display, char *target, int target_len, const MPNumber *x, int base, int ignoreError)
 {
     double val, max_fix;
     
@@ -802,7 +784,7 @@ display_make_number(GCDisplay *display, char *target, int target_len, const MPNu
      *        order to do these tests.
      */
 
-    double number = mp_cast_to_double(MPnumber);
+    double number = mp_cast_to_double(x);
 
     val = fabs(number);
     if (v->error && !ignoreError) {
@@ -831,8 +813,8 @@ display_make_number(GCDisplay *display, char *target, int target_len, const MPNu
     if ((display->format == ENG) ||
         (display->format == SCI) ||
         (display->format == FIX && val != 0.0 && (val > max_fix))) {
-        make_eng_sci(display, target, target_len, MPnumber, base);
+        make_eng_sci(display, target, target_len, x, base);
     } else {
-        mp_cast_to_string(MPnumber, base, v->accuracy, !v->display.show_zeroes, target, target_len);
+        mp_cast_to_string(x, base, v->accuracy, !v->display.show_zeroes, target, target_len);
     }
 }
diff --git a/src/display.h b/src/display.h
index deb6328..810bc05 100644
--- a/src/display.h
+++ b/src/display.h
@@ -92,7 +92,6 @@ gboolean display_is_result(GCDisplay *);
 gboolean display_is_usable_number(GCDisplay *display, MPNumber *);
 
 const char *display_get_text(GCDisplay *display);
-int display_solve(GCDisplay *display, MPNumber *);
 
 void display_make_number(GCDisplay *display, char *target, int target_len, const MPNumber *MPnumber, int base, int ignoreError);
 
diff --git a/src/functions.c b/src/functions.c
index 9dac4ab..5714983 100644
--- a/src/functions.c
+++ b/src/functions.c
@@ -316,7 +316,7 @@ do_shift(int count)
 {
     MPNumber z;
 
-    if (display_is_usable_number(&v->display, &z) || !mp_is_integer(&z)) {
+    if (!display_is_usable_number(&v->display, &z) || !mp_is_integer(&z)) {
         /* Translators: This message is displayed in the status bar when a bit
            shift operation is performed and the display does not contain a number */
         ui_set_statusbar(_("No sane value to do bitwise shift"),
@@ -333,13 +333,11 @@ do_shift(int count)
 static void
 do_base(int b)
 {
-    int ret;
     MPNumber z;
 
     if (!display_is_empty(&v->display))
     {   
-        ret = display_is_usable_number(&v->display, &z);
-        if (ret) {
+        if (!display_is_usable_number(&v->display, &z)) {
             ui_set_statusbar(_("No sane value to convert"),
                              "gtk-dialog-error");
         } else {
@@ -362,7 +360,7 @@ do_exchange(int index)
 {
     MPNumber r, z;
 
-    if (display_is_usable_number(&v->display, &z)) {
+    if (!display_is_usable_number(&v->display, &z)) {
         ui_set_statusbar(_("No sane value to store"),
                          "gtk-dialog-error");
     } else {
@@ -387,14 +385,12 @@ do_wordlen(int len)
 static void
 do_numtype(DisplayFormat n)   /* Set number display type. */
 {
-    int ret;
     MPNumber z;
 
     /* Convert display if it contains a number */
     if (!display_is_empty(&v->display))
     {
-        ret = display_is_usable_number(&v->display, &z);
-        if (ret) {
+        if (!display_is_usable_number(&v->display, &z)) {
             ui_set_statusbar(_("No sane value to convert"),
                              "gtk-dialog-error");
         } else {
@@ -414,7 +410,7 @@ do_sto(int index)
 {
     MPNumber temp;
     
-    if (display_is_usable_number(&v->display, &temp))
+    if (!display_is_usable_number(&v->display, &temp))
         ui_set_statusbar(_("No sane value to store"),
                          "gtk-dialog-error");
     else
diff --git a/src/mp-convert.c b/src/mp-convert.c
index 797f65c..f0ae9da 100644
--- a/src/mp-convert.c
+++ b/src/mp-convert.c
@@ -579,7 +579,7 @@ char_val(char **c, int base)
 }
 
 
-void
+int
 mp_set_from_string(const char *str, int base, MPNumber *z)
 {
     int i, negate = 0, multiplier = 0;
@@ -705,7 +705,7 @@ mp_set_from_string(const char *str, int base, MPNumber *z)
     }
    
     if (c != end) {
-       // FIXME: Error decoding
+        return 1;
     }
     
     if (multiplier != 0) {
@@ -717,4 +717,6 @@ mp_set_from_string(const char *str, int base, MPNumber *z)
  
     if (negate == 1)
         mp_invert_sign(z, z);
+    
+    return 0;
 }
diff --git a/src/mp.h b/src/mp.h
index 2478724..1602439 100644
--- a/src/mp.h
+++ b/src/mp.h
@@ -204,8 +204,10 @@ void   mp_set_from_fraction(int numerator, int denominator, MPNumber *z);
 /* Sets z to be a uniform random number in the range [0, 1] */
 void   mp_set_from_random(MPNumber *z);
 
-/* Sets z from a string representation in 'text' in base 'base' */
-void   mp_set_from_string(const char *text, int base, MPNumber *z);
+/* Sets z from a string representation in 'text' in base 'base'.
+ * Returns 0 on success.
+ */
+int    mp_set_from_string(const char *text, int base, MPNumber *z);
 
 /* Returns x as a native single-precision floating point number */
 float  mp_cast_to_float(const MPNumber *x);



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