+Mon Feb 16 00:17:55 2004 Ben Pfaff <blp@gnu.org>
+
+ Make vfm.c slightly less grotesque.
+
+ * vfm.c: (filter_var) Removed.
+ (filter_index) Removed.
+ (FILTERED macro) Removed.
+ (exclude_this_case) New function.
+ (process_active_file_write_case) Use exclude_this_case() instead
+ of FILTERED and inline tests.
+ (procedure_write_case) Ditto.
+ (setup_filter) Removed.
+ (open_active_file) Don't call setup_filter().
+ (close_active_file) Call dict_get_filter() instead of checking
+ filter_var.
+
Mon Feb 16 00:01:53 2004 Ben Pfaff <blp@gnu.org>
* var.h: (struct variable) Update comments.
/* Information about the data sink. */
struct stream_info vfm_sink_info;
-/* Filter variable and `value' index. */
-static struct variable *filter_var;
-static int filter_index;
-
-#define FILTERED \
- (filter_index != -1 \
- && (temp_case->data[filter_index].f == 0.0 \
- || temp_case->data[filter_index].f == SYSMIS \
- || is_num_user_missing (temp_case->data[filter_index].f, \
- filter_var)))
-
/* Nonzero if the case needs to have values deleted before being
stored, zero otherwise. */
int compaction_necessary;
static void lag_case (void);
static int procedure_write_case (struct write_case_data *);
static void clear_temp_case (void);
+static int exclude_this_case (void);
\f
/* Public functions. */
lag_case ();
/* Call the procedure if FILTER and PROCESS IF don't prohibit it. */
- if (not_canceled
- && !FILTERED
- && (process_if_expr == NULL ||
- expr_evaluate (process_if_expr, temp_case, NULL) == 1.0))
+ if (not_canceled && !exclude_this_case ())
not_canceled = data->procfunc (temp_case, data->aux);
case_count++;
}
}
-/* Sets filter_index to an appropriate value. */
-static void
-setup_filter (void)
-{
- filter_var = dict_get_filter (default_dict);
-
- if (filter_var != NULL)
- {
- assert (filter_var->type == NUMERIC);
- filter_index = filter_var->index;
- } else {
- filter_index = -1;
- }
-}
-
/* Sets all the lag-related variables based on value of n_lag. */
static void
setup_lag (void)
make_temp_case ();
vector_initialization ();
discard_ctl_stack ();
- setup_filter ();
setup_lag ();
/* Debug output. */
process_if_expr = NULL;
/* Cancel FILTER if temporary. */
- if (filter_var != NULL && !FILTER_before_TEMPORARY)
+ if (dict_get_filter (default_dict) != NULL && !FILTER_before_TEMPORARY)
dict_set_filter (default_dict, NULL);
/* Cancel transformations. */
/* Call the procedure if there is one and FILTER and PROCESS IF
don't prohibit it. */
- if (wc_data->procfunc != NULL
- && !FILTERED
- && (process_if_expr == NULL ||
- expr_evaluate (process_if_expr, temp_case, NULL) == 1.0))
+ if (wc_data->procfunc != NULL && !exclude_this_case ())
wc_data->procfunc (temp_case, wc_data->aux);
case_count++;
}
}
+/* Returns nonzero if this case should be exclude as specified on
+ FILTER or PROCESS IF, otherwise zero. */
+static int
+exclude_this_case (void)
+{
+ /* FILTER. */
+ struct variable *filter_var = dict_get_filter (default_dict);
+ if (filter_var != NULL)
+ {
+ double f = temp_case->data[filter_var->fv].f;
+ if (f == 0.0 || f == SYSMIS || is_num_user_missing (f, filter_var))
+ return 1;
+ }
+
+ /* PROCESS IF. */
+ if (process_if_expr != NULL
+ && expr_evaluate (process_if_expr, temp_case, NULL) != 1.0)
+ return 1;
+
+ return 0;
+}
+
/* Appends TRNS to t_trns[], the list of all transformations to be
performed on data as it is read from the active file. */
void