diff options
Diffstat (limited to 'funparam.c')
-rw-r--r-- | funparam.c | 804 |
1 files changed, 804 insertions, 0 deletions
diff --git a/funparam.c b/funparam.c new file mode 100644 index 0000000..88e5f4b --- /dev/null +++ b/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; +} |