X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fxforms%2Frecode.c;h=4f8acf6bbb9d1f05db5cdf707eafd9787c3dd306;hb=9420449c40bb1307f6c31e50b61ba03825680e3a;hp=1aebe344696a066635c0f5dd2cd72e0f6bdf21a1;hpb=41a628f070c7a0d2e9468308cb1bf4ff77de9900;p=pspp diff --git a/src/language/xforms/recode.c b/src/language/xforms/recode.c index 1aebe34469..4f8acf6bbb 100644 --- a/src/language/xforms/recode.c +++ b/src/language/xforms/recode.c @@ -160,6 +160,7 @@ cmd_recode (struct lexer *lexer, struct dataset *ds) { if ( ! enlarge_dst_widths (trns)) { + recode_trns_free (trns); return CMD_FAILURE; } } @@ -327,7 +328,7 @@ parse_map_in (struct lexer *lexer, struct map_in *in, struct pool *pool, set_map_in_generic (in, MAP_MISSING); else if (!lex_force_string (lexer)) return false; - else + else { set_map_in_str (in, pool, lex_tokss (lexer), max_src_width, dict_encoding); @@ -335,7 +336,7 @@ parse_map_in (struct lexer *lexer, struct map_in *in, struct pool *pool, if (lex_token (lexer) == T_ID && lex_id_match (ss_cstr ("THRU"), lex_tokss (lexer))) { - msg (SE, _("THRU is not allowed with string variables.")); + msg (SE, _("%s is not allowed with string variables."), "THRU"); return false; } } @@ -411,10 +412,10 @@ parse_map_out (struct lexer *lexer, struct pool *pool, struct map_out *out) set_map_out_str (out, pool, lex_tokss (lexer)); lex_get (lexer); } - else if (lex_match_id (lexer, "COPY")) + else if (lex_match_id (lexer, "COPY")) { out->copy_input = true; - out->width = 0; + out->width = 0; } else { @@ -451,7 +452,7 @@ set_map_out_str (struct map_out *out, struct pool *pool, out->copy_input = false; value_init_pool (pool, &out->value, length); - memcpy (value_str_rw (&out->value, length), string, length); + memcpy (out->value.s, string, length); out->width = length; } @@ -540,7 +541,7 @@ enlarge_dst_widths (struct recode_trns *trns) const struct variable *narrow_var = NULL; int min_dst_width = INT_MAX; trns->max_dst_width = 0; - + for (i = 0; i < trns->var_cnt; i++) { const struct variable *v = trns->dst_vars[i]; @@ -561,12 +562,12 @@ enlarge_dst_widths (struct recode_trns *trns) { if (out->width > min_dst_width) { - msg (ME, + msg (ME, _("Cannot recode because the variable %s would require a width of %d bytes or greater, but it has a width of only %d bytes."), var_get_name (narrow_var), out->width, min_dst_width); return false; } - + value_resize_pool (trns->pool, &out->value, out->width, trns->max_dst_width); } @@ -655,8 +656,7 @@ find_src_string (struct recode_trns *trns, const uint8_t *value, switch (in->type) { case MAP_SINGLE: - match = !memcmp (value, value_str (&in->x, trns->max_src_width), - width); + match = !memcmp (value, in->x.s, width); break; case MAP_ELSE: match = true; @@ -721,8 +721,7 @@ recode_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED) if (out != NULL) { if (!out->copy_input) - memcpy (dst, value_str (&out->value, trns->max_dst_width), - var_get_width (dst_var)); + memcpy (dst, out->value.s, var_get_width (dst_var)); else if (trns->src_vars != trns->dst_vars) { union value *dst_data = case_data_rw (*c, dst_var);