[gcalctool/gcalctool-new-parser] Get assignments working



commit b3c7a82eab68808600ae821fc8cf5316dcd4b79c
Author: Robert Ancell <robert ancell canonical com>
Date:   Sun Oct 16 18:53:37 2011 +1100

    Get assignments working

 src/mp-equation.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
---
diff --git a/src/mp-equation.c b/src/mp-equation.c
index 32000c2..e599f6f 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -287,6 +287,7 @@ typedef enum
     TOKEN_SYMBOL,
     TOKEN_FUNCTION,
     TOKEN_VARIABLE,
+    TOKEN_ASSIGNMENT,
     TOKEN_EXPRESSION
 } TokenType;
 
@@ -437,6 +438,8 @@ parse(MPEquationOptions *options, const gchar *expression, GList **tokens)
                 current_token = TOKEN_RIGHT_FRACTION;
             else if (c == ' ')
                 refeed = FALSE;
+            else if (c == '=')
+                current_token = TOKEN_ASSIGNMENT;
             else if (c == '\0')
                 return PARSER_ERR_NONE;
             else
@@ -1302,6 +1305,8 @@ mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *
 {
     GList *tokens;
     MPErrorCode error;
+    Token *t0, *t1 = NULL;
+    gchar *variable_name;
 
     if (!(expression && result) || strlen(expression) == 0)
         return PARSER_ERR_INVALID;
@@ -1312,6 +1317,20 @@ mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *
     if (error)
         return error;
 
+    t0 = tokens->data;
+    if (tokens->next)
+        t1 = tokens->next->data;
+    if (t0->type == TOKEN_SYMBOL && t1 && t1->type == TOKEN_ASSIGNMENT)
+    {
+        variable_name = token_get_text (t0);
+        g_free (t0);
+        g_free (t1);
+        tokens = tokens->next->next;
+        tokens->prev = NULL;
+    }
+    else
+        variable_name = g_strdup ("ans");
+
     error = solve_conversion(options, tokens, g_list_last(tokens), result);
     if (!error)
         return error;
@@ -1325,6 +1344,8 @@ mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *
 
     if (mp_get_error())
         return PARSER_ERR_MP;
+  
+    set_variable(options, variable_name, result);
 
     return PARSER_ERR_NONE;
 }



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