[gcalctool] General tidyups



commit 82c437151989feb823fc0a6c1a0d923e24c611de
Author: Robert Ancell <robert ancell gmail com>
Date:   Tue May 19 12:18:20 2009 +0200

    General tidyups
---
 src/display.c            |    3 +++
 src/gtk.c                |    5 ++++-
 src/mp-convert.c         |   15 ++++++---------
 src/mp-equation-parser.y |    4 ++--
 src/mp-equation.c        |   32 +++++++++++++-------------------
 src/mp-equation.h        |   17 ++++++-----------
 src/mp-trigonometric.c   |    6 +++---
 src/mp.c                 |   40 ++++++++++++++++++----------------------
 src/mp.h                 |    3 +++
 src/unittest.c           |    1 +
 10 files changed, 59 insertions(+), 67 deletions(-)

diff --git a/src/display.c b/src/display.c
index e40b328..8d029ff 100644
--- a/src/display.c
+++ b/src/display.c
@@ -20,8 +20,11 @@
  *  02111-1307, USA.
  */
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <math.h>
+#include <errno.h>
 #include <assert.h>
 
 #include "display.h"
diff --git a/src/gtk.c b/src/gtk.c
index f7a224b..6ce6b00 100644
--- a/src/gtk.c
+++ b/src/gtk.c
@@ -20,9 +20,12 @@
  *  02111-1307, USA.
  */
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
+#include <assert.h>
+
 #include <gtk/gtk.h>
 #include <gdk/gdkx.h>
 #include <gdk/gdkkeysyms.h>
@@ -1331,7 +1334,7 @@ about_cb(GtkWidget *widget)
     /* Translators: The translator credits. Please translate this with your name(s). */
     const gchar *translator_credits = _("translator-credits");
 
-    /* Translators: The license this software is under (GPL2+) */    
+    /* Translators: The license this software is under (GPL2+) */
     char *license =
         _("Gcalctool is free software; you can redistribute it and/or modify\n"
           "it under the terms of the GNU General Public License as published by\n"
diff --git a/src/mp-convert.c b/src/mp-convert.c
index 86f28a9..f9c2f37 100644
--- a/src/mp-convert.c
+++ b/src/mp-convert.c
@@ -23,7 +23,6 @@
 #include <string.h>
 #include <ctype.h>
 #include <math.h>
-#include <assert.h>
 
 #include "mp.h"
 #include "mp-internal.h"
@@ -42,12 +41,10 @@ mp_set_from_mp(const MPNumber *x, MPNumber *y)
         return;
 
     /* NO NEED TO COPY X[1],X[2],... IF X[0] == 0 */
-    if (x->sign == 0) {
+    if (x->sign == 0)
         y->sign = 0;
-        return;
-    }
-
-    memcpy (y, x, (MP.t + 2)*sizeof(int));
+    else
+        memcpy (y, x, MP.t * sizeof(int));
 }
 
 /*  CONVERTS SINGLE-PRECISION NUMBER RX TO MULTIPLE-PRECISION Z.
@@ -645,9 +642,9 @@ mp_set_from_string(const char *str, int base, MPNumber *MPval)
         mp_set_from_integer(0, &numerator);
         mp_set_from_integer(1, &denominator);
         while ((inum = char_val(*optr, base)) >= 0) {
-	    mp_multiply_integer(&denominator, base, &denominator);
-	    mp_multiply_integer(&numerator, base, &numerator);
-	    mp_add_integer(&numerator, inum, &numerator);
+            mp_multiply_integer(&denominator, base, &denominator);
+            mp_multiply_integer(&numerator, base, &numerator);
+            mp_add_integer(&numerator, inum, &numerator);
             optr++;
         }
         mp_divide(&numerator, &denominator, &numerator);
diff --git a/src/mp-equation-parser.y b/src/mp-equation-parser.y
index d41c1cb..8f62e21 100644
--- a/src/mp-equation-parser.y
+++ b/src/mp-equation-parser.y
@@ -104,7 +104,7 @@
 
 statement: 
   seq
-| value { mp_set_from_mp(&$1, &(_mp_equation_get_extra(yyscanner))->ret); (_mp_equation_get_extra(yyscanner))->flags |= ANS; }
+| value { mp_set_from_mp(&$1, &(_mp_equation_get_extra(yyscanner))->ret); (_mp_equation_get_extra(yyscanner))->have_result = 1; }
 | error {
   (_mp_equation_get_extra(yyscanner))->error = -EINVAL; 
   YYABORT;
@@ -268,7 +268,7 @@ rcl:
 number:
   tNUMBER {mp_set_from_mp(&$1, &$$);}
 | tANS {
-  mp_set_from_mp(display_get_answer(&v->display), &$$);
+  mp_set_from_mp(&_mp_equation_get_extra(yyscanner)->ans, &$$);
 }
 ;
 
diff --git a/src/mp-equation.c b/src/mp-equation.c
index 1c46b52..e5b3e9b 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -27,7 +27,7 @@
 extern int _mp_equation_parse(yyscan_t yyscanner);
 
 int 
-mp_equation_parse_(const char *expression, MPNumber *result, int flags)
+mp_equation_parse_(const char *expression, MPNumber *result, int need_result)
 {
     int ret = 0;
     MPEquationParserState state;
@@ -41,6 +41,7 @@ mp_equation_parse_(const char *expression, MPNumber *result, int flags)
     state.base = basevals[v->base];
     state.wordlen = v->wordlen;
     state.angle_units = v->ttype;
+    mp_set_from_mp(display_get_answer(&v->display), &state.ans);
     v->math_error = 0;
         
     _mp_equation_lex_init_extra(&state, &yyscanner);
@@ -52,31 +53,24 @@ mp_equation_parse_(const char *expression, MPNumber *result, int flags)
     _mp_equation_lex_destroy(yyscanner);
 
     ret = (state.error) ? state.error : ret;
+    if (ret)
+        return ret;
 
-    if (ret) {
-        return(ret);
-    } else {
-        if ((flags & ANS) != (state.flags & ANS)) {
-            return -EINVAL;
-        }
+    if ((need_result != 0) != (state.have_result != 0))
+        return -EINVAL;
 
-        if (v->math_error) {
-            return v->math_error;
-        }
+    if (v->math_error)
+        return v->math_error;
 
-        if (flags & ANS) {
-            mp_set_from_mp(&state.ret, result);
-        }
-
-        return 0;
-    }
+    mp_set_from_mp(&state.ret, result);
+    return 0;
 }
 
 
 int 
 mp_equation_parse(const char *expression, MPNumber *result)
 {
-    return(mp_equation_parse_(expression, result, ANS));
+    return(mp_equation_parse_(expression, result, 1));
 }
 
 
@@ -84,10 +78,10 @@ int
 mp_equation_udf_parse(const char *expression)
 {
     MPNumber t;
-    return(mp_equation_parse_(expression, &t, 0));
+    return mp_equation_parse_(expression, &t, 0);
 }
 
 int _mp_equation_error(void *yylloc, MPEquationParserState *state, char *text)
 {
-  return 0;
+    return 0;
 }
diff --git a/src/mp-equation.h b/src/mp-equation.h
index cbc163c..871e347 100644
--- a/src/mp-equation.h
+++ b/src/mp-equation.h
@@ -22,17 +22,8 @@
 #ifndef MP_EQUATION_H
 #define MP_EQUATION_H
 
-#include <stdio.h>
-#include <stdlib.h> 
-#include <string.h>
-#include <math.h>
-#include <assert.h>
-#include <errno.h>
-
 #include "mp.h"
 
-#define ANS 1
-
 #define PARSER_ERR_INVALID_BASE     10000
 #define PARSER_ERR_TOO_LONG_NUMBER  10001
 #define PARSER_ERR_BITWISEOP        10002
@@ -50,10 +41,14 @@ typedef struct {
     /* Units for angles (e.g. radians, degrees) */
     MPAngleUnit angle_units;
 
-    int flags;
-
     /* Error returned from parser */
     int error;
+    
+    /* Value of Ans variable */
+    MPNumber ans;
+
+    /* TRUE if have a result */
+    int have_result;
 
     /* Value returned from parser */
     MPNumber ret;
diff --git a/src/mp-trigonometric.c b/src/mp-trigonometric.c
index 5901f05..ddfaaf7 100644
--- a/src/mp-trigonometric.c
+++ b/src/mp-trigonometric.c
@@ -170,12 +170,12 @@ mp_atan1N(int n, MPNumber *z)
         ts = MP.t;
         MP.t = t;
         if (i >= id) {
-            mpmulq(&t2, -i, i + 2, &t2);
+            mp_multiply_fraction(&t2, -i, i + 2, &t2);
             mp_divide_integer(&t2, n, &t2);
             mp_divide_integer(&t2, n, &t2);
         }
         else {
-            mpmulq(&t2, -i, (i + 2)*n*n, &t2);
+            mp_multiply_fraction(&t2, -i, (i + 2)*n*n, &t2);
         }
         MP.t = ts;
 
@@ -567,7 +567,7 @@ mp_atan(const MPNumber *x, MPAngleUnit unit, MPNumber *z)
         ts = MP.t;
         MP.t = t;
         mp_multiply(&t2, &t1, &t2);
-        mpmulq(&t2, -i, i + 2, &t2);
+        mp_multiply_fraction(&t2, -i, i + 2, &t2);
         MP.t = ts;
 
         mp_add(z, &t2, z);
diff --git a/src/mp.c b/src/mp.c
index 2042434..afe5d50 100644
--- a/src/mp.c
+++ b/src/mp.c
@@ -181,8 +181,7 @@ mpadd2(const MPNumber *x, const MPNumber *y, MPNumber *z, int y_sign, int trunc)
     if (exp_diff < 0) {
         /* HERE EXPONENT(Y)  >  EXPONENT(X) */
         if (med > MP.t) {
-            /* 'y' so much larger than 'x' that 'x+-y = y'.  Warning:
-             still true with rounding??  */
+            /* 'y' so much larger than 'x' that 'x+-y = y'.  Warning: still true with rounding??  */
             mp_set_from_mp(y, z);
             z->sign = y_sign;
             return;
@@ -191,8 +190,7 @@ mpadd2(const MPNumber *x, const MPNumber *y, MPNumber *z, int y_sign, int trunc)
     } else if (exp_diff > 0) {
         /* HERE EXPONENT(X)  >  EXPONENT(Y) */
         if (med > MP.t) {
-            /* 'x' so much larger than 'y' that 'x+-y = x'.  Warning:
-             still true with rounding??  */
+            /* 'x' so much larger than 'y' that 'x+-y = x'.  Warning: still true with rounding??  */
             mp_set_from_mp(x, z);
             return;
         }
@@ -225,8 +223,7 @@ mpadd2(const MPNumber *x, const MPNumber *y, MPNumber *z, int y_sign, int trunc)
     if (x_largest) {
         zt.sign = x->sign;
         zt.exponent = x->exponent + mpadd3(y, x, zt.fraction, sign_prod, med);
-    }
-    else {
+    } else {
         zt.sign = y_sign;
         zt.exponent = y->exponent + mpadd3(x, y, zt.fraction, sign_prod, med);
     }
@@ -343,7 +340,7 @@ mpadd3(const MPNumber *x, const MPNumber *y, int *r, int s, int med)
 }
 
 
-/*  ADDS MULTIPLE-PRECISION X TO INTEGER IY
+/*  ADDS MULTIPLE-PRECISION X TO INTEGER Y
  *  GIVING MULTIPLE-PRECISION Z.
  *  DIMENSION OF R IN CALLING PROGRAM MUST BE
  *  AT LEAST 2T+6 (BUT Z(1) MAY BE R(T+5)).
@@ -352,11 +349,11 @@ mpadd3(const MPNumber *x, const MPNumber *y, int *r, int s, int med)
  *  CHECK LEGALITY OF B, T, M AND MXR
  */
 void
-mp_add_integer(const MPNumber *x, int iy, MPNumber *z)
+mp_add_integer(const MPNumber *x, int y, MPNumber *z)
 {
     MPNumber t;
     mpchk();
-    mp_set_from_integer(iy, &t);
+    mp_set_from_integer(y, &t);
     mp_add(x, &t, z);
 }
 
@@ -1590,32 +1587,32 @@ mp_multiply_integer(const MPNumber *x, int iy, MPNumber *z)
 
 /* MULTIPLIES MP X BY I/J, GIVING MP Y */
 void
-mpmulq(const MPNumber *x, int i, int j, MPNumber *y)
+mp_multiply_fraction(const MPNumber *x, int numerator, int denominator, MPNumber *z)
 {
     int is, js;
 
-    if (j == 0) {
+    if (denominator == 0) {
         mpchk();
-        mperr("*** ATTEMPTED DIVISION BY ZERO IN MPMULQ ***");
-        y->sign = 0;
+        mperr("*** ATTEMPTED DIVISION BY ZERO IN MP_MULTIPLY_FRACTION ***");
+        z->sign = 0;
         return;
     }
 
-    if (i == 0) {
-        y->sign = 0;
+    if (numerator == 0) {
+        z->sign = 0;
         return;
     }
 
     /* REDUCE TO LOWEST TERMS */
-    is = i;
-    js = j;
+    is = numerator;
+    js = denominator;
     mpgcd(&is, &js);
     if (abs(is) == 1) {
         /* HERE IS = +-1 */
-        mp_divide_integer(x, is * js, y);
+        mp_divide_integer(x, is * js, z);
     } else {
-        mp_divide_integer(x, js, y);
-        mpmul2(y, is, y, 0);
+        mp_divide_integer(x, js, z);
+        mpmul2(z, is, z, 0);
     }
 }
 
@@ -1628,8 +1625,7 @@ mp_invert_sign(const MPNumber *x, MPNumber *y)
     y->sign = -y->sign;
 }
 
-/*  ASSUMES LONG (I.E. (T+4)-DIGIT) FRACTION IN
- *  R, SIGN = REG_SIGN, EXPONENT = REG_EXP.  NORMALIZES,
+/*  ASSUMES LONG (I.E. (T+4)-DIGIT) FRACTION IN R.  NORMALIZES,
  *  AND RETURNS MP RESULT IN Z.  INTEGER ARGUMENTS REG_EXP IS
  *  NOT PRESERVED. R*-ROUNDING IS USED IF TRUNC == 0
  */
diff --git a/src/mp.h b/src/mp.h
index 2e01645..afb1f86 100644
--- a/src/mp.h
+++ b/src/mp.h
@@ -121,6 +121,9 @@ void   mp_multiply(const MPNumber *x, const MPNumber *y, MPNumber *z);
 /* Sets z = x Ã? y */
 void   mp_multiply_integer(const MPNumber *x, int y, MPNumber *z);
 
+/* Sets z = x � numerator ÷ denominator */
+void   mp_multiply_fraction(const MPNumber *x, int numerator, int denominator, MPNumber *z);
+
 /* Sets z = x ÷ y */
 void   mp_divide(const MPNumber *x, const MPNumber *y, MPNumber *z);
 
diff --git a/src/unittest.c b/src/unittest.c
index 2e0a68e..28d6907 100644
--- a/src/unittest.c
+++ b/src/unittest.c
@@ -19,6 +19,7 @@
  *  02111-1307, USA.
  */
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
 



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