SORT VARIABLES: Improve stability of sort.
[pspp] / src / language / control / repeat.c
index 72d45c2c2ff96344cfe65c3948475fd661792469..0e464420a2bf6d43a4f8ca2bc0f405fc76e6ea3c 100644 (file)
 #include "libpspp/cast.h"
 #include "libpspp/hash-functions.h"
 #include "libpspp/hmap.h"
+#include "libpspp/i18n.h"
 #include "libpspp/message.h"
 #include "libpspp/str.h"
+#include "libpspp/misc.h"
 
 #include "gl/ftoastr.h"
 #include "gl/minmax.h"
@@ -77,7 +79,7 @@ cmd_do_repeat (struct lexer *lexer, struct dataset *ds)
 static unsigned int
 hash_dummy (const char *name, size_t name_len)
 {
-  return hash_case_bytes (name, name_len, 0);
+  return utf8_hash_case_bytes (name, name_len, 0);
 }
 
 static const struct dummy_var *
@@ -87,7 +89,7 @@ find_dummy_var (struct hmap *hmap, const char *name, size_t name_len)
 
   HMAP_FOR_EACH_WITH_HASH (dv, struct dummy_var, hmap_node,
                            hash_dummy (name, name_len), hmap)
-    if (strcasecmp (dv->name, name))
+    if (utf8_strcasecmp (dv->name, name))
       return dv;
 
   return NULL;
@@ -303,9 +305,8 @@ parse_commands (struct lexer *lexer, struct hmap *dummies)
   for (i = 0; i < n_values; i++)
     {
       struct string *output = &outputs[n_values - i - 1];
-      struct lex_reader *reader;
-
-      reader = lex_reader_for_substring_nocopy (ds_ss (output));
+      const char *encoding = lex_get_encoding (lexer);
+      struct lex_reader *reader = lex_reader_for_substring_nocopy (ds_ss (output), encoding);
       lex_reader_set_file_name (reader, file_name);
       reader->line_number = line_number;
       lex_include (lexer, reader);
@@ -399,7 +400,7 @@ parse_numbers (struct lexer *lexer, struct dummy_var *dv)
         {
           char s[DBL_BUFSIZE_BOUND];
 
-          dtoastr (s, sizeof s, 0, 0, lex_number (lexer));
+          c_dtoastr (s, sizeof s, 0, 0, lex_number (lexer));
           add_replacement (dv, xstrdup (s), &allocated);
           lex_get (lexer);
         }
@@ -437,6 +438,6 @@ parse_strings (struct lexer *lexer, struct dummy_var *dv)
 int
 cmd_end_repeat (struct lexer *lexer UNUSED, struct dataset *ds UNUSED)
 {
-  msg (SE, _("No matching DO REPEAT."));
+  msg (SE, _("No matching %s."), "DO REPEAT");
   return CMD_CASCADING_FAILURE;
 }