pgm_state = STATE_INIT;
}
-
-/* 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 ();
-}
\f
/* Returns true if NAME is an acceptable name for a variable,
false otherwise. If ISSUE_ERROR is true, issues an