[gcalctool] General tidyups
- From: Robert Ancell <rancell src gnome org>
- To: svn-commits-list gnome org
- Subject: [gcalctool] General tidyups
- Date: Tue, 19 May 2009 06:19:14 -0400 (EDT)
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]