summaryrefslogtreecommitdiffstats
path: root/funtools/funtest/resample.fc
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funtest/resample.fc')
-rw-r--r--funtools/funtest/resample.fc70
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;
+