X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata%2Fcasereader-translator.c;h=229dac2e54944c8df81088080c1032330c0cd84e;hb=80cc751377f06abdf4b9019dae2acce0ebfbb259;hp=5a717da8252a15de221728734e39e0d6f4210aab;hpb=0553d00dca10c2d2beeffd88fd12120e43a01025;p=pspp diff --git a/src/data/casereader-translator.c b/src/data/casereader-translator.c index 5a717da825..229dac2e54 100644 --- a/src/data/casereader-translator.c +++ b/src/data/casereader-translator.c @@ -38,7 +38,7 @@ struct casereader_translator void *aux; }; -static struct casereader_class casereader_translator_class; +static const struct casereader_class casereader_translator_class; /* Creates and returns a new casereader whose cases are produced by reading from SUBREADER and passing through TRANSLATE, which @@ -103,10 +103,65 @@ casereader_translator_destroy (struct casereader *reader UNUSED, void *ct_) } /* Casereader class for translating casereader. */ -static struct casereader_class casereader_translator_class = +static const struct casereader_class casereader_translator_class = { casereader_translator_read, casereader_translator_destroy, 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; +}