X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fmerge.c;h=e2f2d49570177da5f692b12cf34da7ea39111c5e;hb=3640237a5fc890a84cb814fbe8bf6fd9299624e4;hp=af44855ce1cbb7718dd18d48d459fc5cfe15fa8a;hpb=5c3291dc396b795696e94f47780308fd7ace6fc4;p=pspp diff --git a/src/math/merge.c b/src/math/merge.c index af44855ce1..e2f2d49570 100644 --- a/src/math/merge.c +++ b/src/math/merge.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009 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 @@ -19,17 +19,17 @@ performance regression. */ #include -#include +#include "math/merge.h" -#include -#include -#include -#include -#include -#include -#include +#include "data/case.h" +#include "data/casereader.h" +#include "data/casewriter.h" +#include "data/subcase.h" +#include "libpspp/array.h" +#include "libpspp/assertion.h" +#include "libpspp/taint.h" -#include "xalloc.h" +#include "gl/xalloc.h" #define MAX_MERGE_ORDER 7 @@ -43,7 +43,7 @@ struct merge { struct subcase ordering; struct merge_input inputs[MAX_MERGE_ORDER]; - size_t input_cnt; + size_t n_inputs; struct caseproto *proto; }; @@ -54,7 +54,7 @@ merge_create (const struct subcase *ordering, const struct caseproto *proto) { struct merge *m = xmalloc (sizeof *m); subcase_clone (&m->ordering, ordering); - m->input_cnt = 0; + m->n_inputs = 0; m->proto = caseproto_ref (proto); return m; } @@ -66,8 +66,8 @@ merge_destroy (struct merge *m) { size_t i; - subcase_destroy (&m->ordering); - for (i = 0; i < m->input_cnt; i++) + subcase_uninit (&m->ordering); + for (i = 0; i < m->n_inputs; i++) casereader_destroy (m->inputs[i].reader); caseproto_unref (m->proto); free (m); @@ -78,25 +78,25 @@ void merge_append (struct merge *m, struct casereader *r) { r = casereader_rename (r); - m->inputs[m->input_cnt++].reader = r; - if (m->input_cnt >= MAX_MERGE_ORDER) + m->inputs[m->n_inputs++].reader = r; + if (m->n_inputs >= MAX_MERGE_ORDER) do_merge (m); } struct casereader * merge_make_reader (struct merge *m) { - struct casereader *r; + struct casereader *r = NULL; - if (m->input_cnt > 1) + if (m->n_inputs > 1) do_merge (m); - if (m->input_cnt == 1) + if (m->n_inputs == 1) { r = m->inputs[0].reader; - m->input_cnt = 0; + m->n_inputs = 0; } - else if (m->input_cnt == 0) + else if (m->n_inputs == 0) { struct casewriter *writer = mem_writer_create (m->proto); r = casewriter_make_reader (writer); @@ -118,8 +118,8 @@ read_input_case (struct merge *m, size_t idx) else { casereader_destroy (i->reader); - remove_element (m->inputs, m->input_cnt, sizeof *m->inputs, idx); - m->input_cnt--; + remove_element (m->inputs, m->n_inputs, sizeof *m->inputs, idx); + m->n_inputs--; return false; } } @@ -130,22 +130,22 @@ do_merge (struct merge *m) struct casewriter *w; size_t i; - assert (m->input_cnt > 1); + assert (m->n_inputs > 1); w = tmpfile_writer_create (m->proto); - for (i = 0; i < m->input_cnt; i++) + for (i = 0; i < m->n_inputs; i++) taint_propagate (casereader_get_taint (m->inputs[i].reader), casewriter_get_taint (w)); - for (i = 0; i < m->input_cnt; ) + for (i = 0; i < m->n_inputs;) if (read_input_case (m, i)) i++; - while (m->input_cnt > 0) + while (m->n_inputs > 0) { size_t min; min = 0; - for (i = 1; i < m->input_cnt; i++) + for (i = 1; i < m->n_inputs; i++) if (subcase_compare_3way (&m->ordering, m->inputs[i].c, &m->ordering, m->inputs[min].c) < 0) min = i; @@ -154,7 +154,7 @@ do_merge (struct merge *m) read_input_case (m, min); } - m->input_cnt = 1; + m->n_inputs = 1; m->inputs[0].reader = casewriter_make_reader (w); }