141 |
|
|
142 |
pgm_state = STATE_INIT; |
pgm_state = STATE_INIT; |
143 |
} |
} |
|
|
|
|
/* Return nonzero only if X is a user-missing value for numeric |
|
|
variable V. */ |
|
|
inline int |
|
|
is_num_user_missing (double x, const struct variable *v) |
|
|
{ |
|
|
switch (v->miss_type) |
|
|
{ |
|
|
case MISSING_NONE: |
|
|
return 0; |
|
|
case MISSING_1: |
|
|
return x == v->missing[0].f; |
|
|
case MISSING_2: |
|
|
return x == v->missing[0].f || x == v->missing[1].f; |
|
|
case MISSING_3: |
|
|
return (x == v->missing[0].f || x == v->missing[1].f |
|
|
|| x == v->missing[2].f); |
|
|
case MISSING_RANGE: |
|
|
return x >= v->missing[0].f && x <= v->missing[1].f; |
|
|
case MISSING_LOW: |
|
|
return x <= v->missing[0].f; |
|
|
case MISSING_HIGH: |
|
|
return x >= v->missing[0].f; |
|
|
case MISSING_RANGE_1: |
|
|
return ((x >= v->missing[0].f && x <= v->missing[1].f) |
|
|
|| x == v->missing[2].f); |
|
|
case MISSING_LOW_1: |
|
|
return x <= v->missing[0].f || x == v->missing[1].f; |
|
|
case MISSING_HIGH_1: |
|
|
return x >= v->missing[0].f || x == v->missing[1].f; |
|
|
default: |
|
|
assert (0); |
|
|
} |
|
|
abort (); |
|
|
} |
|
|
|
|
|
/* Return nonzero only if string S is a user-missing variable for |
|
|
string variable V. */ |
|
|
inline int |
|
|
is_str_user_missing (const unsigned char s[], const struct variable *v) |
|
|
{ |
|
|
/* FIXME: should these be memcmp()? */ |
|
|
switch (v->miss_type) |
|
|
{ |
|
|
case MISSING_NONE: |
|
|
return 0; |
|
|
case MISSING_1: |
|
|
return !strncmp (s, v->missing[0].s, v->width); |
|
|
case MISSING_2: |
|
|
return (!strncmp (s, v->missing[0].s, v->width) |
|
|
|| !strncmp (s, v->missing[1].s, v->width)); |
|
|
case MISSING_3: |
|
|
return (!strncmp (s, v->missing[0].s, v->width) |
|
|
|| !strncmp (s, v->missing[1].s, v->width) |
|
|
|| !strncmp (s, v->missing[2].s, v->width)); |
|
|
default: |
|
|
assert (0); |
|
|
} |
|
|
abort (); |
|
|
} |
|
|
|
|
|
/* Return nonzero only if value VAL is system-missing for variable |
|
|
V. */ |
|
|
int |
|
|
is_system_missing (const union value *val, const struct variable *v) |
|
|
{ |
|
|
return v->type == NUMERIC && val->f == SYSMIS; |
|
|
} |
|
|
|
|
|
/* Return nonzero only if value VAL is system- or user-missing for |
|
|
variable V. */ |
|
|
int |
|
|
is_missing (const union value *val, const struct variable *v) |
|
|
{ |
|
|
switch (v->type) |
|
|
{ |
|
|
case NUMERIC: |
|
|
if (val->f == SYSMIS) |
|
|
return 1; |
|
|
return is_num_user_missing (val->f, v); |
|
|
case ALPHA: |
|
|
return is_str_user_missing (val->s, v); |
|
|
default: |
|
|
assert (0); |
|
|
} |
|
|
abort (); |
|
|
} |
|
|
|
|
|
/* Return nonzero only if value VAL is user-missing for variable V. */ |
|
|
int |
|
|
is_user_missing (const union value *val, const struct variable *v) |
|
|
{ |
|
|
switch (v->type) |
|
|
{ |
|
|
case NUMERIC: |
|
|
return is_num_user_missing (val->f, v); |
|
|
case ALPHA: |
|
|
return is_str_user_missing (val->s, v); |
|
|
default: |
|
|
assert (0); |
|
|
} |
|
|
abort (); |
|
|
} |
|
144 |
|
|
145 |
/* Returns true if NAME is an acceptable name for a variable, |
/* Returns true if NAME is an acceptable name for a variable, |
146 |
false otherwise. If ISSUE_ERROR is true, issues an |
false otherwise. If ISSUE_ERROR is true, issues an |