From 751d7694b0904b580fad3903205341c85c04d421 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 11 Sep 2010 13:54:25 -0700 Subject: [PATCH] lexer: Improve translatability of lex_error(). In general I believe that it is easier to translate full sentences or clauses. It seems likely that "Syntax error %s at %s." where the first %s is an arbitrary English phrase would be impossible to translate grammatically into some languages, so this changes the general form to "Syntax error at %s: %s." which seems more likely to be translatable while not changing the English meaning. --- src/language/expressions/parse.c | 2 +- src/language/lexer/lexer.c | 31 ++++++++++++++------------ tests/command/missing-values.sh | 2 +- tests/command/rank.sh | 4 ++-- tests/language/expressions/evaluate.at | 8 +++---- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/language/expressions/parse.c b/src/language/expressions/parse.c index 7e093df31c..f2b4f1c78b 100644 --- a/src/language/expressions/parse.c +++ b/src/language/expressions/parse.c @@ -892,7 +892,7 @@ parse_primary (struct lexer *lexer, struct expression *e) } default: - lex_error (lexer, _("in expression")); + lex_error (lexer, NULL); return NULL; } } diff --git a/src/language/lexer/lexer.c b/src/language/lexer/lexer.c index 9b879c71ec..3dda38a6a0 100644 --- a/src/language/lexer/lexer.c +++ b/src/language/lexer/lexer.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -440,31 +440,34 @@ lex_sbc_missing (struct lexer *lexer, const char *sbc) void lex_error (struct lexer *lexer, const char *message, ...) { - char *token_rep; - char where[128]; + struct string s; + + ds_init_empty (&s); - token_rep = lex_token_representation (lexer); if (lexer->token == T_STOP) - strcpy (where, "end of file"); + ds_put_cstr (&s, _("Syntax error at end of file")); else if (lexer->token == '.') - strcpy (where, "end of command"); + ds_put_cstr (&s, _("Syntax error at end of command")); else - snprintf (where, sizeof where, "`%s'", token_rep); - free (token_rep); + { + char *token_rep = lex_token_representation (lexer); + ds_put_format (&s, _("Syntax error at `%s'"), token_rep); + free (token_rep); + } if (message) { - char buf[1024]; va_list args; + ds_put_cstr (&s, ": "); + va_start (args, message); - vsnprintf (buf, 1024, message, args); + ds_put_vformat (&s, message, args); va_end (args); - - msg (SE, _("Syntax error %s at %s."), buf, where); } - else - msg (SE, _("Syntax error at %s."), where); + + msg (SE, "%s.", ds_cstr (&s)); + ds_destroy (&s); } /* Checks that we're at end of command. diff --git a/tests/command/missing-values.sh b/tests/command/missing-values.sh index 7d567ac59b..e5cb0c1d7c 100755 --- a/tests/command/missing-values.sh +++ b/tests/command/missing-values.sh @@ -127,7 +127,7 @@ activity="compare error messages" diff -u -w $TEMPDIR/errs - <= > <>], [[2 ge 2], [true]], dnl Make sure >= token can't be split: [[2 > = 2], [error], - [error: DEBUG EVALUATE: Syntax error in expression at `='.]], + [error: DEBUG EVALUATE: Syntax error at `='.]], [[1 >= 'foobar'], [error], [error: DEBUG EVALUATE: Type mismatch while applying numeric greater-than-or-equal-to (`>=') operator: cannot convert string to number.]], [[5 ge 'foobar'], [error], @@ -281,10 +281,10 @@ dnl Make sure >= token can't be split: [['asdfj ' ne 'asdf'], [true]], dnl <> token can't be split: [[1 < > 1], [error], - [error: DEBUG EVALUATE: Syntax error in expression at `GT'.]], + [error: DEBUG EVALUATE: Syntax error at `GT'.]], dnl # ~= token can't be split: [[1 ~ = 1], [error], - [error: DEBUG EVALUATE: Syntax error expecting end of command at `NOT'.]]) + [error: DEBUG EVALUATE: Syntax error at `NOT': expecting end of command.]]) CHECK_EXPR_EVAL([exp lg10 ln sqrt abs mod mod10 rnd trunc], [[exp(10)], [22026.47]], -- 2.30.2