/* PSPP - a program for statistical analysis.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <config.h>
-#include <data/casereader.h>
+#include "data/casereader.h"
#include <stdlib.h>
-#include <data/casereader-provider.h>
-#include <data/casewriter.h>
-#include <data/variable.h>
-#include <data/dictionary.h>
-#include <libpspp/taint.h>
-#include <libpspp/message.h>
+#include "data/casereader-provider.h"
+#include "data/casewriter.h"
+#include "data/variable.h"
+#include "data/dictionary.h"
+#include "libpspp/taint.h"
+#include "libpspp/message.h"
-#include "xalloc.h"
+#include "gl/xalloc.h"
#include "gettext.h"
#define _(msgid) gettext (msgid)
filter->aux = aux;
filter->exclude = exclude;
reader = casereader_create_sequential (
- NULL, casereader_get_value_cnt (filter->subreader), CASENUMBER_MAX,
+ NULL, casereader_get_proto (filter->subreader), CASENUMBER_MAX,
&casereader_filter_class, filter);
taint_propagate (casereader_get_taint (filter->subreader),
casereader_get_taint (reader));
}
/* Internal read function for filtering casereader. */
-static bool
-casereader_filter_read (struct casereader *reader UNUSED, void *filter_,
- struct ccase *c)
+static struct ccase *
+casereader_filter_read (struct casereader *reader UNUSED, void *filter_)
{
struct casereader_filter *filter = filter_;
for (;;)
{
- if (!casereader_read (filter->subreader, c))
- return false;
+ struct ccase *c = casereader_read (filter->subreader);
+ if (c == NULL)
+ return NULL;
else if (filter->include (c, filter->aux))
- return true;
+ return c;
else if (filter->exclude != NULL)
casewriter_write (filter->exclude, c);
else
- case_destroy (c);
+ case_unref (c);
}
}
casewriter, if there is one. */
if (filter->exclude != NULL)
{
- struct ccase c;
- while (casereader_read (filter->subreader, &c))
- if (filter->include (&c, filter->aux))
- case_destroy (&c);
+ struct ccase *c;
+ while ((c = casereader_read (filter->subreader)) != NULL)
+ if (filter->include (c, filter->aux))
+ case_unref (c);
else
- casewriter_write (filter->exclude, &c);
+ casewriter_write (filter->exclude, c);
}
casereader_destroy (filter->subreader);
is destroyed.
If N_MISSING is non-null, then after reading, it will be filled
- with the totla number of dropped cases.
+ with the total number of dropped cases.
After this function is called, READER must not ever again
be referenced directly. It will be destroyed automatically
when the filtering casereader is destroyed. */
struct casereader *
casereader_create_filter_missing (struct casereader *reader,
- const struct variable **vars, size_t var_cnt,
+ const struct variable *const*vars, size_t var_cnt,
enum mv_class class,
casenumber *n_missing,
struct casewriter *exclude)
const union value *value = case_data (c, var);
if (var_is_value_missing (var, value, cfm->class))
{
- if ( cfm->n_missing )
+ if (cfm->n_missing)
(*cfm->n_missing)++;
return false;
}