diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/tbtables/cfitsio/modkey.c | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/tbtables/cfitsio/modkey.c')
-rw-r--r-- | pkg/tbtables/cfitsio/modkey.c | 1614 |
1 files changed, 1614 insertions, 0 deletions
diff --git a/pkg/tbtables/cfitsio/modkey.c b/pkg/tbtables/cfitsio/modkey.c new file mode 100644 index 00000000..b257eb25 --- /dev/null +++ b/pkg/tbtables/cfitsio/modkey.c @@ -0,0 +1,1614 @@ +/* This file, modkey.c, contains routines that modify, insert, or update */ +/* keywords in a FITS header. */ + +/* The FITSIO software was written by William Pence at the High Energy */ +/* Astrophysic Science Archive Research Center (HEASARC) at the NASA */ +/* Goddard Space Flight Center. */ + +#include <string.h> +/* stddef.h is apparently needed to define size_t */ +#include <ctype.h> +#include <stddef.h> +#include <stdlib.h> +#include "fitsio2.h" +/*--------------------------------------------------------------------------*/ +int ffuky( fitsfile *fptr, /* I - FITS file pointer */ + int datatype, /* I - datatype of the value */ + char *keyname, /* I - name of keyword to write */ + void *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +/* + Update the keyword, value and comment in the FITS header. + The datatype is specified by the 2nd argument. +*/ +{ + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (datatype == TSTRING) + { + ffukys(fptr, keyname, (char *) value, comm, status); + } + else if (datatype == TBYTE) + { + ffukyj(fptr, keyname, (long) *(unsigned char *) value, comm, status); + } + else if (datatype == TSBYTE) + { + ffukyj(fptr, keyname, (long) *(signed char *) value, comm, status); + } + else if (datatype == TUSHORT) + { + ffukyj(fptr, keyname, (long) *(unsigned short *) value, comm, status); + } + else if (datatype == TSHORT) + { + ffukyj(fptr, keyname, (long) *(short *) value, comm, status); + } + else if (datatype == TINT) + { + ffukyj(fptr, keyname, (long) *(int *) value, comm, status); + } + else if (datatype == TUINT) + { + ffukyg(fptr, keyname, (double) *(unsigned int *) value, 0, + comm, status); + } + else if (datatype == TLOGICAL) + { + ffukyl(fptr, keyname, *(int *) value, comm, status); + } + else if (datatype == TULONG) + { + ffukyg(fptr, keyname, (double) *(unsigned long *) value, 0, + comm, status); + } + else if (datatype == TLONG) + { + ffukyj(fptr, keyname, *(long *) value, comm, status); + } + else if (datatype == TFLOAT) + { + ffukye(fptr, keyname, *(float *) value, -7, comm, status); + } + else if (datatype == TDOUBLE) + { + ffukyd(fptr, keyname, *(double *) value, -15, comm, status); + } + else if (datatype == TCOMPLEX) + { + ffukyc(fptr, keyname, (float *) value, -7, comm, status); + } + else if (datatype == TDBLCOMPLEX) + { + ffukym(fptr, keyname, (double *) value, -15, comm, status); + } + else + *status = BAD_DATATYPE; + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyu(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyu(fptr, keyname, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyu(fptr, keyname, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukys(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkys(fptr, keyname, value, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkys(fptr, keyname, value, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukls(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + /* update a long string keyword */ + + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkls(fptr, keyname, value, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkls(fptr, keyname, value, comm, status); + } + return(*status); +}/*--------------------------------------------------------------------------*/ +int ffukyl(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + int value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyl(fptr, keyname, value, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyl(fptr, keyname, value, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyj(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + long value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyj(fptr, keyname, value, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyj(fptr, keyname, value, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyf(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyf(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyf(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukye(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkye(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkye(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyg(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyg(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyg(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyd(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyd(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyd(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukfc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkfc(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkfc(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukyc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkyc(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkyc(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukfm(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkfm(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkfm(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffukym(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmkym(fptr, keyname, value, decim, comm, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffpkym(fptr, keyname, value, decim, comm, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffucrd(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *card, /* I - card string value */ + int *status) /* IO - error status */ +{ + int tstatus; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + tstatus = *status; + + if (ffmcrd(fptr, keyname, card, status) == KEY_NO_EXIST) + { + *status = tstatus; + ffprec(fptr, card, status); + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmrec(fitsfile *fptr, /* I - FITS file pointer */ + int nkey, /* I - number of the keyword to modify */ + char *card, /* I - card string value */ + int *status) /* IO - error status */ +{ + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffmaky(fptr, nkey+1, status); + ffmkey(fptr, card, status); + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmcrd(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *card, /* I - card string value */ + int *status) /* IO - error status */ +{ + char tcard[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgcrd(fptr, keyname, tcard, status) > 0) + return(*status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmnam(fitsfile *fptr, /* I - FITS file pointer */ + char *oldname, /* I - existing keyword name */ + char *newname, /* I - new name for keyword */ + int *status) /* IO - error status */ +{ + char comm[FLEN_COMMENT]; + char value[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, oldname, value, comm, status) > 0) + return(*status); + + ffmkky(newname, value, comm, card, status); /* construct the card */ + ffmkey(fptr, card, status); /* rewrite with new name */ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmcom(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char oldcomm[FLEN_COMMENT]; + char value[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, value, oldcomm, status) > 0) + return(*status); + + ffmkky(keyname, value, comm, card, status); /* construct the card */ + ffmkey(fptr, card, status); /* rewrite with new comment */ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffpunt(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *unit, /* I - keyword unit string */ + int *status) /* IO - error status */ +/* + Write (put) the units string into the comment field of the existing + keyword. This routine uses a local FITS convention (not defined in the + official FITS standard) in which the units are enclosed in + square brackets following the '/' comment field delimiter, e.g.: + + KEYWORD = 12 / [kpc] comment string goes here +*/ +{ + char oldcomm[FLEN_COMMENT]; + char newcomm[FLEN_COMMENT]; + char value[FLEN_VALUE]; + char card[FLEN_CARD]; + char *loc; + size_t len; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, value, oldcomm, status) > 0) + return(*status); + + /* copy the units string to the new comment string if not null */ + if (*unit) + { + strcpy(newcomm, "["); + strncat(newcomm, unit, 45); /* max allowed length is about 45 chars */ + strcat(newcomm, "] "); + len = strlen(newcomm); + len = FLEN_COMMENT - len - 1; /* amount of space left in the field */ + } + else + { + newcomm[0] = '\0'; + len = FLEN_COMMENT - 1; + } + + if (oldcomm[0] == '[') /* check for existing units field */ + { + loc = strchr(oldcomm, ']'); /* look for the closing bracket */ + if (loc) + { + loc++; + while (*loc == ' ') /* skip any blank spaces */ + loc++; + + strncat(newcomm, loc, len); /* concat remainder of comment */ + } + else + { + strncat(newcomm, oldcomm, len); /* append old comment onto new */ + } + } + else + { + strncat(newcomm, oldcomm, len); + } + + ffmkky(keyname, value, newcomm, card, status); /* construct the card */ + ffmkey(fptr, card, status); /* rewrite with new units string */ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyu(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + strcpy(valstring," "); /* create a dummy value string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkys(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + /* NOTE: This routine does not support long continued strings */ + /* It will correctly overwrite an existing long continued string, */ + /* but it will not write a new long string. */ + + char oldval[FLEN_VALUE], valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + int len, keypos; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, oldval, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffs2c(value, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); /* overwrite the previous keyword */ + + keypos = ((((fptr->Fptr)->nextkey) - ((fptr->Fptr)->headstart[(fptr->Fptr)->curhdu])) / 80) + 1; + + /* check if old string value was continued over multiple keywords */ + ffc2s(oldval, valstring, status); /* remove quotes and trailing spaces */ + len = strlen(valstring); + + while (len && valstring[len - 1] == '&') /* ampersand is continuation char */ + { + ffgcnt(fptr, valstring, status); + if (*valstring) + { + ffdrec(fptr, keypos, status); /* delete the continuation */ + len = strlen(valstring); + } + else /* a null valstring indicates no continuation */ + len = 0; + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkls( fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - name of keyword to write */ + char *value, /* I - keyword value */ + char *incomm, /* I - keyword comment */ + int *status) /* IO - error status */ +/* + Modify the value and optionally the comment of a long string keyword. + This routine supports the + HEASARC long string convention and can modify arbitrarily long string + keyword values. The value is continued over multiple keywords that + have the name COMTINUE without an equal sign in column 9 of the card. + This routine also supports simple string keywords which are less than + 69 characters in length. + + This routine is not very efficient, so it should be used sparingly. +*/ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + char comm[FLEN_COMMENT]; + char tstring[FLEN_VALUE], *cptr; + char *longval; + int next, remain, vlen, nquote, nchar, namelen, contin, tstatus = -1; + int nkeys, keypos; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (!incomm || incomm[0] == '&') /* preserve the old comment string */ + { + ffghps(fptr, &nkeys, &keypos, status); /* save current position */ + + if (ffgkls(fptr, keyname, &longval, comm, status) > 0) + return(*status); /* keyword doesn't exist */ + + free(longval); /* don't need the old value */ + + /* move back to previous position to ensure that we delete */ + /* the right keyword in case there are more than one keyword */ + /* with this same name. */ + ffgrec(fptr, keypos - 1, card, status); + } + else + strcpy(comm, incomm); /* copy the input comment string */ + + /* delete the old keyword */ + if (ffdkey(fptr, keyname, status) > 0) + return(*status); /* keyword doesn't exist */ + + ffghps(fptr, &nkeys, &keypos, status); /* save current position */ + + /* now construct the new keyword, and insert into header */ + remain = strlen(value); /* number of characters to write out */ + next = 0; /* pointer to next character to write */ + + /* count the number of single quote characters in the string */ + nquote = 0; + cptr = strchr(value, '\''); /* search for quote character */ + + while (cptr) /* search for quote character */ + { + nquote++; /* increment no. of quote characters */ + cptr++; /* increment pointer to next character */ + cptr = strchr(cptr, '\''); /* search for another quote char */ + } + + cptr = keyname; + while(*cptr == ' ') /* skip over leading spaces in name */ + cptr++; + + /* determine the number of characters that will fit on the line */ + /* Note: each quote character is expanded to 2 quotes */ + + namelen = strlen(cptr); + if (namelen <= 8 && (fftkey(cptr, &tstatus) <= 0) ) + { + /* This a normal 8-character FITS keyword */ + nchar = 68 - nquote; /* max of 68 chars fit in a FITS string value */ + } + else + { + /* This a HIERARCH keyword */ + if (FSTRNCMP(cptr, "HIERARCH ", 9) && + FSTRNCMP(cptr, "hierarch ", 9)) + nchar = 66 - nquote - namelen; + else + nchar = 75 - nquote - namelen; /* don't count 'HIERARCH' twice */ + + } + + contin = 0; + while (remain > 0) + { + strncpy(tstring, &value[next], nchar); /* copy string to temp buff */ + tstring[nchar] = '\0'; + ffs2c(tstring, valstring, status); /* put quotes around the string */ + + if (remain > nchar) /* if string is continued, put & as last char */ + { + vlen = strlen(valstring); + nchar -= 1; /* outputting one less character now */ + + if (valstring[vlen-2] != '\'') + valstring[vlen-2] = '&'; /* over write last char with & */ + else + { /* last char was a pair of single quotes, so over write both */ + valstring[vlen-3] = '&'; + valstring[vlen-1] = '\0'; + } + } + + if (contin) /* This is a CONTINUEd keyword */ + { + ffmkky("CONTINUE", valstring, comm, card, status); /* make keyword */ + strncpy(&card[8], " ", 2); /* overwrite the '=' */ + } + else + { + ffmkky(keyname, valstring, comm, card, status); /* make keyword */ + } + + ffirec(fptr, keypos, card, status); /* insert the keyword */ + + keypos++; /* next insert position */ + contin = 1; + remain -= nchar; + next += nchar; + nchar = 68 - nquote; + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyl(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + int value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffl2c(value, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyj(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + long value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffi2c(value, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyf(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffr2f(value, decim, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkye(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffr2e(value, decim, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyg(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffd2f(value, decim, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyd(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + ffd2e(value, decim, valstring, status); /* convert value to a string */ + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkfc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + strcpy(valstring, "(" ); + ffr2f(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffr2f(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkyc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + strcpy(valstring, "(" ); + ffr2e(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffr2e(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkfm(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + strcpy(valstring, "(" ); + ffd2f(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffd2f(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffmkym(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char oldcomm[FLEN_COMMENT]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, oldcomm, status) > 0) + return(*status); /* get old comment */ + + strcpy(valstring, "(" ); + ffd2e(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffd2e(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + if (!comm || comm[0] == '&') /* preserve the current comment string */ + ffmkky(keyname, valstring, oldcomm, card, status); + else + ffmkky(keyname, valstring, comm, card, status); + + ffmkey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyu(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +/* + Insert a null-valued keyword and comment into the FITS header. +*/ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + strcpy(valstring," "); /* create a dummy value string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikys(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + char *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffs2c(value, valstring, status); /* put quotes around the string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikls( fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - name of keyword to write */ + char *value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +/* + Insert a long string keyword. This routine supports the + HEASARC long string convention and can insert arbitrarily long string + keyword values. The value is continued over multiple keywords that + have the name COMTINUE without an equal sign in column 9 of the card. + This routine also supports simple string keywords which are less than + 69 characters in length. +*/ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + char tstring[FLEN_VALUE], *cptr; + int next, remain, vlen, nquote, nchar, namelen, contin, tstatus = -1; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + /* construct the new keyword, and insert into header */ + remain = strlen(value); /* number of characters to write out */ + next = 0; /* pointer to next character to write */ + + /* count the number of single quote characters in the string */ + nquote = 0; + cptr = strchr(value, '\''); /* search for quote character */ + + while (cptr) /* search for quote character */ + { + nquote++; /* increment no. of quote characters */ + cptr++; /* increment pointer to next character */ + cptr = strchr(cptr, '\''); /* search for another quote char */ + } + + cptr = keyname; + while(*cptr == ' ') /* skip over leading spaces in name */ + cptr++; + + /* determine the number of characters that will fit on the line */ + /* Note: each quote character is expanded to 2 quotes */ + + namelen = strlen(cptr); + if (namelen <= 8 && (fftkey(cptr, &tstatus) <= 0) ) + { + /* This a normal 8-character FITS keyword */ + nchar = 68 - nquote; /* max of 68 chars fit in a FITS string value */ + } + else + { + /* This a HIERARCH keyword */ + if (FSTRNCMP(cptr, "HIERARCH ", 9) && + FSTRNCMP(cptr, "hierarch ", 9)) + nchar = 66 - nquote - namelen; + else + nchar = 75 - nquote - namelen; /* don't count 'HIERARCH' twice */ + + } + + contin = 0; + while (remain > 0) + { + strncpy(tstring, &value[next], nchar); /* copy string to temp buff */ + tstring[nchar] = '\0'; + ffs2c(tstring, valstring, status); /* put quotes around the string */ + + if (remain > nchar) /* if string is continued, put & as last char */ + { + vlen = strlen(valstring); + nchar -= 1; /* outputting one less character now */ + + if (valstring[vlen-2] != '\'') + valstring[vlen-2] = '&'; /* over write last char with & */ + else + { /* last char was a pair of single quotes, so over write both */ + valstring[vlen-3] = '&'; + valstring[vlen-1] = '\0'; + } + } + + if (contin) /* This is a CONTINUEd keyword */ + { + ffmkky("CONTINUE", valstring, comm, card, status); /* make keyword */ + strncpy(&card[8], " ", 2); /* overwrite the '=' */ + } + else + { + ffmkky(keyname, valstring, comm, card, status); /* make keyword */ + } + + ffikey(fptr, card, status); /* insert the keyword */ + + contin = 1; + remain -= nchar; + next += nchar; + nchar = 68 - nquote; + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyl(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + int value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffl2c(value, valstring, status); /* convert logical to 'T' or 'F' */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyj(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + long value, /* I - keyword value */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffi2c(value, valstring, status); /* convert to formatted string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyf(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffr2f(value, decim, valstring, status); /* convert to formatted string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikye(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffr2e(value, decim, valstring, status); /* convert to formatted string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyg(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffd2f(value, decim, valstring, status); /* convert to formatted string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyd(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffd2e(value, decim, valstring, status); /* convert to formatted string */ + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikfc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + strcpy(valstring, "(" ); + ffr2f(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffr2f(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikyc(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + float *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + strcpy(valstring, "(" ); + ffr2e(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffr2e(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikfm(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + + strcpy(valstring, "(" ); + ffd2f(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffd2f(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikym(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + double *value, /* I - keyword value */ + int decim, /* I - no of decimals */ + char *comm, /* I - keyword comment */ + int *status) /* IO - error status */ +{ + char valstring[FLEN_VALUE], tmpstring[FLEN_VALUE]; + char card[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + strcpy(valstring, "(" ); + ffd2e(value[0], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ", "); + ffd2e(value[1], decim, tmpstring, status); /* convert to string */ + strcat(valstring, tmpstring); + strcat(valstring, ")"); + + ffmkky(keyname, valstring, comm, card, status); /* construct the keyword*/ + ffikey(fptr, card, status); /* write the keyword*/ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffirec(fitsfile *fptr, /* I - FITS file pointer */ + int nkey, /* I - position to insert new keyword */ + char *card, /* I - card string value */ + int *status) /* IO - error status */ +{ + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + ffmaky(fptr, nkey, status); /* move to insert position */ + ffikey(fptr, card, status); /* insert the keyword card */ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffikey(fitsfile *fptr, /* I - FITS file pointer */ + char *card, /* I - card string value */ + int *status) /* IO - error status */ +/* + insert a keyword at the position of (fptr->Fptr)->nextkey +*/ +{ + int ii, len, nshift; + long nblocks; + OFF_T bytepos; + char *inbuff, *outbuff, *tmpbuff, buff1[FLEN_CARD], buff2[FLEN_CARD]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + /* reset position to the correct HDU if necessary */ + if (fptr->HDUposition != (fptr->Fptr)->curhdu) + ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status); + + if ( ((fptr->Fptr)->datastart - (fptr->Fptr)->headend) == 80) /* only room for END card */ + { + nblocks = 1; + if (ffiblk(fptr, nblocks, 0, status) > 0) /* add new 2880-byte block*/ + return(*status); + } + + nshift=( (fptr->Fptr)->headend - (fptr->Fptr)->nextkey ) / 80; /* no. keywords to shift */ + + strncpy(buff2, card, 80); /* copy card to output buffer */ + buff2[80] = '\0'; + + len = strlen(buff2); + for (ii=len; ii < 80; ii++) /* fill buffer with spaces if necessary */ + buff2[ii] = ' '; + + for (ii=0; ii < 8; ii++) /* make sure keyword name is uppercase */ + buff2[ii] = toupper(buff2[ii]); + + fftkey(buff2, status); /* test keyword name contains legal chars */ + fftrec(buff2, status); /* test rest of keyword for legal chars */ + + inbuff = buff1; + outbuff = buff2; + + bytepos = (fptr->Fptr)->nextkey; /* pointer to next keyword in header */ + ffmbyt(fptr, bytepos, REPORT_EOF, status); + + for (ii = 0; ii < nshift; ii++) /* shift each keyword down one position */ + { + ffgbyt(fptr, 80, inbuff, status); /* read the current keyword */ + + ffmbyt(fptr, bytepos, REPORT_EOF, status); /* move back */ + ffpbyt(fptr, 80, outbuff, status); /* overwrite with other buffer */ + + tmpbuff = inbuff; /* swap input and output buffers */ + inbuff = outbuff; + outbuff = tmpbuff; + + bytepos += 80; + } + + ffpbyt(fptr, 80, outbuff, status); /* write the final keyword */ + + (fptr->Fptr)->headend += 80; /* increment the position of the END keyword */ + (fptr->Fptr)->nextkey += 80; /* increment the pointer to next keyword */ + + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffdkey(fitsfile *fptr, /* I - FITS file pointer */ + char *keyname, /* I - keyword name */ + int *status) /* IO - error status */ +/* + delete a specified header keyword +*/ +{ + int keypos, len; + char valstring[FLEN_VALUE], comm[FLEN_COMMENT], value[FLEN_VALUE]; + char message[FLEN_ERRMSG]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + if (ffgkey(fptr, keyname, valstring, comm, status) > 0) /* read keyword */ + { + sprintf(message, "Could not find the %s keyword to delete (ffdkey)", + keyname); + ffpmsg(message); + return(*status); + } + + /* calc position of keyword in header */ + keypos = (((fptr->Fptr)->nextkey) - ((fptr->Fptr)->headstart[(fptr->Fptr)->curhdu])) / 80; + + ffdrec(fptr, keypos, status); /* delete the keyword */ + + /* check for string value which may be continued over multiple keywords */ + ffc2s(valstring, value, status); /* remove quotes and trailing spaces */ + len = strlen(value); + + while (len && value[len - 1] == '&') /* ampersand used as continuation char */ + { + ffgcnt(fptr, value, status); + if (*value) + { + ffdrec(fptr, keypos, status); /* delete the keyword */ + len = strlen(value); + } + else /* a null valstring indicates no continuation */ + len = 0; + } + return(*status); +} +/*--------------------------------------------------------------------------*/ +int ffdrec(fitsfile *fptr, /* I - FITS file pointer */ + int keypos, /* I - position in header of keyword to delete */ + int *status) /* IO - error status */ +/* + Delete a header keyword at position keypos. The 1st keyword is at keypos=1. +*/ +{ + int ii, nshift; + OFF_T bytepos; + char *inbuff, *outbuff, *tmpbuff, buff1[81], buff2[81]; + char message[FLEN_ERRMSG]; + + if (*status > 0) /* inherit input status value if > 0 */ + return(*status); + + /* reset position to the correct HDU if necessary */ + if (fptr->HDUposition != (fptr->Fptr)->curhdu) + ffmahd(fptr, (fptr->HDUposition) + 1, NULL, status); + + if (keypos < 1 || + keypos > (fptr->Fptr)->headend - (fptr->Fptr)->headstart[(fptr->Fptr)->curhdu] / 80 ) + return(*status = KEY_OUT_BOUNDS); + + (fptr->Fptr)->nextkey = (fptr->Fptr)->headstart[(fptr->Fptr)->curhdu] + (keypos - 1) * 80; + + nshift=( (fptr->Fptr)->headend - (fptr->Fptr)->nextkey ) / 80; /* no. keywords to shift */ + + if (nshift <= 0) + { + sprintf(message, "Cannot delete keyword number %d. It does not exist.", + keypos); + ffpmsg(message); + return(*status = KEY_OUT_BOUNDS); + } + + bytepos = (fptr->Fptr)->headend - 80; /* last keyword in header */ + + /* construct a blank keyword */ + strcpy(buff2, " "); + strcat(buff2, " "); + inbuff = buff1; + outbuff = buff2; + for (ii = 0; ii < nshift; ii++) /* shift each keyword up one position */ + { + + ffmbyt(fptr, bytepos, REPORT_EOF, status); + ffgbyt(fptr, 80, inbuff, status); /* read the current keyword */ + + ffmbyt(fptr, bytepos, REPORT_EOF, status); + ffpbyt(fptr, 80, outbuff, status); /* overwrite with next keyword */ + + tmpbuff = inbuff; /* swap input and output buffers */ + inbuff = outbuff; + outbuff = tmpbuff; + + bytepos -= 80; + } + + (fptr->Fptr)->headend -= 80; /* decrement the position of the END keyword */ + return(*status); +} + |