summaryrefslogtreecommitdiffstats
path: root/funtools/fitsy/cardins.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/fitsy/cardins.c')
-rw-r--r--funtools/fitsy/cardins.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/funtools/fitsy/cardins.c b/funtools/fitsy/cardins.c
new file mode 100644
index 0000000..59ce7a8
--- /dev/null
+++ b/funtools/fitsy/cardins.c
@@ -0,0 +1,107 @@
+/* Fitsy FITS card insert and delete routines.
+
+ EXAMPLES
++
+ FITSCard here;
+ FITSBuff card;
+
+ #ft_cardkey(&card, "Keyword", 0);
+ #ft_cardseti(&card, 4, NULL);
+
+ /-* Insert a new card "Keyword" after the 4th card.
+ *-/
+ here = #ft_cardins(fits, &card, #ft_cardnth(4));
+
+ /-* Append the same card to the header
+ *-/
+ card = #ft_cardapp(fits, &card);
+
+ /-* Delete the first card.
+ *-/
+ #ft_carddel(fits, here);
++
+ */
+
+#include "xos.h"
+#include "fitsy.h"
+
+/* Insert a #card into a FITS header after #here.
+
+ If #here is NULL #card is inserted before the END card.
+
+ Returns #card;
+ */
+FITSCard ft_cardins(fits, card, here)
+ FITSHead fits; /* FITS header. */
+ FITSCard card; /* FITS card to insert, append or
+ delete. */
+ FITSCard here; /* Insert #card after #here */
+{
+
+ if ( fits == NULL ) return NULL;
+ if ( fits->cards == NULL ) return NULL;
+ if ( card == NULL ) return NULL;
+
+ if ( fits->index ) (void)Free(fits->index);
+
+ if ( fits->ncard+1 > fits->acard ) {
+ int hereoffset = 0;
+
+ if ( here != NULL ) hereoffset = here - fits->cards;
+
+ if ( fits->mem != FT_MALLOC ) return NULL;
+
+ fits->acard += FT_CARDS;
+ /* fits->data = fits->acard * FT_CARDLEN; */
+ (void)ReAlloc(fits->cards, sizeof(FITSBuff) * fits->acard + 1);
+ /* make sure there is a null at the end (EGM) */
+ ((char *)fits->cards)[sizeof(FITSBuff) * fits->acard] = '\0';
+
+ if ( here != NULL ) here = fits->cards + hereoffset;
+
+ ft_cardclr(&fits->cards[fits->acard-FT_CARDS], FT_CARDS);
+ }
+
+ if ( here == NULL ) here = &fits->cards[fits->ncard-2];
+
+ memmove(here+2, here+1
+ , (&fits->cards[fits->ncard-1]-here) * sizeof(FITSBuff));
+ memmove(here+1, card , sizeof(FITSBuff));
+
+ fits->ncard++;
+
+ return (here+1);
+}
+
+/* Append a card to the end of the FITS header.
+
+ Retuns #card.
+ */
+FITSCard ft_cardapp(fits, card)
+ FITSHead fits;
+ FITSCard card;
+{
+ return ft_cardins(fits, card, NULL);
+}
+
+/* Delete a card from a FITS header.
+
+ Returns #card which now points the the card after
+ the one deleted
+ */
+FITSCard ft_carddel(fits, card)
+ FITSHead fits;
+ FITSCard card;
+{
+ if ( fits == NULL ) return NULL;
+ if ( card == NULL ) return NULL;
+
+ (void)Free(fits->index);
+ memmove(card, card+1, (ft_last(fits) - card) * sizeof(FITSBuff));
+ ft_cardclr(ft_last(fits), 1);
+
+ fits->ncard--;
+
+ return card;
+}
+