lexer: Improve translatability of lex_error().
[pspp] / src / language / lexer / lexer.c
index 317aac73e66354ad12e4c20bd69abcf1a223159a..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
@@ -176,19 +176,19 @@ lex_get (struct lexer *lexer)
          return;
        }
 
-  /* If a token was pushed ahead, return it. */
-  if (lexer->put_token)
-    {
-      restore_token (lexer);
+      /* If a token was pushed ahead, return it. */
+      if (lexer->put_token)
+        {
+          restore_token (lexer);
 #if DUMP_TOKENS
          dump_token (lexer);
 #endif
-      return;
-    }
+          return;
+        }
 
-  for (;;)
-    {
-      /* Skip whitespace. */
+      for (;;)
+        {
+          /* Skip whitespace. */
          while (c_isspace ((unsigned char) *lexer->prog))
            lexer->prog++;
 
@@ -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.
@@ -1249,7 +1252,7 @@ dump_token (struct lexer *lexer)
       break;
 
     case T_STRING:
-      fprintf (stderr, "STRING\t\"%s\"\n", ds_cstr (&lexer->tokstr));
+      fprintf (stderr, "STRING\t`%s'\n", ds_cstr (&lexer->tokstr));
       break;
 
     case T_STOP: