diff options
Diffstat (limited to 'pkg/tbtables/cfitsio/iter_b.c')
-rw-r--r-- | pkg/tbtables/cfitsio/iter_b.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/pkg/tbtables/cfitsio/iter_b.c b/pkg/tbtables/cfitsio/iter_b.c new file mode 100644 index 00000000..296f4e16 --- /dev/null +++ b/pkg/tbtables/cfitsio/iter_b.c @@ -0,0 +1,114 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include "fitsio.h" + +/* + This program illustrates how to use the CFITSIO iterator function. + It simply prints out the values in a character string and a logical + type column in a table, and toggles the value in the logical column + so that T -> F and F -> T. +*/ +main() +{ + extern str_iter(); /* external work function is passed to the iterator */ + fitsfile *fptr; + iteratorCol cols[2]; + int n_cols; + long rows_per_loop, offset; + int status = 0; + char filename[] = "iter_b.fit"; /* name of rate FITS file */ + + /* open the file and move to the correct extension */ + fits_open_file(&fptr, filename, READWRITE, &status); + fits_movnam_hdu(fptr, BINARY_TBL, "iter_test", 0, &status); + + /* define input column structure members for the iterator function */ + n_cols = 2; /* number of columns */ + + /* define input column structure members for the iterator function */ + fits_iter_set_by_name(&cols[0], fptr, "Avalue", TSTRING, InputOutputCol); + fits_iter_set_by_name(&cols[1], fptr, "Lvalue", TLOGICAL, InputOutputCol); + + rows_per_loop = 0; /* use default optimum number of rows */ + offset = 0; /* process all the rows */ + + /* apply the function to each row of the table */ + printf("Calling iterator function...%d\n", status); + + fits_iterate_data(n_cols, cols, offset, rows_per_loop, + str_iter, 0L, &status); + + fits_close_file(fptr, &status); /* all done */ + + if (status) + fits_report_error(stderr, status); /* print out error messages */ + + return(status); +} +/*--------------------------------------------------------------------------*/ +int str_iter(long totalrows, long offset, long firstrow, long nrows, + int ncols, iteratorCol *cols, void *user_strct ) + +/* + Sample iterator function. +*/ +{ + int ii; + + /* declare variables static to preserve their values between calls */ + static char **stringvals; + static char *logicalvals; + + /*--------------------------------------------------------*/ + /* Initialization procedures: execute on the first call */ + /*--------------------------------------------------------*/ + if (firstrow == 1) + { + if (ncols != 2) + return(-1); /* number of columns incorrect */ + + if (fits_iter_get_datatype(&cols[0]) != TSTRING || + fits_iter_get_datatype(&cols[1]) != TLOGICAL ) + return(-2); /* bad data type */ + + /* assign the input pointers to the appropriate arrays */ + stringvals = (char **) fits_iter_get_array(&cols[0]); + logicalvals = (char *) fits_iter_get_array(&cols[1]); + + printf("Total rows, No. rows = %d %d\n",totalrows, nrows); + } + + /*------------------------------------------*/ + /* Main loop: process all the rows of data */ + /*------------------------------------------*/ + + /* NOTE: 1st element of array is the null pixel value! */ + /* Loop from 1 to nrows, not 0 to nrows - 1. */ + + for (ii = 1; ii <= nrows; ii++) + { + printf("%s %d\n", stringvals[ii], logicalvals[ii]); + if (logicalvals[ii]) + { + logicalvals[ii] = FALSE; + strcpy(stringvals[ii], "changed to false"); + } + else + { + logicalvals[ii] = TRUE; + strcpy(stringvals[ii], "changed to true"); + } + } + + /*-------------------------------------------------------*/ + /* Clean up procedures: after processing all the rows */ + /*-------------------------------------------------------*/ + + if (firstrow + nrows - 1 == totalrows) + { + /* no action required in this case */ + } + + return(0); +} |