projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Issue an error if no valid data are found
[pspp]
/
src
/
language
/
xforms
/
recode.c
diff --git
a/src/language/xforms/recode.c
b/src/language/xforms/recode.c
index 01f3bf765428038e9e964ee55e7ebe79c8b07fed..83d48553479b9e0f0f91dc1c5b201d15602a6064 100644
(file)
--- a/
src/language/xforms/recode.c
+++ b/
src/language/xforms/recode.c
@@
-97,8
+97,8
@@
struct recode_trns
enum var_type dst_type; /* dst_vars[*]->type. */
/* Variables. */
enum var_type dst_type; /* dst_vars[*]->type. */
/* Variables. */
-
struct variable **src_vars;
/* Source variables. */
-
struct variable **dst_vars;
/* Destination variables. */
+
const struct variable **src_vars;
/* Source variables. */
+
const struct variable **dst_vars;
/* Destination variables. */
char **dst_names; /* Name of dest variables, if they're new. */
size_t var_cnt; /* Number of variables. */
char **dst_names; /* Name of dest variables, if they're new. */
size_t var_cnt; /* Number of variables. */
@@
-181,7
+181,7
@@
static bool
parse_src_vars (struct lexer *lexer,
struct recode_trns *trns, const struct dictionary *dict)
{
parse_src_vars (struct lexer *lexer,
struct recode_trns *trns, const struct dictionary *dict)
{
- if (!parse_variables (lexer, dict, &trns->src_vars, &trns->var_cnt,
+ if (!parse_variables
_const
(lexer, dict, &trns->src_vars, &trns->var_cnt,
PV_SAME_TYPE))
return false;
pool_register (trns->pool, free, trns->src_vars);
PV_SAME_TYPE))
return false;
pool_register (trns->pool, free, trns->src_vars);
@@
-260,6
+260,7
@@
parse_mappings (struct lexer *lexer, struct recode_trns *trns)
struct map_in in;
set_map_in_generic (&in, MAP_CONVERT);
add_mapping (trns, &map_allocated, &in);
struct map_in in;
set_map_in_generic (&in, MAP_CONVERT);
add_mapping (trns, &map_allocated, &in);
+ set_map_out_num (&trns->mappings[trns->map_cnt - 1].out, 0.0);
dst_type = VAR_NUMERIC;
if (trns->src_type != VAR_STRING
dst_type = VAR_NUMERIC;
if (trns->src_type != VAR_STRING
@@
-312,6
+313,12
@@
parse_map_in (struct lexer *lexer, struct map_in *in, struct pool *pool,
return false;
set_map_in_str (in, pool, lex_tokstr (lexer), max_src_width);
lex_get (lexer);
return false;
set_map_in_str (in, pool, lex_tokstr (lexer), max_src_width);
lex_get (lexer);
+ if (lex_token (lexer) == T_ID
+ && lex_id_match (ss_cstr ("THRU"), ss_cstr (lex_tokid (lexer))))
+ {
+ msg (SE, _("THRU is not allowed with string variables."));
+ return false;
+ }
}
return true;
}
return true;
@@
-443,7
+450,7
@@
parse_dst_vars (struct lexer *lexer, struct recode_trns *trns,
trns->var_cnt, sizeof *trns->dst_vars);
for (i = 0; i < trns->var_cnt; i++)
{
trns->var_cnt, sizeof *trns->dst_vars);
for (i = 0; i < trns->var_cnt; i++)
{
- struct variable *v;
+
const
struct variable *v;
v = trns->dst_vars[i] = dict_lookup_var (dict, trns->dst_names[i]);
if (v == NULL && trns->dst_type == VAR_STRING)
{
v = trns->dst_vars[i] = dict_lookup_var (dict, trns->dst_names[i]);
if (v == NULL && trns->dst_type == VAR_STRING)
{
@@
-472,7
+479,7
@@
parse_dst_vars (struct lexer *lexer, struct recode_trns *trns,
for (i = 0; i < trns->var_cnt; i++)
{
for (i = 0; i < trns->var_cnt; i++)
{
- struct variable *v = trns->dst_vars[i];
+
const
struct variable *v = trns->dst_vars[i];
if (v != NULL && var_get_type (v) != trns->dst_type)
{
msg (SE, _("Type mismatch. Cannot store %s data in "
if (v != NULL && var_get_type (v) != trns->dst_type)
{
msg (SE, _("Type mismatch. Cannot store %s data in "
@@
-498,7
+505,7
@@
enlarge_dst_widths (struct recode_trns *trns)
max_dst_width = 0;
for (i = 0; i < trns->var_cnt; i++)
{
max_dst_width = 0;
for (i = 0; i < trns->var_cnt; i++)
{
- struct variable *v = trns->dst_vars[i];
+
const
struct variable *v = trns->dst_vars[i];
if (var_get_width (v) > max_dst_width)
max_dst_width = var_get_width (v);
}
if (var_get_width (v) > max_dst_width)
max_dst_width = var_get_width (v);
}
@@
-509,7
+516,7
@@
enlarge_dst_widths (struct recode_trns *trns)
if (!out->copy_input && out->width < max_dst_width)
{
char *s = pool_alloc_unaligned (trns->pool, max_dst_width + 1);
if (!out->copy_input && out->width < max_dst_width)
{
char *s = pool_alloc_unaligned (trns->pool, max_dst_width + 1);
-
str_copy_rpad (s, max_dst_width + 1, out->value.c
);
+
buf_copy_rpad (s, max_dst_width + 1, out->value.c, out->width
);
out->value.c = s;
}
}
out->value.c = s;
}
}
@@
-523,7
+530,7
@@
create_dst_vars (struct recode_trns *trns, struct dictionary *dict)
for (i = 0; i < trns->var_cnt; i++)
{
for (i = 0; i < trns->var_cnt; i++)
{
- struct variable **var = &trns->dst_vars[i];
+
const
struct variable **var = &trns->dst_vars[i];
const char *name = trns->dst_names[i];
*var = dict_lookup_var (dict, name);
const char *name = trns->dst_names[i];
*var = dict_lookup_var (dict, name);
@@
-538,7
+545,7
@@
create_dst_vars (struct recode_trns *trns, struct dictionary *dict)
/* Returns the output mapping in TRNS for an input of VALUE on
variable V, or a null pointer if there is no mapping. */
static const struct map_out *
/* Returns the output mapping in TRNS for an input of VALUE on
variable V, or a null pointer if there is no mapping. */
static const struct map_out *
-find_src_numeric (struct recode_trns *trns, double value, struct variable *v)
+find_src_numeric (struct recode_trns *trns, double value,
const
struct variable *v)
{
struct mapping *m;
{
struct mapping *m;
@@
-554,11
+561,14
@@
find_src_numeric (struct recode_trns *trns, double value, struct variable *v)
match = value == in->x.f;
break;
case MAP_MISSING:
match = value == in->x.f;
break;
case MAP_MISSING:
- match = var_is_num_missing (v, value, MV_
USER
);
+ match = var_is_num_missing (v, value, MV_
ANY
);
break;
case MAP_RANGE:
match = value >= in->x.f && value <= in->y.f;
break;
break;
case MAP_RANGE:
match = value >= in->x.f && value <= in->y.f;
break;
+ case MAP_SYSMIS:
+ match = value == SYSMIS;
+ break;
case MAP_ELSE:
match = true;
break;
case MAP_ELSE:
match = true;
break;
@@
-624,8
+634,8
@@
recode_trns_proc (void *trns_, struct ccase *c, casenumber case_idx UNUSED)
for (i = 0; i < trns->var_cnt; i++)
{
for (i = 0; i < trns->var_cnt; i++)
{
- struct variable *src_var = trns->src_vars[i];
- struct variable *dst_var = trns->dst_vars[i];
+
const
struct variable *src_var = trns->src_vars[i];
+
const
struct variable *dst_var = trns->dst_vars[i];
const union value *src_data = case_data (c, src_var);
union value *dst_data = case_data_rw (c, dst_var);
const union value *src_data = case_data (c, src_var);
union value *dst_data = case_data_rw (c, dst_var);
@@
-633,9
+643,9
@@
recode_trns_proc (void *trns_, struct ccase *c, casenumber case_idx UNUSED)
const struct map_out *out;
if (trns->src_type == VAR_NUMERIC)
const struct map_out *out;
if (trns->src_type == VAR_NUMERIC)
-
out = find_src_numeric (trns, src_data->f, src_var);
+ out = find_src_numeric (trns, src_data->f, src_var);
else
else
-
out = find_src_string (trns, src_data->s, var_get_width (src_var));
+ out = find_src_string (trns, src_data->s, var_get_width (src_var));
if (trns->dst_type == VAR_NUMERIC)
{
if (trns->dst_type == VAR_NUMERIC)
{