[gcalctool] Fix base conversions
- From: Robert Ancell <rancell src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gcalctool] Fix base conversions
- Date: Sun, 30 Aug 2009 23:58:24 +0000 (UTC)
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]