02110-1301, USA. */
#include <config.h>
-#include "message.h"
+
#include <stdlib.h>
-#include "alloc.h"
-#include "any-reader.h"
-#include "any-writer.h"
-#include "case.h"
-#include "command.h"
-#include "compiler.h"
-#include "dictionary.h"
-#include "message.h"
-#include "file-handle.h"
-#include "hash.h"
-#include "lexer.h"
-#include "misc.h"
-#include "por-file-writer.h"
-#include "settings.h"
-#include "sys-file-writer.h"
-#include "str.h"
-#include "value-labels.h"
-#include "variable.h"
-#include "procedure.h"
+
+#include <data/any-reader.h>
+#include <data/any-writer.h>
+#include <data/case-sink.h>
+#include <data/case-source.h>
+#include <data/case.h>
+#include <data/casefile.h>
+#include <data/dictionary.h>
+#include <data/por-file-writer.h>
+#include <data/procedure.h>
+#include <data/settings.h>
+#include <data/storage-stream.h>
+#include <data/sys-file-writer.h>
+#include <data/transformations.h>
+#include <data/value-labels.h>
+#include <data/variable.h>
+#include <language/command.h>
+#include <language/data-io/file-handle.h>
+#include <language/lexer/lexer.h>
+#include <language/lexer/variable-parser.h>
+#include <libpspp/alloc.h>
+#include <libpspp/assertion.h>
+#include <libpspp/compiler.h>
+#include <libpspp/hash.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
+#include <libpspp/misc.h>
+#include <libpspp/str.h>
#include "gettext.h"
#define _(msgid) gettext (msgid)
-#include "debug-print.h"
-
/* Rearranging and reducing a dictionary. */
static void start_case_map (struct dictionary *);
static struct case_map *finish_case_map (struct dictionary *);
dict_destroy (default_dict);
default_dict = dict;
- vfm_source = create_case_source (&case_reader_source_class, pgm);
+ proc_set_source (create_case_source (&case_reader_source_class, pgm));
return CMD_SUCCESS;
}
else
aw->writer = any_writer_open (handle, dict);
+ if (aw->writer == NULL)
+ goto error;
dict_destroy (dict);
return aw;
/* Writes case C to writer AW. */
static bool
-case_writer_write_case (struct case_writer *aw, struct ccase *c)
+case_writer_write_case (struct case_writer *aw, const struct ccase *c)
{
if (aw->map != NULL)
{
\f
/* SAVE and EXPORT. */
-static bool output_proc (struct ccase *, void *);
+static bool output_proc (const struct ccase *, void *);
/* Parses and performs the SAVE or EXPORT procedure. */
static int
/* Writes case C to file. */
static bool
-output_proc (struct ccase *c, void *aw_)
+output_proc (const struct ccase *c, void *aw_)
{
struct case_writer *aw = aw_;
return case_writer_write_case (aw, c);
\f
/* MATCH FILES. */
-#include "debug-print.h"
-
/* File types. */
enum
{
char first[LONG_NAME_LEN + 1], last[LONG_NAME_LEN + 1];
struct dictionary *dict; /* Dictionary of output file. */
- struct case_sink *sink; /* Sink to receive output. */
+ struct casefile *output; /* MATCH FILES output. */
struct ccase mtf_case; /* Case used for output. */
unsigned seq_num; /* Have we initialized this variable? */
static bool mtf_read_nonactive_records (void *);
static bool mtf_processing_finish (void *);
-static bool mtf_processing (struct ccase *, void *);
+static bool mtf_processing (const struct ccase *, void *);
static char *var_type_description (struct variable *);
mtf.first[0] = '\0';
mtf.last[0] = '\0';
mtf.dict = dict_create ();
- mtf.sink = NULL;
+ mtf.output = NULL;
case_nullify (&mtf.mtf_case);
mtf.seq_num = 0;
mtf.seq_nums = NULL;
saw_table = true;
}
else
- assert (0);
+ NOT_REACHED ();
lex_match ('=');
file->by = NULL;
}
used_active_file = true;
- assert (pgm_state != STATE_INPUT);
- if (pgm_state == STATE_INIT)
+ if (!proc_has_source ())
{
msg (SE, _("Cannot specify the active file since no active "
"file has been defined."));
goto error;
}
- if (temporary != 0)
- {
- msg (SE,
- _("MATCH FILES may not be used after TEMPORARY when "
- "the active file is an input source. "
- "Temporary transformations will be made permanent."));
- cancel_temporary ();
- }
+ if (proc_make_temporary_transformations_permanent ())
+ msg (SE,
+ _("MATCH FILES may not be used after TEMPORARY when "
+ "the active file is an input source. "
+ "Temporary transformations will be made permanent."));
file->dict = default_dict;
}
discard_variables ();
dict_compact_values (mtf.dict);
- mtf.sink = create_case_sink (&storage_sink_class, mtf.dict, NULL);
- if (mtf.sink->class->open != NULL)
- mtf.sink->class->open (mtf.sink);
-
+ mtf.output = casefile_create (dict_get_next_value_idx (mtf.dict));
mtf.seq_nums = xcalloc (dict_get_var_cnt (mtf.dict), sizeof *mtf.seq_nums);
case_create (&mtf.mtf_case, dict_get_next_value_idx (mtf.dict));
goto error;
if (used_active_file)
- ok = procedure (mtf_processing, &mtf) && mtf_processing_finish (&mtf);
+ {
+ proc_set_sink (create_case_sink (&null_sink_class, default_dict, NULL));
+ ok = procedure (mtf_processing, &mtf) && mtf_processing_finish (&mtf);
+ }
else
ok = mtf_processing_finish (&mtf);
- free_case_source (vfm_source);
- vfm_source = NULL;
+ discard_variables ();
dict_destroy (default_dict);
default_dict = mtf.dict;
mtf.dict = NULL;
- vfm_source = mtf.sink->class->make_source (mtf.sink);
- free_case_sink (mtf.sink);
+ proc_set_source (storage_source_create (mtf.output));
+ mtf.output = NULL;
if (!mtf_free (&mtf))
ok = false;
if (iter->handle == NULL)
{
if (!mtf_delete_file_in_place (mtf, &iter))
- abort ();
+ NOT_REACHED ();
break;
}
static inline int
mtf_compare_BY_values (struct mtf_proc *mtf,
struct mtf_file *a, struct mtf_file *b,
- struct ccase *c)
+ const struct ccase *c)
{
- struct ccase *ca = case_is_null (&a->input) ? c : &a->input;
- struct ccase *cb = case_is_null (&b->input) ? c : &b->input;
+ const struct ccase *ca = case_is_null (&a->input) ? c : &a->input;
+ const struct ccase *cb = case_is_null (&b->input) ? c : &b->input;
assert ((a == NULL) + (b == NULL) + (c == NULL) <= 1);
return case_compare_2dict (ca, cb, a->by, b->by, mtf->by_cnt);
}
/* Perform one iteration of steps 3...7 above.
Returns true if successful, false if an I/O error occurred. */
static bool
-mtf_processing (struct ccase *c, void *mtf_)
+mtf_processing (const struct ccase *c, void *mtf_)
{
struct mtf_proc *mtf = mtf_;
if (mv != NULL && mtf->seq_nums[mv->index] != mtf->seq_num)
{
- struct ccase *record
+ const struct ccase *record
= case_is_null (&iter->input) ? c : &iter->input;
union value *out = case_data_rw (&mtf->mtf_case, mv->fv);
}
/* 5. Write the output record. */
- mtf->sink->class->write (mtf->sink, &mtf->mtf_case);
+ casefile_append (mtf->output, &mtf->mtf_case);
/* 6. Read another record from each input file FILE and TABLE
that we stored values from above. If we come to the end of
if (dv->width == mv->width)
{
if (val_labs_count (dv->val_labs)
- && !val_labs_count (mv->val_labs))
- mv->val_labs = val_labs_copy (dv->val_labs);
+ && !val_labs_count (mv->val_labs))
+ {
+ val_labs_destroy (mv->val_labs);
+ mv->val_labs = val_labs_copy (dv->val_labs);
+ }
if (!mv_is_empty (&dv->miss) && mv_is_empty (&mv->miss))
mv_copy (&mv->miss, &dv->miss);
}