/* Fitsy FITS header find routines.
 */

#include "xos.h"
#include "fitsy.h"

extern int ft_compare();

/* Find a FITS card in the header.

   If the header has been indexed the index will be used
   otherwise a sequential search will be done.

   Returns
	The card found or NULL if an exact match was not found.
 */
FITSCard ft_headfind(fits, name, n, add)
        FITSHead         fits;		/* The FITS header to search.		*/
	char		*name;		/* Name of the card keyword to search for. */
	int		 n;		/* keyword index number, if is zero no
                                           index number is appended to the keyword.
                                         */
	int		add;		/* If add is true the card will
					   be added to the header if it is
					   not found.
					 */
{
		FITSBuff	key;

	return ft_cardfind(fits, ft_cardkey(&key, name, n), add);
}

/* Index a header for use with #ft_headfind.
 */
void ft_headindex(fits)
	FITSHead	fits;
{
		int	i;

	if ( fits->index ) Free(fits->index);

	Malloc(fits->index, sizeof(FITSCard *) * fits->ncard);
	for ( i = 0; i < fits->ncard; i++ ) {
	    fits->index[i] = (FITSCard) &fits->cards[i];
	}

	qsort(fits->index, fits->ncard, sizeof(FITSCard *), ft_compare);
}

/* Find a FITS card in the header.

   #headfindidx uses an index to find the card.
 */
FITSCard ft_headfindidx(fits, name, n, match)
        FITSHead         fits;
	char		*name;
	int		 n;
	int		*match;		/* Returns true if the card found is
					   an exact match for the keyword
					   requested.
					 */
{
		FITSBuff	key;

	return ft_cardfindidx(fits, ft_cardkey(&key, name, n), match);
}

/* Find a FITS card in the header.

   Find a card in the header using sequential search.

   If the requested card is a FITS indexed keyword and an exact match
   is not found, the highest existing card of that type is returned and
   match is set to 0.
 */
FITSCard ft_headfindseq(fits, name, n, match)
        FITSHead         fits;
	char		*name;
	int		 n;
        int             *match;
{
		FITSBuff	key;

	return ft_cardfindseq(fits, ft_cardkey(&key, name, n), match);
}

