[gcalctool] Improve error messages
- From: Robin Sonefors <rsonefors src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gcalctool] Improve error messages
- Date: Wed, 7 Oct 2009 22:05:41 +0000 (UTC)
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]