pspp-dev
[Top][All Lists]
Advanced

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

[pre-lexer 09/21] lexer: Improve translatability of lex_error().


From: Ben Pfaff
Subject: [pre-lexer 09/21] lexer: Improve translatability of lex_error().
Date: Thu, 23 Sep 2010 21:20:45 -0700

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 7e093df..f2b4f1c 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 9b879c7..3dda38a 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 7d567ac..e5cb0c1 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 - <<EOF
 $TEMPDIR/missing-values.stat:35: error: MISSING VALUES: Missing values 
provided are too long to assign to variable of width 3.
 $TEMPDIR/missing-values.stat:38: error: MISSING VALUES: Truncating missing 
value to maximum acceptable length (8 bytes).
-$TEMPDIR/missing-values.stat:41: error: MISSING VALUES: Syntax error expecting 
string at \`THRU'.
+$TEMPDIR/missing-values.stat:41: error: MISSING VALUES: Syntax error at 
\`THRU': expecting string.
 $TEMPDIR/missing-values.stat:41: error: MISSING VALUES: THRU is not a variable 
name.
 $TEMPDIR/missing-values.stat:44: error: MISSING VALUES: Cannot mix numeric 
variables (e.g. num1) and string variables (e.g. str1) within a single list.
 EOF
diff --git a/tests/command/rank.sh b/tests/command/rank.sh
index 8114c43..6267788 100755
--- a/tests/command/rank.sh
+++ b/tests/command/rank.sh
@@ -137,8 +137,8 @@ if [ $? -ne 1 ] ; then fail ; fi
 activity="compare errors"
 perl -pi -e 's/^\s*$//g' $TEMPDIR/errs
 diff -b $TEMPDIR/errs - << EOF
-$TEMPDIR/rank.sh.sps:15: error: RANK: Syntax error expecting \`(' at end of 
command.
-$TEMPDIR/rank.sh.sps:19: error: RANK: Syntax error expecting integer at \`d'.
+$TEMPDIR/rank.sh.sps:15: error: RANK: Syntax error at end of command:  
expecting \`('.
+$TEMPDIR/rank.sh.sps:19: error: RANK: Syntax error at \`d':  expecting integer.
 $TEMPDIR/rank.sh.sps:25: error: RANK: Variable x already exists.
 $TEMPDIR/rank.sh.sps:30: error: RANK: Too many variables in INTO clause.
 EOF
diff --git a/tests/language/expressions/evaluate.at 
b/tests/language/expressions/evaluate.at
index 28a4dd5..a714422 100644
--- a/tests/language/expressions/evaluate.at
+++ b/tests/language/expressions/evaluate.at
@@ -188,7 +188,7 @@ dnl Mathematically true:
   [[2 le 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 
less-than-or-equal-to (`<=') operator: cannot convert string to number.]],
   [[5 <= 'foobar'], [error],
@@ -229,7 +229,7 @@ CHECK_EXPR_EVAL([>= > <>],
   [[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]],
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]