void c_tbegtd (const IRAFPointer tp, const IRAFPointer cp, int row, double *buffer) { /* Read a value of type double from a table column. arguments: IRAFPointer tp i: table descriptor IRAFPointer cp i: column descriptor int row i: row number (one indexed) double *buffer o: value read from table */ TableDescr *tbl_descr; ColumnDescr *col_descr; int anynul=0; long firstelem=1, nelem=1; double nulval=IRAF_INDEFD; int status = 0; tbl_descr = (TableDescr *)tp; col_descr = (ColumnDescr *)cp; if (col_descr->datatype < 0) { char *value; int maxch; maxch = col_descr->width + 5; value = (char *)calloc (maxch, sizeof(char)); c_tbegtt (tp, cp, row, value, maxch); if (strcmp (value, "INDEF") == 0) *buffer = IRAF_INDEFD; else *buffer = atof (value); free (value); } else if (col_descr->datatype == IRAF_INT) { int i_value; c_tbegti (tp, cp, row, &i_value); if (i_value == IRAF_INDEFI) *buffer = IRAF_INDEFD; else *buffer = i_value; } else if (col_descr->datatype == IRAF_SHORT) { short si_value; c_tbegts (tp, cp, row, &si_value); if (si_value == IRAF_INDEFS) *buffer = IRAF_INDEFD; else *buffer = si_value; } else { /* fits_read_col_dbl = ffgcvd */ fits_read_col_dbl (tbl_descr->fptr, col_descr->colnum, (long)row, firstelem, nelem, nulval, buffer, &anynul, &status); if (status != 0) setError (status, "c_tbegtd: error reading element"); } }
int fits_read_wcstab( fitsfile *fptr, int nwtb, wtbarr *wtb, int *status) { int anynul, colnum, hdunum, iwtb, m, naxis, nostat; long *naxes = 0, nelem; wtbarr *wtbp; if (*status) return *status; if (fptr == 0) { return (*status = NULL_INPUT_PTR); } if (nwtb == 0) return 0; /* Zero the array pointers. */ wtbp = wtb; for (iwtb = 0; iwtb < nwtb; iwtb++, wtbp++) { *wtbp->arrayp = 0x0; } /* Save HDU number so that we can move back to it later. */ fits_get_hdu_num(fptr, &hdunum); wtbp = wtb; for (iwtb = 0; iwtb < nwtb; iwtb++, wtbp++) { /* Move to the required binary table extension. */ if (fits_movnam_hdu(fptr, BINARY_TBL, (char *)(wtbp->extnam), wtbp->extver, status)) { goto cleanup; } /* Locate the table column. */ if (fits_get_colnum(fptr, CASEINSEN, (char *)(wtbp->ttype), &colnum, status)) { goto cleanup; } /* Get the array dimensions and check for consistency. */ if (wtbp->ndim < 1) { *status = NEG_AXIS; goto cleanup; } if (!(naxes = calloc(wtbp->ndim, sizeof(long)))) { *status = MEMORY_ALLOCATION; goto cleanup; } if (fits_read_tdim(fptr, colnum, wtbp->ndim, &naxis, naxes, status)) { goto cleanup; } if (naxis != wtbp->ndim) { if (wtbp->kind == 'c' && wtbp->ndim == 2) { /* Allow TDIMn to be omitted for degenerate coordinate arrays. */ naxis = 2; naxes[1] = naxes[0]; naxes[0] = 1; } else { *status = BAD_TDIM; goto cleanup; } } if (wtbp->kind == 'c') { /* Coordinate array; calculate the array size. */ nelem = naxes[0]; for (m = 0; m < naxis-1; m++) { *(wtbp->dimlen + m) = naxes[m+1]; nelem *= naxes[m+1]; } } else { /* Index vector; check length. */ if ((nelem = naxes[0]) != *(wtbp->dimlen)) { /* N.B. coordinate array precedes the index vectors. */ *status = BAD_TDIM; goto cleanup; } } free(naxes); naxes = 0; /* Allocate memory for the array. */ if (!(*wtbp->arrayp = calloc((size_t)nelem, sizeof(double)))) { *status = MEMORY_ALLOCATION; goto cleanup; } /* Read the array from the table. */ if (fits_read_col_dbl(fptr, colnum, wtbp->row, 1L, nelem, 0.0, *wtbp->arrayp, &anynul, status)) { goto cleanup; } } cleanup: /* Move back to the starting HDU. */ nostat = 0; fits_movabs_hdu(fptr, hdunum, 0, &nostat); /* Release allocated memory. */ if (naxes) free(naxes); if (*status) { wtbp = wtb; for (iwtb = 0; iwtb < nwtb; iwtb++, wtbp++) { if (*wtbp->arrayp) free(*wtbp->arrayp); } } return *status; }