#include <math.h>
#include <stdlib.h>
-#include <data/case.h>
-#include <data/data-in.h>
-#include <data/format.h>
-#include <data/dictionary.h>
-#include <data/procedure.h>
-#include <data/transformations.h>
-#include <data/variable.h>
-#include <language/command.h>
-#include <language/lexer/lexer.h>
-#include <language/lexer/value-parser.h>
-#include <language/lexer/variable-parser.h>
-#include <libpspp/assertion.h>
-#include <libpspp/compiler.h>
-#include <libpspp/message.h>
-#include <libpspp/pool.h>
-#include <libpspp/str.h>
-
-#include "xalloc.h"
+#include "data/case.h"
+#include "data/data-in.h"
+#include "data/dictionary.h"
+#include "data/format.h"
+#include "data/procedure.h"
+#include "data/transformations.h"
+#include "data/variable.h"
+#include "language/command.h"
+#include "language/lexer/lexer.h"
+#include "language/lexer/value-parser.h"
+#include "language/lexer/variable-parser.h"
+#include "libpspp/assertion.h"
+#include "libpspp/cast.h"
+#include "libpspp/compiler.h"
+#include "libpspp/message.h"
+#include "libpspp/pool.h"
+#include "libpspp/str.h"
+
+#include "gl/xalloc.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
/* Create destination variables, if needed.
This must be the final step; otherwise we'd have to
delete destination variables on failure. */
+ trns->dst_dict = dataset_dict (ds);
if (trns->src_vars != trns->dst_vars)
create_dst_vars (trns, dataset_dict (ds));
}
else if (lex_match_id (lexer, "SYSMIS"))
set_map_out_num (out, SYSMIS);
- else if (lex_token (lexer) == T_STRING)
+ else if (lex_is_string (lexer))
{
set_map_out_str (out, pool, lex_tokstr (lexer));
lex_get (lexer);
{
size_t i;
- trns->dst_dict = dict;
-
for (i = 0; i < trns->var_cnt; i++)
{
const struct variable **var = &trns->dst_vars[i];
find_src_string (struct recode_trns *trns, const uint8_t *value,
const struct variable *src_var)
{
- struct mapping *m;
+ const char *encoding = dict_get_encoding (trns->dst_dict);
int width = var_get_width (src_var);
+ struct mapping *m;
for (m = trns->mappings; m < trns->mappings + trns->map_cnt; m++)
{
case MAP_CONVERT:
{
union value uv;
+ char *error;
+
+ error = data_in (ss_buffer (CHAR_CAST_BUG (char *, value), width),
+ LEGACY_NATIVE, FMT_F, &uv, 0, encoding);
+ match = error == NULL;
+ free (error);
- msg_disable ();
- match = data_in (ss_buffer (CHAR_CAST_BUG (char *, value), width),
- LEGACY_NATIVE, FMT_F, 0, 0, 0, trns->dst_dict,
- &uv, 0);
- msg_enable ();
out->value.f = uv.f;
break;
}
}
else
{
- char *dst = case_str_rw (*c, dst_var);
+ char *dst = CHAR_CAST_BUG (char *, case_str_rw (*c, dst_var));
if (out != NULL)
{
if (!out->copy_input)