/* Routines to insert, append and delete FITS cards from a header.

   These routines allow FITS cards to be inserted, appended and deleted
   by keyword value.

   The insertion routines format a new card with the supplied keyword and
   value and insert it after indicated card.  The append routines add new
   cards to the end of the header (before the END card).

 */

#include "fitsy.h"

/* Insert a logical value FITS card into a header.
 */
FITSCard ft_headinsl(fits, name, n, lvalue, comm, here)
	FITSHead	 fits;	/* FITS header to insert, append or
				   delete a card.
				 */
	char		*name;	/* Name of the FITS card.		*/
	int		 n;	/* keyword index number, if is zero no
                                   index number is appended to the
				   keyword.
                                 */
	int		 lvalue;/* Logical to format as a FITS value.	*/
	char		*comm;	/* Comment for the new card.		*/
	FITSCard	 here;	/* Insert the new card after this card.	*/
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n, FT_LOGICAL, &lvalue, 0, comm)
	    , here);
}

/* Insert a integer value FITS card into a header.
 */
FITSCard ft_headinsi(fits, name, n, ivalue, comm, here)
	FITSHead	 fits;
	char		*name;
	int		 n;
	int		 ivalue;/* Integer to format as a FITS value.   */
	char		*comm;
	FITSCard	 here;
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n, FT_INTEGER, &ivalue, 0, comm)
	    , here);
}

/* Insert a longlong integer value FITS card into a header.
 */
FITSCard ft_headinsil(fits, name, n, ivalue, comm, here)
	FITSHead	 fits;
	char		*name;
	int		 n;
	longlong	 ivalue;/* Integer to format as a FITS value.   */
	char		*comm;
	FITSCard	 here;
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n, FT_LONG, &ivalue, 0, comm)
	    , here);
}

/* Insert a real value FITS card into a header.
 */
FITSCard ft_headinsr(fits, name, n, dvalue, prec, comm, here)
	FITSHead	 fits;
	char		*name;
	int		 n;
	double		 dvalue;/* Double to format as a FITS value.   	*/
	int		 prec;	/* Precision for the value		*/
	char		*comm;
	FITSCard	 here;
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n,    FT_REAL, &dvalue, prec, comm)
	    , here);
}

/* Insert a string value FITS card into a header.
 */
FITSCard ft_headinss(fits, name, n, svalue, comm, here)
	FITSHead	 fits;
	char		*name;
	int		 n;
	char		*svalue;/* String to format as a FITS value	*/
	char		*comm;
	FITSCard	 here;
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n,  FT_STRING, svalue, 0, comm)
	    , here);
}

/* Insert a raw value FITS card into a header.
 */
FITSCard ft_headinsv(fits, name, n, vvalue, comm, here)
	FITSHead	 fits;
	char		*name;
	int		 n;
	char		*vvalue;/* Raw value to format as a FITS value	*/
	char		*comm;
	FITSCard	 here;
{
	FITSBuff	card;

    return ft_cardins(fits
	    , ft_cardfmt(&card, name, n,  FT_VALUE, vvalue, 0, comm)
	    , here);
}

/* Append a logical value FITS card to a header.
 */
FITSCard ft_headappl(fits, name, n, lvalue, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	int		 lvalue;
	char		*comm;
{
	return ft_headinsl(fits, name, n, lvalue, comm, NULL);
}

/* Append a integer value FITS card to a header.
 */
FITSCard ft_headappi(fits, name, n, ivalue, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	int		 ivalue;
	char		*comm;
{
	return ft_headinsi(fits, name, n, ivalue, comm, NULL);
}

/* Append a 64-bit integer value FITS card to a header.
 */
FITSCard ft_headappil(fits, name, n, ivalue, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	longlong	 ivalue;
	char		*comm;
{
	return ft_headinsil(fits, name, n, ivalue, comm, NULL);
}

/* Append a real value FITS card to a header.
 */
FITSCard ft_headappr(fits, name, n, dvalue, prec, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	double		 dvalue;
	int		 prec;
	char		*comm;
{
	return ft_headinsr(fits, name, n, dvalue, prec, comm, NULL);
}

/* Append a string value FITS card to a header.
 */
FITSCard ft_headapps(fits, name, n, svalue, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	char		*svalue;
	char		*comm;
{
	return ft_headinss(fits, name, n, svalue, comm, NULL);
}


/* Append a raw value FITS card to a header.
 */
FITSCard ft_headappv(fits, name, n, vvalue, comm)
	FITSHead	 fits;
	char		*name;
	int		 n;
	char		*vvalue;
	char		*comm;
{
	return ft_headinsv(fits, name, n, vvalue, comm, NULL);
}


/* Find and delete a card from a FITS header.
 */
FITSCard ft_headdel(fits, name, n)
	FITSHead	 fits;
	char		*name;
	int		 n;
{
    return ft_carddel(fits, ft_headfind(fits, name, n, 0));
}