From: Ben Pfaff Date: Sat, 26 Jul 2008 06:25:53 +0000 (-0700) Subject: New function for adding a numbering column to a casereader. X-Git-Tag: v0.7.0~8 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0bd3b06bbdf530044eeb6b1518edbffd7124fcb7;p=pspp-builds.git New function for adding a numbering column to a casereader. --- diff --git a/src/data/ChangeLog b/src/data/ChangeLog index 1b242dd5..ef91902b 100644 --- a/src/data/ChangeLog +++ b/src/data/ChangeLog @@ -1,3 +1,11 @@ +2008-07-25 Ben Pfaff + + * casereader-translator.c (struct casereader_arithmetic_sequence): + New struct. + (casereader_create_arithmetic_sequence): New function. + (cas_translate): New function. + (cas_destroy): New function. + 2008-07-26 John Darrington * case-ordering.c case-ordering.h: Removed the value_cnt diff --git a/src/data/casereader-translator.c b/src/data/casereader-translator.c index b857b5b8..229dac2e 100644 --- a/src/data/casereader-translator.c +++ b/src/data/casereader-translator.c @@ -110,3 +110,58 @@ static const struct casereader_class casereader_translator_class = NULL, NULL, }; + +struct casereader_arithmetic_sequence + { + int value_ofs; + double first; + double increment; + casenumber n; + }; + +static void cas_translate (struct ccase *input, struct ccase *output, + void *aux); +static bool cas_destroy (void *aux); + +/* Creates and returns a new casereader whose cases are produced + by reading from SUBREADER and appending an additional value, + which takes the value FIRST in the first case, FIRST + + INCREMENT in the second case, FIRST + INCREMENT * 2 in the + third case, and so on. + + After this function is called, SUBREADER must not ever again + be referenced directly. It will be destroyed automatically + when the translating casereader is destroyed. */ +struct casereader * +casereader_create_arithmetic_sequence (struct casereader *subreader, + double first, double increment) +{ + /* This could be implemented with a great deal more efficiency + and generality. However, this implementation is easy. */ + struct casereader_arithmetic_sequence *cas = xmalloc (sizeof *cas); + cas->value_ofs = casereader_get_value_cnt (subreader); + cas->first = first; + cas->increment = increment; + cas->n = 0; + return casereader_create_translator (subreader, cas->value_ofs + 1, + cas_translate, cas_destroy, cas); +} + +static void +cas_translate (struct ccase *input, struct ccase *output, void *cas_) +{ + struct casereader_arithmetic_sequence *cas = cas_; + case_nullify (output); + case_move (output, input); + case_resize (output, cas->value_ofs + 1); + case_data_rw_idx (output, cas->value_ofs)->f + = cas->first + cas->increment * cas->n++; +} + +static bool +cas_destroy (void *cas_) +{ + struct casereader_arithmetic_sequence *cas = cas_; + free (cas); + return true; +} diff --git a/src/data/casereader.h b/src/data/casereader.h index 6d719c61..ba65cb18 100644 --- a/src/data/casereader.h +++ b/src/data/casereader.h @@ -112,4 +112,8 @@ casereader_create_translator (struct casereader *, size_t output_value_cnt, bool (*destroy) (void *aux), void *aux); +struct casereader * +casereader_create_arithmetic_sequence (struct casereader *, + double first, double increment); + #endif /* data/casereader.h */