summaryrefslogtreecommitdiffstats
path: root/funtools/funparam.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funparam.c')
-rw-r--r--funtools/funparam.c804
1 files changed, 804 insertions, 0 deletions
diff --git a/funtools/funparam.c b/funtools/funparam.c
new file mode 100644
index 0000000..88e5f4b
--- /dev/null
+++ b/funtools/funparam.c
@@ -0,0 +1,804 @@
+/*
+ * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
+ */
+
+#include <funtoolsP.h>
+
+static int doprim=0;
+static int doraw=0;
+
+#define BLANK_NAME " "
+
+#define MULTI_ENTRY(name,n) (!n && (!strcmp(name, BLANK_NAME) || \
+ !strcmp(name, "HISTORY") || \
+ !strcmp(name, "CONTINUE") || \
+ !strcmp(name, "COMMENT")) )
+
+#ifdef ANSI_FUNC
+static int
+_FunParamGetType(FITSCard card)
+#else
+static int _FunParamGetType(card)
+ FITSCard card;
+#endif
+{
+ FITSType type;
+ char tbuf[SZ_LINE];
+
+ if( ft_cardpar(card, &type, tbuf, NULL, NULL) != NULL ){
+ switch(type){
+ case FT_UNKNOWN:
+ return(FUN_PAR_UNKNOWN);
+ case FT_COMMENT:
+ return(FUN_PAR_COMMENT);
+ case FT_LOGICAL:
+ return(FUN_PAR_LOGICAL);
+ case FT_INTEGER:
+ return(FUN_PAR_INTEGER);
+ case FT_STRING:
+ return(FUN_PAR_STRING);
+ case FT_VALUE:
+ return(FUN_PAR_VALUE);
+ case FT_REAL:
+ return(FUN_PAR_REAL);
+ case FT_COMPLEX:
+ return(FUN_PAR_COMPLEX);
+ default:
+ return(FUN_PAR_UNKNOWN);
+ }
+ }
+ return(0);
+}
+
+/*
+ *
+ * _FunParamUpdateFile -- make a stab at updating a param value
+ *
+ */
+#ifdef ANSI_FUNC
+static int
+_FunParamUpdateFile(Fun fun, FITSCard ocard, FITSCard card)
+#else
+static int _FunParamUpdateFile(fun, ocard, card)
+ Fun fun;
+ FITSCard card;
+ FITSCard ocard;
+#endif
+{
+ off_t pos, opos;
+
+ /* sanity check */
+ if( !ocard ) return 0;
+
+ /* try to update file if necessary */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ pos = fun->headpos + (char *)ocard - (char *)fun->header->cards;
+ if( ((opos=gtell(fun->gio)) >=0) && (gseek(fun->gio, pos, 0) >=0) ){
+ gwrite(fun->gio, (char *)card, sizeof(char), FT_CARDLEN);
+ gseek(fun->gio, opos, 0);
+ return 1;
+ }
+ else
+ return 0;
+ }
+ else
+ return 1;
+}
+
+/*
+ *
+ * FUN_PRIMARY -- set the doprim flag
+ * this is meant to look like one of the funtools defines
+ *
+ */
+#ifdef ANSI_FUNC
+Fun
+FUN_PRIMARY(Fun fun)
+#else
+Fun FUN_PRIMARY(fun)
+ Fun fun;
+#endif
+{
+ doprim = 1;
+ return fun;
+}
+
+/*
+ *
+ * FUN_RAW -- set the doraw flag
+ * this is meant to look like one of the funtools defines
+ *
+ */
+#ifdef ANSI_FUNC
+char *
+FUN_RAW(char *name)
+#else
+char *FUN_RAW(name)
+ char *name;
+#endif
+{
+ doraw = 1;
+ return name;
+}
+
+/*
+ *
+ * FunParamGetb -- get a parameter as a logical
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamGetb(Fun fun, char *name, int n, int defval, int *got)
+#else
+int FunParamGetb(fun, name, n, defval, got)
+ Fun fun;
+ char *name;
+ int n;
+ int defval;
+ int *got;
+#endif
+{
+ FITSCard card;
+ FITSHead hd;
+ int val;
+
+ *got = 0;
+ val = defval;
+ if( doprim || fun->doprim ){
+ if( fun->header->primary )
+ hd = fun->header->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+ val = ft_headgetl(hd, name, n, defval, &card);
+ if( card ){
+ *got = _FunParamGetType(card);
+ }
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return val;
+}
+
+/*
+ *
+ * FunParamGeti -- get a parameter as an integer
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamGeti(Fun fun, char *name, int n, int defval, int *got)
+#else
+int FunParamGeti(fun, name, n, defval, got)
+ Fun fun;
+ char *name;
+ int n;
+ int defval;
+ int *got;
+#endif
+{
+ FITSCard card;
+ FITSHead hd;
+ int val;
+
+ *got = 0;
+ val = defval;
+ if( doprim || fun->doprim ){
+ if( fun->header->primary )
+ hd = fun->header->primary;
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ val = ft_headgeti(hd, name, n, defval, &card);
+ if( card ){
+ *got = _FunParamGetType(card);
+ }
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return val;
+}
+
+/*
+ *
+ * FunParamGetl -- get a parameter as a longlong
+ *
+ */
+#ifdef ANSI_FUNC
+longlong
+FunParamGetl(Fun fun, char *name, int n, longlong defval, int *got)
+#else
+longlong FunParamGetl(fun, name, n, defval, got)
+ Fun fun;
+ char *name;
+ int n;
+ longlong defval;
+ int *got;
+#endif
+{
+ FITSCard card;
+ FITSHead hd;
+ int val;
+
+ *got = 0;
+ val = defval;
+ if( doprim || fun->doprim ){
+ if( fun->header->primary )
+ hd = fun->header->primary;
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ val = ft_headgetil(hd, name, n, defval, &card);
+ if( card ){
+ *got = _FunParamGetType(card);
+ }
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return val;
+}
+
+/*
+ *
+ * FunParamGetd -- get a parameter as a double float
+ *
+ */
+#ifdef ANSI_FUNC
+double
+FunParamGetd(Fun fun, char *name, int n, double defval, int *got)
+#else
+double FunParamGetd(fun, name, n, defval, got)
+ Fun fun;
+ char *name;
+ int n;
+ double defval;
+ int *got;
+#endif
+{
+ FITSCard card;
+ FITSHead hd;
+ double val;
+
+ *got = 0;
+ val = defval;
+ if( doprim || fun->doprim ){
+ if( fun->header->primary )
+ hd = fun->header->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ val = ft_headgetr(hd, name, n, defval, &card);
+ if( card ){
+ *got = _FunParamGetType(card);
+ }
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return val;
+}
+
+/*
+ *
+ * FunParamGets -- get a parameter as a string
+ *
+ */
+#ifdef ANSI_FUNC
+char *
+FunParamGets(Fun fun, char *name, int n, char *defval, int *got)
+#else
+char *FunParamGets(fun, name, n, defval, got)
+ Fun fun;
+ char *name;
+ int n;
+ char * defval;
+ int *got;
+#endif
+{
+ FITSCard card;
+ FITSHead hd;
+ char tbuf[FT_CARDLEN+1];
+ char *val;
+
+ *got = 0;
+ if( doprim || fun->doprim ){
+ if( fun->header->primary )
+ hd = fun->header->primary;
+ else
+ goto dodef;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto dodef;
+ }
+
+ if( name && *name ){
+ val = ft_headgets(hd, name, n, defval, &card);
+ if( doraw || fun->doraw ){
+ if( val ) xfree(val);
+ if( card && *card->c ){
+ strncpy(tbuf, card->c, FT_CARDLEN);
+ tbuf[FT_CARDLEN] = '\0';
+ val = xstrdup(tbuf);
+ }
+ else{
+ goto dodef;
+ }
+ }
+ }
+ else{
+ if( n > 0 ){
+ card = ft_cardnth(hd, n);
+ if( card && *card->c ){
+ strncpy(tbuf, card->c, FT_CARDLEN);
+ tbuf[FT_CARDLEN] = '\0';
+ val = xstrdup(tbuf);
+ }
+ else
+ goto dodef;
+ }
+ else{
+ goto dodef;
+ }
+ }
+ if( card ){
+ *got = _FunParamGetType(card);
+ }
+ doprim = 0;
+ doraw = 0;
+ return val;
+
+dodef:
+ *got = 0;
+ doprim = 0;
+ doraw = 0;
+ if( defval && *defval )
+ val = xstrdup(defval);
+ else
+ val = NULL;
+ return val;
+}
+
+/*
+ *
+ * FunParamPutb -- set a logical parameter value
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamPutb(Fun fun, char *name, int n, int value, char *comm,
+ int append)
+#else
+int FunParamPutb(fun, name, n, value, comm, append)
+ Fun fun;
+ char *name;
+ int n;
+ int value;
+ char *comm;
+ int append;
+#endif
+{
+ FITSCard card=NULL, ocard=NULL, tcard=NULL;
+ FITSHead hd;
+ int got;
+ int ip;
+ char tbuf[SZ_LINE], tbuf2[SZ_LINE];
+
+ got = -1;
+ if( !name ) name = BLANK_NAME;
+ if( doprim || fun->doprim ){
+ if( fun->primary )
+ hd = fun->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ /* see if we have to update file (if we already have written this param) */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ /* look for the exact card */
+ ocard=ft_headfind(hd, name, n, 0);
+ /* look for a blank placeholder card whose value is the card name */
+ if( !ocard && (append == 2) ){
+ if( n != 0 )
+ snprintf(tbuf2, SZ_LINE-1, "%s%d", name, n);
+ else
+ strncpy(tbuf2, name, SZ_LINE-1);
+ for(tcard=hd->cards; tcard!=&(hd->cards[hd->ncard]); tcard++){
+ if( !strncmp((*tcard).c, BLANK_NAME, 8) ){
+ ip = 0;
+ if( word((*tcard).c, tbuf, &ip) && !strcasecmp(tbuf, tbuf2) ){
+ ocard = tcard;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* set parameter value */
+ if( MULTI_ENTRY(name, n) )
+ card = ft_headappl(hd, name, n, value, comm);
+ else
+ card = ft_headsetl(hd, name, n, value, comm, append);
+ /* so far, so good */
+ if( card ) got = 1;
+
+ /* update file if necessary */
+ if( ocard && card ) got = _FunParamUpdateFile(fun, ocard, card);
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return got;
+}
+
+/*
+ *
+ * FunParamPuti -- set an integer parameter value
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamPuti(Fun fun, char *name, int n, int value, char *comm, int append)
+#else
+int FunParamPuti(fun, name, n, value, comm, append)
+ Fun fun;
+ char *name;
+ int n;
+ int value;
+ char *comm;
+ int append;
+#endif
+{
+ FITSCard card=NULL, ocard=NULL, tcard=NULL;
+ FITSHead hd;
+ int got;
+ int ip;
+ char tbuf[SZ_LINE], tbuf2[SZ_LINE];
+
+ got = -1;
+ if( !name ) name = BLANK_NAME;
+ if( doprim || fun->doprim ){
+ if( fun->primary )
+ hd = fun->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ /* see if we have to update file (if we already have written this param) */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ /* look for the exact card */
+ ocard=ft_headfind(hd, name, n, 0);
+ /* look for a blank placeholder card whose value is the card name */
+ if( !ocard && (append == 2) ){
+ if( n != 0 )
+ snprintf(tbuf2, SZ_LINE-1, "%s%d", name, n);
+ else
+ strncpy(tbuf2, name, SZ_LINE-1);
+ for(tcard=hd->cards; tcard!=&(hd->cards[hd->ncard]); tcard++){
+ if( !strncmp((*tcard).c, BLANK_NAME, 8) ){
+ ip = 0;
+ if( word((*tcard).c, tbuf, &ip) && !strcasecmp(tbuf, tbuf2) ){
+ ocard = tcard;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* set parameter value */
+ if( MULTI_ENTRY(name, n) )
+ card = ft_headappi(hd, name, n, value, comm);
+ else
+ card = ft_headseti(hd, name, n, value, comm, append);
+ /* so far, so good */
+ if( card ) got = 1;
+
+ /* update file if necessary */
+ if( ocard && card ) got = _FunParamUpdateFile(fun, ocard, card);
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return got;
+}
+
+/*
+ *
+ * FunParamPutl -- set a integer64 parameter value
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamPutl(Fun fun, char *name, int n, longlong value, char *comm, int append)
+#else
+int FunParamPutl(fun, name, n, value, comm, append)
+ Fun fun;
+ char *name;
+ int n;
+ longlong value;
+ char *comm;
+ int append;
+#endif
+{
+ FITSCard card=NULL, ocard=NULL, tcard=NULL;
+ FITSHead hd;
+ int got;
+ int ip;
+ char tbuf[SZ_LINE], tbuf2[SZ_LINE];
+
+ got = -1;
+ if( !name ) name = BLANK_NAME;
+ if( doprim || fun->doprim ){
+ if( fun->primary )
+ hd = fun->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ /* see if we have to update file (if we already have written this param) */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ /* look for the exact card */
+ ocard=ft_headfind(hd, name, n, 0);
+ /* look for a blank placeholder card whose value is the card name */
+ if( !ocard && (append == 2) ){
+ if( n != 0 )
+ snprintf(tbuf2, SZ_LINE-1, "%s%d", name, n);
+ else
+ strncpy(tbuf2, name, SZ_LINE-1);
+ for(tcard=hd->cards; tcard!=&(hd->cards[hd->ncard]); tcard++){
+ if( !strncmp((*tcard).c, BLANK_NAME, 8) ){
+ ip = 0;
+ if( word((*tcard).c, tbuf, &ip) && !strcasecmp(tbuf, tbuf2) ){
+ ocard = tcard;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* set parameter value */
+ if( MULTI_ENTRY(name, n) )
+ card = ft_headappil(hd, name, n, value, comm);
+ else
+ card = ft_headsetil(hd, name, n, value, comm, append);
+ /* so far, so good */
+ if( card ) got = 1;
+
+ /* update file if necessary */
+ if( ocard && card ) got = _FunParamUpdateFile(fun, ocard, card);
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return got;
+}
+
+/*
+ *
+ * FunParamPutd -- set a double parameter value
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamPutd(Fun fun, char *name, int n, double value, int prec,
+ char *comm, int append)
+#else
+int FunParamPutd(fun, name, n, value, prec, comm, append)
+ Fun fun;
+ char *name;
+ int n;
+ double value;
+ int prec;
+ char *comm;
+ int append;
+#endif
+{
+ FITSCard card=NULL, ocard=NULL, tcard=NULL;
+ FITSHead hd;
+ int got;
+ int ip;
+ char tbuf[SZ_LINE], tbuf2[SZ_LINE];
+
+ got = -1;
+ if( !name ) name = BLANK_NAME;
+ if( doprim || fun->doprim ){
+ if( fun->primary )
+ hd = fun->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ /* see if we have to update file (if we already have written this param) */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ /* look for the exact card */
+ ocard=ft_headfind(hd, name, n, 0);
+ /* look for a blank placeholder card whose value is the card name */
+ if( !ocard && (append == 2) ){
+ if( n != 0 )
+ snprintf(tbuf2, SZ_LINE-1, "%s%d", name, n);
+ else
+ strncpy(tbuf2, name, SZ_LINE-1);
+ for(tcard=hd->cards; tcard!=&(hd->cards[hd->ncard]); tcard++){
+ if( !strncmp((*tcard).c, BLANK_NAME, 8) ){
+ ip = 0;
+ if( word((*tcard).c, tbuf, &ip) && !strcasecmp(tbuf, tbuf2) ){
+ ocard = tcard;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* set parameter value */
+ if( MULTI_ENTRY(name, n) )
+ card = ft_headappr(hd, name, n, value, prec, comm);
+ else
+ card = ft_headsetr(hd, name, n, value, prec, comm, append);
+ /* so far, so good */
+ if( card ) got = 1;
+
+ /* update file if necessary */
+ if( ocard && card ) got = _FunParamUpdateFile(fun, ocard, card);
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return got;
+}
+
+/*
+ *
+ * FunParamPuts -- set a string parameter value
+ *
+ */
+#ifdef ANSI_FUNC
+int
+FunParamPuts(Fun fun, char *name, int n, char *value, char *comm,
+ int append)
+#else
+int FunParamPuts(fun, name, n, value, comm, append)
+ Fun fun;
+ char *name;
+ int n;
+ char *value;
+ char *comm;
+ int append;
+#endif
+{
+ FITSCard card=NULL, ocard=NULL, tcard=NULL;
+ FITSHead hd;
+ int got;
+ int ip;
+ char tbuf[SZ_LINE], tbuf2[SZ_LINE];
+
+ got = -1;
+ if( !name ) name = BLANK_NAME;
+ if( doprim || fun->doprim ){
+ if( fun->primary )
+ hd = fun->primary;
+ else
+ goto done;
+ }
+ else{
+ if( fun->header )
+ hd = fun->header;
+ else if( fun->theader )
+ hd = fun->theader;
+ else
+ goto done;
+ }
+
+ /* see if we have to update file (if we already have written this param) */
+ if( (fun->ops & OP_WRHEAD) && (fun->headpos >=0) ){
+ /* look for the exact card */
+ ocard=ft_headfind(hd, name, n, 0);
+ /* look for a blank placeholder card whose value is the card name */
+ if( !ocard && (append == 2) ){
+ if( n != 0 )
+ snprintf(tbuf2, SZ_LINE-1, "%s%d", name, n);
+ else
+ strncpy(tbuf2, name, SZ_LINE-1);
+ for(tcard=hd->cards; tcard!=&(hd->cards[hd->ncard]); tcard++){
+ if( !strncmp((*tcard).c, BLANK_NAME, 8) ){
+ ip = 0;
+ if( word((*tcard).c, tbuf, &ip) && !strcasecmp(tbuf, tbuf2) ){
+ ocard = tcard;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* set parameter value */
+ if( MULTI_ENTRY(name, n) )
+ card = ft_headapps(hd, name, n, value, comm);
+ else
+ card = ft_headsets(hd, name, n, value, comm, append);
+ /* so far, so good */
+ if( card ) got = 1;
+
+ /* update file if necessary */
+ if( ocard && card ) got = _FunParamUpdateFile(fun, ocard, card);
+
+done:
+ doprim = 0;
+ doraw = 0;
+ return got;
+}