lexer: Reimplement for better testability and internationalization.
[pspp-builds.git] / src / language / lexer / value-parser.c
index 8cbbab4c82bfa3d0e262d865d8975c72794c9bee..ff2701e8dadfb586b64a791367de731177b00563 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006, 2009, 2010, 2011 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
@@ -25,6 +25,7 @@
 #include "data/value.h"
 #include "language/lexer/lexer.h"
 #include "libpspp/cast.h"
+#include "libpspp/i18n.h"
 #include "libpspp/message.h"
 #include "libpspp/str.h"
 
@@ -103,9 +104,12 @@ parse_number (struct lexer *lexer, double *x, const enum fmt_type *format)
   else if (lex_is_string (lexer) && format != NULL)
     {
       union value v;
-      assert (! (fmt_get_category (*format) & ( FMT_CAT_STRING )));
-      data_in (ds_ss (lex_tokstr (lexer)), LEGACY_NATIVE, *format, 0, 0,
-               &v, 0, NULL);
+
+      assert (fmt_get_category (*format) != FMT_CAT_STRING);
+
+      if (!data_in_msg (lex_tokss (lexer), "UTF-8", *format, &v, 0, NULL))
+        return false;
+
       lex_get (lexer);
       *x = v.f;
       if (*x == SYSMIS)
@@ -139,7 +143,7 @@ parse_value (struct lexer *lexer, union value *v, int width)
     }
   else if (lex_force_string (lexer))
     {
-      const char *s = ds_cstr (lex_tokstr (lexer));
+      const char *s = lex_tokcstr (lexer);
       value_copy_str_rpad (v, width, CHAR_CAST_BUG (const uint8_t *, s), ' ');
     }
   else