[gcalctool] Improve error messages



commit e07f489b08acc663376815d1fee301c7c323f7c8
Author: Robin Sonefors <ozamosi flukkost nu>
Date:   Wed Oct 7 22:51:20 2009 +0200

    Improve error messages

 src/calctool.c            |    2 +-
 src/display.c             |   16 +++++++++++-----
 src/mp-equation-parser.y  |    8 ++++++--
 src/mp-equation-private.h |    3 +++
 src/mp-equation.c         |    5 ++++-
 src/mp-equation.h         |    2 +-
 src/unittest.c            |    2 +-
 7 files changed, 27 insertions(+), 11 deletions(-)
---
diff --git a/src/calctool.c b/src/calctool.c
index 7a84d83..edbec89 100644
--- a/src/calctool.c
+++ b/src/calctool.c
@@ -54,7 +54,7 @@ solve(const char *equation)
     options.wordlen = 32;
     options.angle_units = MP_DEGREES;
 
-    error = mp_equation_parse(equation, &options, &result);
+    error = mp_equation_parse(equation, &options, &result, NULL);
     if(error != 0) {
         fprintf(stderr, "Error %d\n", error);
         exit(1);
diff --git a/src/display.c b/src/display.c
index 3c9af48..9172a8d 100644
--- a/src/display.c
+++ b/src/display.c
@@ -750,7 +750,7 @@ set_variable(const char *name, const MPNumber *x, void *data)
 
 
 static int
-parse(GCDisplay *display, const char *text, MPNumber *z)
+parse(GCDisplay *display, const char *text, MPNumber *z, char **error_token)
 {
     MPEquationOptions options;
 
@@ -761,7 +761,7 @@ parse(GCDisplay *display, const char *text, MPNumber *z)
     options.set_variable = set_variable;
     options.callback_data = display;
 
-    return mp_equation_parse(text, &options, z);
+    return mp_equation_parse(text, &options, z, error_token);
 }
 
 
@@ -1006,8 +1006,12 @@ display_do_function(GCDisplay *display, int function, gpointer arg, int cursor_s
                 MPNumber z;
                 int result;
                 const char *message = NULL;
+                char *error_token;
 
-                result = parse(display, display_get_text(display), &z);
+                result = parse(display,
+                               display_get_text(display),
+                               &z,
+                               &error_token);
                 switch (result) {
                     case 0:
                         mp_set_from_mp(&z, ans);
@@ -1021,12 +1025,14 @@ display_do_function(GCDisplay *display, int function, gpointer arg, int cursor_s
 
                     case -PARSER_ERR_UNKNOWN_VARIABLE:
                         /* Translators: Error displayed to user when they an unknown variable is entered */
-                        message = _("Unknown variable");
+                        message = g_strdup_printf(_("Unknown variable '%s'"), error_token);
+                        free(error_token);
                         break;
 
                     case -PARSER_ERR_UNKNOWN_FUNCTION:
                         /* Translators: Error displayed to user when an unknown function is entered */
-                        message = _("Function '%s' is not defined");
+                        message = g_strdup_printf(_("Function '%s' is not defined"), error_token);
+                        free(error_token);
                         break;
 
                     case -PARSER_ERR_MP:
diff --git a/src/mp-equation-parser.y b/src/mp-equation-parser.y
index ae671fa..0dad75d 100644
--- a/src/mp-equation-parser.y
+++ b/src/mp-equation-parser.y
@@ -38,8 +38,10 @@ static void set_error(yyscan_t yyscanner, int error)
 
 static void get_variable(yyscan_t yyscanner, const char *name, MPNumber *z)
 {
-    if (!_mp_equation_get_extra(yyscanner)->get_variable(_mp_equation_get_extra(yyscanner), name, z))
+    if (!_mp_equation_get_extra(yyscanner)->get_variable(_mp_equation_get_extra(yyscanner), name, z)) {
         set_error(yyscanner, -PARSER_ERR_UNKNOWN_VARIABLE);
+        _mp_equation_get_extra(yyscanner)->error_token = strdup(name);
+    }
 }
 
 static void set_variable(yyscan_t yyscanner, const char *name, MPNumber *x)
@@ -49,8 +51,10 @@ static void set_variable(yyscan_t yyscanner, const char *name, MPNumber *x)
 
 static void get_function(yyscan_t yyscanner, const char *name, const MPNumber *x, MPNumber *z)
 {
-    if (!_mp_equation_get_extra(yyscanner)->get_function(_mp_equation_get_extra(yyscanner), name, x, z))
+    if (!_mp_equation_get_extra(yyscanner)->get_function(_mp_equation_get_extra(yyscanner), name, x, z)) {
         set_error(yyscanner, -PARSER_ERR_UNKNOWN_FUNCTION);
+        _mp_equation_get_extra(yyscanner)->error_token = strdup(name);
+    }
 }
 
 static void do_not(yyscan_t yyscanner, const MPNumber *x, MPNumber *z)
diff --git a/src/mp-equation-private.h b/src/mp-equation-private.h
index d47d60a..403ce2d 100644
--- a/src/mp-equation-private.h
+++ b/src/mp-equation-private.h
@@ -43,6 +43,9 @@ struct MPEquationParserState {
     /* Error returned from parser */
     int error;
 
+    /* Name of token where error occured */
+    char *error_token;
+
     /* Value returned from parser */
     MPNumber ret;
 };
diff --git a/src/mp-equation.c b/src/mp-equation.c
index 91d6690..c60e78f 100644
--- a/src/mp-equation.c
+++ b/src/mp-equation.c
@@ -148,7 +148,7 @@ get_function(MPEquationParserState *state, const char *name, const MPNumber *x,
 
 
 int
-mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *result)
+mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *result, char **error_token)
 {
     int ret;
     MPEquationParserState state;
@@ -171,6 +171,9 @@ mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *
     buffer = _mp_equation__scan_string(expression, yyscanner);
 
     ret = _mp_equation_parse(yyscanner);
+    if (state.error_token != NULL && error_token != NULL) {
+        *error_token = state.error_token;
+    }
 
     _mp_equation__delete_buffer(buffer, yyscanner);
     _mp_equation_lex_destroy(yyscanner);
diff --git a/src/mp-equation.h b/src/mp-equation.h
index b9cd8e0..b4a0a57 100644
--- a/src/mp-equation.h
+++ b/src/mp-equation.h
@@ -52,6 +52,6 @@ typedef struct {
     int (*get_function)(const char *name, const MPNumber *x, MPNumber *z, void *data);
 } MPEquationOptions;
 
-int mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *result);
+int mp_equation_parse(const char *expression, MPEquationOptions *options, MPNumber *result, char **error_token);
 
 #endif
diff --git a/src/unittest.c b/src/unittest.c
index f0646a4..c50ee16 100644
--- a/src/unittest.c
+++ b/src/unittest.c
@@ -67,7 +67,7 @@ test(char *expression, char *expected, int expected_error)
     MPNumber result;
     char result_str[1024] = "";
 
-    error = mp_equation_parse(expression, &options, &result);
+    error = mp_equation_parse(expression, &options, &result, NULL);
 
     if(error == 0) {
         mp_cast_to_string(&result, base, 9, 1, result_str, 1024);



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