diff options
Diffstat (limited to 'funtools/funtest/resample.fc')
-rw-r--r-- | funtools/funtest/resample.fc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/funtools/funtest/resample.fc b/funtools/funtest/resample.fc new file mode 100644 index 0000000..00ef7c4 --- /dev/null +++ b/funtools/funtest/resample.fc @@ -0,0 +1,70 @@ +global +#include <stdlib.h> + +int icmp( const void *e1, const void *e2 ) +{ + int i1 = *(int*) e1; + int i2 = *(int*) e2; + + return i1 < i2 ? -1 : i1 == i2 ? 0 : 1; +} + +end + +local +int got; +size_t irow = 0; +size_t oidx = 0; +size_t* output_irow; +int naxis2; +long int seed = getenv("SEED") ? atoi(getenv("SEED")) : 1 ; + +srand48(seed); +end + +before + +naxis2 = FunParamGeti(fun, "NAXIS", 2, -1, &got); +if ( ! got ) +{ + gerror(stderr, "error retrieving naxis2\n" ); + goto error; +} + +/* allocate one more than we need. we stick a sentinel valuethat is + always greater than the number of rows in the file in the last + slot. that way we never fall off the end of output_irow in the + processing loop below. */ + +if ( ! (output_irow = malloc( (naxis2+1) * sizeof(*output_irow) ) ) ) + { + gerror(stderr, "error allocating index array of size %d\n", naxis2 ); + goto error; + } + +{ size_t i; + for ( i = 0 ; i < naxis2 ; i++ ) + output_irow[i] = drand48() * naxis2; + qsort( output_irow, naxis2, sizeof(*output_irow), icmp ); + output_irow[naxis2] = naxis2; +} + +end + + +cur->x; + +/* if the current row index is the next one to write, write it. + the row may be used multiple times, so keep incrementing the + list of rows to write until it doesn't match the current row */ + +while( irow == output_irow[oidx] ) +{ + FunTableRowPut(ofun, (char *)cur, 1, __i, NULL); + oidx++; +} +irow++; + +/* don't let funcalc write anything out; we've handled that */ +continue; + |