[gcalctool/gcalctool-newui2] support log base n



commit 4f3b0e70b81ff2d3b7e13c2e3a62a8c1af9604ab
Author: Robert Ancell <robert ancell gmail com>
Date:   Wed Jul 15 11:30:20 2009 +1000

    support log base n

 src/mp-equation.c |   31 +++++++++++++++++++++++++++++--
 1 files changed, 29 insertions(+), 2 deletions(-)
---
diff --git a/src/mp-equation.c b/src/mp-equation.c
index 0ff8d58..22293ca 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -39,7 +39,7 @@ get_variable(MPEquationParserState *state, const char *name, MPNumber *z)
     lower_name = strdup(name);
     for (c = lower_name; *c; c++)
         *c = tolower(*c);
-
+    
     if (lower_name[0] == 'r')
         mp_set_from_mp(register_get_value(atoi(name+1)), z);
     else if (strcmp(lower_name, "ans") == 0)
@@ -69,6 +69,23 @@ set_variable(MPEquationParserState *state, const char *name, MPNumber *x)
 // letters+numbers = numbers+letters+numbers = function
 
 
+static int sub_atoi(const char *data)
+{
+    int i, value = 0;
+    const char *digits[] = {"â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", "â??", NULL};
+    
+    do {
+        for(i = 0; digits[i] != NULL && strncmp(data, digits[i], strlen(digits[i])) != 0; i++);
+        if(digits[i] == NULL)
+            return -1;
+        data += strlen(digits[i]);
+        value = value * 10 + i;
+    } while(*data != '\0');
+
+    return value;
+}
+
+
 static int
 get_function(MPEquationParserState *state, const char *name, const MPNumber *x, MPNumber *z)
 {
@@ -82,7 +99,17 @@ get_function(MPEquationParserState *state, const char *name, const MPNumber *x,
     // FIXME: Re Im ?
 
     if (strcmp(lower_name, "log") == 0)
-        mp_logarithm(10, x, z);
+        mp_logarithm(10, x, z); // FIXME: Default to ln
+    else if (strncmp(lower_name, "log", 3) == 0) {
+        int base;
+        
+        base = sub_atoi(lower_name + 3);
+        printf("%d\n", base);
+        if (base < 0)
+            result = 0;
+        else
+            mp_logarithm(base, x, z);
+    }
     else if (strcmp(lower_name, "ln") == 0)
         mp_ln(x, z);
     else if (strcmp(lower_name, "sqrt") == 0) // â??x



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