lexer: Improve translatability of lex_error().
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 11 Sep 2010 20:54:25 +0000 (13:54 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Fri, 24 Sep 2010 03:45:30 +0000 (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
src/language/lexer/lexer.c
tests/command/missing-values.sh
tests/command/rank.sh
tests/language/expressions/evaluate.at

index 7e093df31c9ed1eda3b0d3587b9f60366d20fedf..f2b4f1c78b4cc2b4a85f6ea752e74990d19c952b 100644 (file)
@@ -892,7 +892,7 @@ parse_primary (struct lexer *lexer, struct expression *e)
       }
 
     default:
-      lex_error (lexer, _("in expression"));
+      lex_error (lexer, NULL);
       return NULL;
     }
 }
index 9b879c71ec5d57484bb4105a0540e6db2b6b11d9..3dda38a6a0b8ab4f39d87d3e8a05c36ba4761488 100644 (file)
@@ -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.
index 7d567ac59bb301fcdb7a5cf1802f0213f0be7fe5..e5cb0c1d7c8ba780111f99e30c09c6850ba21e58 100755 (executable)
@@ -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
index 8114c438f9aef125df005effd67797d95fac3946..626778828f613b7d72521a83322e774df432fd9b 100755 (executable)
@@ -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
index 28a4dd5ef865fdd05cb633278531d1d17f46dde8..a7144221bd86c717cf594be74d1d451b3ca825e5 100644 (file)
@@ -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]],