X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcasereader-filter.c;h=15fa4a5e6701605ec107fe43a599fab71d48f043;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=b4275254fa24db01a182a66bf5000c48646b001e;hpb=085d4563d8d5adfb3a2552d6ab1959c3fcacaee0;p=pspp-builds.git diff --git a/src/data/casereader-filter.c b/src/data/casereader-filter.c index b4275254..15fa4a5e 100644 --- a/src/data/casereader-filter.c +++ b/src/data/casereader-filter.c @@ -1,5 +1,5 @@ /* 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 @@ -16,18 +16,18 @@ #include -#include +#include "data/casereader.h" #include -#include -#include -#include -#include -#include -#include +#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) @@ -78,7 +78,7 @@ casereader_create_filter_func (struct casereader *subreader, 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)); @@ -86,22 +86,22 @@ casereader_create_filter_func (struct casereader *subreader, } /* 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); } } @@ -115,12 +115,12 @@ casereader_filter_destroy (struct casereader *reader, void *filter_) 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); @@ -266,14 +266,14 @@ static bool casereader_filter_missing_destroy (void *); is destroyed. If N_MISSING is non-null, then after reading, it will be filled - with the total number of dropped cases. + with the totla 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)