X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvfm.c;h=08e3ca30f1f5818a88b8ea1dddadce283260abfa;hb=4aa81a07a03b3322e3bcf2ce141fe119c02f87f7;hp=90edfcd02694cc74aed682ad7ac8fccc04bedeea;hpb=2e02472cf15ddb64c33a1477cf4cfbf3be2d0c95;p=pspp diff --git a/src/vfm.c b/src/vfm.c index 90edfcd026..08e3ca30f1 100644 --- a/src/vfm.c +++ b/src/vfm.c @@ -30,6 +30,7 @@ #include "alloc.h" #include "case.h" #include "casefile.h" +#include "command.h" #include "dictionary.h" #include "do-ifP.h" #include "error.h" @@ -42,6 +43,9 @@ #include "var.h" #include "value-labels.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + /* Virtual File Manager (vfm): @@ -223,7 +227,7 @@ open_active_file (void) lag_count = 0; lag_head = 0; - lag_queue = xmalloc (n_lag * sizeof *lag_queue); + lag_queue = xnmalloc (n_lag, sizeof *lag_queue); for (i = 0; i < n_lag; i++) case_nullify (&lag_queue[i]); } @@ -259,7 +263,8 @@ write_case (struct write_case_data *wc_data) { if (compaction_necessary) { - dict_compact_case (temp_dict, &wc_data->sink_case, &wc_data->trns_case); + dict_compact_case (temp_dict, &wc_data->sink_case, + &wc_data->trns_case); vfm_sink->class->write (vfm_sink, &wc_data->sink_case); } else @@ -332,7 +337,7 @@ filter_case (const struct ccase *c, int case_idx) if (filter_var != NULL) { double f = case_num (c, filter_var->fv); - if (f == 0.0 || f == SYSMIS || is_num_user_missing (f, filter_var)) + if (f == 0.0 || mv_is_num_missing (&filter_var->miss, f)) return 1; } @@ -405,11 +410,8 @@ close_active_file (void) dict_compact_values (default_dict); /* Free data source. */ - if (vfm_source != NULL) - { - free_case_source (vfm_source); - vfm_source = NULL; - } + free_case_source (vfm_source); + vfm_source = NULL; /* Old data sink becomes new data source. */ if (vfm_sink->class->make_source != NULL) @@ -606,7 +608,7 @@ add_transformation (struct trns_header * trns) if (n_trns >= m_trns) { m_trns += 16; - t_trns = xrealloc (t_trns, sizeof *t_trns * m_trns); + t_trns = xnrealloc (t_trns, m_trns, sizeof *t_trns); } t_trns[n_trns] = trns; trns->index = n_trns++; @@ -906,3 +908,32 @@ multipass_split_output (struct multipass_split_aux_data *aux) casefile_destroy (aux->casefile); aux->casefile = NULL; } + + +/* Discards all the current state in preparation for a data-input + command like DATA LIST or GET. */ +void +discard_variables (void) +{ + dict_clear (default_dict); + default_handle = NULL; + + n_lag = 0; + + if (vfm_source != NULL) + { + free_case_source (vfm_source); + vfm_source = NULL; + } + + cancel_transformations (); + + ctl_stack = NULL; + + expr_free (process_if_expr); + process_if_expr = NULL; + + cancel_temporary (); + + pgm_state = STATE_INIT; +}