The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif

#include "fitsio.h"
#include "util.h"

/* use the C std lib malloc/free */
#ifdef malloc
#undef malloc
#endif
#ifdef free
#undef free
#endif

static int
not_here(s)
char *s;
{
    croak("%s not implemented on this architecture", s);
    return -1;
}

static double
constant(name, arg)
char *name;
int arg;
{
    errno = 0;
    switch (*name) {
    case 'A':
	if (strEQ(name, "ANGLE_TOO_BIG"))
#ifdef ANGLE_TOO_BIG
	    return ANGLE_TOO_BIG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "ANY_HDU"))
#ifdef ANY_HDU
	    return ANY_HDU;
#else
	    goto not_there;
#endif
	if (strEQ(name, "ARRAY_TOO_BIG"))
#ifdef ARRAY_TOO_BIG
	    return ARRAY_TOO_BIG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "ASCII_TBL"))
#ifdef ASCII_TBL
	    return ASCII_TBL;
#else
	    goto not_there;
#endif
	break;
    case 'B':
	if (strEQ(name, "BAD_ATABLE_FORMAT"))
#ifdef BAD_ATABLE_FORMAT
	    return BAD_ATABLE_FORMAT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_BITPIX"))
#ifdef BAD_BITPIX
	    return BAD_BITPIX;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_BTABLE_FORMAT"))
#ifdef BAD_BTABLE_FORMAT
	    return BAD_BTABLE_FORMAT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_C2D"))
#ifdef BAD_C2D
	    return BAD_C2D;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_C2F"))
#ifdef BAD_C2F
	    return BAD_C2F;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_C2I"))
#ifdef BAD_C2I
	    return BAD_C2I;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_COL_NUM"))
#ifdef BAD_COL_NUM
	    return BAD_COL_NUM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DATATYPE"))
#ifdef BAD_DATATYPE
	    return BAD_DATATYPE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DATA_FILL"))
#ifdef BAD_DATA_FILL
	    return BAD_DATA_FILL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DATE"))
#ifdef BAD_DATE
	    return BAD_DATE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DECIM"))
#ifdef BAD_DECIM
	    return BAD_DECIM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DIMEN"))
#ifdef BAD_DIMEN
	    return BAD_DIMEN;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_DOUBLEKEY"))
#ifdef BAD_DOUBLEKEY
	    return BAD_DOUBLEKEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_ELEM_NUM"))
#ifdef BAD_ELEM_NUM
	    return BAD_ELEM_NUM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_F2C"))
#ifdef BAD_F2C
	    return BAD_F2C;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_FILEPTR"))
#ifdef BAD_FILEPTR
	    return BAD_FILEPTR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_FLOATKEY"))
#ifdef BAD_FLOATKEY
	    return BAD_FLOATKEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_GCOUNT"))
#ifdef BAD_GCOUNT
	    return BAD_GCOUNT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_GROUP_ID"))
#ifdef BAD_GROUP_ID
	    return BAD_GROUP_ID;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_HDU_NUM"))
#ifdef BAD_HDU_NUM
	    return BAD_HDU_NUM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_HEADER_FILL"))
#ifdef BAD_HEADER_FILL
	    return BAD_HEADER_FILL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_I2C"))
#ifdef BAD_I2C
	    return BAD_I2C;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_INTKEY"))
#ifdef BAD_INTKEY
	    return BAD_INTKEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_KEYCHAR"))
#ifdef BAD_KEYCHAR
	    return BAD_KEYCHAR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_LOGICALKEY"))
#ifdef BAD_LOGICALKEY
	    return BAD_LOGICALKEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_NAXES"))
#ifdef BAD_NAXES
	    return BAD_NAXES;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_NAXIS"))
#ifdef BAD_NAXIS
	    return BAD_NAXIS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_OPTION"))
#ifdef BAD_OPTION
	    return BAD_OPTION;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_ORDER"))
#ifdef BAD_ORDER
	    return BAD_ORDER;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_PCOUNT"))
#ifdef BAD_PCOUNT
	    return BAD_PCOUNT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_PIX_NUM"))
#ifdef BAD_PIX_NUM
	    return BAD_PIX_NUM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_ROW_NUM"))
#ifdef BAD_ROW_NUM
	    return BAD_ROW_NUM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_ROW_WIDTH"))
#ifdef BAD_ROW_WIDTH
	    return BAD_ROW_WIDTH;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_SIMPLE"))
#ifdef BAD_SIMPLE
	    return BAD_SIMPLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_TBCOL"))
#ifdef BAD_TBCOL
	    return BAD_TBCOL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_TDIM"))
#ifdef BAD_TDIM
	    return BAD_TDIM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_TFIELDS"))
#ifdef BAD_TFIELDS
	    return BAD_TFIELDS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_TFORM"))
#ifdef BAD_TFORM
	    return BAD_TFORM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_TFORM_DTYPE"))
#ifdef BAD_TFORM_DTYPE
	    return BAD_TFORM_DTYPE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_URL_PREFIX"))
#ifdef BAD_URL_PREFIX
	    return BAD_URL_PREFIX;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_WCS_PROJ"))
#ifdef BAD_WCS_PROJ
	    return BAD_WCS_PROJ;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BAD_WCS_VAL"))
#ifdef BAD_WCS_VAL
	    return BAD_WCS_VAL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BINARY_TBL"))
#ifdef BINARY_TBL
	    return BINARY_TBL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "BYTE_IMG"))
#ifdef BYTE_IMG
	    return BYTE_IMG;
#else
	    goto not_there;
#endif
	break;
    case 'C':
	if (strEQ(name, "CASEINSEN"))
#ifdef CASEINSEN
	    return CASEINSEN;
#else
	    goto not_there;
#endif
	if (strEQ(name, "CASESEN"))
#ifdef CASESEN
	    return CASESEN;
#else
	    goto not_there;
#endif
	if (strEQ(name, "CFITSIO_MAJOR"))
#ifdef CFITSIO_MAJOR
	    return CFITSIO_MAJOR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "CFITSIO_MINOR"))
#ifdef CFITSIO_MINOR
	    return CFITSIO_MINOR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "COL_NOT_FOUND"))
#ifdef COL_NOT_FOUND
	    return COL_NOT_FOUND;
#else
	    goto not_there;
#endif
	if (strEQ(name, "COL_NOT_UNIQUE"))
#ifdef COL_NOT_UNIQUE
	    return COL_NOT_UNIQUE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "COL_TOO_WIDE"))
#ifdef COL_TOO_WIDE
	    return COL_TOO_WIDE;
#else
	    goto not_there;
#endif
	break;
    case 'D':
	if (strEQ(name, "DOUBLENULLVALUE"))
#ifdef DOUBLENULLVALUE
	    return DOUBLENULLVALUE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "DOUBLE_IMG"))
#ifdef DOUBLE_IMG
	    return DOUBLE_IMG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "DRIVER_INIT_FAILED"))
#ifdef DRIVER_INIT_FAILED
	    return DRIVER_INIT_FAILED;
#else
	    goto not_there;
#endif
	break;
    case 'E':
	if (strEQ(name, "END_JUNK"))
#ifdef END_JUNK
	    return END_JUNK;
#else
	    goto not_there;
#endif
	if (strEQ(name, "END_OF_FILE"))
#ifdef END_OF_FILE
	    return END_OF_FILE;
#else
	    goto not_there;
#endif
	break;
    case 'F':
	if (strEQ(name, "FALSE"))
#ifdef FALSE
	    return FALSE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FILE_NOT_CLOSED"))
#ifdef FILE_NOT_CLOSED
	    return FILE_NOT_CLOSED;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FILE_NOT_CREATED"))
#ifdef FILE_NOT_CREATED
	    return FILE_NOT_CREATED;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FILE_NOT_OPENED"))
#ifdef FILE_NOT_OPENED
	    return FILE_NOT_OPENED;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_CARD"))
#ifdef FLEN_CARD
	    return FLEN_CARD;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_COMMENT"))
#ifdef FLEN_COMMENT
	    return FLEN_COMMENT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_ERRMSG"))
#ifdef FLEN_ERRMSG
	    return FLEN_ERRMSG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_FILENAME"))
#ifdef FLEN_FILENAME
	    return FLEN_FILENAME;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_KEYWORD"))
#ifdef FLEN_KEYWORD
	    return FLEN_KEYWORD;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_STATUS"))
#ifdef FLEN_STATUS
	    return FLEN_STATUS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLEN_VALUE"))
#ifdef FLEN_VALUE
	    return FLEN_VALUE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLOATNULLVALUE"))
#ifdef FLOATNULLVALUE
	    return FLOATNULLVALUE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "FLOAT_IMG"))
#ifdef FLOAT_IMG
	    return FLOAT_IMG;
#else
	    goto not_there;
#endif
	break;
    case 'G':
	if (strEQ(name, "GROUP_NOT_FOUND"))
#ifdef GROUP_NOT_FOUND
	    return GROUP_NOT_FOUND;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_ALL"))
#ifdef GT_ID_ALL
	    return GT_ID_ALL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_ALL_URI"))
#ifdef GT_ID_ALL_URI
	    return GT_ID_ALL_URI;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_POS"))
#ifdef GT_ID_POS
	    return GT_ID_POS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_POS_URI"))
#ifdef GT_ID_POS_URI
	    return GT_ID_POS_URI;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_REF"))
#ifdef GT_ID_REF
	    return GT_ID_REF;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GT_ID_REF_URI"))
#ifdef GT_ID_REF_URI
	    return GT_ID_REF_URI;
#else
	    goto not_there;
#endif
	if (strEQ(name, "GZIP_1"))
#ifdef GZIP_1
	    return GZIP_1;
#else
	    goto not_there;
#endif
	break;
    case 'H':
	if (strEQ(name, "HDU_ALREADY_MEMBER"))
#ifdef HDU_ALREADY_MEMBER
	    return HDU_ALREADY_MEMBER;
#else
	    goto not_there;
#endif
	if (strEQ(name, "HDU_ALREADY_TRACKED"))
#ifdef HDU_ALREADY_TRACKED
	    return HDU_ALREADY_TRACKED;
#else
	    goto not_there;
#endif
	if (strEQ(name, "HEADER_NOT_EMPTY"))
#ifdef HEADER_NOT_EMPTY
	    return HEADER_NOT_EMPTY;
#else
	    goto not_there;
#endif
	break;
    case 'I':
	if (strEQ(name, "IDENTICAL_POINTERS"))
#ifdef IDENTICAL_POINTERS
	    return IDENTICAL_POINTERS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "IMAGE_HDU"))
#ifdef IMAGE_HDU
	    return IMAGE_HDU;
#else
	    goto not_there;
#endif
	if (strEQ(name, "InputCol"))
#ifdef InputCol
	    return InputCol;
#else
	    goto not_there;
#endif
	if (strEQ(name, "InputOutputCol"))
#ifdef InputOutputCol
	    return InputOutputCol;
#else
	    goto not_there;
#endif
	break;
    case 'J':
	break;
    case 'K':
	if (strEQ(name, "KEY_NO_EXIST"))
#ifdef KEY_NO_EXIST
	    return KEY_NO_EXIST;
#else
	    goto not_there;
#endif
	if (strEQ(name, "KEY_OUT_BOUNDS"))
#ifdef KEY_OUT_BOUNDS
	    return KEY_OUT_BOUNDS;
#else
	    goto not_there;
#endif
	break;
    case 'L':
	if (strEQ(name, "LONG_IMG"))
#ifdef LONG_IMG
	    return LONG_IMG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "LONGLONG_IMG"))
#ifdef LONGLONG_IMG
	    return LONGLONG_IMG;
#else
	    goto not_there;
#endif
	break;
    case 'M':
	if (strEQ(name, "MAXHDU"))
#ifdef MAXHDU
	    return MAXHDU;
#else
	    goto not_there;
#endif
	if (strEQ(name, "MEMBER_NOT_FOUND"))
#ifdef MEMBER_NOT_FOUND
	    return MEMBER_NOT_FOUND;
#else
	    goto not_there;
#endif
	if (strEQ(name, "MEMORY_ALLOCATION"))
#ifdef MEMORY_ALLOCATION
	    return MEMORY_ALLOCATION;
#else
	    goto not_there;
#endif
	break;
    case 'N':
	if (strEQ(name, "NEG_AXIS"))
#ifdef NEG_AXIS
	    return NEG_AXIS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NEG_BYTES"))
#ifdef NEG_BYTES
	    return NEG_BYTES;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NEG_FILE_POS"))
#ifdef NEG_FILE_POS
	    return NEG_FILE_POS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NEG_ROWS"))
#ifdef NEG_ROWS
	    return NEG_ROWS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NEG_WIDTH"))
#ifdef NEG_WIDTH
	    return NEG_WIDTH;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_ASCII_COL"))
#ifdef NOT_ASCII_COL
	    return NOT_ASCII_COL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_ATABLE"))
#ifdef NOT_ATABLE
	    return NOT_ATABLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_BTABLE"))
#ifdef NOT_BTABLE
	    return NOT_BTABLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_GROUP_TABLE"))
#ifdef NOT_GROUP_TABLE
	    return NOT_GROUP_TABLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_IMAGE"))
#ifdef NOT_IMAGE
	    return NOT_IMAGE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_LOGICAL_COL"))
#ifdef NOT_LOGICAL_COL
	    return NOT_LOGICAL_COL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_POS_INT"))
#ifdef NOT_POS_INT
	    return NOT_POS_INT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_TABLE"))
#ifdef NOT_TABLE
	    return NOT_TABLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NOT_VARI_LEN"))
#ifdef NOT_VARI_LEN
	    return NOT_VARI_LEN;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_BITPIX"))
#ifdef NO_BITPIX
	    return NO_BITPIX;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_END"))
#ifdef NO_END
	    return NO_END;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_GCOUNT"))
#ifdef NO_GCOUNT
	    return NO_GCOUNT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_MATCHING_DRIVER"))
#ifdef NO_MATCHING_DRIVER
	    return NO_MATCHING_DRIVER;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_NAXES"))
#ifdef NO_NAXES
	    return NO_NAXES;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_NAXIS"))
#ifdef NO_NAXIS
	    return NO_NAXIS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_NULL"))
#ifdef NO_NULL
	    return NO_NULL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_PCOUNT"))
#ifdef NO_PCOUNT
	    return NO_PCOUNT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_QUOTE"))
#ifdef NO_QUOTE
	    return NO_QUOTE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_SIMPLE"))
#ifdef NO_SIMPLE
	    return NO_SIMPLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_TBCOL"))
#ifdef NO_TBCOL
	    return NO_TBCOL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_TFIELDS"))
#ifdef NO_TFIELDS
	    return NO_TFIELDS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_TFORM"))
#ifdef NO_TFORM
	    return NO_TFORM;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_WCS_KEY"))
#ifdef NO_WCS_KEY
	    return NO_WCS_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NO_XTENSION"))
#ifdef NO_XTENSION
	    return NO_XTENSION;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NULL_INPUT_PTR"))
#ifdef NULL_INPUT_PTR
	    return NULL_INPUT_PTR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "NUM_OVERFLOW"))
#ifdef NUM_OVERFLOW
	    return NUM_OVERFLOW;
#else
	    goto not_there;
#endif
	break;
    case 'O':
	if (strEQ(name, "OPT_CMT_MBR"))
#ifdef OPT_CMT_MBR
	    return OPT_CMT_MBR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_CMT_MBR_DEL"))
#ifdef OPT_CMT_MBR_DEL
	    return OPT_CMT_MBR_DEL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_GCP_ALL"))
#ifdef OPT_GCP_ALL
	    return OPT_GCP_ALL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_GCP_GPT"))
#ifdef OPT_GCP_GPT
	    return OPT_GCP_GPT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_GCP_MBR"))
#ifdef OPT_GCP_MBR
	    return OPT_GCP_MBR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MCP_ADD"))
#ifdef OPT_MCP_ADD
	    return OPT_MCP_ADD;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MCP_MOV"))
#ifdef OPT_MCP_MOV
	    return OPT_MCP_MOV;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MCP_NADD"))
#ifdef OPT_MCP_NADD
	    return OPT_MCP_NADD;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MCP_REPL"))
#ifdef OPT_MCP_REPL
	    return OPT_MCP_REPL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MRG_COPY"))
#ifdef OPT_MRG_COPY
	    return OPT_MRG_COPY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_MRG_MOV"))
#ifdef OPT_MRG_MOV
	    return OPT_MRG_MOV;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_RM_ALL"))
#ifdef OPT_RM_ALL
	    return OPT_RM_ALL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_RM_ENTRY"))
#ifdef OPT_RM_ENTRY
	    return OPT_RM_ENTRY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_RM_GPT"))
#ifdef OPT_RM_GPT
	    return OPT_RM_GPT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OPT_RM_MBR"))
#ifdef OPT_RM_MBR
	    return OPT_RM_MBR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OVERFLOW_ERR"))
#ifdef OVERFLOW_ERR
	    return OVERFLOW_ERR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "OutputCol"))
#ifdef OutputCol
	    return OutputCol;
#else
	    goto not_there;
#endif
	break;
    case 'P':
	if (strEQ(name, "PARSE_BAD_COL"))
#ifdef PARSE_BAD_COL
	    return PARSE_BAD_COL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PARSE_BAD_OUTPUT"))
#ifdef PARSE_BAD_OUTPUT
	    return PARSE_BAD_OUTPUT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PARSE_BAD_TYPE"))
#ifdef PARSE_BAD_TYPE
	    return PARSE_BAD_TYPE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PARSE_LRG_VECTOR"))
#ifdef PARSE_LRG_VECTOR
	    return PARSE_LRG_VECTOR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PARSE_NO_OUTPUT"))
#ifdef PARSE_NO_OUTPUT
	    return PARSE_NO_OUTPUT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PARSE_SYNTAX_ERR"))
#ifdef PARSE_SYNTAX_ERR
	    return PARSE_SYNTAX_ERR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "PLIO_1"))
#ifdef PLIO_1
	    return PLIO_1;
#else
	    goto not_there;
#endif
	break;
    case 'Q':
	break;
    case 'R':
	if (strEQ(name, "READONLY"))
#ifdef READONLY
	    return READONLY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "READONLY_FILE"))
#ifdef READONLY_FILE
	    return READONLY_FILE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "READWRITE"))
#ifdef READWRITE
	    return READWRITE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "READ_ERROR"))
#ifdef READ_ERROR
	    return READ_ERROR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "RICE_1"))
#ifdef RICE_1
	    return RICE_1;
#else
	    goto not_there;
#endif
	break;
    case 'S':
	if (strEQ(name, "SAME_FILE"))
#ifdef SAME_FILE
	    return SAME_FILE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "SEEK_ERROR"))
#ifdef SEEK_ERROR
	    return SEEK_ERROR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "SHORT_IMG"))
#ifdef SHORT_IMG
	    return SHORT_IMG;
#else
	    goto not_there;
#endif
	break;
    case 'T':
	if (strEQ(name, "TBIT"))
#ifdef TBIT
	    return TBIT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TBYTE"))
#ifdef TBYTE
	    return TBYTE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TSBYTE"))
#ifdef TSBYTE
	    return TSBYTE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TCOMPLEX"))
#ifdef TCOMPLEX
	    return TCOMPLEX;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TDBLCOMPLEX"))
#ifdef TDBLCOMPLEX
	    return TDBLCOMPLEX;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TDOUBLE"))
#ifdef TDOUBLE
	    return TDOUBLE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TFLOAT"))
#ifdef TFLOAT
	    return TFLOAT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TINT"))
#ifdef TINT
	    return TINT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TLOGICAL"))
#ifdef TLOGICAL
	    return TLOGICAL;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TLONG"))
#ifdef TLONG
	    return TLONG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TLONGLONG"))
#ifdef TLONGLONG
	    return TLONGLONG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TOO_MANY_DRIVERS"))
#ifdef TOO_MANY_DRIVERS
	    return TOO_MANY_DRIVERS;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TOO_MANY_FILES"))
#ifdef TOO_MANY_FILES
	    return TOO_MANY_FILES;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TOO_MANY_HDUS_TRACKED"))
#ifdef TOO_MANY_HDUS_TRACKED
	    return TOO_MANY_HDUS_TRACKED;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TRUE"))
#ifdef TRUE
	    return TRUE;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TSHORT"))
#ifdef TSHORT
	    return TSHORT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TSTRING"))
#ifdef TSTRING
	    return TSTRING;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TUINT"))
#ifdef TUINT
	    return TUINT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TULONG"))
#ifdef TULONG
	    return TULONG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TUSHORT"))
#ifdef TUSHORT
	    return TUSHORT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_STRUC_KEY"))
#ifdef TYP_STRUC_KEY
	    return TYP_STRUC_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_CMPRS_KEY"))
#ifdef TYP_CMPRS_KEY
	    return TYP_CMPRS_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_SCAL_KEY"))
#ifdef TYP_SCAL_KEY
	    return TYP_SCAL_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_NULL_KEY"))
#ifdef TYP_NULL_KEY
	    return TYP_NULL_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_DIM_KEY"))
#ifdef TYP_DIM_KEY
	    return TYP_DIM_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_RANG_KEY"))
#ifdef TYP_RANG_KEY
	    return TYP_RANG_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_UNIT_KEY"))
#ifdef TYP_UNIT_KEY
	    return TYP_UNIT_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_DISP_KEY"))
#ifdef TYP_DISP_KEY
	    return TYP_DISP_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_HDUID_KEY"))
#ifdef TYP_HDUID_KEY
	    return TYP_HDUID_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_CKSUM_KEY"))
#ifdef TYP_CKSUM_KEY
	    return TYP_CKSUM_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_WCS_KEY"))
#ifdef TYP_WCS_KEY
	    return TYP_WCS_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_REFSYS_KEY"))
#ifdef TYP_REFSYS_KEY
	    return TYP_REFSYS_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_COMM_KEY"))
#ifdef TYP_COMM_KEY
	    return TYP_COMM_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_CONT_KEY"))
#ifdef TYP_CONT_KEY
	    return TYP_CONT_KEY;
#else
	    goto not_there;
#endif
	if (strEQ(name, "TYP_USER_KEY"))
#ifdef TYP_USER_KEY
	    return TYP_USER_KEY;
#else
	    goto not_there;
#endif
	break;
    case 'U':
	if (strEQ(name, "ULONG_IMG"))
#ifdef ULONG_IMG
	    return ULONG_IMG;
#else
	    goto not_there;
#endif
	if (strEQ(name, "UNKNOWN_EXT"))
#ifdef UNKNOWN_EXT
	    return UNKNOWN_EXT;
#else
	    goto not_there;
#endif
	if (strEQ(name, "UNKNOWN_REC"))
#ifdef UNKNOWN_REC
	    return UNKNOWN_REC;
#else
	    goto not_there;
#endif
	if (strEQ(name, "URL_PARSE_ERROR"))
#ifdef URL_PARSE_ERROR
	    return URL_PARSE_ERROR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "USE_MEM_BUFF"))
#ifdef USE_MEM_BUFF
	    return USE_MEM_BUFF;
#else
	    goto not_there;
#endif
	if (strEQ(name, "USHORT_IMG"))
#ifdef USHORT_IMG
	    return USHORT_IMG;
#else
	    goto not_there;
#endif
	break;
    case 'V':
	if (strEQ(name, "VALIDSTRUC"))
#ifdef VALIDSTRUC
	    return VALIDSTRUC;
#else
	    goto not_there;
#endif
	if (strEQ(name, "VALUE_UNDEFINED"))
#ifdef VALUE_UNDEFINED
	    return VALUE_UNDEFINED;
#else
	    goto not_there;
#endif
	break;
    case 'W':
	if (strEQ(name, "WCS_ERROR"))
#ifdef WCS_ERROR
	    return WCS_ERROR;
#else
	    goto not_there;
#endif
	if (strEQ(name, "WRITE_ERROR"))
#ifdef WRITE_ERROR
	    return WRITE_ERROR;
#else
	    goto not_there;
#endif
	break;
    case 'X':
	break;
    case 'Y':
	break;
    case 'Z':
	if (strEQ(name, "ZERO_SCALE"))
#ifdef ZERO_SCALE
	    return ZERO_SCALE;
#else
	    goto not_there;
#endif
	break;
    }
    errno = EINVAL;
    return 0;

not_there:
    errno = ENOENT;
    return 0;
}

#define NewFitsFile(fptr) \
do \
{	New(0, fptr, 1, FitsFile);\
	fptr->perlyunpacking = -1;\
	fptr->is_open = 1;\
} while(0)

#define AbortFitsFile(fptr) \
do \
{	Safefree(fptr);\
	fptr = 0;\
} while(0)

MODULE = Astro::FITS::CFITSIO		PACKAGE = Astro::FITS::CFITSIO

PROTOTYPES: DISABLE

double
constant(name,arg)
	char *		name
	int		arg

int
sizeof_datatype(type)
	int type

int
PerlyUnpacking(...)
	CODE:
	        RETVAL = PerlyUnpacking( items > 0 ? SvIV((ST(0))) : -1 );
	OUTPUT:
		RETVAL

int
perlyunpacking(fptr, ...)
        FitsFile * fptr
	ALIAS:
		fitsfilePtr::perlyunpacking = 1
        CODE:
	        if( items > 1 )
                  fptr->perlyunpacking = SvIV((ST(1)));
                RETVAL = fptr->perlyunpacking;
	OUTPUT:
		RETVAL

int
_is_open(fptr, ...)
        FitsFile * fptr
	ALIAS:
		fitsfilePtr::_is_open = 1
        CODE:
	        if( items > 1 )
                  fptr->is_open = SvIV((ST(1)));
                RETVAL = fptr->is_open;
	OUTPUT:
		RETVAL

int
PERLYUNPACKING(fptr)
        FitsFile * fptr
	ALIAS:
		fitsfilePtr::PERLYUNPACKING = 1
        CODE:
                RETVAL = PERLYUNPACKING(fptr->perlyunpacking);
	OUTPUT:
		RETVAL

void
DESTROY(fptr)
        FitsFile * fptr
	ALIAS:
		fitsfilePtr::DESTROY = 1
        PREINIT:
                int status = 0;
	CODE:
                if ( fptr->is_open )
                {
		  ffclos( fptr->fptr, &status );
		  if ( status )
		  {
		    char * err_text = get_mortalspace(FLEN_ERRMSG,TBYTE);
		    ffgerr(status,err_text);
		    Safefree(fptr);
		    croak( "fitsfilePtr::DESTROY: error closing FITS file: %s",
		            err_text );
	          }
		}
                Safefree(fptr);

int
ffgtam(gfptr,mfptr,hdupos,status)
	fitsfile * gfptr
	fitsfile * mfptr = NO_INIT
	int hdupos
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_add_group_member = 1
		fitsfilePtr::add_group_member = 2
	CODE:
		/*
		 * (mfptr == NULL) => member HDU is identified by hdupos
		 */
		if (ST(1)==&PL_sv_undef)
			mfptr = NULL;
		else if (sv_derived_from(ST(1),"fitsfilePtr"))
			mfptr = fitsfileSV(ST(1));
		else
			croak("mfptr is not of type fitsfilePtr");
		RETVAL = ffgtam(gfptr,mfptr,hdupos,&status);
	OUTPUT:
		status
		RETVAL

int
ffasfm(tform,typecode,width,decimals,status)
	char * tform
	int typecode = NO_INIT
	long width = NO_INIT
	int decimals = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_ascii_tform = 1
	CODE:
		RETVAL = ffasfm(tform,&typecode,&width,&decimals,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),width);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),decimals);
	OUTPUT:
		status
		RETVAL

int
ffbnfm(tform,typecode,repeat,width,status)
	char * tform
	int typecode = NO_INIT
	long repeat  = NO_INIT
	long width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_binary_tform = 1
	CODE:
		RETVAL = ffbnfm(tform,&typecode,&repeat,&width,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),repeat);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),width);
	OUTPUT:
		status
		RETVAL

int
ffbnfmll(tform,typecode,repeat,width,status)
	char * tform
	int typecode = NO_INIT
	LONGLONG repeat  = NO_INIT
	long width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_binary_tformll = 1
	CODE:
		RETVAL = ffbnfmll(tform,&typecode,&repeat,&width,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),typecode);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),repeat);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),width);
	OUTPUT:
		status
		RETVAL

int
ffcrow(fptr,datatype,expr,firstrow,nelements,nulval,array,anynul,status)
	FitsFile * fptr
	int datatype
	char * expr
	long firstrow
	long nelements
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_calc_rows = 1
		fitsfilePtr::calc_rows = 2
	CODE:
		array = get_mortalspace(nelements,datatype);
		RETVAL=ffcrow(
			fptr->fptr,datatype,expr,firstrow,nelements,
			(nulval!=&PL_sv_undef) ? pack1D(nulval,datatype):NULL,
			array,&anynul,&status
		);
		FIXME("ffcrow: I should be calling fftexp (no harm done, however)");
		unpack1D(ST(6),array,nelements,datatype,fptr->perlyunpacking);
	OUTPUT:
		anynul
		status
		RETVAL

int
ffcalc(infptr, expr, outfptr, parName, parInfo, status)
	fitsfile * infptr
	char * expr
	fitsfile * outfptr
	char * parName
	char * parInfo
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_calculator = 1
		fitsfilePtr::calculator = 2
	OUTPUT:
		status

int
ffcalc_rng(infptr, expr, outfptr, parName, parInfo, nranges, firstrow, lastrow, status)
	fitsfile * infptr
	char * expr
	fitsfile * outfptr
	char * parName
	char * parInfo
	int nranges
	long * firstrow
	long * lastrow
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_calculator_rng = 1
		fitsfilePtr::calculator_rng = 2
	OUTPUT:
		status

int
ffgtch(gfptr,grouptype,status)
	fitsfile * gfptr
	int grouptype
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_change_group = 1
		fitsfilePtr::change_group = 2
	OUTPUT:
		status

void
ffpmrk()
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_errmark = 1

void
ffcmrk()
	ALIAS:
		Astro::FITS::CFITSIO::fits_clear_errmark = 1

void
ffcmsg()
	ALIAS:
		Astro::FITS::CFITSIO::fits_clear_errmsg = 1

int
ffclos(fptr, status)
	FitsFile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_close_file = 1
		fitsfilePtr::close_file = 2
	CODE: 
                RETVAL = ffclos(fptr->fptr, &status);
                fptr->is_open = 0;
	OUTPUT:
		RETVAL
		status

int
ffgtcm(gfptr,cmopt,status)
	fitsfile * gfptr
	int cmopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_compact_group = 1
		fitsfilePtr::compact_group = 2
	OUTPUT:
		status

void
ffcmps(templt,string,casesen,match,exact)
	char * templt
	char * string
	int casesen
	int &match
	int &exact
	ALIAS:
		Astro::FITS::CFITSIO::fits_compare_str = 1
	OUTPUT:
		match
		exact

int
ffcmph(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_compress_heap = 1
		fitsfilePtr::compress_heap = 2
	OUTPUT:
		status

int
ffcpcl(infptr,outfptr,incolnum,outcolnum,create_col,status)
	fitsfile * infptr
	fitsfile * outfptr
	int incolnum
	int outcolnum
	int create_col
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_col = 1
		fitsfilePtr::copy_col = 2
	OUTPUT:
		status

int
ffcprw(infptr,outfptr,firstrow,nrows,status)
	fitsfile * infptr
	fitsfile * outfptr
	LONGLONG firstrow
	LONGLONG nrows
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_rows = 1
		fitsfilePtr::copy_rows = 2
	OUTPUT:
		status

int
ffcpdt(infptr,outfptr,status)
	fitsfile * infptr
	fitsfile * outfptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_data = 1
		fitsfilePtr::copy_data = 2
	OUTPUT:
		status

int
ffwrhdu(infptr, stream, status)
	fitsfile * infptr
	FILE * stream
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_hdu = 1
		fitsfilePtr::write_hdu = 2
	OUTPUT:
		status

int
ffgtcp(infptr,outfptr,cpopt,status)
	fitsfile * infptr
	fitsfile * outfptr
	int cpopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_group = 1
		fitsfilePtr::copy_group = 2
	OUTPUT:
		status

int
ffcpfl(infptr,outfptr,previous,current,following,status)
	fitsfile * infptr
	fitsfile * outfptr
	int previous
	int current
	int following
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_file = 1
		fitsfilePtr::copy_file = 2
	OUTPUT:
		status

int
ffcopy(infptr,outfptr,morekeys,status)
	fitsfile * infptr
	fitsfile * outfptr
	int morekeys
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_hdu = 1
		fitsfilePtr::copy_hdu = 2
	OUTPUT:
		status

int
ffcphd(infptr,outfptr,status)
	fitsfile * infptr
	fitsfile * outfptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_header = 1
		fitsfilePtr::copy_header = 2
	OUTPUT:
		status

int
ffcpky(infptr,outfptr,innum,outnum,keyroot,status)
	fitsfile * infptr
	fitsfile * outfptr
	int innum
	int outnum
	char * keyroot
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_key = 1
		fitsfilePtr::copy_key = 2
	OUTPUT:
		status

int
ffgmcp(gfptr,mfptr,member,cpopt,status)
	fitsfile * gfptr
	fitsfile * mfptr
	long member
	int cpopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_copy_member = 1
		fitsfilePtr::copy_member = 2
	OUTPUT:
		status

FitsFile *
create_file(name,status)
	char * name
	int status
	PREINIT:
		FitsFile* fptr;
	CODE:
		NewFitsFile(fptr);
		if (ffinit(&(fptr->fptr),name,&status))
		  AbortFitsFile(fptr);
		RETVAL = fptr;

	OUTPUT:
		RETVAL
		status

int
ffinit(fptr,name,status)
	FitsFile * fptr = NO_INIT
	char * name
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_file = 1
	CODE:
		NewFitsFile(fptr);
		RETVAL = ffinit(&(fptr->fptr),name,&status);
		if (RETVAL)
		  AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffdkinit(fptr,name,status)
	FitsFile * fptr = NO_INIT
	char * name
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_diskfile = 1
	CODE:
		NewFitsFile(fptr);
		RETVAL = ffdkinit(&(fptr->fptr),name,&status);
		if (RETVAL)
		  AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffgtcr(fptr,grpname,grouptype,status)
	fitsfile * fptr
	char * grpname
	int grouptype
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_group = 1
		fitsfilePtr::create_group = 2
	OUTPUT:
		status

int
ffcrhd(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_hdu = 1
		fitsfilePtr::create_hdu = 2
	OUTPUT:
		status

int
ffcrim(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	long * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_img = 1
		fitsfilePtr::create_img = 2
	OUTPUT:
		status

int
ffcrimll(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	LONGLONG * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_imgll = 1
		fitsfilePtr::create_imgll = 2
	OUTPUT:
		status

int
ffcrtb(fptr,tbltype,naxis2,tfields,ttype,tform,tunit,extname,status)
	fitsfile * fptr
	int tbltype
	LONGLONG naxis2
	int tfields
	char ** ttype
	char ** tform
	char ** tunit
	char * extname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_tbl = 1
		fitsfilePtr::create_tbl = 2
	OUTPUT:
		status

FitsFile *
create_template(filename,tpltfile,status)
	char * filename
	char * tpltfile
	int status
	PREINIT:
		FitsFile * fptr;
	CODE:
		NewFitsFile(fptr);
		if (fftplt(&(fptr->fptr),filename,tpltfile,&status))
		   AbortFitsFile(fptr);
		RETVAL = fptr;
	OUTPUT:
		RETVAL
		status

int
fftplt(fptr,filename,tpltfile,status)
	FitsFile * &fptr = NO_INIT
	char * filename
	char * tpltfile
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_create_template = 1
	CODE:
		NewFitsFile(fptr);
		RETVAL = fftplt(&(fptr->fptr),filename,tpltfile,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffdt2s(year,month,day,datestr,status)
	int year
	int month
	int day
	char * datestr = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_date2str = 1
	CODE:
		datestr = get_mortalspace(11,TBYTE); /* YYYY-MM-DD or dd/mm/yy */
		RETVAL=ffdt2s(year,month,day,datestr,&status);
	OUTPUT:
		datestr
		status
		RETVAL

unsigned long
ffdsum(ascii,complm,sum)
	char * ascii
	int complm
	unsigned long &sum
	ALIAS:
		Astro::FITS::CFITSIO::fits_decode_chksum = 1
	OUTPUT:
		sum

int
ffdtdm(fptr,tdimstr,colnum,naxis,naxes,status)
	FitsFile * fptr
	char * tdimstr
	int colnum
	int naxis = NO_INIT
	long * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_decode_tdim = 1
		fitsfilePtr::decode_tdim = 2
	CODE:
		if (ST(4)!=&PL_sv_undef) { /* caller wants naxes set */
			ffdtdm(fptr->fptr,tdimstr,colnum,0,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONG);
		}
		else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffdtdm(fptr->fptr,tdimstr,colnum,naxis,&naxis,naxes,&status);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
ffdtdmll(fptr,tdimstr,colnum,naxis,naxes,status)
	FitsFile * fptr
	char * tdimstr
	int colnum
	int naxis = NO_INIT
	LONGLONG * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_decode_tdimll = 1
		fitsfilePtr::decode_tdimll = 2
	CODE:
		if (ST(4)!=&PL_sv_undef) { /* caller wants naxes set */
			ffdtdmll(fptr->fptr,tdimstr,colnum,0,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONGLONG);
		}
		else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffdtdmll(fptr->fptr,tdimstr,colnum,naxis,&naxis,naxes,&status);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONGLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
fits_decomp_img(infptr,outfptr,status)
	fitsfile * infptr
	fitsfile * outfptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_decompress_img = 1
		fitsfilePtr::decompress_img = 2
	OUTPUT:
		status

int
ffdcol(fptr,colnum,status)
	fitsfile * fptr
	int colnum
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_col = 1
		fitsfilePtr::delete_col = 2
	OUTPUT:
		status

int
ffdelt(fptr,status)
	FitsFile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_file = 1
		fitsfilePtr::delete_file = 2
	CODE:
		RETVAL = ffdelt(fptr->fptr, &status );
		fptr->is_open = 0;
	OUTPUT:
		RETVAL
		status

int
ffdhdu(fptr,hdutype,status)
	fitsfile * fptr
	int hdutype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_hdu = 1
		fitsfilePtr::delete_hdu = 2
	CODE:
		RETVAL = ffdhdu(fptr,&hdutype,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),hdutype);
	OUTPUT:
		status
		RETVAL

int
ffdkey(fptr,keyname,status)
	fitsfile * fptr
	char * keyname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_key = 1
		fitsfilePtr::delete_key = 2
	OUTPUT:
		status

int
ffdrec(fptr,keynum,status)
	fitsfile * fptr
	int keynum
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_record  = 1
		fitsfilePtr::delete_record  = 2
	OUTPUT:
		status

int
ffdrrg(fptr,rangelist,status)
	fitsfile * fptr
	char * rangelist
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_rowrange = 1
		fitsfilePtr::delete_rowrange = 2
	OUTPUT:
		status

int
ffdrws(fptr,rowlist,nrows,status)
	fitsfile * fptr
	long * rowlist
	long nrows
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_rowlist = 1
		fitsfilePtr::delete_rowlist = 2
	OUTPUT:
		status

int
ffdrwsll(fptr,rowlist,nrows,status)
	fitsfile * fptr
	LONGLONG* rowlist
	LONGLONG nrows
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_rowlistll = 1
		fitsfilePtr::delete_rowlistll = 2
	OUTPUT:
		status

int
ffdrow(fptr,firstrow,nrows,status)
	fitsfile * fptr
	LONGLONG firstrow
	LONGLONG nrows
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_rows = 1
		fitsfilePtr::delete_rows = 2
	OUTPUT:
		status

void
ffesum(sum,complm,ascii)
	unsigned long sum
	int complm
	char * ascii = NO_INIT
	ALIAS:
		Astro::FITS::CFITSIO::fits_encode_chksum = 1
	CODE:
		ascii = get_mortalspace(17,TBYTE);
		ffesum(sum,complm,ascii);
	OUTPUT:
		ascii

int
ffexist(filename, exists, status)
	char* filename
	int &exists = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_file_exists = 1
	OUTPUT:
		exists
		status

int
ffflmd(fptr,iomode,status)
	fitsfile * fptr
	int &iomode = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_file_mode = 1
		fitsfilePtr::file_mode = 2
	OUTPUT:
		iomode
		status

int
ffflnm(fptr,filename,status)
	fitsfile * fptr
	char * filename = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_file_name = 1
		fitsfilePtr::file_name = 2
	CODE:
		filename = get_mortalspace(FLEN_FILENAME,TBYTE);
		RETVAL=ffflnm(fptr,filename,&status);
	OUTPUT:
		filename
		status
		RETVAL

int
ffgnxk(fptr,inclist,ninc,exclist,nexc,card,status)
	fitsfile * fptr
	char ** inclist
	int ninc
	char ** exclist
	int nexc
	char * card = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_find_nextkey = 1
		fitsfilePtr::find_nextkey = 2
	CODE:
		card = get_mortalspace(FLEN_CARD,TBYTE);
		RETVAL=ffgnxk(fptr,inclist,ninc,exclist,nexc,card,&status);
	OUTPUT:
		card
		status
		RETVAL

int
ffffrw(fptr, expr, rownum, status)
	fitsfile * fptr
	char * expr
	long &rownum = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_find_first_row = 1
		fitsfilePtr::find_first_row = 2
	OUTPUT:
		rownum
		status

int
fffrow(fptr,expr,firstrow,nrows,n_good_rows,row_status,status)
	FitsFile * fptr
	char * expr
	long firstrow
	long nrows
	long n_good_rows = NO_INIT
	logical * row_status = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_find_rows = 1
		fitsfilePtr::find_rows = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nrows*sizeof_datatype(TLOGICAL));
			RETVAL=fffrow(fptr->fptr,expr,firstrow,nrows,&n_good_rows,(logical*)SvPV(ST(5),PL_na),&status);
		}
		else {
			row_status = get_mortalspace(nrows,TLOGICAL);
			RETVAL=fffrow(fptr->fptr,expr,firstrow,nrows,&n_good_rows,row_status,&status);
			unpack1D(ST(5),row_status,nrows,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4), n_good_rows); /* value-added */
	OUTPUT:
		status
		RETVAL

int
ffflus(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_flush_file = 1
		fitsfilePtr::flush_file = 2
	OUTPUT:
		status

int
ffflsh(fptr, clearbuf, status)
	fitsfile * fptr
	int clearbuf
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_flush_buffer = 1
		fitsfilePtr::flush_buffer = 2
	OUTPUT:
		status

int
ffgacl(fptr,colnum,ttype,tbcol,tunit,tform,scale,zero,nulstr,tdisp,status)
	fitsfile * fptr
	int colnum
	char * ttype = NO_INIT
	long tbcol = NO_INIT
	char * tunit = NO_INIT
	char * tform = NO_INIT
	double scale = NO_INIT
	double zero = NO_INIT
	char * nulstr = NO_INIT
	char * tdisp = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_acolparms = 1
		fitsfilePtr::get_acolparms = 2
	CODE:
		ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tunit = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tform = (ST(5) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		nulstr= (ST(8) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		RETVAL=ffgacl(fptr,colnum,ttype,&tbcol,tunit,tform,&scale,&zero,nulstr,tdisp,&status);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),tbcol);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero);
	OUTPUT:
		ttype
		tunit
		tform
		nulstr
		tdisp
		status
		RETVAL

int
ffgbcl(fptr,colnum,ttype,tunit,dtype,repeat,scale,zero,nulval,tdisp,status)
	fitsfile * fptr
	int colnum
	char * ttype = NO_INIT
	char * tunit = NO_INIT
	char * dtype = NO_INIT
	long repeat = NO_INIT
	double scale = NO_INIT
	double zero = NO_INIT
	long nulval = NO_INIT
	char * tdisp = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_bcolparms = 1
		fitsfilePtr::get_bcolparms = 2
	CODE:
		ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tunit = (ST(3) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		dtype = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		RETVAL=ffgbcl(fptr,colnum,ttype,tunit,dtype,&repeat,&scale,&zero,&nulval,tdisp,&status);
		if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),repeat);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero);
		if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),nulval);
	OUTPUT:
		ttype
		tunit
		dtype
		tdisp
		status
		RETVAL

int
ffgbclll(fptr,colnum,ttype,tunit,dtype,repeat,scale,zero,nulval,tdisp,status)
	fitsfile * fptr
	int colnum
	char * ttype = NO_INIT
	char * tunit = NO_INIT
	char * dtype = NO_INIT
	LONGLONG repeat = NO_INIT
	double scale = NO_INIT
	double zero = NO_INIT
	LONGLONG nulval = NO_INIT
	char * tdisp = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_bcolparmsll = 1
		fitsfilePtr::get_bcolparmsll = 2
	CODE:
		ttype = (ST(2) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tunit = (ST(3) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		dtype = (ST(4) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		tdisp = (ST(9) != &PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		RETVAL=ffgbclll(fptr,colnum,ttype,tunit,dtype,&repeat,&scale,&zero,&nulval,tdisp,&status);
		if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),repeat);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),scale);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),zero);
		if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),nulval);
	OUTPUT:
		ttype
		tunit
		dtype
		tdisp
		status
		RETVAL

int
ffgcks(fptr,datasum,hdusum,status)
	fitsfile * fptr
	unsigned long datasum = NO_INIT
	unsigned long hdusum = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_chksum = 1
		fitsfilePtr::get_chksum = 2
	CODE:
		RETVAL = ffgcks(fptr,&datasum,&hdusum,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1), datasum); /* value-added */
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2), hdusum); /* value-added */
	OUTPUT:
		status
		RETVAL

int
ffgcnn(fptr,casesen,templt,colname,colnum,status)
	fitsfile * fptr
	int casesen
	char * templt
	char * colname = NO_INIT
	int colnum = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_colname = 1
		fitsfilePtr::get_colname = 2
	CODE:
		colname = get_mortalspace(FLEN_KEYWORD,TBYTE);
		RETVAL=ffgcnn(fptr,casesen,templt,colname,&colnum,&status);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),colnum); /* value-added */
	OUTPUT:
		colname
		status
		RETVAL

int
ffgcno(fptr,casesen,templt,colnum,status)
	fitsfile * fptr
	int casesen
	char * templt
	int colnum = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_colnum = 1
		fitsfilePtr::get_colnum = 2
	CODE:
		RETVAL = fits_get_colnum(fptr,casesen,templt,&colnum,&status);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),colnum);
	OUTPUT:
		status
		RETVAL

int
ffgtcl(fptr,colnum,typecode,repeat,width,status)
	fitsfile * fptr
	int colnum
	int typecode = NO_INIT
	long repeat = NO_INIT
	long width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_coltype = 1
		fitsfilePtr::get_coltype = 2
	CODE:
		RETVAL = ffgtcl(fptr,colnum,&typecode,&repeat,&width,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width);
	OUTPUT:
		status
		RETVAL

int
ffgtclll(fptr,colnum,typecode,repeat,width,status)
	fitsfile * fptr
	int colnum
	int typecode = NO_INIT
	LONGLONG repeat = NO_INIT
	LONGLONG width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_coltypell = 1
		fitsfilePtr::get_coltypell = 2
	CODE:
		RETVAL = ffgtclll(fptr,colnum,&typecode,&repeat,&width,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width);
	OUTPUT:
		status
		RETVAL

int
ffeqty(fptr,colnum,typecode,repeat,width,status)
	fitsfile * fptr
	int colnum
	int typecode = NO_INIT
	long repeat = NO_INIT
	long width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_eqcoltype = 1
		fitsfilePtr::get_eqcoltype = 2
	CODE:
		RETVAL = ffeqty(fptr,colnum,&typecode,&repeat,&width,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width);
	OUTPUT:
		status
		RETVAL

int
ffeqtyll(fptr,colnum,typecode,repeat,width,status)
	fitsfile * fptr
	int colnum
	int typecode = NO_INIT
	LONGLONG repeat = NO_INIT
	LONGLONG width = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_eqcoltypell = 1
		fitsfilePtr::get_eqcoltypell = 2
	CODE:
		RETVAL = ffeqtyll(fptr,colnum,&typecode,&repeat,&width,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),typecode);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),width);
	OUTPUT:
		status
		RETVAL

int
fits_get_compression_type(fptr, comptype, status)
	fitsfile *fptr
	int &comptype = NO_INIT
	int &status
	ALIAS:
		fitsfilePtr::get_compression_type = 1
	OUTPUT:
		comptype
		status

void
ffgerr(status,err_text)
	int status
	char * err_text = NO_INIT
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_errstatus = 1
	CODE:
		err_text = get_mortalspace(FLEN_ERRMSG,TBYTE);
		ffgerr(status,err_text);
	OUTPUT:
		err_text

int
ffghps(fptr,keysexist,keynum,status)
	fitsfile * fptr
	int keysexist = NO_INIT
	int keynum = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hdrpos = 1
		fitsfilePtr::get_hdrpos = 2
	CODE:
		RETVAL = ffghps(fptr,&keysexist,&keynum,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),keysexist); /* value-added */
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),keynum); /* value-added */
	OUTPUT:
		status
		RETVAL

int
ffghsp(fptr,keysexist,morekeys,status)
	fitsfile * fptr
	int keysexist = NO_INIT
	int morekeys = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hdrspace = 1
		fitsfilePtr::get_hdrspace = 2
	CODE:
		RETVAL = ffghsp(fptr,&keysexist,&morekeys,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),keysexist); /* value-added */
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),morekeys); /* value-added */
	OUTPUT:
		status
		RETVAL

int 
ffghdn(fptr,hdunum)
	fitsfile * fptr
	int hdunum = NO_INIT
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hdu_num = 1
		fitsfilePtr::get_hdu_num = 2
	CODE:
		RETVAL = ffghdn(fptr,&hdunum);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),hdunum);
	OUTPUT:
		RETVAL

int
ffghdt(fptr,hdutype,status)
	fitsfile * fptr
	int &hdutype = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hdu_type = 1
		fitsfilePtr::get_hdu_type = 2
	OUTPUT:
		hdutype
		status

int
ffghad(fptr,headstart,datastart,dataend,status)
	fitsfile * fptr
	long headstart = NO_INIT
	long datastart = NO_INIT
	long dataend = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hduaddr = 1
		fitsfilePtr::get_hduaddr = 2
	CODE:
		RETVAL = ffghad(fptr,&headstart,&datastart,&dataend,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),headstart);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),datastart);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),dataend);
	OUTPUT:
		status
		RETVAL

int
ffghadll(fptr,headstart,datastart,dataend,status)
	fitsfile * fptr
	LONGLONG headstart = NO_INIT
	LONGLONG datastart = NO_INIT
	LONGLONG dataend = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hduaddrll = 1
		fitsfilePtr::get_hduaddrll = 2
	CODE:
		RETVAL = ffghadll(fptr,&headstart,&datastart,&dataend,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),headstart);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),datastart);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),dataend);
	OUTPUT:
		status
		RETVAL

int
ffghof(fptr, headstart, datastart, dataend, status)
	fitsfile * fptr
	OFF_T headstart = NO_INIT	
	OFF_T datastart = NO_INIT	
	OFF_T dataend = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_hduoff = 1
		fitsfilePtr::get_hduoff = 2
	CODE:
		RETVAL = ffghof(fptr,&headstart,&datastart,&dataend,&status);
		if (ST(1) != &PL_sv_undef) sv_setuv(ST(1),headstart);
		if (ST(2) != &PL_sv_undef) sv_setuv(ST(2),datastart);
		if (ST(3) != &PL_sv_undef) sv_setuv(ST(3),dataend);
	OUTPUT:
		status
		RETVAL


int
ffgknm(card,name,len,status)
	char * card
	char * name = NO_INIT
	int len = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_keyname = 1
	CODE:
		name = get_mortalspace(FLEN_KEYWORD,TBYTE);
		RETVAL = ffgknm(card,name,&len,&status);
		if (ST(2) != &PL_sv_undef)
			sv_setiv(ST(2), len);
	OUTPUT:
		name
		status
		RETVAL

int
ffdtyp(value,dtype,status)
	char * value
	char &dtype = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_keytype = 1
	OUTPUT:
		dtype
		status

int
ffgidt(fptr,bitpix,status)
	fitsfile * fptr
	int &bitpix = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_type = 1
		fitsfilePtr::get_img_type = 2
	OUTPUT:
		bitpix
		status

int
ffinttyp(value,inttype,neg,status)
	char * value
	int &inttype = NO_INIT
	int &neg = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_inttype = 1
	OUTPUT:
		inttype
		neg
		status

int
ffgiet(fptr,bitpix,status)
	fitsfile * fptr
	int &bitpix = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_equivtype = 1
		fitsfilePtr::get_img_equivtype = 2
	OUTPUT:
		bitpix
		status

int
ffgidm(fptr,naxis,status)
	fitsfile * fptr
	int &naxis = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_dim = 1
		fitsfilePtr::get_img_dim = 2
	OUTPUT:
		naxis
		status

int
ffgisz(fptr,naxes,status)
	FitsFile * fptr
	long *naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_size = 1
		fitsfilePtr::get_img_size = 2
	PREINIT:
		int nlen;
	CODE:
		RETVAL = ffgidm(fptr->fptr,&nlen,&status);
		if (RETVAL <= 0) {
			naxes = get_mortalspace(nlen,TLONG);
			RETVAL = ffgisz(fptr->fptr,nlen,naxes,&status);
			/* unpack as Perl array */
			unpack1D(ST(1),naxes,nlen,TLONG,1);
		}
	OUTPUT:
		status
		RETVAL

int
ffgiszll(fptr,naxes,status)
	FitsFile * fptr
	LONGLONG *naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_sizell = 1
		fitsfilePtr::get_img_sizell = 2
	PREINIT:
		int nlen;
	CODE:
		RETVAL = ffgidm(fptr->fptr,&nlen,&status);
		if (RETVAL <= 0) {
			naxes = get_mortalspace(nlen,TLONGLONG);
			RETVAL = ffgiszll(fptr->fptr,nlen,naxes,&status);
			/* unpack as Perl array */
			unpack1D(ST(1),naxes,nlen,TLONGLONG,1);
		}
	OUTPUT:
		status
		RETVAL

int
fits_get_noise_bits(fptr, noisebits, status)
	fitsfile *fptr
	int &noisebits = NO_INIT
	int &status
	ALIAS:
		fitsfilePtr::get_noise_bits = 1
	OUTPUT:
		noisebits
		status

int
ffgncl(fptr,ncols,status)
	fitsfile * fptr
	int &ncols = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_cols = 1
		fitsfilePtr::get_num_cols = 2
	OUTPUT:
		ncols
		status

int
ffgmng(mfptr,nmembers,status)
	fitsfile * mfptr
	long &nmembers = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_groups = 1
		fitsfilePtr::get_num_groups = 2
	OUTPUT:
		nmembers
		status

int
ffthdu(fptr,hdunum,status)
	fitsfile * fptr
	int &hdunum = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_hdus = 1
		fitsfilePtr::get_num_hdus = 2
	OUTPUT:
		hdunum
		status

int
ffgtnm(gfptr,nmembers,status)
	fitsfile * gfptr
	long &nmembers = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_members = 1
		fitsfilePtr::get_num_members = 2
	OUTPUT:
		nmembers
		status

int
ffgnrw(fptr,nrows,status)
	fitsfile * fptr
	long &nrows = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_rows = 1
		fitsfilePtr::get_num_rows = 2
	OUTPUT:
		nrows
		status

int
ffgnrwll(fptr,nrows,status)
	fitsfile * fptr
	LONGLONG &nrows = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_num_rowsll = 1
		fitsfilePtr::get_num_rowsll = 2
	OUTPUT:
		nrows
		status

int
ffgrsz(fptr,nrows,status)
	fitsfile * fptr
	long &nrows = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_rowsize = 1
		fitsfilePtr::get_rowsize = 2
	OUTPUT:
		nrows
		status

int
ffgstm(timestr,timeref,status)
	char * timestr = NO_INIT
	int timeref = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_system_time = 1
	CODE:
		timestr = get_mortalspace(20,TBYTE); /* YYYY-MM-DDThh:mm:ss */
		RETVAL=ffgstm(timestr,&timeref,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),timeref);
	OUTPUT:
		timestr
		status
		RETVAL

int
ffgabc(tfields,tform,space,rowlen,tbcol,status)
	int tfields
	char ** tform
	int space
	long rowlen = NO_INIT
	long * tbcol = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_tbcol = 1
	CODE:
		tbcol = get_mortalspace(tfields,TLONG);
		RETVAL=ffgabc(tfields,tform,space,&rowlen,tbcol,&status);
		unpack1D(ST(4),tbcol,tfields,TLONG,-1);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),rowlen); /* value-added */
	OUTPUT:
		status
		RETVAL

int
fits_get_tile_dim(fptr, ndim, tilesize, status)
	FitsFile *fptr
	int ndim
	long *naxes = NO_INIT
	int status
	ALIAS:
		fitsfilePtr::get_tile_dim = 1
	CODE:
		naxes = get_mortalspace(ndim,TLONG);
		RETVAL=fits_get_tile_dim(fptr->fptr,ndim,naxes,&status);
		if (ST(2)!=&PL_sv_undef) unpack1D(ST(2),naxes,ndim,TLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

float
ffvers(version)
	float version = NO_INIT
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_version = 1
	CODE:
		RETVAL = ffvers(&version);
		if (ST(0) != &PL_sv_undef) sv_setnv(ST(0),version); /* value-added */
	OUTPUT:
		RETVAL

int
ffhdr2str(fptr, nocomments, header, nkeys, status)
	FitsFile *fptr
	int nocomments
	char *header = NO_INIT
	int nkeys = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_hdr2str = 1
		fitsfilePtr::hdr2str = 2
	CODE:
		RETVAL=fits_hdr2str(fptr->fptr,nocomments,NULL,0,&header,&nkeys,&status);
		if (ST(2)!=&PL_sv_undef) unpackScalar(ST(2), header, TSTRING);
		if (ST(3)!=&PL_sv_undef) unpackScalar(ST(3), &nkeys, TINT);
		free(header);
	OUTPUT:
		status
		RETVAL

int
ffcnvthdr2str(fptr, nocomments, header, nkeys, status)
	FitsFile *fptr
	int nocomments
	char *header = NO_INIT
	int nkeys = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_convert_hdr2str = 1
		fitsfilePtr::convert_hdr2str = 2
	CODE:
		RETVAL=fits_hdr2str(fptr->fptr,nocomments,NULL,0,&header,&nkeys,&status);
		if (ST(2)!=&PL_sv_undef) unpackScalar(ST(2), header, TSTRING);
		if (ST(3)!=&PL_sv_undef) unpackScalar(ST(3), &nkeys, TINT);
		free(header);
	OUTPUT:
		status
		RETVAL

int
ffitab(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status)
	fitsfile * fptr
	LONGLONG rowlen
	LONGLONG nrows
	int tfields
	char ** ttype
	long * tbcol
	char ** tform
	char ** tunit
	char * extname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_atbl = 1
		fitsfilePtr::insert_atbl = 2
	OUTPUT:
		status

int
ffibin(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status)
	fitsfile * fptr
	LONGLONG nrows 
	int tfields
	char ** ttype
	char ** tform
	char ** tunit
	char * extname
	LONGLONG pcount
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_btbl = 1
		fitsfilePtr::insert_btbl = 2
	OUTPUT:
		status

int
fficol(fptr,colnum,ttype,tform,status)
	fitsfile * fptr
	int colnum
	char * ttype
	char * tform
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_col = 1
		fitsfilePtr::insert_col = 2
	OUTPUT:
		status

int
fficls(fptr,colnum,ncols,ttype,tform,status)
	fitsfile * fptr
	int colnum
	int ncols
	char ** ttype
	char ** tform
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_cols = 1
		fitsfilePtr::insert_cols = 2
	OUTPUT:
		status

int
ffgtis(fptr,grpname,grouptype,status)
	fitsfile * fptr
	char * grpname
	int grouptype
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_group = 1
		fitsfilePtr::insert_group = 2
	OUTPUT:
		status

int
ffiimg(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	long * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_img = 1
		fitsfilePtr::insert_img = 2
	OUTPUT:
		status

int
ffiimgll(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	LONGLONG * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_imgll = 1
		fitsfilePtr::insert_imgll = 2
	OUTPUT:
		status

int
ffikyu(fptr,keyname,comment,status)
	fitsfile * fptr
	char * keyname
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_null = 1
		fitsfilePtr::insert_key_null = 2
	OUTPUT:
		status

int
ffikys(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_str = 1
		fitsfilePtr::insert_key_str = 2
	OUTPUT:
		status

int
ffikyl(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	int value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_log = 1
		fitsfilePtr::insert_key_log = 2
	OUTPUT:
		status

int
ffikyj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	LONGLONG value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_lng = 1
		fitsfilePtr::insert_key_lng = 2
	OUTPUT:
		status

int
ffikye(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_flt = 1
		fitsfilePtr::insert_key_flt = 2
	OUTPUT:
		status

int
ffikyf(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_fixflt = 1
		fitsfilePtr::insert_key_fixflt = 2
	OUTPUT:
		status

int
ffikyd(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_dbl = 1
		fitsfilePtr::insert_key_dbl = 2
	OUTPUT:
		status

int
ffikyg(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_fixdbl = 1
		fitsfilePtr::insert_key_fixdbl = 2
	OUTPUT:
		status

int
ffikyc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_cmp = 1
		fitsfilePtr::insert_key_cmp = 2
	OUTPUT:
		status

int
ffikfc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_fixcmp = 1
		fitsfilePtr::insert_key_fixcmp = 2
	OUTPUT:
		status

int
ffikym(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_dblcmp = 1
		fitsfilePtr::insert_key_dblcmp = 2
	OUTPUT:
		status

int
ffikfm(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_fixdblcmp = 1
		fitsfilePtr::insert_key_fixdblcmp = 2
	OUTPUT:
		status

int
ffirec(fptr,keynum,card,status)
	fitsfile * fptr
	int keynum
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_record = 1
		fitsfilePtr::insert_record = 2
	OUTPUT:
		status

int
ffikey(fptr,card,status)
	fitsfile * fptr
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_card = 1
		fitsfilePtr::insert_card = 2
	OUTPUT:
		status

int
ffirow(fptr,firstrow,nrows,status)
	fitsfile * fptr
	LONGLONG firstrow
	LONGLONG nrows
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_rows = 1
		fitsfilePtr::insert_rows = 2
	OUTPUT:
		status

int
ffkeyn(keyroot,value,keyname,status)
	char * keyroot
	int value
	char * keyname = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_make_keyn = 1
	CODE:
		keyname = get_mortalspace(FLEN_KEYWORD,TBYTE);
		RETVAL=ffkeyn(keyroot,value,keyname,&status);
	OUTPUT:
		keyname
		status
		RETVAL

int
ffnkey(value,keyroot,keyname,status)
	int value
	char * keyroot
	char * keyname = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_make_nkey = 1
	CODE:
		keyname = get_mortalspace(FLEN_KEYWORD,TBYTE);
		RETVAL=ffnkey(value,keyroot,keyname,&status);
	OUTPUT:
		keyname
		status
		RETVAL

int
ffmkky(keyname, value, comm, card, status)
	const char * keyname
	char * value
	const char * comm
	char * card = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_make_key = 1
	CODE:
		card = get_mortalspace(FLEN_CARD, TBYTE);
		RETVAL=ffmkky(keyname, value, comm, card, &status);
	OUTPUT:
		card
		status
		RETVAL

int
ffgtmg(infptr,outfptr,mgopt,status)
	fitsfile * infptr
	fitsfile * outfptr
	int mgopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_merge_groups = 1
		fitsfilePtr::merge_groups = 2
	OUTPUT:
		status

int
ffmbyt(fptr, bytepos, err_mode, status)
	fitsfile * fptr
	LONGLONG bytepos
	int err_mode
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_seek = 1
		fitsfilePtr::seek = 2
	OUTPUT:
		status

int
ffmcrd(fptr,keyname,card,status)
	fitsfile * fptr
	char * keyname
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_card = 1
		fitsfilePtr::modify_card = 2
	OUTPUT:
		status

int
ffmcom(fptr,keyname,comment,status)
	fitsfile * fptr
	char * keyname
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_comment = 1
		fitsfilePtr::modify_comment = 2
	OUTPUT:
		status

int
ffmkyu(fptr,keyname,comment,status)
	fitsfile * fptr
	char * keyname
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_null = 1
		fitsfilePtr::modify_key_null = 2
	OUTPUT:
		status

int
ffmkys(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_str = 1
		fitsfilePtr::modify_key_str = 2
	OUTPUT:
		status

int
ffmkyl(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	int value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_log = 1
		fitsfilePtr::modify_key_log = 2
	OUTPUT:
		status

int
ffmkyj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	LONGLONG value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_lng = 1
		fitsfilePtr::modify_key_lng = 2
	OUTPUT:
		status

int
ffmkye(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_flt = 1
		fitsfilePtr::modify_key_flt = 2
	OUTPUT:
		status

int
ffmkyf(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_fixflt = 1
		fitsfilePtr::modify_key_fixflt = 2
	OUTPUT:
		status

int
ffmkyd(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_dbl = 1
		fitsfilePtr::modify_key_dbl = 2
	OUTPUT:
		status

int
ffmkyg(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_fixdbl = 1
		fitsfilePtr::modify_key_fixdbl = 2
	OUTPUT:
		status

int
ffmkyc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_cmp = 1
		fitsfilePtr::modify_key_cmp = 2
	OUTPUT:
		status

int
ffmkfc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_fixcmp = 1
		fitsfilePtr::modify_key_fixcmp = 2
	OUTPUT:
		status

int
ffmkym(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_dblcmp = 1
		fitsfilePtr::modify_key_dblcmp = 2
	OUTPUT:
		status

int
ffmkfm(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_fixdblcmp = 1
		fitsfilePtr::modify_key_fixdblcmp = 2
	OUTPUT:
		status

int
ffmnam(fptr,oldname,newname,status)
	fitsfile * fptr
	char * oldname
	char * newname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_name = 1
		fitsfilePtr::modify_name = 2
	OUTPUT:
		status

int
ffmrec(fptr,keynum,card,status)
	fitsfile * fptr
	int keynum
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_record = 1
		fitsfilePtr::modify_record = 2
	OUTPUT:
		status

int
ffmvec(fptr,colnum,newveclen,status)
	fitsfile * fptr
	int colnum
	LONGLONG newveclen
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_vector_len = 1
		fitsfilePtr::modify_vector_len = 2
	OUTPUT:
		status

int
ffmahd(fptr,hdunum,hdutype,status)
	fitsfile * fptr
	int hdunum
	int hdutype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_movabs_hdu = 1
		fitsfilePtr::movabs_hdu = 2
	CODE:
		RETVAL = ffmahd(fptr,hdunum,&hdutype,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hdutype);
	OUTPUT:
		status
		RETVAL

int
ffmnhd(fptr,hdutype,extname,extvers,status)
	fitsfile * fptr
	int hdutype
	char * extname
	int extvers
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_movnam_hdu = 1
		fitsfilePtr::movnam_hdu = 2
	OUTPUT:
		status

int
ffmrhd(fptr,nmove,hdutype,status)
	fitsfile * fptr
	int nmove
	int hdutype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_movrel_hdu = 1
		fitsfilePtr::movrel_hdu = 2
	CODE:
		RETVAL = ffmrhd(fptr,nmove,&hdutype,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hdutype);
	OUTPUT:
		status
		RETVAL

int
ffnchk(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_null_check = 1
		fitsfilePtr::null_check = 2
	OUTPUT:
		status

FitsFile*
open_file(filename,iomode,status)
	char * filename
	int iomode
	int status
	PREINIT:
		FitsFile * fptr;
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		if (ffopen(&(fptr->fptr),filename,iomode,&status))
		   AbortFitsFile(fptr);
		RETVAL = fptr;
	OUTPUT:
		RETVAL
		status

int
ffopen(fptr,filename,iomode,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_file = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = ffopen(&(fptr->fptr),filename,iomode,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffdkopn(fptr,filename,iomode,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_diskfile = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = ffdkopn(&(fptr->fptr),filename,iomode,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffdopn(fptr,filename,iomode,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_data = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = ffdopn(&(fptr->fptr),filename,iomode,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffiopn(fptr,filename,iomode,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_image = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = ffiopn(&(fptr->fptr),filename,iomode,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
fftopn(fptr,filename,iomode,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_table = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = fftopn(&(fptr->fptr),filename,iomode,&status);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffeopn(fptr,filename,iomode,extlist,hdutype,status)
	FitsFile * fptr = NO_INIT
	char * filename
	int iomode
	char * extlist
	int hdutype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_extlist = 1
	CODE:
		if (!filename) /* undef passed */
			filename = "";
		NewFitsFile(fptr);
		RETVAL = ffeopn(&(fptr->fptr),filename,iomode,extlist,&hdutype,&status);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),hdutype);
		if (RETVAL)
		   AbortFitsFile(fptr);
	OUTPUT:
		RETVAL
		fptr
		status

int
ffgtop(mfptr,group,gfptr,status)
	fitsfile * mfptr
	int group
	FitsFile * gfptr = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_group = 1
		fitsfilePtr::open_group = 2
	CODE:
		NewFitsFile(gfptr);
		RETVAL = ffgtop(mfptr,group,&(gfptr->fptr),&status);
		if (RETVAL)
		   AbortFitsFile(gfptr);
	OUTPUT:
		RETVAL
		gfptr
		status

int
ffgmop(gfptr,member,mfptr,status)
	fitsfile * gfptr
	long member
	FitsFile * mfptr = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_open_member = 1
		fitsfilePtr::open_member = 2
	CODE:
		NewFitsFile(mfptr);
		RETVAL = ffgmop(gfptr,member,&(mfptr->fptr),&status);
		if (RETVAL)
		   AbortFitsFile(mfptr);
	OUTPUT:
		status
		mfptr
		RETVAL

int
ffextn(filename,hdunum,status)
	char * filename
	int &hdunum = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_extnum = 1
	OUTPUT:
		hdunum
		status

int
ffiurl(filename,urltype,infile,outfile,extspec,filter,binspec,colspec,status)
	char * filename
	char * urltype = NO_INIT
	char * infile = NO_INIT
	char * outfile = NO_INIT
	char * extspec = NO_INIT
	char * filter = NO_INIT
	char * binspec = NO_INIT
	char * colspec = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_input_url = 1
	CODE:
		urltype = get_mortalspace(FLEN_FILENAME,TBYTE);
		infile = get_mortalspace(FLEN_FILENAME,TBYTE);
		outfile = get_mortalspace(FLEN_FILENAME,TBYTE);
		extspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		filter = get_mortalspace(FLEN_FILENAME,TBYTE);
		binspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		colspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		RETVAL = ffiurl(filename,urltype,infile,outfile,extspec,filter,binspec,colspec,&status);
	OUTPUT:
		urltype
		infile
		outfile
		extspec
		filter
		binspec
		colspec
		status
		RETVAL

int
ffifile(filename,filetype,infile,outfile,extspec,filter,binspec,colspec,pixspec,status)
	char * filename
	char * filetype = NO_INIT
	char * infile = NO_INIT
	char * outfile = NO_INIT
	char * extspec = NO_INIT
	char * filter = NO_INIT
	char * binspec = NO_INIT
	char * colspec = NO_INIT
	char * pixspec = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_input_filename = 1
	CODE:
		filetype = get_mortalspace(FLEN_FILENAME,TBYTE);
		infile = get_mortalspace(FLEN_FILENAME,TBYTE);
		outfile = get_mortalspace(FLEN_FILENAME,TBYTE);
		extspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		filter = get_mortalspace(FLEN_FILENAME,TBYTE);
		binspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		colspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		pixspec = get_mortalspace(FLEN_FILENAME,TBYTE);
		RETVAL = ffifile(filename,filetype,infile,outfile,extspec,filter,binspec,colspec,pixspec,&status);
	OUTPUT:
		filetype
		infile
		outfile
		extspec
		filter
		binspec
		colspec
		pixspec
		status
		RETVAL

int
fits_copy_cell2image(infptr, outfptr, colname, rownum, status)
	fitsfile* infptr
	fitsfile* outfptr
	char* colname
	long rownum
	int &status
	ALIAS:
		fitsfilePtr::copy_cell2image = 1
	OUTPUT:
		status

int
fits_copy_image2cell(infptr, outfptr, colname, rownum, copykeyflag, status)
	fitsfile* infptr
	fitsfile* outfptr
	char* colname
	long rownum
	int copykeyflag
	int &status
	ALIAS:
		fitsfilePtr::copy_image2cell = 1
	OUTPUT:
		status

int
ffrwrg(rowlist, maxrows, maxranges, numranges, rangemin, rangemax, status)
	char * rowlist
	LONGLONG maxrows
	int maxranges
	int numranges = NO_INIT
	long * rangemin = NO_INIT
	long * rangemax = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_range = 1
	CODE:
		if (ST(4)!=&PL_sv_undef || ST(5)!=&PL_sv_undef) {
			rangemin = get_mortalspace(maxranges,TLONG);
			rangemax = get_mortalspace(maxranges,TLONG);
		}
		else {
			rangemin = rangemax = 0;
			maxranges = 0;
		}

		RETVAL=ffrwrg(rowlist, maxrows, maxranges, &numranges,
			rangemin, rangemax, &status);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),numranges);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),rangemin,numranges,TLONG,-1);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),rangemax,numranges,TLONG,-1);
	OUTPUT:
		status
		RETVAL

int
ffrwrgll(rowlist, maxrows, maxranges, numranges, rangemin, rangemax, status)
	char * rowlist
	LONGLONG maxrows
	int maxranges
	int numranges = NO_INIT
	LONGLONG * rangemin = NO_INIT
	LONGLONG * rangemax = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_rangell = 1
	CODE:
		if (ST(4)!=&PL_sv_undef || ST(5)!=&PL_sv_undef) {
			rangemin = get_mortalspace(maxranges,TLONG);
			rangemax = get_mortalspace(maxranges,TLONG);
		}
		else {
			rangemin = rangemax = 0;
			maxranges = 0;
		}

		RETVAL=ffrwrgll(rowlist, maxrows, maxranges, &numranges,
			rangemin, rangemax, &status);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),numranges);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),rangemin,numranges,TLONGLONG,-1);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),rangemax,numranges,TLONGLONG,-1);
	OUTPUT:
		status
		RETVAL

int
ffrtnm(url,rootname,status)
	char * url 
	char * rootname = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_rootname = 1
	CODE:
		rootname = get_mortalspace(FLEN_FILENAME,TBYTE);
		RETVAL = ffrtnm(url,rootname,&status);
	OUTPUT:
		rootname
		status
		RETVAL

int
ffgthd(templt,card,keytype,status)
	char * templt
	char * card = NO_INIT
	int keytype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_template = 1
	CODE:
		card = get_mortalspace(FLEN_CARD,TBYTE);
		RETVAL = ffgthd(templt,card,&keytype,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),keytype);
	OUTPUT:
		card
		status
		RETVAL

int
fits_translate_keyword(inrec, outrec, inpatterns, outpatterns, npat, n_value, n_offset, n_range, pat_num, i, j, m, n, status)
	char* inrec
	char* outrec = NO_INIT
	char** inpatterns
	char** outpatterns
	int npat
	int n_value
	int n_offset
	int n_range
	int pat_num = NO_INIT
	int i = NO_INIT
	int j = NO_INIT
	int m = NO_INIT
	int n = NO_INIT
	int status
	PREINIT:
		char* (*patterns)[2];
		int ii;
	CODE:
		patterns = malloc(npat * sizeof(*patterns));
		for (ii=0; ii<npat; ++ii) {
		    patterns[ii][0] = inpatterns[ii];
		    patterns[ii][1] = outpatterns[ii];
		}
		outrec = get_mortalspace(strlen(inrec)+1,TBYTE);
		RETVAL = fits_translate_keyword(inrec,
						outrec,
						patterns,
						npat,
						n_value,
						n_offset,
						n_range,
						&pat_num,
						&i,
						&j,
						&m,
						&n,
						&status);
		if (ST(1) != &PL_sv_undef) sv_setpv(ST(1),outrec);
		if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),pat_num);
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),i);
		if (ST(10) != &PL_sv_undef) sv_setiv(ST(10),j);
		if (ST(11) != &PL_sv_undef) sv_setiv(ST(11),m);
		if (ST(12) != &PL_sv_undef) sv_setiv(ST(12),n);
		free(patterns);
	OUTPUT:
		status
		RETVAL

int
fits_translate_keywords(infptr, outfptr, firstkey, inpatterns, outpatterns, npat, n_value, n_offset, n_range, status)
	FitsFile* infptr
	FitsFile* outfptr
	int firstkey
	char** inpatterns
	char** outpatterns
	int npat
	int n_value
	int n_offset
	int n_range
	int status
	ALIAS:
		fitsfilePtr::translate_keywords = 1
	PREINIT:
		char* (*patterns)[2];
		int ii;
	CODE:
		patterns = malloc(npat * sizeof(*patterns));
		for (ii=0; ii<npat; ++ii) {
		    patterns[ii][0] = inpatterns[ii];
		    patterns[ii][1] = outpatterns[ii];
		}
		RETVAL = fits_translate_keywords(infptr->fptr,
						 outfptr->fptr,
						 firstkey,
						 patterns,
						 npat,
						 n_value,
						 n_offset,
						 n_range,
						 &status);
		free(patterns);
	OUTPUT:
		status
		RETVAL

int
ffpsvc(card,value,comment,status)
	char * card
	char * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_parse_value = 1
	CODE:
		value = get_mortalspace(FLEN_VALUE,TBYTE);
		comment = get_mortalspace(FLEN_COMMENT,TBYTE);
		RETVAL = ffpsvc(card,value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffwldp(xpix,ypix,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,xpos,ypos,status)
	double xpix
	double ypix
	double xrefval
	double yrefval
	double xrefpix
	double yrefpix
	double xinc
	double yinc
	double rot
	char * coordtype
	double &xpos = NO_INIT
	double &ypos = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_pix_to_world = 1
	OUTPUT:
		xpos
		ypos
		status

int
ffg2db(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	byte nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	byte * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_byt = 1
		fitsfilePtr::read_2d_byt = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TBYTE));
			RETVAL=ffg2db(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(byte*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TBYTE);
			RETVAL=ffg2db(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TBYTE,fptr->perlyunpacking);
		}
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2dsb(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	byte nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	signed char* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_sbyt = 1
		fitsfilePtr::read_2d_sbyt = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TSBYTE));
			RETVAL=ffg2dsb(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(signed char*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TSBYTE);
			RETVAL=ffg2dsb(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TSBYTE,fptr->perlyunpacking);
		}
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2dui(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned short nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_usht = 1
		fitsfilePtr::read_2d_usht = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TUSHORT));
			RETVAL=ffg2dui(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned short*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TUSHORT);
			RETVAL=ffg2dui(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TUSHORT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2di(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	short nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_sht = 1
		fitsfilePtr::read_2d_sht = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TSHORT));
			RETVAL=ffg2di(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(short*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TSHORT);
			RETVAL=ffg2di(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TSHORT,fptr->perlyunpacking);
		}
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2duk(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned int nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_uint = 1
		fitsfilePtr::read_2d_uint = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TUINT));
			RETVAL=ffg2duk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned int*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TUINT);
			RETVAL=ffg2duk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TUINT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2dk(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	int nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_int = 1
		fitsfilePtr::read_2d_int = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TINT));
			RETVAL=ffg2dk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(int*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TINT);
			RETVAL=ffg2dk(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TINT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2duj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned long nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_ulng = 1
		fitsfilePtr::read_2d_ulng = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TULONG));
			RETVAL=ffg2duj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(unsigned long*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TULONG);
			RETVAL=ffg2duj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TULONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2dj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	long nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_lng = 1
		fitsfilePtr::read_2d_lng = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TLONG));
			RETVAL=ffg2dj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(long*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TLONG);
			RETVAL=ffg2dj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TLONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2djj(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	long nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_lnglng = 1
		fitsfilePtr::read_2d_lnglng = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TLONGLONG));
			RETVAL=ffg2djj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(LONGLONG*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TLONGLONG);
			RETVAL=ffg2djj(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TLONGLONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2de(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	float nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_flt = 1
		fitsfilePtr::read_2d_flt = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TFLOAT));
			RETVAL=ffg2de(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(float*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TFLOAT);
			RETVAL=ffg2de(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TFLOAT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg2dd(fptr,group,nulval,dim1,naxis1,naxis2,array,anynul,status)
	FitsFile * fptr
	long group
	double nulval
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_2d_dbl = 1
		fitsfilePtr::read_2d_dbl = 2
	PREINIT:
		LONGLONG dims[2];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),naxis2*dim1*sizeof_datatype(TDOUBLE));
			RETVAL=ffg2dd(fptr->fptr,group,nulval,dim1,naxis1,naxis2,(double*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis2; dims[1] = dim1;
			array = get_mortalspace(naxis2*dim1,TDOUBLE);
			RETVAL=ffg2dd(fptr->fptr,group,nulval,dim1,naxis1,naxis2,array,&anynul,&status);
			unpack2D(ST(6),array,dims,TDOUBLE,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3db(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	byte nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	byte * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_byt = 1
		fitsfilePtr::read_3d_byt = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TBYTE));
			RETVAL=ffg3db(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(byte*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TBYTE);
			RETVAL=ffg3db(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TBYTE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3dsb(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	signed char nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	signed char* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_sbyt = 1
		fitsfilePtr::read_3d_sbyt = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TSBYTE));
			RETVAL=ffg3dsb(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(signed char*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TSBYTE);
			RETVAL=ffg3dsb(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TSBYTE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3dui(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned short nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_usht = 1
		fitsfilePtr::read_3d_usht = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TUSHORT));
			RETVAL=ffg3dui(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned short*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TUSHORT);
			RETVAL=ffg3dui(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TUSHORT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3di(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	short nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_sht = 1
		fitsfilePtr::read_3d_sht = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TSHORT));
			RETVAL=ffg3di(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(short*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TSHORT);
			RETVAL=ffg3di(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TSHORT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3duk(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned int nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_uint = 1
		fitsfilePtr::read_3d_uint = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TUINT));
			RETVAL=ffg3duk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned int*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TUINT);
			RETVAL=ffg3duk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TUINT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3dk(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	int nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_int = 1
		fitsfilePtr::read_3d_int = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TINT));
			RETVAL=ffg3dk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(int*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TINT);
			RETVAL=ffg3dk(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TINT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3duj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	unsigned long nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_ulng = 1
		fitsfilePtr::read_3d_ulng = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TULONG));
			RETVAL=ffg3duj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(unsigned long*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TULONG);
			RETVAL=ffg3duj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TULONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3dj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	long nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_lng = 1
		fitsfilePtr::read_3d_lng = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TLONG));
			RETVAL=ffg3dj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(long*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TLONG);
			RETVAL=ffg3dj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TLONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3djj(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	LONGLONG* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_lnglng = 1
		fitsfilePtr::read_3d_lnglng = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TLONGLONG));
			RETVAL=ffg3djj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(LONGLONG*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TLONGLONG);
			RETVAL=ffg3djj(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TLONGLONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3de(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	float nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_flt = 1
		fitsfilePtr::read_3d_flt = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TFLOAT));
			RETVAL=ffg3de(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(float*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TFLOAT);
			RETVAL=ffg3de(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TFLOAT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffg3dd(fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,anynul,status)
	FitsFile * fptr
	long group
	double nulval
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_3d_dbl = 1
		fitsfilePtr::read_3d_dbl = 2
	PREINIT:
		LONGLONG dims[3];
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),naxis3*dim2*dim1*sizeof_datatype(TDOUBLE));
			RETVAL=ffg3dd(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,(double*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			dims[0]=naxis3; dims[1] = dim2; dims[2] = dim1;
			array = get_mortalspace(dim1*dim2*naxis3,TDOUBLE);
			RETVAL=ffg3dd(fptr->fptr,group,nulval,dim1,dim2,naxis1,naxis2,naxis3,array,&anynul,&status);
			unpack3D(ST(8),array,dims,TDOUBLE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcdw(fptr, colnum, dispwidth, status)
	fitsfile *fptr
	int colnum
	int &dispwidth = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_col_display_width = 1
		fitsfilePtr::get_col_display_width = 2
	OUTPUT:
		dispwidth
		status

int
ffghtb(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status)
	FitsFile * fptr
	long rowlen = NO_INIT
	long nrows = NO_INIT
	int tfields = NO_INIT
	char ** ttype = NO_INIT
	long * tbcol = NO_INIT
	char ** tform = NO_INIT
	char ** tunit = NO_INIT
	char * extname = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_atblhdr = 1
		fitsfilePtr::read_atblhdr = 2
	PREINIT:
		int i;
	CODE:
		ffghtb(fptr->fptr,0,&rowlen,&nrows,&tfields,NULL,NULL,NULL,NULL,NULL,&status);

		tbcol = (ST(5)!=&PL_sv_undef) ? get_mortalspace(tfields,TLONG) : NULL;
		extname = (ST(8)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		if (ST(4)!=&PL_sv_undef) {
			ttype = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				ttype[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else ttype = NULL;
		if (ST(6)!=&PL_sv_undef) {
			tform = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tform[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tform = NULL;
		if (ST(7)!=&PL_sv_undef) {
			tunit = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tunit[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tunit = NULL;

		RETVAL=ffghtb(fptr->fptr,tfields,&rowlen,&nrows,&tfields,ttype,tbcol,tform,tunit,extname,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),rowlen);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),nrows);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),tfields);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),ttype,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tbcol,tfields,TLONG,fptr->perlyunpacking);
		if (ST(6)!=&PL_sv_undef) unpack1D(ST(6),tform,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(7)!=&PL_sv_undef) unpack1D(ST(7),tunit,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(8)!=&PL_sv_undef) sv_setpv(ST(8),extname);
	OUTPUT:
		status
		RETVAL

int
ffghtbll(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status)
	FitsFile * fptr
	LONGLONG rowlen = NO_INIT
	LONGLONG nrows = NO_INIT
	int tfields = NO_INIT
	char ** ttype = NO_INIT
	LONGLONG * tbcol = NO_INIT
	char ** tform = NO_INIT
	char ** tunit = NO_INIT
	char * extname = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_atblhdrll = 1
		fitsfilePtr::read_atblhdrll = 2
	PREINIT:
		int i;
	CODE:
		ffghtbll(fptr->fptr,0,&rowlen,&nrows,&tfields,NULL,NULL,NULL,NULL,NULL,&status);

		tbcol = (ST(5)!=&PL_sv_undef) ? get_mortalspace(tfields,TLONGLONG) : NULL;
		extname = (ST(8)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		if (ST(4)!=&PL_sv_undef) {
			ttype = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				ttype[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else ttype = NULL;
		if (ST(6)!=&PL_sv_undef) {
			tform = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tform[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tform = NULL;
		if (ST(7)!=&PL_sv_undef) {
			tunit = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tunit[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tunit = NULL;

		RETVAL=ffghtbll(fptr->fptr,tfields,&rowlen,&nrows,&tfields,ttype,tbcol,tform,tunit,extname,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),rowlen);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),nrows);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),tfields);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),ttype,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tbcol,tfields,TLONGLONG,fptr->perlyunpacking);
		if (ST(6)!=&PL_sv_undef) unpack1D(ST(6),tform,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(7)!=&PL_sv_undef) unpack1D(ST(7),tunit,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(8)!=&PL_sv_undef) sv_setpv(ST(8),extname);
	OUTPUT:
		status
		RETVAL

int
ffghbn(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status)
	FitsFile * fptr
	long nrows = NO_INIT
	int tfields = NO_INIT
	char ** ttype = NO_INIT
	char ** tform = NO_INIT
	char ** tunit = NO_INIT
	char * extname = NO_INIT
	long pcount = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_btblhdr = 1
		fitsfilePtr::read_btblhdr = 2
	PREINIT:
		int i;
	CODE:
		ffghbn(fptr->fptr,0,&nrows,&tfields,NULL,NULL,NULL,NULL,&pcount,&status);
		extname = (ST(7)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		if (ST(4) != &PL_sv_undef) {
			ttype = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				ttype[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else ttype = NULL;
		if (ST(5) != &PL_sv_undef) {
			tform = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tform[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tform = NULL;
		if (ST(6) != &PL_sv_undef) {
			tunit = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tunit[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tunit = NULL;
		RETVAL=ffghbn(fptr->fptr,tfields,&nrows,&tfields,ttype,tform,tunit,extname,&pcount,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),nrows);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),tfields);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),ttype,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),tform,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tunit,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(6)!=&PL_sv_undef) sv_setpv(ST(6),extname);
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),pcount);
	OUTPUT:
		status
		RETVAL

int
ffghbnll(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status)
	FitsFile * fptr
	LONGLONG nrows = NO_INIT
	int tfields = NO_INIT
	char ** ttype = NO_INIT
	char ** tform = NO_INIT
	char ** tunit = NO_INIT
	char * extname = NO_INIT
	LONGLONG pcount = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_btblhdrll = 1
		fitsfilePtr::read_btblhdrll = 2
	PREINIT:
		int i;
	CODE:
		ffghbnll(fptr->fptr,0,&nrows,&tfields,NULL,NULL,NULL,NULL,&pcount,&status);
		extname = (ST(7)!=&PL_sv_undef) ? get_mortalspace(FLEN_VALUE,TBYTE) : NULL;
		if (ST(4) != &PL_sv_undef) {
			ttype = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				ttype[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else ttype = NULL;
		if (ST(5) != &PL_sv_undef) {
			tform = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tform[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tform = NULL;
		if (ST(6) != &PL_sv_undef) {
			tunit = get_mortalspace(tfields,TSTRING);
			for (i=0; i<tfields; i++)
				tunit[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		} else tunit = NULL;
		RETVAL=ffghbnll(fptr->fptr,tfields,&nrows,&tfields,ttype,tform,tunit,extname,&pcount,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),nrows);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),tfields);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),ttype,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),tform,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),tunit,tfields,TSTRING,fptr->perlyunpacking);
		if (ST(6)!=&PL_sv_undef) sv_setpv(ST(6),extname);
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),pcount);
	OUTPUT:
		status
		RETVAL

int
ffgcrd(fptr,keyname,card,status)
	fitsfile * fptr
	char * keyname
	char * card = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_card = 1
		fitsfilePtr::read_card = 2
	CODE:
		card = get_mortalspace(FLEN_CARD,TBYTE);
		RETVAL=ffgcrd(fptr,keyname,card,&status);
	OUTPUT:
		card
		status
		RETVAL

int
ffgcv(fptr,datatype,colnum,firstrow,firstelem,nelements,nulval,array,anynul,status)
	FitsFile * fptr
	int datatype
	int colnum
	LONGLONG firstrow
	LONGLONG firstelem
	LONGLONG nelements
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col = 1
		fitsfilePtr::read_col = 2
	PREINIT:
		long col_width;
		LONGLONG i;
		int storage_datatype;
	CODE:
		storage_datatype = datatype;
		if (datatype == TBIT)
			storage_datatype = TLOGICAL;
		if (!PERLYUNPACKING(fptr->perlyunpacking) && datatype != TSTRING) {
			SvGROW(ST(7),nelements*sizeof_datatype(storage_datatype));
			RETVAL=ffgcv(fptr->fptr,datatype,colnum,firstrow,firstelem,nelements,pack1D(nulval,storage_datatype),(void*)SvPV(ST(7),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelements,storage_datatype);
			if (datatype == TSTRING) {
				col_width = column_width(fptr->fptr,colnum);
				for (i=0;i<nelements;i++)
					*((char**)array+i)=get_mortalspace(col_width+1,TBYTE);
			}
			RETVAL=ffgcv(fptr->fptr,datatype,colnum,firstrow,firstelem,nelements,pack1D(nulval,storage_datatype),array,&anynul,&status);
			unpack1D(ST(7),array,nelements,storage_datatype,fptr->perlyunpacking);
		}
		if (ST(8) != &PL_sv_undef) sv_setiv(ST(8),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcx(fptr,colnum,frow,fbit,nbit,larray,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG fbit
	LONGLONG nbit
	logical * larray = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_bit = 1
		fitsfilePtr::read_col_bit = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nbit*sizeof_datatype(TLOGICAL));
			RETVAL = ffgcx(fptr->fptr,colnum,frow,fbit,nbit,(logical*)SvPV(ST(5),PL_na),&status);
		}
		else {
			larray = get_mortalspace(nbit,TLOGICAL);
			RETVAL=ffgcx(fptr->fptr,colnum,frow,fbit,nbit,larray,&status);
			unpack1D(ST(5),larray,nbit,TLOGICAL,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffgcxui(fptr,colnum,frow,nrows,fbit,nbits,array,status)
	FitsFile *fptr
	int colnum
	LONGLONG frow
	LONGLONG nrows
	long fbit
	int nbits
	unsigned short *array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_bit_usht = 1
		fitsfilePtr::read_col_bit_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nrows*sizeof_datatype(TUSHORT));
			RETVAL = ffgcxui(fptr->fptr,colnum,frow,nrows,fbit,nbits,(unsigned short*)SvPV(ST(6),PL_na),&status);
		}
		else {
			array = get_mortalspace(nrows,TUSHORT);
			RETVAL = ffgcxui(fptr->fptr,colnum,frow,nrows,fbit,nbits,array,&status);
			unpack1D(ST(6),array,nrows,TUSHORT,fptr->perlyunpacking);
		}
	OUTPUT:
		RETVAL
		status

int
ffgcxuk(fptr,colnum,frow,nrows,fbit,nbits,array,status)
	FitsFile *fptr
	int colnum
	LONGLONG frow
	LONGLONG nrows
	long fbit
	int nbits
	unsigned int *array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_bit_uint = 1
		fitsfilePtr::read_col_bit_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nrows*sizeof_datatype(TUINT));
			RETVAL = ffgcxuk(fptr->fptr,colnum,frow,nrows,fbit,nbits,(unsigned int*)SvPV(ST(6),PL_na),&status);
		}
		else {
			array = get_mortalspace(nrows,TUINT);
			RETVAL = ffgcxuk(fptr->fptr,colnum,frow,nrows,fbit,nbits,array,&status);
			unpack1D(ST(6),array,nrows,TUINT,fptr->perlyunpacking);
		}
	OUTPUT:
		RETVAL
		status

int
ffgcvs(fptr,colnum,firstrow,firstelem,nelements,nulstr,array,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG firstrow
	LONGLONG firstelem
	LONGLONG nelements
	char * nulstr
	char ** array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_str = 1
		fitsfilePtr::read_col_str = 2
	PREINIT:
		LONGLONG i;
		long col_size;
	CODE:
		col_size = column_width(fptr->fptr,colnum);
		array = get_mortalspace(nelements,TSTRING);
		for (i=0;i<nelements;i++)
			array[i] = get_mortalspace(col_size+1,TBYTE);
		RETVAL=ffgcvs(fptr->fptr,colnum,firstrow,firstelem,nelements,nulstr,array,&anynul,&status);
		unpack1D(ST(6),array,nelements,TSTRING,fptr->perlyunpacking);
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvl(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	logical nulval
	logical * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_log = 1
		fitsfilePtr::read_col_log = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
			RETVAL=ffgcvl(fptr->fptr,cnum,frow,felem,nelem,nulval,(logical*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcvl(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvb(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	byte nulval
	byte * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_byt = 1
		fitsfilePtr::read_col_byt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TBYTE));
			RETVAL=ffgcvb(fptr->fptr,cnum,frow,felem,nelem,nulval,(byte*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TBYTE);
			RETVAL=ffgcvb(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TBYTE,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvsb(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	signed char nulval
	signed char* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_sbyt = 1
		fitsfilePtr::read_col_sbyt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TSBYTE));
			RETVAL=ffgcvsb(fptr->fptr,cnum,frow,felem,nelem,nulval,(signed char*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSBYTE);
			RETVAL=ffgcvsb(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TSBYTE,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvui(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned short nulval
	unsigned short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_usht = 1
		fitsfilePtr::read_col_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TUSHORT));
			RETVAL=ffgcvui(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned short*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUSHORT);
			RETVAL=ffgcvui(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TUSHORT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvi(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	short nulval
	short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_sht = 1
		fitsfilePtr::read_col_sht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TSHORT));
			RETVAL=ffgcvi(fptr->fptr,cnum,frow,felem,nelem,nulval,(short*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSHORT);
			RETVAL=ffgcvi(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TSHORT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvuk(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned int nulval
	unsigned int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_uint = 1
		fitsfilePtr::read_col_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TUINT));
			RETVAL=ffgcvuk(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned int*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUINT);
			RETVAL=ffgcvuk(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TUINT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvk(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	int nulval
	int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_int = 1
		fitsfilePtr::read_col_int = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TINT));
			RETVAL=ffgcvk(fptr->fptr,cnum,frow,felem,nelem,nulval,(int*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TINT);
			RETVAL=ffgcvk(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TINT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvuj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned long nulval
	unsigned long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_ulng = 1
		fitsfilePtr::read_col_ulng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TULONG));
			RETVAL=ffgcvuj(fptr->fptr,cnum,frow,felem,nelem,nulval,(unsigned long*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TULONG);
			RETVAL=ffgcvuj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TULONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	long nulval
	long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_lng = 1
		fitsfilePtr::read_col_lng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TLONG));
			RETVAL=ffgcvj(fptr->fptr,cnum,frow,felem,nelem,nulval,(long*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONG);
			RETVAL=ffgcvj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TLONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvjj(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	LONGLONG nulval
	LONGLONG* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_lnglng = 1
		fitsfilePtr::read_col_lnglng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TLONGLONG));
			RETVAL=ffgcvjj(fptr->fptr,cnum,frow,felem,nelem,nulval,(LONGLONG*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONGLONG);
			RETVAL=ffgcvjj(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TLONGLONG,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcve(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float nulval
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_flt = 1
		fitsfilePtr::read_col_flt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TFLOAT));
			RETVAL=ffgcve(fptr->fptr,cnum,frow,felem,nelem,nulval,(float*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TFLOAT);
			RETVAL=ffgcve(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TFLOAT,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvd(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double nulval
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_dbl = 1
		fitsfilePtr::read_col_dbl = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TDOUBLE));
			RETVAL=ffgcvd(fptr->fptr,cnum,frow,felem,nelem,nulval,(double*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDOUBLE);
			RETVAL=ffgcvd(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TDOUBLE,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvc(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float nulval
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_cmp = 1
		fitsfilePtr::read_col_cmp = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TCOMPLEX));
			RETVAL=ffgcvc(fptr->fptr,cnum,frow,felem,nelem,nulval,(float*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TCOMPLEX);
			RETVAL=ffgcvc(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TCOMPLEX,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcvm(fptr,cnum,frow,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double nulval
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_col_dblcmp = 1
		fitsfilePtr::read_col_dblcmp = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),nelem*sizeof_datatype(TDBLCOMPLEX));
			RETVAL=ffgcvm(fptr->fptr,cnum,frow,felem,nelem,nulval,(double*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDBLCOMPLEX);
			RETVAL=ffgcvm(fptr->fptr,cnum,frow,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(6),array,nelem,TDBLCOMPLEX,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcf(fptr,datatype,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int datatype
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	void * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull = 1
		fitsfilePtr::read_colnull = 2
	PREINIT:
		int storage_datatype;
	CODE:
		storage_datatype = datatype;
		if (datatype == TBIT)
			storage_datatype = TLOGICAL;
		if (!PERLYUNPACKING(fptr->perlyunpacking) && datatype != TSTRING) {
			if (ST(6)!=&PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(storage_datatype));
				array = (void*)SvPV(ST(6),PL_na);
			}
			else
				array = get_mortalspace(nelem,storage_datatype);
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(7),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcf(fptr->fptr,datatype,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,storage_datatype);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcf(fptr->fptr,datatype,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(6)!=&PL_sv_undef)
				unpack1D(ST(6),array,nelem,storage_datatype,fptr->perlyunpacking);
			if (ST(7)!=&PL_sv_undef)
				unpack1D(ST(7),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(8)!=&PL_sv_undef)
			sv_setiv(ST(8),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfs(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	char ** array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_str = 1
		fitsfilePtr::read_colnull_str = 2
	PREINIT:
		long col_size;
		LONGLONG i;
	CODE:
		col_size = column_width(fptr->fptr,colnum);
		array = get_mortalspace(nelem,TSTRING);
		for (i=0;i<nelem;i++)
			array[i] = get_mortalspace(col_size+1,TBYTE);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);

			RETVAL=ffgcfs(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfs(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSTRING,fptr->perlyunpacking);
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfl(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	logical * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_log = 1
		fitsfilePtr::read_colnull_log = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				array = (logical*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TLOGICAL);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfl(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLOGICAL);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfl(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLOGICAL,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfb(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	byte * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_byt = 1
		fitsfilePtr::read_colnull_byt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TBYTE));
				array = (byte*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TBYTE);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TBYTE);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TBYTE,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfsb(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	signed char* array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_sbyt = 1
		fitsfilePtr::read_colnull_sbyt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TSBYTE));
				array = (signed char*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TSBYTE);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfsb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSBYTE);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfsb(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSBYTE,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfui(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned short * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_usht = 1
		fitsfilePtr::read_colnull_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TUSHORT));
				array = (unsigned short*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TUSHORT);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfui(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUSHORT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfui(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TUSHORT,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfi(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	short * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_sht = 1
		fitsfilePtr::read_colnull_sht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TSHORT));
				array = (short*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TSHORT);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfi(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSHORT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfi(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TSHORT,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfk(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	int * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_int = 1
		fitsfilePtr::read_colnull_int = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TINT));
				array = (int*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TINT);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TINT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TINT,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfuk(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned int * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_uint = 1
		fitsfilePtr::read_colnull_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TUINT));
				array = (unsigned int*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TUINT);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfuk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUINT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfuk(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TUINT,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	long * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_lng = 1
		fitsfilePtr::read_colnull_lng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLONG));
				array = (long*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TLONG);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLONG,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfjj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	LONGLONG* array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_lnglng = 1
		fitsfilePtr::read_colnull_lnglng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLONGLONG));
				array = (LONGLONG*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TLONGLONG);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfjj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONGLONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfjj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TLONGLONG,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfuj(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned long * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_ulng = 1
		fitsfilePtr::read_colnull_ulng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TULONG));
				array = (unsigned long*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TULONG);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfuj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TULONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfuj(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TULONG,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfe(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_flt = 1
		fitsfilePtr::read_colnull_flt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TFLOAT));
				array = (float*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TFLOAT);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfe(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TFLOAT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfe(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TFLOAT,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfd(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_dbl = 1
		fitsfilePtr::read_colnull_dbl = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TDOUBLE));
				array = (double*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TDOUBLE);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfd(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDOUBLE);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfd(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TDOUBLE,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfc(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_cmp = 1
		fitsfilePtr::read_colnull_cmp = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TCOMPLEX));
				array = (float*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TCOMPLEX);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfc(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TCOMPLEX);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfc(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TCOMPLEX,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgcfm(fptr,colnum,frow,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_colnull_dblcmp = 1
		fitsfilePtr::read_colnull_dblcmp = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TDBLCOMPLEX));
				array = (double*)SvPV(ST(5),PL_na);
			}
			else
				array = get_mortalspace(nelem,TDBLCOMPLEX);
			if (ST(6) != &PL_sv_undef) {
				SvGROW(ST(6),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(6),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfm(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDBLCOMPLEX);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgcfm(fptr->fptr,colnum,frow,felem,nelem,array,nularray,&anynul,&status);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),array,nelem,TDBLCOMPLEX,fptr->perlyunpacking);
			if (ST(6) != &PL_sv_undef) unpack1D(ST(6),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef) sv_setiv(ST(7),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgdes(fptr,colnum,rownum,repeat,offset,status)
	fitsfile * fptr
	int colnum
	LONGLONG rownum
	long repeat = NO_INIT
	long offset = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_descript = 1
		fitsfilePtr::read_descript = 2
	CODE:
		RETVAL = ffgdes(fptr,colnum,rownum,&repeat,&offset,&status);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),offset);
	OUTPUT:
		status
		RETVAL

int
ffgdesll(fptr,colnum,rownum,repeat,offset,status)
	fitsfile * fptr
	int colnum
	LONGLONG rownum
	LONGLONG repeat = NO_INIT
	LONGLONG offset = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_descriptll = 1
		fitsfilePtr::read_descriptll = 2
	CODE:
		RETVAL = ffgdesll(fptr,colnum,rownum,&repeat,&offset,&status);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),repeat);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),offset);
	OUTPUT:
		status
		RETVAL

int
ffgdess(fptr,colnum,frow,nrows,repeat,offset,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG nrows
	long * repeat = NO_INIT
	long * offset = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_descripts = 1
		fitsfilePtr::read_descripts = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nrows*sizeof_datatype(TLONG));
				repeat = (long*)SvPV(ST(4),PL_na);
			}
			else
				repeat = get_mortalspace(nrows,TLONG);

			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nrows*sizeof_datatype(TLONG));
				offset = (long*)SvPV(ST(5),PL_na);
			}
			else
				offset = get_mortalspace(nrows,TLONG);
			RETVAL=ffgdess(fptr->fptr,colnum,frow,nrows,repeat,offset,&status);
		}
		else {
			repeat = get_mortalspace(nrows,TLONG);
			offset = get_mortalspace(nrows,TLONG);
			RETVAL=ffgdess(fptr->fptr,colnum,frow,nrows,repeat,offset,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),repeat,nrows,TLONG,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),offset,nrows,TLONG,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffgdessll(fptr,colnum,frow,nrows,repeat,offset,status)
	FitsFile * fptr
	int colnum
	LONGLONG frow
	LONGLONG nrows
	LONGLONG* repeat = NO_INIT
	LONGLONG* offset = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_descriptsll = 1
		fitsfilePtr::read_descriptsll = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nrows*sizeof_datatype(TLONGLONG));
				repeat = (LONGLONG*)SvPV(ST(4),PL_na);
			}
			else
				repeat = get_mortalspace(nrows,TLONGLONG);

			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nrows*sizeof_datatype(TLONGLONG));
				offset = (LONGLONG*)SvPV(ST(5),PL_na);
			}
			else
				offset = get_mortalspace(nrows,TLONGLONG);
			RETVAL=ffgdessll(fptr->fptr,colnum,frow,nrows,repeat,offset,&status);
		}
		else {
			repeat = get_mortalspace(nrows,TLONGLONG);
			offset = get_mortalspace(nrows,TLONGLONG);
			RETVAL=ffgdessll(fptr->fptr,colnum,frow,nrows,repeat,offset,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),repeat,nrows,TLONGLONG,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),offset,nrows,TLONGLONG,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffgmsg(err_msg)
	char * err_msg = NO_INIT
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_errmsg = 1
	CODE:
		err_msg = get_mortalspace(FLEN_ERRMSG,TBYTE);
		RETVAL = fits_read_errmsg(err_msg);
	OUTPUT:
		err_msg
		RETVAL

int
ffggpb(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	byte * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_byt = 1
		fitsfilePtr::read_grppar_byt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TBYTE));
			RETVAL=ffggpb(fptr->fptr,group,felem,nelem,(byte*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TBYTE);
			RETVAL=ffggpb(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpsb(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	signed char* array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_sbyt = 1
		fitsfilePtr::read_grppar_sbyt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TSBYTE));
			RETVAL=ffggpsb(fptr->fptr,group,felem,nelem,(signed char*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TSBYTE);
			RETVAL=ffggpsb(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TSBYTE,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpi(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	short * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_sht = 1
		fitsfilePtr::read_grppar_sht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TSHORT));
			RETVAL=ffggpi(fptr->fptr,group,felem,nelem,(short*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TSHORT);
			RETVAL=ffggpi(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TSHORT,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpui(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	unsigned short * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_usht = 1
		fitsfilePtr::read_grppar_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TUSHORT));
			RETVAL=ffggpui(fptr->fptr,group,felem,nelem,(unsigned short*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TUSHORT);
			RETVAL=ffggpui(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TUSHORT,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpk(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	int * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_int = 1
		fitsfilePtr::read_grppar_int = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TINT));
			RETVAL=ffggpk(fptr->fptr,group,felem,nelem,(int*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TINT);
			RETVAL=ffggpk(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TINT,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpuk(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	unsigned int * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_uint = 1
		fitsfilePtr::read_grppar_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TUINT));
			RETVAL=ffggpuk(fptr->fptr,group,felem,nelem,(unsigned int*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TUINT);
			RETVAL=ffggpuk(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TUINT,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpj(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	long * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_lng = 1
		fitsfilePtr::read_grppar_lng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TLONG));
			RETVAL=ffggpj(fptr->fptr,group,felem,nelem,(long*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TLONG);
			RETVAL=ffggpj(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TLONG,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpjj(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	LONGLONG* array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_lnglng = 1
		fitsfilePtr::read_grppar_lnglng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TLONGLONG));
			RETVAL=ffggpjj(fptr->fptr,group,felem,nelem,(LONGLONG*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TLONGLONG);
			RETVAL=ffggpjj(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TLONGLONG,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpuj(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	unsigned long * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_ulng = 1
		fitsfilePtr::read_grppar_ulng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TULONG));
			RETVAL=ffggpuj(fptr->fptr,group,felem,nelem,(unsigned long*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TULONG);
			RETVAL=ffggpuj(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TULONG,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpe(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	float * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_flt = 1
		fitsfilePtr::read_grppar_flt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TFLOAT));
			RETVAL=ffggpe(fptr->fptr,group,felem,nelem,(float*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TFLOAT);
			RETVAL=ffggpe(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TFLOAT,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffggpd(fptr,group,felem,nelem,array,status)
	FitsFile * fptr
	long group
	long felem
	long nelem
	double * array = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_grppar_dbl = 1
		fitsfilePtr::read_grppar_dbl = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nelem*sizeof_datatype(TDOUBLE));
			RETVAL=ffggpd(fptr->fptr,group,felem,nelem,(double*)SvPV(ST(4),PL_na),&status);
		}
		else {
			array = get_mortalspace(nelem,TDOUBLE);
			RETVAL=ffggpd(fptr->fptr,group,felem,nelem,array,&status);
			unpack1D(ST(4),array,nelem,TDOUBLE,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffgpv(fptr,datatype,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	int datatype
	LONGLONG felem
	LONGLONG nelem
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img = 1
		fitsfilePtr::read_img = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(datatype));
			RETVAL=ffgpv(fptr->fptr,datatype,felem,nelem,pack1D(nulval,datatype),(void*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,datatype);
			RETVAL=ffgpv(fptr->fptr,datatype,felem,nelem,pack1D(nulval,datatype),array,&anynul,&status);
			unpack1D(ST(5),array,nelem,datatype,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgics(fptr,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status)
	fitsfile * fptr
	double xrefval = NO_INIT
	double yrefval = NO_INIT
	double xrefpix = NO_INIT
	double yrefpix = NO_INIT
	double xinc = NO_INIT
	double yinc = NO_INIT
	double rot = NO_INIT
	char * coordtype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_coord = 1
		fitsfilePtr::read_img_coord = 2
	CODE:
		coordtype = get_mortalspace(FLEN_VALUE,TBYTE);
		RETVAL=ffgics(fptr,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status);
		if (ST(1) != &PL_sv_undef) sv_setnv(ST(1),xrefval);
		if (ST(2) != &PL_sv_undef) sv_setnv(ST(2),yrefval);
		if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),xrefpix);
		if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),yrefpix);
		if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),xinc);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),yinc);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),rot);
	OUTPUT:
		coordtype
		status
		RETVAL

int
ffgicsa(fptr,version,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status)
	fitsfile * fptr
	char version
	double xrefval = NO_INIT
	double yrefval = NO_INIT
	double xrefpix = NO_INIT
	double yrefpix = NO_INIT
	double xinc = NO_INIT
	double yinc = NO_INIT
	double rot = NO_INIT
	char * coordtype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_coord_version = 1
		fitsfilePtr::read_img_coord_version = 2
	CODE:
		coordtype = get_mortalspace(FLEN_VALUE,TBYTE);
		RETVAL=ffgics(fptr,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status);
		if (ST(2) != &PL_sv_undef) sv_setnv(ST(2),xrefval);
		if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),yrefval);
		if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),xrefpix);
		if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),yrefpix);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),xinc);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),yinc);
		if (ST(8) != &PL_sv_undef) sv_setnv(ST(8),rot);
	OUTPUT:
		coordtype
		status
		RETVAL

int
ffgpvb(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	byte nulval
	byte * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_byt = 1
		fitsfilePtr::read_img_byt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TBYTE));
			RETVAL=ffgpvb(fptr->fptr,group,felem,nelem,nulval,(byte*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TBYTE);
			RETVAL=ffgpvb(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TBYTE,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvsb(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	signed char nulval
	signed char* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_sbyt = 1
		fitsfilePtr::read_img_sbyt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TSBYTE));
			RETVAL=ffgpvsb(fptr->fptr,group,felem,nelem,nulval,(signed char*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSBYTE);
			RETVAL=ffgpvsb(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TSBYTE,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvi(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	short nulval
	short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_sht = 1
		fitsfilePtr::read_img_sht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TSHORT));
			RETVAL=ffgpvi(fptr->fptr,group,felem,nelem,nulval,(short*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSHORT);
			RETVAL=ffgpvi(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TSHORT,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvui(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned short nulval
	unsigned short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_usht = 1
		fitsfilePtr::read_img_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TUSHORT));
			RETVAL=ffgpvui(fptr->fptr,group,felem,nelem,nulval,(unsigned short*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUSHORT);
			RETVAL=ffgpvui(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TUSHORT,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvk(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	int nulval
	int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_int = 1
		fitsfilePtr::read_img_int = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TINT));
			RETVAL=ffgpvk(fptr->fptr,group,felem,nelem,nulval,(int*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TINT);
			RETVAL=ffgpvk(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TINT,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvuk(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned int nulval
	unsigned int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_uint = 1
		fitsfilePtr::read_img_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TUINT));
			RETVAL=ffgpvuk(fptr->fptr,group,felem,nelem,nulval,(unsigned int*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUINT);
			RETVAL=ffgpvuk(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TUINT,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvj(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	long nulval
	long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_lng = 1
		fitsfilePtr::read_img_lng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TLONG));
			RETVAL=ffgpvj(fptr->fptr,group,felem,nelem,nulval,(long*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONG);
			RETVAL=ffgpvj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TLONG,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvjj(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	LONGLONG nulval
	LONGLONG* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_lnglng = 1
		fitsfilePtr::read_img_lnglng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TLONGLONG));
			RETVAL=ffgpvjj(fptr->fptr,group,felem,nelem,nulval,(LONGLONG*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONGLONG);
			RETVAL=ffgpvjj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TLONGLONG,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvuj(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned long nulval
	unsigned long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_ulng = 1
		fitsfilePtr::read_img_ulng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TULONG));
			RETVAL=ffgpvuj(fptr->fptr,group,felem,nelem,nulval,(unsigned long*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TULONG);
			RETVAL=ffgpvuj(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TULONG,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpve(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	float nulval
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_flt = 1
		fitsfilePtr::read_img_flt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TFLOAT));
			RETVAL=ffgpve(fptr->fptr,group,felem,nelem,nulval,(float*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TFLOAT);
			RETVAL=ffgpve(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TFLOAT,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpvd(fptr,group,felem,nelem,nulval,array,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	double nulval
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_img_dbl = 1
		fitsfilePtr::read_img_dbl = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(TDOUBLE));
			RETVAL=ffgpvd(fptr->fptr,group,felem,nelem,nulval,(double*)SvPV(ST(5),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDOUBLE);
			RETVAL=ffgpvd(fptr->fptr,group,felem,nelem,nulval,array,&anynul,&status);
			unpack1D(ST(5),array,nelem,TDOUBLE,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffghpr(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status)
	FitsFile * fptr
	int simple = NO_INIT
	int bitpix = NO_INIT
	int naxis = NO_INIT
	long * naxes = NO_INIT
	long pcount = NO_INIT
	long gcount = NO_INIT
	int extend = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imghdr = 1
		fitsfilePtr::read_imghdr = 2
	CODE:

		if (ST(4)!=&PL_sv_undef) { /* caller wants naxes to be set */
			ffghpr(fptr->fptr,0,NULL,NULL,&naxis,NULL,NULL,NULL,NULL,&status);
			naxes = get_mortalspace(naxis,TLONG);
		} else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffghpr(fptr->fptr,naxis,&simple,&bitpix,&naxis,naxes,&pcount,&gcount,&extend,&status);

		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),simple);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),bitpix);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONG,
						  fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) sv_setiv(ST(5),pcount);
		if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),gcount);
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),extend);
	OUTPUT:
		status
		RETVAL

int
ffghprll(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status)
	FitsFile * fptr
	int simple = NO_INIT
	int bitpix = NO_INIT
	int naxis = NO_INIT
	LONGLONG * naxes = NO_INIT
	long pcount = NO_INIT
	long gcount = NO_INIT
	int extend = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imghdrll = 1
		fitsfilePtr::read_imghdrll = 2
	CODE:

		if (ST(4)!=&PL_sv_undef) { /* caller wants naxes to be set */
			ffghprll(fptr->fptr,0,NULL,NULL,&naxis,NULL,NULL,NULL,NULL,&status);
			naxes = get_mortalspace(naxis,TLONGLONG);
		} else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffghprll(fptr->fptr,naxis,&simple,&bitpix,&naxis,naxes,&pcount,&gcount,&extend,&status);

		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),simple);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),bitpix);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),naxis);
		if (ST(4)!=&PL_sv_undef) unpack1D(ST(4),naxes,naxis,TLONGLONG,
						  fptr->perlyunpacking);
		if (ST(5)!=&PL_sv_undef) sv_setiv(ST(5),pcount);
		if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),gcount);
		if (ST(7)!=&PL_sv_undef) sv_setiv(ST(7),extend);
	OUTPUT:
		status
		RETVAL

int
ffgpf(fptr,datatype,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	int datatype
	LONGLONG felem
	LONGLONG nelem
	void * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull = 1
		fitsfilePtr::read_imgnull = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4)!=&PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(datatype));
				array = (void*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,datatype);
			if (ST(5)!=&PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpf(fptr->fptr,datatype,felem,nelem,array,nularray,&anynul,&status);

		}
		else {
			array = get_mortalspace(nelem,datatype);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpf(fptr->fptr,datatype,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4)!=&PL_sv_undef)
				unpack1D(ST(4),array,nelem,datatype,fptr->perlyunpacking);
			if (ST(5)!=&PL_sv_undef)
				unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6)!=&PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfb(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	byte * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_byt = 1
		fitsfilePtr::read_imgnull_byt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TBYTE));
				array = (byte*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TBYTE);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TBYTE);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfsb(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	signed char* array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_sbyt = 1
		fitsfilePtr::read_imgnull_sbyt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TSBYTE));
				array = (signed char*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TSBYTE);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfsb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSBYTE);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfsb(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TSBYTE,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfi(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	short * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_sht = 1
		fitsfilePtr::read_imgnull_sht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TSHORT));
				array = (short*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TSHORT);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfi(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TSHORT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfi(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TSHORT,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfui(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned short * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_usht = 1
		fitsfilePtr::read_imgnull_usht = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TUSHORT));
				array = (unsigned short*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TUSHORT);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfui(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUSHORT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfui(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TUSHORT,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfk(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	int * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_int = 1
		fitsfilePtr::read_imgnull_int = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TINT));
				array = (int*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TINT);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TINT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TINT,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfuk(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned int * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_uint = 1
		fitsfilePtr::read_imgnull_uint = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TUINT));
				array = (unsigned int*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TUINT);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfuk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TUINT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfuk(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TUINT,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfj(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	long * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_lng = 1
		fitsfilePtr::read_imgnull_lng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TLONG));
				array = (long*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TLONG);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TLONG,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfjj(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	LONGLONG* array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_lnglng = 1
		fitsfilePtr::read_imgnull_lnglng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TLONGLONG));
				array = (LONGLONG*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TLONGLONG);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfjj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TLONGLONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfjj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TLONGLONG,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfuj(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned long * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_ulng = 1
		fitsfilePtr::read_imgnull_ulng = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TULONG));
				array = (unsigned long*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TULONG);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfuj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TULONG);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfuj(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TBYTE,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfe(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	float * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_flt = 1
		fitsfilePtr::read_imgnull_flt = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TFLOAT));
				array = (float*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TFLOAT);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfe(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TFLOAT);
			nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfe(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TFLOAT,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpfd(fptr,group,felem,nelem,array,nularray,anynul,status)
	FitsFile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	double * array = NO_INIT
	logical * nularray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_imgnull_dbl = 1
		fitsfilePtr::read_imgnull_dbl = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(TDOUBLE));
				array = (double*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem,TDOUBLE);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nularray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nularray = get_mortalspace(nelem,TLOGICAL);
			RETVAL=ffgpfd(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
		}
		else {
			array = get_mortalspace(nelem,TDOUBLE);
			nularray = get_mortalspace(nelem,TLOGICAL);
				RETVAL=ffgpfd(fptr->fptr,group,felem,nelem,array,nularray,&anynul,&status);
			if (ST(4) != &PL_sv_undef) unpack1D(ST(4),array,nelem,TDOUBLE,fptr->perlyunpacking);
			if (ST(5) != &PL_sv_undef) unpack1D(ST(5),nularray,nelem,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(6) != &PL_sv_undef) sv_setiv(ST(6),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgstr(fptr, string, card, status)
	fitsfile * fptr
	char * string
	char * card = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_str = 1
		fitsfilePtr::read_str = 2
	OUTPUT:
		card
		status

int
ffgksl(fptr,keyname,length,status)
	fitsfile * fptr
	const char * keyname
	int &length = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_key_strlen = 1
		fitsfilePtr::get_key_strlen = 2
	OUTPUT:
		length
		status

int
ffgsky(fptr,keyname,firstchar,maxchar,value,valuelen,comm,status)
	fitsfile * fptr
	const char * keyname
	int firstchar
	int maxchar
	char * value = NO_INIT
	int valuelen = NO_INIT
	char * comm = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_string_key = 1
		fitsfilePtr::read_key_string = 2
	CODE:
		value = (ST(4) != &PL_sv_undef) ? get_mortalspace(maxchar+1,TBYTE) : NULL;
		comm = (ST(6) != &PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgsky(fptr,keyname,firstchar,maxchar,value,&valuelen,comm,&status);
		if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),valuelen);
	OUTPUT:
		value
		comm
		status

int
ffdstr(fptr, string, status)
	fitsfile * fptr
	char * string
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_delete_str = 1
		fitsfilePtr::delete_str = 2
	OUTPUT:
		status

int
ffgky(fptr,datatype,keyname,value,comment,status)
	fitsfile * fptr
	int datatype
	char * keyname
	void * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key = 1
		fitsfilePtr::read_key = 2
	CODE:
		comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		switch (datatype) {
			case TSTRING:
				value = get_mortalspace(FLEN_VALUE,TBYTE); break;
			case TLOGICAL:
				value = get_mortalspace(1,TINT); break;
			default:
				value = get_mortalspace(1,datatype);
		}
		RETVAL=ffgky(fptr,datatype,keyname,value,comment,&status);
		if (datatype == TLOGICAL)
			datatype = TINT;
		unpackScalar(ST(3),value,datatype);
	OUTPUT:
		comment
		status
		RETVAL

int
ffgkyt(fptr,keyname,intval,frac,comment,status)
	fitsfile * fptr
	char * keyname
	long intval = NO_INIT
	double frac = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_triple = 1
		fitsfilePtr::read_key_triple = 2
	CODE:
		comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyt(fptr,keyname,&intval,&frac,comment,&status);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),intval);
		if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),frac);
	OUTPUT:
		comment
		status
		RETVAL

int
ffgunt(fptr,keyname,unit,status)
	fitsfile * fptr
	char * keyname
	char * unit = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_unit = 1
		fitsfilePtr::read_key_unit = 2
	CODE:
		unit = get_mortalspace(FLEN_VALUE,TBYTE);
		RETVAL=ffgunt(fptr,keyname,unit,&status);
	OUTPUT:
		unit
		status
		RETVAL

int
ffgkls(fptr,keyname,longstr,comment,status)
	fitsfile * fptr
	char * keyname
	char * longstr = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_longstr = 1
		fitsfilePtr::read_key_longstr = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkls(fptr,keyname,&longstr,comment,&status);
		sv_setpv(ST(2),longstr);
		free(longstr);
	OUTPUT:
		comment
		status
		RETVAL

int
fffree(value, status)
	void * value
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_free_memory = 1
		fitsfilePtr::read_free_memory = 2
	OUTPUT:
		status

int
ffgkys(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_str = 1
		fitsfilePtr::read_key_str = 2
	CODE:
		value = get_mortalspace(FLEN_VALUE,TBYTE);
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkys(fptr,keyname,value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkyl(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	int value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_log = 1
		fitsfilePtr::read_key_log = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyl(fptr,keyname,&value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkyj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	long value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_lng = 1
		fitsfilePtr::read_key_lng = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyj(fptr,keyname,&value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkyjj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	LONGLONG value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_lnglng = 1
		fitsfilePtr::read_key_lnglng = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyjj(fptr,keyname,&value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkye(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	float value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_flt = 1
		fitsfilePtr::read_key_flt = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkye(fptr,keyname,&value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkyd(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	double value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_dbl = 1
		fitsfilePtr::read_key_dbl = 2
	CODE:
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyd(fptr,keyname,&value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgkyc(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	float * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_cmp = 1
		fitsfilePtr::read_key_cmp = 2
	CODE:
		value = get_mortalspace(1,TCOMPLEX);
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyc(fptr,keyname,value,comment,&status);
		unpackScalar(ST(2),value,TCOMPLEX);
	OUTPUT:
		status
		comment
		RETVAL

int
ffgkym(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	double * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_key_dblcmp = 1
		fitsfilePtr::read_key_dblcmp = 2
	CODE:
		value = get_mortalspace(1,TDBLCOMPLEX);
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkym(fptr,keyname,value,comment,&status);
		unpackScalar(ST(2),value,TDBLCOMPLEX);
	OUTPUT:
		comment
		status
		RETVAL

int
ffgkyn(fptr,keynum,keyname,value,comment,status)
	fitsfile * fptr
	int keynum
	char * keyname = NO_INIT
	char * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keyn = 1
		fitsfilePtr::read_keyn = 2
	CODE:
		keyname = get_mortalspace(FLEN_KEYWORD,TBYTE);
		value = get_mortalspace(FLEN_VALUE,TBYTE);
		comment=(ST(4)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkyn(fptr,keynum,keyname,value,comment,&status);
	OUTPUT:
		keyname
		value
		comment
		status
		RETVAL

int
ffgkns(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	char ** value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_str = 1
		fitsfilePtr::read_keys_str = 2
	PREINIT:
		int i;
	CODE:
		value=get_mortalspace(nkeys,TSTRING);
		for (i=0; i<nkeys; i++)
			value[i] = get_mortalspace(FLEN_VALUE,TBYTE);
		RETVAL=ffgkns(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TSTRING,fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgknl(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	int * value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_log = 1
		fitsfilePtr::read_keys_log = 2
	CODE:
		value=get_mortalspace(nkeys,TINT);
		RETVAL=ffgknl(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TINT,fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgknj(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	long * value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_lng = 1
		fitsfilePtr::read_keys_lng = 2
	CODE:
		value=get_mortalspace(nkeys,TLONG);
		RETVAL=ffgknj(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TLONG,fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgknjj(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	LONGLONG * value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_lnglng = 1
		fitsfilePtr::read_keys_lnglng = 2
	CODE:
		value=get_mortalspace(nkeys,TLONGLONG);
		RETVAL=ffgknjj(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TLONGLONG, fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgkne(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	float * value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_flt = 1
		fitsfilePtr::read_keys_flt = 2
	CODE:
		value=get_mortalspace(nkeys,TFLOAT);
		RETVAL=ffgkne(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TFLOAT,fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgknd(fptr,keyname,nstart,nkeys,value,nfound,status)
	FitsFile * fptr
	char * keyname
	int nstart
	int nkeys
	double * value = NO_INIT
	int nfound = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keys_dbl = 1
		fitsfilePtr::read_keys_dbl = 2
	CODE:
		value=get_mortalspace(nkeys,TDOUBLE);
		RETVAL=ffgknd(fptr->fptr,keyname,nstart,nkeys,value,&nfound,&status);
		unpack1D(ST(4),value,(nkeys>nfound) ? nfound : nkeys,TDOUBLE,fptr->perlyunpacking);
	OUTPUT:
		nfound
		status
		RETVAL

int
ffgkey(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value = NO_INIT
	char * comment = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_keyword = 1
		fitsfilePtr::read_keyword = 2
	CODE:
		value = get_mortalspace(FLEN_VALUE,TBYTE);
		comment=(ST(3)!=&PL_sv_undef) ? get_mortalspace(FLEN_COMMENT,TBYTE) : NULL;
		RETVAL=ffgkey(fptr,keyname,value,comment,&status);
	OUTPUT:
		value
		comment
		status
		RETVAL

int
ffgrec(fptr,keynum,card,status)
	fitsfile * fptr
	int keynum
	char * card = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_record = 1
		fitsfilePtr::read_record = 2
	CODE:
		card = get_mortalspace(FLEN_CARD,TBYTE);
		RETVAL=ffgrec(fptr,keynum,card,&status);
	OUTPUT:
		card
		status
		RETVAL

int
ffgsv(fptr, dtype, blc, trc, inc, nulval, array, anynul, status)
	FitsFile * fptr
	int dtype
	long * blc
	long * trc
	long * inc
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset = 1
		fitsfilePtr::read_subset = 2
	PREINIT:
		long ndata, *naxes;
		int i, naxis, storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;

		/* get the size of the image */
		RETVAL = ffgidm(fptr->fptr, &naxis, &status);
		naxes = get_mortalspace(naxis, TLONG);
		RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status);

		/* determine the number of pixels to be read */
		ndata = 1;
		for (i=0; i<naxis; i++)
		ndata *= (trc[i]-blc[i]+1)/inc[i] +
			(((trc[i]-blc[i]+1) % inc[i]) ? 1 : 0);

		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(6),ndata*sizeof_datatype(storage_dtype));
			RETVAL=ffgsv(fptr->fptr,dtype,blc,trc,inc,(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL),(void*)SvPV(ST(6),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,storage_dtype);
			RETVAL=ffgsv(fptr->fptr,dtype,blc,trc,inc,(nulval != &PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL),array,&anynul,&status);
			unpack1D(ST(6),array,ndata,storage_dtype,fptr->perlyunpacking);
		}
		if (ST(7) != &PL_sv_undef)
			sv_setiv(ST(7),anynul);
	OUTPUT:
		RETVAL
		status

int
ffgsvb(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	byte nulval
	byte * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_byt = 1
		fitsfilePtr::read_subset_byt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TBYTE));
			RETVAL=ffgsvb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(byte*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TBYTE);
			RETVAL=ffgsvb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TBYTE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvsb(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	signed char nulval
	signed char* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_sbyt = 1
		fitsfilePtr::read_subset_sbyt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TSBYTE));
			RETVAL=ffgsvsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(signed char*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TSBYTE);
			RETVAL=ffgsvsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TSBYTE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvi(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	short nulval
	short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_sht = 1
		fitsfilePtr::read_subset_sht = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TSHORT));
			RETVAL=ffgsvi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(short*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TSHORT);
			RETVAL=ffgsvi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TSHORT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvui(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned short nulval
	unsigned short * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_usht = 1
		fitsfilePtr::read_subset_usht = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TUSHORT));
			RETVAL=ffgsvui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned short*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TUSHORT);
			RETVAL=ffgsvui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TUSHORT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvk(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	int nulval
	int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_int = 1
		fitsfilePtr::read_subset_int = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TINT));
			RETVAL=ffgsvk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(int*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TINT);
			RETVAL=ffgsvk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TINT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvuk(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned int nulval
	unsigned int * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_uint = 1
		fitsfilePtr::read_subset_uint = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TUINT));
			RETVAL=ffgsvuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned int*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TUINT);
			RETVAL=ffgsvuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TUINT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	long nulval
	long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_lng = 1
		fitsfilePtr::read_subset_lng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TLONG));
			RETVAL=ffgsvj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(long*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TLONG);
			RETVAL=ffgsvj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TLONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvjj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	LONGLONG nulval
	LONGLONG* array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_lnglng = 1
		fitsfilePtr::read_subset_lnglng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TLONGLONG));
			RETVAL=ffgsvjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(LONGLONG*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TLONGLONG);
			RETVAL=ffgsvjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TLONGLONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvuj(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned long nulval
	unsigned long * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_ulng = 1
		fitsfilePtr::read_subset_ulng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TULONG));
			RETVAL=ffgsvuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(unsigned long*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TULONG);
			RETVAL=ffgsvuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TULONG,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsve(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	float nulval
	float * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_flt = 1
		fitsfilePtr::read_subset_flt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TFLOAT));
			RETVAL=ffgsve(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(float*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TFLOAT);
			RETVAL=ffgsve(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TFLOAT,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsvd(fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	double nulval
	double * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subset_dbl = 1
		fitsfilePtr::read_subset_dbl = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(8),ndata*sizeof_datatype(TDOUBLE));
			RETVAL=ffgsvd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,(double*)SvPV(ST(8),PL_na),&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TDOUBLE);
			RETVAL=ffgsvd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,nulval,array,&anynul,&status);
			unpack1D(ST(8),array,ndata,TDOUBLE,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfb(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	byte * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_byt = 1
		fitsfilePtr::read_subsetnull_byt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TBYTE));
				array = (byte*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TBYTE);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TBYTE);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TBYTE,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfsb(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	signed char* array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_sbyt = 1
		fitsfilePtr::read_subsetnull_sbyt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TSBYTE));
				array = (signed char*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TSBYTE);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TSBYTE);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfsb(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TSBYTE,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfi(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	short * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_sht = 1
		fitsfilePtr::read_subsetnull_sht = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TSHORT));
				array = (short*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TSHORT);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TSHORT);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfi(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TSHORT,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfui(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned short * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_usht = 1
		fitsfilePtr::read_subsetnull_usht = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TUSHORT));
				array = (unsigned short*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TUSHORT);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TUSHORT);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfui(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TUSHORT,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfk(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	int * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_int = 1
		fitsfilePtr::read_subsetnull_int = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TINT));
				array = (int*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TINT);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TINT);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TINT,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfuk(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned int * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_uint = 1
		fitsfilePtr::read_subsetnull_uint = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TUINT));
				array = (unsigned int*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TUINT);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TUINT);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfuk(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TUINT,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	long * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_lng = 1
		fitsfilePtr::read_subsetnull_lng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TLONG));
				array = (long*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TLONG);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TLONG);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TLONG,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfjj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	LONGLONG* array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_lnglng = 1
		fitsfilePtr::read_subsetnull_lnglng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TLONGLONG));
				array = (LONGLONG*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TLONGLONG);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TLONGLONG);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfjj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TLONGLONG,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfuj(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	unsigned long * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_ulng = 1
		fitsfilePtr::read_subsetnull_ulng = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TULONG));
				array = (unsigned long*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TULONG);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TULONG);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfuj(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TULONG,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfe(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	float * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_flt = 1
		fitsfilePtr::read_subsetnull_flt = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TFLOAT));
				array = (float*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TFLOAT);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfe(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TFLOAT);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfe(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TFLOAT,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgsfd(fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,anynul,status)
	FitsFile * fptr
	int group
	int naxis
	long * naxes
	long * fpixels
	long * lpixels
	long * inc
	double * array = NO_INIT
	logical * nularr = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_subsetnull_dbl = 1
		fitsfilePtr::read_subsetnull_dbl = 2
	PREINIT:
		long ndata;
		int i;
	CODE:
		ndata = 1;
		for (i=0; i<naxis; i++)
			ndata *= (lpixels[i]-fpixels[i]+1)/inc[i] +
				(((lpixels[i]-fpixels[i]+1) % inc[i]) ? 1 : 0);
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(7) != &PL_sv_undef) {
				SvGROW(ST(7),ndata*sizeof_datatype(TDOUBLE));
				array = (double*)SvPV(ST(7),PL_na);
			}
			else
				array = get_mortalspace(ndata,TDOUBLE);
			if (ST(8) != &PL_sv_undef) {
				SvGROW(ST(8),ndata*sizeof_datatype(TLOGICAL));
				nularr = (logical*)SvPV(ST(8),PL_na);
			}
			else
				nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
		}
		else {
			array = get_mortalspace(ndata,TDOUBLE);
			nularr = get_mortalspace(ndata,TLOGICAL);
			RETVAL=ffgsfd(fptr->fptr,group,naxis,naxes,fpixels,lpixels,inc,array,nularr,&anynul,&status);
			if (ST(7) != &PL_sv_undef) unpack1D(ST(7),array,ndata,TDOUBLE,fptr->perlyunpacking);
			if (ST(8) != &PL_sv_undef) unpack1D(ST(8),nularr,ndata,TLOGICAL,fptr->perlyunpacking);
		}
		if (ST(9) != &PL_sv_undef) sv_setiv(ST(9),anynul);
	OUTPUT:
		status
		RETVAL

int
ffgtcs(fptr,xcol,ycol,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,status)
	fitsfile * fptr
	int xcol
	int ycol
	double xrefval = NO_INIT
	double yrefval = NO_INIT
	double xrefpix = NO_INIT
	double yrefpix = NO_INIT
	double xinc = NO_INIT
	double yinc = NO_INIT
	double rot = NO_INIT
	char * coordtype = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_tbl_coord = 1
		fitsfilePtr::read_tbl_coord = 2
	CODE:
		coordtype = get_mortalspace(FLEN_VALUE,TBYTE);
		RETVAL=ffgtcs(fptr,xcol,ycol,&xrefval,&yrefval,&xrefpix,&yrefpix,&xinc,&yinc,&rot,coordtype,&status);
		if (ST(3) != &PL_sv_undef) sv_setnv(ST(3),xrefval);  /* value-added, all around */
		if (ST(4) != &PL_sv_undef) sv_setnv(ST(4),yrefval);
		if (ST(5) != &PL_sv_undef) sv_setnv(ST(5),xrefpix);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),yrefpix);
		if (ST(7) != &PL_sv_undef) sv_setnv(ST(7),xinc);
		if (ST(8) != &PL_sv_undef) sv_setnv(ST(8),yinc);
		if (ST(9) != &PL_sv_undef) sv_setnv(ST(9),rot);
	OUTPUT:
		coordtype
		status
		RETVAL

int
ffgtbb(fptr,frow,fchar,nchars,values,status)
	FitsFile * fptr
	LONGLONG frow
	LONGLONG fchar
	LONGLONG nchars
	byte * values = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_tblbytes = 1
		fitsfilePtr::read_tblbytes = 2
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(4),nchars*sizeof_datatype(TBYTE));
			RETVAL=ffgtbb(fptr->fptr,frow,fchar,nchars,(byte*)SvPV(ST(4),PL_na),&status);
		}
		else {
			values = get_mortalspace(nchars,TBYTE);
			RETVAL=ffgtbb(fptr->fptr,frow,fchar,nchars,values,&status);
			unpack1D(ST(4),values,nchars,TBYTE,fptr->perlyunpacking);
		}
	OUTPUT:
		status
		RETVAL

int
ffgtdm(fptr,colnum,naxis,naxes,status)
	FitsFile * fptr
	int colnum
	int naxis = NO_INIT
	long * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_tdim = 1
		fitsfilePtr::read_tdim = 2
	CODE:
		if (ST(3)!=&PL_sv_undef) {
			ffgtdm(fptr->fptr,colnum,0,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONG);
		}
		else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffgtdm(fptr->fptr,colnum,naxis,&naxis,naxes,&status);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
ffgtdmll(fptr,colnum,naxis,naxes,status)
	FitsFile * fptr
	int colnum
	int naxis = NO_INIT
	LONGLONG * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_tdimll = 1
		fitsfilePtr::read_tdimll = 2
	CODE:
		if (ST(3)!=&PL_sv_undef) {
			ffgtdmll(fptr->fptr,colnum,0,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONGLONG);
		}
		else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=ffgtdmll(fptr->fptr,colnum,naxis,&naxis,naxes,&status);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONGLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
ffgtrm(gfptr,rmopt,status)
	fitsfile * gfptr
	int rmopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_remove_group = 1
		fitsfilePtr::remove_group = 2
	OUTPUT:
		status

int
ffgmrm(fptr,member,rmopt,status)
	fitsfile * fptr
	long member
	int rmopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_remove_member = 1
		fitsfilePtr::remove_member = 2
	OUTPUT:
		status

int
ffreopen(openfptr,newfptr,status)
	fitsfile * openfptr
	FitsFile * newfptr = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_reopen_file = 1
		fitsfilePtr::reopen_file = 2
	CODE:
		NewFitsFile(newfptr);
		RETVAL = ffreopen(openfptr,&(newfptr->fptr),&status);
		if (RETVAL)
		   AbortFitsFile(newfptr);
	OUTPUT:
		status
		newfptr
		RETVAL

void
ffrprt(stream, status)
	FILE * stream
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_report_error = 1

int
ffrsim(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	long * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_resize_img = 1
		fitsfilePtr::resize_img = 2
	OUTPUT:
		status

int
ffrsimll(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	LONGLONG * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_resize_imgll = 1
		fitsfilePtr::resize_imgll = 2
	OUTPUT:
		status

int
ffsrow(infptr,outfptr,expr,status)
	fitsfile * infptr
	fitsfile * outfptr
	char * expr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_select_rows = 1
		fitsfilePtr::select_rows = 2
	OUTPUT:
		status

int
ffpscl(fptr,scale,zero,status)
	fitsfile * fptr
	double scale
	double zero
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_bscale = 1
		fitsfilePtr::set_bscale = 2
	OUTPUT:
		status

int
ffsnul(fptr,colnum,nulstr,status)
	fitsfile * fptr
	int colnum
	char * nulstr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_atblnull = 1
		fitsfilePtr::set_atblnull = 2
	OUTPUT:
		status

int
fftnul(fptr,colnum,nulval,status)
	fitsfile * fptr
	int colnum
	LONGLONG nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_btblnull = 1
		fitsfilePtr::set_btblnull = 2
	OUTPUT:
		status

int
fits_set_compression_type(fptr, comptype, status)
	fitsfile *fptr	
	int comptype
	int &status
	ALIAS:
		fitsfilePtr::set_compression_type = 1
	OUTPUT:
		status

int
ffhdef(fptr,morekeys,status)
	fitsfile * fptr
	int morekeys
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_hdrsize = 1
		fitsfilePtr::set_hdrsize = 2
	OUTPUT:
		status

int
ffrdef(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_hdustruc = 1
		fitsfilePtr::set_hdustruc = 2
	OUTPUT:
		status

int
ffpnul(fptr,nulval,status)
	fitsfile * fptr
	LONGLONG nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_imgnull = 1
		fitsfilePtr::set_imgnull = 2
	OUTPUT:
		status

int
fits_set_noise_bits(fptr, noisebits, status)
	fitsfile *fptr	
	int noisebits
	int &status
	ALIAS:
		fitsfilePtr::set_noise_bits = 1
	OUTPUT:
		status

int
fits_set_tile_dim(fptr, ndim, tilesize, status)
	fitsfile *fptr
	int ndim
	long *tilesize
	int &status
	ALIAS:
		fitsfilePtr::set_tile_dim = 1
	OUTPUT:
		status

int
fftscl(fptr,colnum,scale,zero,status)
	fitsfile * fptr
	int colnum
	double scale
	double zero
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_set_tscale = 1
		fitsfilePtr::set_tscale = 2
	OUTPUT:
		status

int
ffs2dt(datestr,year,month,day,status)
	char * datestr
	int year = NO_INIT
	int month = NO_INIT
	int day = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_str2date = 1
	CODE:
		RETVAL = ffs2dt(datestr,&year,&month,&day,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),year);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),month);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),day);
	OUTPUT:
		status
		RETVAL

int
ffs2tm(datestr,year,month,day,hour,minute,second,status)
	char * datestr
	int year = NO_INIT
	int month = NO_INIT
	int day = NO_INIT
	int hour = NO_INIT
	int minute = NO_INIT
	double second = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_str2time = 1
	CODE:
		RETVAL = ffs2tm(datestr,&year,&month,&day,&hour,&minute,&second,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),year);
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),month);
		if (ST(3) != &PL_sv_undef) sv_setiv(ST(3),day);
		if (ST(4) != &PL_sv_undef) sv_setiv(ST(4),hour);
		if (ST(5) != &PL_sv_undef) sv_setiv(ST(5),minute);
		if (ST(6) != &PL_sv_undef) sv_setnv(ST(6),second);
	OUTPUT:
		status
		RETVAL

int
fftexp(fptr,expr,datatype,nelem,naxis,naxes,status)
	FitsFile * fptr
	char * expr
	int datatype = NO_INIT
	long nelem = NO_INIT
	int naxis = NO_INIT
	long * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_test_expr = 1
		fitsfilePtr::test_expr = 2
	CODE:
		if (ST(5)!=&PL_sv_undef) {
			fftexp(fptr->fptr,expr,0,&datatype,&nelem,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONG);
		}
		else {
			naxes = NULL;
			naxis = 0;
		}
		RETVAL=fftexp(fptr->fptr,expr,naxis,&datatype,&nelem,&naxis,naxes,&status);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),datatype);
		if (ST(3)!=&PL_sv_undef) sv_setiv(ST(3),nelem);
		if (ST(4)!=&PL_sv_undef) sv_setiv(ST(4),naxis);
		if (ST(5)!=&PL_sv_undef) unpack1D(ST(5),naxes,naxis,TLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
fftheap(fptr,heapsize,unused,overlap,validheap,status)
	fitsfile * fptr
	LONGLONG &heapsize = NO_INIT
	LONGLONG &unused = NO_INIT
	LONGLONG &overlap = NO_INIT
	int &validheap = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_test_heap = 1
		fitsfilePtr::test_heap = 2
	OUTPUT:
		heapsize
		unused
		overlap
		validheap
		status

int
fftkey(keyname,status)
	char * keyname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_test_keyword = 1
	OUTPUT:
		status

int
fftrec(card,status)
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_test_record = 1
	OUTPUT:
		status

int
fftm2s(year,month,day,hr,min,sec,decimals,datestr,status)
	int year
	int month
	int day
	int hr
	int min
	double sec
	int decimals
	char * datestr = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_time2str = 1
	PREINIT:
		int datestrlen;
	CODE:
		datestrlen=21; /* YYYY-MM-DDThh:mm:ss.[ddd...] */
		if (decimals > 0) datestrlen += decimals;
		datestr = get_mortalspace(datestrlen,TBYTE);
		RETVAL=fftm2s(year,month,day,hr,min,sec,decimals,datestr,&status);
	OUTPUT:
		datestr
		status
		RETVAL

int
ffgmtf(infptr,outfptr,member,tfopt,status)
	fitsfile * infptr
	fitsfile * outfptr
	long member
	int tfopt
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_transfer_member = 1
		fitsfilePtr::transfer_member = 2
	OUTPUT:
		status

int
ffucrd(fptr,keyname,card,status)
	fitsfile *fptr
	char * keyname
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_card = 1
		fitsfilePtr::update_card = 2
	OUTPUT:
		status

int
ffupck(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_chksum = 1
		fitsfilePtr::update_chksum = 2
	OUTPUT:
		status

int
ffuky(fptr,datatype,keyname,value,comm,status)
	fitsfile * fptr
	int datatype
	char * keyname
	void * value = NO_INIT
	char * comm
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key = 1
		fitsfilePtr::update_key = 2
	CODE:
		value = pack1D(ST(3),(datatype == TLOGICAL) ? TINT : datatype);
		RETVAL=ffuky(fptr,datatype,keyname,value,comm,&status);
	OUTPUT:
		status
		RETVAL

int
ffukyu(fptr,keyname,comment,status)
	fitsfile * fptr
	char * keyname
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_null = 1
		fitsfilePtr::update_key_null = 2
	OUTPUT:
		status

int
ffukys(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_str = 1
		fitsfilePtr::update_key_str = 2
	OUTPUT:
		status

int
ffukyl(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	int value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_log = 1
		fitsfilePtr::update_key_log = 2
	OUTPUT:
		status

int
ffukyj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	LONGLONG value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_lng = 1
		fitsfilePtr::update_key_lng = 2
	OUTPUT:
		status

int
ffukye(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_flt = 1
		fitsfilePtr::update_key_flt = 2
	OUTPUT:
		status

int
ffukyd(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_dbl = 1
		fitsfilePtr::update_key_dbl = 2
	OUTPUT:
		status

int
ffukyf(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_fixflt = 1
		fitsfilePtr::update_key_fixflt = 2
	OUTPUT:
		status

int
ffukyg(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_fixdbl = 1
		fitsfilePtr::update_key_fixdbl = 2
	OUTPUT:
		status

int
ffukyc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_cmp = 1
		fitsfilePtr::update_key_cmp = 2
	OUTPUT:
		status

int
ffukym(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_dblcmp = 1
		fitsfilePtr::update_key_dblcmp = 2
	OUTPUT:
		status

int
ffukfc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	cmp * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_fixcmp = 1
		fitsfilePtr::update_key_fixcmp = 2
	OUTPUT:
		status

int
ffukfm(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	dblcmp * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_fixdblcmp = 1
		fitsfilePtr::update_key_fixdblcmp = 2
	OUTPUT:
		status

void
ffupch(string)
	char * string
	ALIAS:
		Astro::FITS::CFITSIO::fits_uppercase = 1
	OUTPUT:
		string

int
ffurlt(fptr,urlType,status)
	fitsfile *fptr
	char *urlType = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_url_type = 1
		fitsfilePtr::url_type = 2
	CODE:
		urlType = get_mortalspace(FLEN_FILENAME,TBYTE);
		RETVAL = ffurlt(fptr,urlType,&status);
	OUTPUT:
		urlType
		status
		RETVAL
		
	
int
ffvcks(fptr,dataok,hduok,status)
	fitsfile * fptr
	int dataok = NO_INIT
	int hduok = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_verify_chksum = 1
		fitsfilePtr::verify_chksum = 2
	CODE:
		RETVAL = ffvcks(fptr,&dataok,&hduok,&status);
		if (ST(1) != &PL_sv_undef) sv_setiv(ST(1),dataok); /* value-added */
		if (ST(2) != &PL_sv_undef) sv_setiv(ST(2),hduok); /* value-added */
	OUTPUT:
		status
		RETVAL

int
ffgtvf(gfptr,firstfailed,status)
	fitsfile * gfptr
	long &firstfailed = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_verify_group = 1
		fitsfilePtr::verify_group = 2
	OUTPUT:
		firstfailed
		status

int
ffxypx(xpos,ypos,xrefval,yrefval,xrefpix,yrefpix,xinc,yinc,rot,coordtype,xpix,ypix,status)
	double xpos
	double ypos
	double xrefval
	double yrefval
	double xrefpix
	double yrefpix
	double xinc
	double yinc
	double rot
	char * coordtype
	double &xpix = NO_INIT
	double &ypix = NO_INIT
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_world_to_pix = 1
	OUTPUT:
		xpix
		ypix
		status

int
ffp2db(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_byt = 1
		fitsfilePtr::write_2d_byt = 2
	OUTPUT:
		status

int
ffp2dsb(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_sbyt = 1
		fitsfilePtr::write_2d_sbyt = 2
	OUTPUT:
		status

int
ffp2di(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_sht = 1
		fitsfilePtr::write_2d_sht = 2
	OUTPUT:
		status

int
ffp2dui(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_usht = 1
		fitsfilePtr::write_2d_usht = 2
	OUTPUT:
		status

int
ffp2dk(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_int = 1
		fitsfilePtr::write_2d_int = 2
	OUTPUT:
		status

int
ffp2duk(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_uint = 1
		fitsfilePtr::write_2d_uint = 2
	OUTPUT:
		status

int
ffp2dj(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_lng = 1
		fitsfilePtr::write_2d_lng = 2
	OUTPUT:
		status

int
ffp2djj(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_lnglng = 1
		fitsfilePtr::write_2d_lnglng = 2
	OUTPUT:
		status

int
ffp2duj(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_ulng = 1
		fitsfilePtr::write_2d_ulng = 2
	OUTPUT:
		status

int
ffp2de(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_flt = 1
		fitsfilePtr::write_2d_flt = 2
	OUTPUT:
		status

int
ffp2dd(fptr,group,dim1,naxis1,naxis2,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG naxis1
	LONGLONG naxis2
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_2d_dbl = 1
		fitsfilePtr::write_2d_dbl = 2
	OUTPUT:
		status

int
ffp3db(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_byt = 1
		fitsfilePtr::write_3d_byt = 2
	OUTPUT:
		status

int
ffp3dsb(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_sbyt = 1
		fitsfilePtr::write_3d_sbyt = 2
	OUTPUT:
		status

int
ffp3di(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_sht = 1
		fitsfilePtr::write_3d_sht = 2
	OUTPUT:
		status

int
ffp3dui(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_usht = 1
		fitsfilePtr::write_3d_usht = 2
	OUTPUT:
		status

int
ffp3dk(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_int = 1
		fitsfilePtr::write_3d_int = 2
	OUTPUT:
		status

int
ffp3duk(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_uint = 1
		fitsfilePtr::write_3d_uint = 2
	OUTPUT:
		status

int
ffp3dj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_lng = 1
		fitsfilePtr::write_3d_lng = 2
	OUTPUT:
		status

int
ffp3djj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_lnglng = 1
		fitsfilePtr::write_3d_lnglng = 2
	OUTPUT:
		status

int
ffp3duj(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_ulng = 1
		fitsfilePtr::write_3d_ulng = 2
	OUTPUT:
		status

int
ffp3de(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_flt = 1
		fitsfilePtr::write_3d_flt = 2
	OUTPUT:
		status

int
ffp3dd(fptr,group,dim1,dim2,naxis1,naxis2,naxis3,array,status)
	fitsfile * fptr
	long group
	LONGLONG dim1
	LONGLONG dim2
	LONGLONG naxis1
	LONGLONG naxis2
	LONGLONG naxis3
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_3d_dbl = 1
		fitsfilePtr::write_3d_dbl = 2
	OUTPUT:
		status

int
ffphtb(fptr,rowlen,nrows,tfields,ttype,tbcol,tform,tunit,extname,status)
	fitsfile * fptr
	LONGLONG rowlen
	LONGLONG nrows
	int tfields
	char ** ttype
	long * tbcol
	char ** tform
	char ** tunit
	char * extname
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_atblhdr = 1
		fitsfilePtr::write_atblhdr = 2
	OUTPUT:
		status

int
ffphbn(fptr,nrows,tfields,ttype,tform,tunit,extname,pcount,status)
	fitsfile * fptr
	LONGLONG nrows
	int tfields
	char ** ttype
	char ** tform
	char ** tunit
	char * extname
	LONGLONG pcount
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_btblhdr = 1
		fitsfilePtr::write_btblhdr = 2
	OUTPUT:
		status

int
ffphext(fptr, xtension, bitpix, naxis, naxes, pcount, gcount, status)
	fitsfile * fptr
	char * xtension
	int bitpix
	int naxis
	long * naxes
	LONGLONG pcount
	LONGLONG gcount
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_exthdr = 1
		fitsfilePtr::write_exthdr = 2
	OUTPUT:
		status

int
ffpcks(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_chksum = 1
		fitsfilePtr::write_chksum = 2
	OUTPUT:
		status

int
ffprwu(fptr,firstrow,nelem,status)
	fitsfile * fptr
	LONGLONG firstrow
	LONGLONG nelem
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_nullrows = 1
		fitsfilePtr::write_nullrows = 2
	OUTPUT:
		status

int
ffpclu(fptr,colnum,frow,felem,nelem,status)
	fitsfile * fptr
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_null = 1
		fitsfilePtr::write_col_null = 2
	OUTPUT:
		status

int
ffpcl(fptr,datatype,colnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int datatype
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	SV * array
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col = 1
		fitsfilePtr::write_col = 2
	PREINIT:
		int storage_datatype;
	CODE:
		storage_datatype = datatype;
		if (datatype == TBIT)
			storage_datatype = TLOGICAL;
		RETVAL=ffpcl(fptr,datatype,colnum,frow,felem,nelem,packND(array,storage_datatype),&status);
	OUTPUT:
		status
		RETVAL

int
ffpclx(fptr,cnum,frow,fbit,nbits,larray,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	long fbit
	long nbits
	logical * larray
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_bit = 1
		fitsfilePtr::write_col_bit = 2
	OUTPUT:
		status

int
ffpcls(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	char ** array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_str = 1
		fitsfilePtr::write_col_str = 2
	OUTPUT:
		status

int
ffpcll(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	logical * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_log = 1
		fitsfilePtr::write_col_log = 2
	OUTPUT:
		status

int
ffpclb(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_byt = 1
		fitsfilePtr::write_col_byt = 2
	OUTPUT:
		status

int
ffpclsb(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_sbyt = 1
		fitsfilePtr::write_col_sbyt = 2
	OUTPUT:
		status

int
ffpclui(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_usht = 1
		fitsfilePtr::write_col_usht = 2
	OUTPUT:
		status

int
ffpcli(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_sht = 1
		fitsfilePtr::write_col_sht = 2
	OUTPUT:
		status

int
ffpcluk(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_uint = 1
		fitsfilePtr::write_col_uint = 2
	OUTPUT:
		status

int
ffpclk(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_int = 1
		fitsfilePtr::write_col_int = 2
	OUTPUT:
		status

int
ffpcluj(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_ulng = 1
		fitsfilePtr::write_col_ulng = 2
	OUTPUT:
		status

int
ffpclj(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_lng = 1
		fitsfilePtr::write_col_lng = 2
	OUTPUT:
		status

int
ffpcljj(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_lnglng = 1
		fitsfilePtr::write_col_lnglng = 2
	OUTPUT:
		status

int
ffpcle(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_flt = 1
		fitsfilePtr::write_col_flt = 2
	OUTPUT:
		status

int
ffpcld(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_dbl = 1
		fitsfilePtr::write_col_dbl = 2
	OUTPUT:
		status

int
ffpclc(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_cmp = 1
		fitsfilePtr::write_col_cmp = 2
	OUTPUT:
		status

int
ffpclm(fptr,cnum,frow,felem,nelem,array,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_col_dblcmp = 1
		fitsfilePtr::write_col_dblcmp = 2
	OUTPUT:
		status

int
ffpcn(fptr,datatype,colnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int datatype
	int colnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	SV * array
	SV * nulval
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull = 1
		fitsfilePtr::write_colnull = 2
	PREINIT:
		int storage_datatype;
	CODE:
		storage_datatype = datatype;
		if (datatype == TBIT)
			storage_datatype = TLOGICAL;
		RETVAL=ffpcn(
			fptr,
			datatype,
			colnum,
			frow, felem, nelem,
			packND(array,storage_datatype),
			(nulval!=&PL_sv_undef) ? pack1D(nulval, storage_datatype) : NULL,
			&status);
	OUTPUT:
		status
		RETVAL

int
ffpcns(fptr,cnum,frow,felem,nelem,array,nulstr,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	char ** array
	char * nulstr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_str = 1
		fitsfilePtr::write_colnull_str = 2
	OUTPUT:
		status

int
ffpcnl(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	logical * array
	logical nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_log = 1
		fitsfilePtr::write_colnull_log = 2
	OUTPUT:
		status

int
ffpcnb(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	byte * array
	byte nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_byt = 1
		fitsfilePtr::write_colnull_byt = 2
	OUTPUT:
		status

int
ffpcnsb(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	signed char* array
	signed char nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_sbyt = 1
		fitsfilePtr::write_colnull_sbyt = 2
	OUTPUT:
		status

int
ffpcnui(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned short * array
	unsigned short nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_usht = 1
		fitsfilePtr::write_colnull_usht = 2
	OUTPUT:
		status

int
ffpcni(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	short * array
	short nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_sht = 1
		fitsfilePtr::write_colnull_sht = 2
	OUTPUT:
		status

int
ffpcnuk(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned int * array
	unsigned int nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_uint = 1
		fitsfilePtr::write_colnull_uint = 2
	OUTPUT:
		status

int
ffpcnk(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	int * array
	int nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_int = 1
		fitsfilePtr::write_colnull_int = 2
	OUTPUT:
		status

int
ffpcnuj(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	unsigned long * array
	unsigned long nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_ulng = 1
		fitsfilePtr::write_colnull_ulng = 2
	OUTPUT:
		status

int
ffpcnj(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	long * array
	long nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_lng = 1
		fitsfilePtr::write_colnull_lng = 2
	OUTPUT:
		status

int
ffpcnjj(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	LONGLONG* array
	LONGLONG nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_lnglng = 1
		fitsfilePtr::write_colnull_lnglng = 2
	OUTPUT:
		status

int
ffpcne(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	float * array
	float nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_flt = 1
		fitsfilePtr::write_colnull_flt = 2
	OUTPUT:
		status

int
ffpcnd(fptr,cnum,frow,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int cnum
	LONGLONG frow
	LONGLONG felem
	LONGLONG nelem
	double * array
	double nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_colnull_dbl = 1
		fitsfilePtr::write_colnull_dbl = 2
	OUTPUT:
		status

int
ffpcom(fptr,comment,status)
	fitsfile * fptr
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_comment = 1
		fitsfilePtr::write_comment = 2
	OUTPUT:
		status

int
ffpdat(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_date = 1
		fitsfilePtr::write_date = 2
	OUTPUT:
		status

int
ffpdes(fptr,colnum,rownum,repeat,offset,status)
	fitsfile * fptr
	int colnum
	LONGLONG rownum
	LONGLONG repeat
	LONGLONG offset
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_descript = 1
		fitsfilePtr::write_descript = 2
	OUTPUT:
		status

void
ffpmsg(err_msg)
	char * err_msg
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_errmsg = 1

int
ffpgpb(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_byt = 1
		fitsfilePtr::write_grppar_byt = 2
	OUTPUT:
		status

int
ffpgpsb(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_sbyt = 1
		fitsfilePtr::write_grppar_sbyt = 2
	OUTPUT:
		status

int
ffpgpui(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_usht = 1
		fitsfilePtr::write_grppar_usht = 2
	OUTPUT:
		status

int
ffpgpi(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_sht = 1
		fitsfilePtr::write_grppar_sht = 2
	OUTPUT:
		status

int
ffpgpuk(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_uint = 1
		fitsfilePtr::write_grppar_uint = 2
	OUTPUT:
		status

int
ffpgpk(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_int = 1
		fitsfilePtr::write_grppar_int = 2
	OUTPUT:
		status

int
ffpgpuj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_ulng = 1
		fitsfilePtr::write_grppar_ulng = 2
	OUTPUT:
		status

int
ffpgpj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_lng = 1
		fitsfilePtr::write_grppar_lng = 2
	OUTPUT:
		status

int
ffpgpjj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_lnglng = 1
		fitsfilePtr::write_grppar_lnglng = 2
	OUTPUT:
		status

int
ffpgpe(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_flt = 1
		fitsfilePtr::write_grppar_flt = 2
	OUTPUT:
		status

int
ffpgpd(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	long felem
	long nelem
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grppar_dbl = 1
		fitsfilePtr::write_grppar_dbl = 2
	OUTPUT:
		status

int
ffphis(fptr,history,status)
	fitsfile * fptr
	char * history
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_history = 1
		fitsfilePtr::write_history = 2
	OUTPUT:
		status

int
ffppr(fptr,datatype,firstelem,nelem,array,status)
	fitsfile * fptr
	int datatype
	LONGLONG firstelem
	LONGLONG nelem
	SV * array
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img = 1
		fitsfilePtr::write_img = 2
	CODE:
		RETVAL=ffppr(fptr,datatype,firstelem,nelem,packND(array,datatype),&status);
	OUTPUT:
		status
		RETVAL

int
ffppru(fptr,group,felem,nelem,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_null = 1
		fitsfilePtr::write_img_null = 2
	OUTPUT:
		status

int
ffpprb(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_byt = 1
		fitsfilePtr::write_img_byt = 2
	OUTPUT:
		status

int
ffpprsb(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_sbyt = 1
		fitsfilePtr::write_img_sbyt = 2
	OUTPUT:
		status

int
ffpprui(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_usht = 1
		fitsfilePtr::write_img_usht = 2
	OUTPUT:
		status

int
ffppri(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_sht = 1
		fitsfilePtr::write_img_sht = 2
	OUTPUT:
		status

int
ffppruk(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_uint = 1
		fitsfilePtr::write_img_uint = 2
	OUTPUT:
		status

int
ffpprk(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_int = 1
		fitsfilePtr::write_img_int = 2
	OUTPUT:
		status

int
ffppruj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_ulng = 1
		fitsfilePtr::write_img_ulng = 2
	OUTPUT:
		status

int
ffpprj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_lng = 1
		fitsfilePtr::write_img_lng = 2
	OUTPUT:
		status

int
ffpprjj(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_lnglng = 1
		fitsfilePtr::write_img_lnglng = 2
	OUTPUT:
		status

int
ffppre(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_flt = 1
		fitsfilePtr::write_img_flt = 2
	OUTPUT:
		status

int
ffpprd(fptr,group,felem,nelem,array,status)
	fitsfile * fptr
	long group
	LONGLONG nelem
	LONGLONG felem
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_img_dbl = 1
		fitsfilePtr::write_img_dbl = 2
	OUTPUT:
		status

int
ffphps(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	long * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imghdr = 1
		fitsfilePtr::write_imghdr = 2
	OUTPUT:
		status

int
ffphpsll(fptr,bitpix,naxis,naxes,status)
	fitsfile * fptr
	int bitpix
	int naxis
	LONGLONG * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imghdrll = 1
		fitsfilePtr::write_imghdrll = 2
	OUTPUT:
		status

int
ffphpr(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status)
	fitsfile * fptr
	int simple
	int bitpix
	int naxis
	long * naxes
	LONGLONG pcount
	LONGLONG gcount
	int extend
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grphdr = 1
		fitsfilePtr::write_grphdr = 2
	OUTPUT:
		status

int
ffphprll(fptr,simple,bitpix,naxis,naxes,pcount,gcount,extend,status)
	fitsfile * fptr
	int simple
	int bitpix
	int naxis
	LONGLONG* naxes
	LONGLONG pcount
	LONGLONG gcount
	int extend
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_grphdrll = 1
		fitsfilePtr::write_grphdrll = 2
	OUTPUT:
		status

int
ffppn(fptr,datatype,felem,nelem,array,nulval,status)
	fitsfile * fptr
	int datatype
	LONGLONG felem
	LONGLONG nelem
	SV * array
	SV * nulval
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull = 1
		fitsfilePtr::write_imgnull = 2
	CODE:
		RETVAL=ffppn(fptr,datatype,felem,nelem,packND(array,datatype),pack1D(nulval,datatype),&status);
	OUTPUT:
		status
		RETVAL

int
ffppnb(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	byte * array
	byte nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_byt = 1
		fitsfilePtr::write_imgnull_byt = 2
	OUTPUT:
		status

int
ffppnsb(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	signed char* array
	signed char nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_sbyt = 1
		fitsfilePtr::write_imgnull_sbyt = 2
	OUTPUT:
		status

int
ffppnui(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned short * array
	unsigned short nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_usht = 1
		fitsfilePtr::write_imgnull_usht = 2
	OUTPUT:
		status

int
ffppni(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	short * array
	short nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_sht = 1
		fitsfilePtr::write_imgnull_sht = 2
	OUTPUT:
		status

int
ffppnuk(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned int * array
	unsigned int nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_uint = 1
		fitsfilePtr::write_imgnull_uint = 2
	OUTPUT:
		status

int
ffppnk(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	int * array
	int nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_int = 1
		fitsfilePtr::write_imgnull_int = 2
	OUTPUT:
		status

int
ffppnuj(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	unsigned long * array
	unsigned long nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_ulng = 1
		fitsfilePtr::write_imgnull_ulng = 2
	OUTPUT:
		status

int
ffppnj(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	long * array
	long nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_lng = 1
		fitsfilePtr::write_imgnull_lng = 2
	OUTPUT:
		status

int
ffppnjj(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	LONGLONG* array
	LONGLONG nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_lnglng = 1
		fitsfilePtr::write_imgnull_lnglng = 2
	OUTPUT:
		status

int
ffppne(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	float * array
	float nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_flt = 1
		fitsfilePtr::write_imgnull_flt = 2
	OUTPUT:
		status

int
ffppnd(fptr,group,felem,nelem,array,nulval,status)
	fitsfile * fptr
	long group
	LONGLONG felem
	LONGLONG nelem
	double * array
	double nulval
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_imgnull_dbl = 1
		fitsfilePtr::write_imgnull_dbl = 2
	OUTPUT:
		status

int
ffpky(fptr,datatype,keyname,value,comment,status)
	fitsfile * fptr
	int datatype
	char * keyname
	void * value = NO_INIT
	char * comment
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key = 1
		fitsfilePtr::write_key = 2
	CODE:
		value = pack1D(ST(3),(datatype == TLOGICAL) ? TINT : datatype);
		RETVAL=ffpky(fptr,datatype,keyname,value,comment,&status);
	OUTPUT:
		status
		RETVAL

int
ffpkls(fptr,keyname,longstr,comment,status)
	fitsfile * fptr
	char * keyname
	char * longstr
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_longstr = 1
		fitsfilePtr::write_key_longstr = 2
	OUTPUT:
		status

int
ffukls(fptr,keynam,value,comm,status)
	fitsfile * fptr
	char * keynam
	char * value
	char * comm
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_update_key_longstr = 1
		fitsfilePtr::update_key_longstr = 2
	OUTPUT:
		status

int
ffikls(fptr,keynam,value,comm,status)
	fitsfile * fptr
	char * keynam
	char * value
	char * comm
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_insert_key_longstr = 1
		fitsfilePtr::insert_key_longstr = 2
	OUTPUT:
		status

int
ffmkls(fptr,keynam,value,comm,status)
	fitsfile * fptr
	char * keynam
	char * value
	char * comm
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_modify_key_longstr = 1
		fitsfilePtr::modify_key_longstr = 2
	OUTPUT:
		status

int
ffplsw(fptr,status)
	fitsfile * fptr
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_longwarn = 1
		fitsfilePtr::write_key_longwarn = 2
	OUTPUT:
		status

int
ffpkyu(fptr,keyname,comment,status)
	fitsfile * fptr
	char * keyname
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_null = 1
		fitsfilePtr::write_key_null = 2
	OUTPUT:
		status

int
ffpktp(fptr,filename,status)
	fitsfile * fptr
	char * filename
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_template = 1
		fitsfilePtr::write_key_template = 2
	OUTPUT:
		status

int
ffpkyt(fptr,keyname,intval,frac,comment,status)
	fitsfile * fptr
	char * keyname
	long intval
	double frac
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_triple = 1
		fitsfilePtr::write_key_triple = 2
	OUTPUT:
		status

int
ffpunt(fptr,keyname,unit,status)
	fitsfile * fptr
	char * keyname
	char * unit
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_unit = 1
		fitsfilePtr::write_key_unit = 2
	OUTPUT:
		status

int
ffpkys(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	char * value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_str = 1
		fitsfilePtr::write_key_str = 2
	OUTPUT:
		status

int
ffpkyl(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	int value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_log = 1
		fitsfilePtr::write_key_log = 2
	OUTPUT:
		status

int
ffpkyj(fptr,keyname,value,comment,status)
	fitsfile * fptr
	char * keyname
	LONGLONG value
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_lng = 1
		fitsfilePtr::write_key_lng = 2
	OUTPUT:
		status

int
ffpkye(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_flt = 1
		fitsfilePtr::write_key_flt = 2
	OUTPUT:
		status

int
ffpkyf(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_fixflt = 1
		fitsfilePtr::write_key_fixflt = 2
	OUTPUT:
		status

int
ffpkyd(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_dbl = 1
		fitsfilePtr::write_key_dbl = 2
	OUTPUT:
		status

int
ffpkyg(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_fixdbl = 1
		fitsfilePtr::write_key_fixdbl = 2
	OUTPUT:
		status

int
ffpkyc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_cmp = 1
		fitsfilePtr::write_key_cmp = 2
	OUTPUT:
		status

int
ffpkfc(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	float * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_fixcmp = 1
		fitsfilePtr::write_key_fixcmp = 2
	OUTPUT:
		status

int
ffpkym(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_dblcmp = 1
		fitsfilePtr::write_key_dblcmp = 2
	OUTPUT:
		status

int
ffpkfm(fptr,keyname,value,decimals,comment,status)
	fitsfile * fptr
	char * keyname
	double * value
	int decimals
	char * comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_key_fixdblcmp = 1
		fitsfilePtr::write_key_fixdblcmp = 2
	OUTPUT:
		status

int
ffpkns(fptr,keyroot,nstart,nkeys,value,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	char ** value
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_str = 1
		fitsfilePtr::write_keys_str = 2
	OUTPUT:
		status

int
ffpknl(fptr,keyroot,nstart,nkeys,value,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	int * value
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_log = 1
		fitsfilePtr::write_keys_log = 2
	OUTPUT:
		status

int
ffpknj(fptr,keyroot,nstart,nkeys,value,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	long * value
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_lng = 1
		fitsfilePtr::write_keys_lng = 2
	OUTPUT:
		status

int
ffpknjj(fptr,keyroot,nstart,nkeys,value,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	LONGLONG * value
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_lnglng = 1
		fitsfilePtr::write_keysll = 2
	OUTPUT:
		status

int
ffpkne(fptr,keyroot,nstart,nkeys,value,decimals,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	float * value
	int decimals
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_flt = 1
		fitsfilePtr::write_keys_flt = 2
	OUTPUT:
		status

int
ffpknf(fptr,keyroot,nstart,nkeys,value,decimals,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	float * value
	int decimals
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_fixflt = 1
		fitsfilePtr::write_keys_fixflt = 2
	OUTPUT:
		status

int
ffpknd(fptr,keyroot,nstart,nkeys,value,decimals,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	double * value
	int decimals
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_dbl = 1
		fitsfilePtr::write_keys_dbl = 2
	OUTPUT:
		status

int
ffpkng(fptr,keyroot,nstart,nkeys,value,decimals,comment,status)
	fitsfile * fptr
	char * keyroot
	int nstart
	int nkeys
	double * value
	int decimals
	char ** comment
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_keys_fixdbl = 1
		fitsfilePtr::write_keys_fixdbl = 2
	OUTPUT:
		status

int
ffpprn(fptr,felem,nelem,status)
	fitsfile * fptr
	LONGLONG felem
	LONGLONG nelem
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_null_img = 1
		fitsfilePtr::write_null_img = 2
	OUTPUT:
		status

int
ffprec(fptr,card,status)
	fitsfile * fptr
	char * card
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_record = 1
		fitsfilePtr::write_record = 2
	OUTPUT:
		status

int
ffpss(fptr, dtype, fpix, lpix, nelem, array, status)
	fitsfile *fptr
	int dtype
	long *fpix
	long *lpix
	SV *array
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset = 1
		fitsfilePtr::write_subset = 2
	PREINIT:
		int storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;
		RETVAL = ffpss(fptr,dtype,fpix,lpix,packND(array,storage_dtype),&status);
	OUTPUT:
		RETVAL
		status

int
ffpssb(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	byte * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_byt = 1
		fitsfilePtr::write_subset_byt = 2
	OUTPUT:
		status

int
ffpsssb(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	signed char* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_sbyt = 1
		fitsfilePtr::write_subset_sbyt = 2
	OUTPUT:
		status

int
ffpssui(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	unsigned short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_usht = 1
		fitsfilePtr::write_subset_usht = 2
	OUTPUT:
		status

int
ffpssi(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	short * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_sht = 1
		fitsfilePtr::write_subset_sht = 2
	OUTPUT:
		status

int
ffpssuk(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	unsigned int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_uint = 1
		fitsfilePtr::write_subset_uint = 2
	OUTPUT:
		status

int
ffpssk(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	int * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_int = 1
		fitsfilePtr::write_subset_int = 2
	OUTPUT:
		status

int
ffpssuj(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	unsigned long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_ulng = 1
		fitsfilePtr::write_subset_ulng = 2
	OUTPUT:
		status

int
ffpssj(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	long * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_lng = 1
		fitsfilePtr::write_subset_lng = 2
	OUTPUT:
		status

int
ffpssjj(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	LONGLONG* array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_lnglng = 1
		fitsfilePtr::write_subset_lnglng = 2
	OUTPUT:
		status

int
ffpsse(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	float * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_flt = 1
		fitsfilePtr::write_subset_flt = 2
	OUTPUT:
		status

int
ffpssd(fptr,group,naxis,naxes,fpixel,lpixel,array,status)
	fitsfile * fptr
	long group
	long naxis
	long * naxes
	long * fpixel
	long * lpixel
	double * array
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_subset_dbl = 1
		fitsfilePtr::write_subset_dbl = 2
	OUTPUT:
		status

int
ffptbb(fptr,frow,fchar,nchars,values,status)
	fitsfile * fptr
	LONGLONG frow
	LONGLONG fchar
	LONGLONG nchars
	byte * values;
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_tblbytes = 1
		fitsfilePtr::write_tblbytes = 2
	OUTPUT:
		status

int
ffptdm(fptr,colnum,naxis,naxes,status)
	fitsfile * fptr
	int colnum
	int naxis
	long * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_tdim = 1
		fitsfilePtr::write_tdim = 2
	OUTPUT:
		status

int
ffptdmll(fptr,colnum,naxis,naxes,status)
	fitsfile * fptr
	int colnum
	int naxis
	LONGLONG * naxes
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_tdimll = 1
		fitsfilePtr::write_tdimll = 2
	OUTPUT:
		status

int
ffpthp(fptr,theap,status)
	fitsfile * fptr
	long theap
	int &status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_theap = 1
		fitsfilePtr::write_theap = 2
	OUTPUT:
		status

int
ffgiwcs(fptr,header,status)
	fitsfile * fptr
	char * header = NO_INIT
	int status

	ALIAS:
		Astro::FITS::CFITSIO::fits_get_image_wcs_keys = 1
		fitsfilePtr::get_image_wcs_keys = 2
	CODE:
		RETVAL = ffgiwcs(fptr,&header,&status);
		if (status == 0) {
			if (ST(1) != &PL_sv_undef)
				unpackScalar(ST(1),header,TSTRING);
			free(header);
		}
	OUTPUT:
		RETVAL
		status

int
ffgtwcs(fptr,xcol,ycol,header,status)
	fitsfile * fptr
	int xcol
	int ycol
	char * header = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_table_wcs_keys = 1
		fitsfilePtr::get_table_wcs_keys = 2
	CODE:
		RETVAL = ffgtwcs(fptr,xcol,ycol,&header,&status);
		if (status == 0) {
			if (ST(3)!=&PL_sv_undef)
				unpackScalar(ST(3),header,TSTRING);
			free(header);
		}
	OUTPUT:
		RETVAL
		status

int
ffgipr(fptr,bitbix,naxis,naxes,status)
	FitsFile * fptr
	int bitpix = NO_INIT
	int naxis = NO_INIT
	long * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_parm = 1
		fitsfilePtr::get_img_parm = 2
	CODE:
		if (ST(3)!=&PL_sv_undef) {
			RETVAL = ffgipr(fptr->fptr,0,&bitpix,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONG);
		}
		else {
			naxis = 0;
			naxes = NULL;
		}
		RETVAL = ffgipr(fptr->fptr,naxis,&bitpix,&naxis,naxes,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),bitpix);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
ffgiprll(fptr,bitbix,naxis,naxes,status)
	FitsFile * fptr
	int bitpix = NO_INIT
	int naxis = NO_INIT
	LONGLONG * naxes = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_img_parmll = 1
		fitsfilePtr::get_img_parmll = 2
	CODE:
		if (ST(3)!=&PL_sv_undef) {
			RETVAL = ffgiprll(fptr->fptr,0,&bitpix,&naxis,NULL,&status);
			naxes = get_mortalspace(naxis,TLONGLONG);
		}
		else {
			naxis = 0;
			naxes = NULL;
		}
		RETVAL = ffgiprll(fptr->fptr,naxis,&bitpix,&naxis,naxes,&status);
		if (ST(1)!=&PL_sv_undef) sv_setiv(ST(1),bitpix);
		if (ST(2)!=&PL_sv_undef) sv_setiv(ST(2),naxis);
		if (ST(3)!=&PL_sv_undef) unpack1D(ST(3),naxes,naxis,TLONGLONG,fptr->perlyunpacking);
	OUTPUT:
		status
		RETVAL

int
ffgkcl(card)
	char * card
	ALIAS:
		Astro::FITS::CFITSIO::fits_get_keyclass = 1

int
ffgpxv(fptr, dtype, fpix, nelem, nulval, array, anynul, status)
	FitsFile * fptr
	int dtype
	long * fpix
	LONGLONG nelem
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_pix = 1
		fitsfilePtr::read_pix = 2
	PREINIT:
		int naxis;
		long *naxes;
		OFF_T nelem_all;
		int i;
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(dtype));
			RETVAL = ffgpxv(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), (void*)SvPV(ST(5),PL_na), &anynul, &status);
		}
		else {
			/* find out how many elements are in the image,
			 * allocate space, read, unpack
			 */
			RETVAL = ffgidm(fptr->fptr, &naxis, &status);
			if (status == 0) {
				naxes = get_mortalspace(naxis, TLONG);
				RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status);
				nelem_all = 1;
				for (i=0; i<naxis; i++)
					nelem_all *= naxes[i];
				array=get_mortalspace(nelem_all,dtype);
				RETVAL=ffgpxv(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ?  pack1D(nulval, dtype) : NULL), array, &anynul, &status);
				if (status == 0) {
					order_reverse(naxis, naxes);
					unpackND(ST(5), array, naxis, naxes, dtype, fptr->perlyunpacking);
				}
			}
		}
		if (ST(6) != &PL_sv_undef)
			sv_setiv(ST(6), anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpxvll(fptr, dtype, fpix, nelem, nulval, array, anynul, status)
	FitsFile * fptr
	int dtype
	LONGLONG * fpix
	LONGLONG nelem
	SV * nulval
	void * array = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_pixll = 1
		fitsfilePtr::read_pixll = 2
	PREINIT:
		int naxis;
		LONGLONG *naxes;
		OFF_T nelem_all;
		int i;
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			SvGROW(ST(5),nelem*sizeof_datatype(dtype));
			RETVAL = ffgpxvll(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ? pack1D(nulval, dtype) : NULL), (void*)SvPV(ST(5),PL_na), &anynul, &status);
		}
		else {
			/* find out how many elements are in the image,
			 * allocate space, read, unpack
			 */
			RETVAL = ffgidm(fptr->fptr, &naxis, &status);
			if (status == 0) {
				naxes = get_mortalspace(naxis, TLONGLONG);
				RETVAL = ffgiszll(fptr->fptr, naxis, naxes, &status);
				nelem_all = 1;
				for (i=0; i<naxis; i++)
					nelem_all *= naxes[i];
				array=get_mortalspace(nelem_all,dtype);
				RETVAL=ffgpxvll(fptr->fptr, dtype, fpix, nelem, (nulval!=&PL_sv_undef ?  pack1D(nulval, dtype) : NULL), array, &anynul, &status);
				if (status == 0) {
					order_reversell(naxis, naxes);
					unpackNDll(ST(5), array, naxis, naxes, dtype,fptr->perlyunpacking);
				}
			}
		}
		if (ST(6) != &PL_sv_undef)
			sv_setiv(ST(6), anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpxf(fptr, dtype, fpix, nelem, array, nullarray, anynul, status)
	FitsFile * fptr
	int dtype
	long * fpix
	LONGLONG nelem
	void * array = NO_INIT
	logical * nullarray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_pixnull = 1
		fitsfilePtr::read_pixnull = 2
	PREINIT:
		int naxis;
		long *naxes;
		OFF_T nelem_all;
		int i;
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(dtype));
				array = (void*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem, dtype);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nullarray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nullarray = get_mortalspace(nelem,TLOGICAL);
			RETVAL = ffgpxf(fptr->fptr,dtype,fpix,nelem,array,nullarray, &anynul,&status);
		}
		else {
			/* find out how many elements are in the image,
			 * allocate space, read, unpack
			 */
			RETVAL = ffgidm(fptr->fptr, &naxis, &status);
			if (status == 0) {
				naxes = get_mortalspace(naxis, TLONG);
				RETVAL = ffgisz(fptr->fptr, naxis, naxes, &status);
				nelem_all = 1;
				for (i=0; i<naxis; i++)
					nelem_all *= naxes[i];
				array=get_mortalspace(nelem_all,dtype);
				nullarray=get_mortalspace(nelem_all,TLOGICAL);
				RETVAL=ffgpxf(fptr->fptr,dtype,fpix,nelem,array,nullarray,&anynul,&status);
				if (status == 0) {
					order_reverse(naxis, naxes);
					if (ST(4)!=&PL_sv_undef)
						unpackND(ST(4),array,naxis,naxes,dtype,fptr->perlyunpacking);
					if (ST(5)!=&PL_sv_undef)
						unpackND(ST(5),nullarray,naxis,naxes,TLOGICAL,fptr->perlyunpacking);
				}
			}
		}
		if (ST(6) != &PL_sv_undef)
			sv_setiv(ST(6), anynul);
	OUTPUT:
		status
		RETVAL

int
ffgpxfll(fptr, dtype, fpix, nelem, array, nullarray, anynul, status)
	FitsFile * fptr
	int dtype
	LONGLONG * fpix
	LONGLONG nelem
	void * array = NO_INIT
	logical * nullarray = NO_INIT
	int anynul = NO_INIT
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_read_pixnullll = 1
		fitsfilePtr::read_pixnullll = 2
	PREINIT:
		int naxis;
		LONGLONG *naxes;
		OFF_T nelem_all;
		int i;
	CODE:
		if (!PERLYUNPACKING(fptr->perlyunpacking)) {
			if (ST(4) != &PL_sv_undef) {
				SvGROW(ST(4),nelem*sizeof_datatype(dtype));
				array = (void*)SvPV(ST(4),PL_na);
			}
			else
				array = get_mortalspace(nelem, dtype);
			if (ST(5) != &PL_sv_undef) {
				SvGROW(ST(5),nelem*sizeof_datatype(TLOGICAL));
				nullarray = (logical*)SvPV(ST(5),PL_na);
			}
			else
				nullarray = get_mortalspace(nelem,TLOGICAL);
			RETVAL = ffgpxfll(fptr->fptr,dtype,fpix,nelem,array,nullarray, &anynul,&status);
		}
		else {
			/* find out how many elements are in the image,
			 * allocate space, read, unpack
			 */
			RETVAL = ffgidm(fptr->fptr, &naxis, &status);
			if (status == 0) {
				naxes = get_mortalspace(naxis, TLONGLONG);
				RETVAL = ffgiszll(fptr->fptr, naxis, naxes, &status);
				nelem_all = 1;
				for (i=0; i<naxis; i++)
					nelem_all *= naxes[i];
				array=get_mortalspace(nelem_all,dtype);
				nullarray=get_mortalspace(nelem_all,TLOGICAL);
				RETVAL=ffgpxfll(fptr->fptr,dtype,fpix,nelem,array,nullarray,&anynul,&status);
				if (status == 0) {
					order_reversell(naxis, naxes);
					if (ST(4)!=&PL_sv_undef)
						unpackNDll(ST(4),array,naxis,naxes,dtype,fptr->perlyunpacking);
					if (ST(5)!=&PL_sv_undef)
						unpackNDll(ST(5),nullarray,naxis,naxes,TLOGICAL,fptr->perlyunpacking);
				}
			}
		}
		if (ST(6) != &PL_sv_undef)
			sv_setiv(ST(6), anynul);
	OUTPUT:
		status
		RETVAL

int
ffppx(fptr, dtype, fpix, nelem, array, status)
	fitsfile * fptr
	int dtype
	long * fpix
	LONGLONG nelem
	SV * array
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_pix = 1
		fitsfilePtr::write_pix = 2
	PREINIT:
		int storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;
		RETVAL = ffppx(fptr,dtype,fpix,nelem,packND(array,storage_dtype),&status);
	OUTPUT:
		RETVAL
		status

int
ffppxll(fptr, dtype, fpix, nelem, array, status)
	fitsfile * fptr
	int dtype
	LONGLONG * fpix
	LONGLONG nelem
	SV * array
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_pixll = 1
		fitsfilePtr::write_pixll = 2
	PREINIT:
		int storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;
		RETVAL = ffppxll(fptr,dtype,fpix,nelem,packND(array,storage_dtype),&status);
	OUTPUT:
		RETVAL
		status

int
ffppxn(fptr, dtype, fpix, nelem, array, nulval, status)
	fitsfile * fptr
	int dtype
	long * fpix
	LONGLONG nelem
	SV * array
	SV * nulval
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_pixnull = 1
		fitsfilePtr::write_pixnull = 2
	PREINIT:
		int storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;
		RETVAL = ffppxn(fptr,dtype,fpix,nelem,packND(array,storage_dtype),(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL), &status);
	OUTPUT:
		RETVAL
		status

int
ffppxnll(fptr, dtype, fpix, nelem, array, nulval, status)
	fitsfile * fptr
	int dtype
	LONGLONG * fpix
	LONGLONG nelem
	SV * array
	SV * nulval
	int status
	ALIAS:
		Astro::FITS::CFITSIO::fits_write_pixnullll = 1
		fitsfilePtr::write_pixnullll = 2
	PREINIT:
		int storage_dtype;
	CODE:
		storage_dtype = dtype;
		if (dtype == TBIT)
			storage_dtype = TLOGICAL;
		RETVAL = ffppxnll(fptr,dtype,fpix,nelem,packND(array,storage_dtype),(nulval!=&PL_sv_undef ? pack1D(nulval,storage_dtype) : NULL), &status);
	OUTPUT:
		RETVAL
		status