diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2016-10-25 20:57:49 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2016-10-25 20:57:49 (GMT) |
commit | d1c4bf158203c4e8ec29fdeb83fd311e36320885 (patch) | |
tree | 15874534e282f67505ce4af5ba805a1ff70ec43e /funtools/funhead.c | |
parent | e19a18e035dc4d0e8e215f9b452bb9ef6f58b9d7 (diff) | |
parent | 339420dd5dd874c41f6bab5808291fb4036dd022 (diff) | |
download | blt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.zip blt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.tar.gz blt-d1c4bf158203c4e8ec29fdeb83fd311e36320885.tar.bz2 |
Merge commit '339420dd5dd874c41f6bab5808291fb4036dd022' as 'funtools'
Diffstat (limited to 'funtools/funhead.c')
-rw-r--r-- | funtools/funhead.c | 369 |
1 files changed, 369 insertions, 0 deletions
diff --git a/funtools/funhead.c b/funtools/funhead.c new file mode 100644 index 0000000..1ba03f5 --- /dev/null +++ b/funtools/funhead.c @@ -0,0 +1,369 @@ +/* + * Copyright (c) 1999-2005 Smithsonian Astrophysical Observatory + */ + +#include <funtoolsP.h> + +#define MAXROW 8192 +static int maxrow=MAXROW; + +#define BLANK " " + +extern char *optarg; +extern int optind; + +#ifdef ANSI_FUNC +static int +_FunHeadEdit(char *iname, char *oname, char *ename) +#else + static int _FunHeadEdit(iname, oname, ename) + char *iname; + char *oname; + char *ename; +#endif +{ + int i; + int type; + int dim2; + int action=1; + int got=0; + int put=0; + int pgot=0; + char *ev; + char *eptr=NULL; + char ebuf[SZ_LINE]; + char key[SZ_LINE]; + char val[SZ_LINE]; + char com[SZ_LINE]; + char tfile[SZ_LINE]; + char tbuf[SZ_LINE]; + char *buf=NULL; + Fun ifun=NULL; + Fun ofun=NULL; + GIO efd=NULL; + FITSHead header=NULL, theader=NULL; + FITSCard card; + + /* sanity check */ + if( !*iname || !*ename ) return 0; + + /* temp file if no output name is given */ + if( !oname ){ + if( !mkrtemp("fun", ".fits", tfile, SZ_LINE, 0) ){ + gerror(stderr, "can't open temp file for param editing\n"); + } + oname = tfile; + } + + /* open file(s) */ + if( !(efd = gopen(ename, "r")) ){ + gerror(stderr, "can't open edit file: %s\n", ename); + } + if( !(ifun = FunOpen(iname, "rC", NULL)) ){ + gerror(stderr, "can't FunOpen input file (or find extension): %s\n", + iname); + } + if( !(ofun = FunOpen(oname, "w", ifun)) ){ + gerror(stderr, "can't FunOpen output file: %s\n", + oname); + } + + /* we write into the temp space of the output header */ + FunInfoGet(ifun, FUN_HEADER, &header, FUN_TYPE, &type, 0); + FunInfoGet(ofun, FUN_THEADER, &theader, 0); + + /* read and process the edit commands */ + while( ggets (efd, ebuf, SZ_LINE) ){ + eptr = ebuf; + /* skip comments and blank lines */ + if( (*eptr == '#') || (*eptr == '\n') ) continue; + /* skip whitespace */ + while( isspace((int)*eptr) ) eptr++; + /* check for action type */ + switch((int)*eptr){ + case '-': + action = 1; + eptr++; + break; + case '?': + action = 2; + eptr++; + break; + default: + action = 3; + break; + } + /* analyze string */ + pgot = FunTextParam(NULL, eptr, key, val, com, SZ_LINE); + /* key is always upper case */ + cluc(key); + /* process action for this parameter */ + switch(action){ + case 1: + /* delete the parameter */ + if( (card=ft_headfind(theader, key, 0, 0)) && *card->c ){ + ft_headdel(theader, key, 0); + } + else if( (card=ft_headfind(header, key, 0, 0)) && *card->c ){ + ft_headdel(header, key, 0); + } + else{ + fprintf(stdout, "WARNING: %s not found\n", key); + } + break; + case 2: + /* display the parameter */ + if( ((card=ft_headfind(theader, key, 0, 0)) && *card->c) || + ((card=ft_headfind(header, key, 0, 0)) && *card->c) ){ + strncpy(tbuf, card->c, FT_CARDLEN); + tbuf[FT_CARDLEN] = '\0'; + fprintf(stdout, "%s\n", tbuf); + } + else{ + fprintf(stdout, "WARNING: %s not found\n", key); + } + fflush(stdout); + break; + case 3: + /* add or modify the parameter */ + FunTextParamHeader(theader, eptr, key, val, com, pgot); + break; + default: + break; + } + } + if( efd ) gclose(efd); + + /* copy data */ + switch(type){ + case FUN_IMAGE: + case FUN_ARRAY: + FunInfoGet(ifun, FUN_SECT_DIM2, &dim2, 0); + /* set dim2 to 1 for a 1D image */ + if( dim2 == 0 ) dim2 = 1; + /* copy the image from input to output */ + for(i=1; i<=dim2; i++){ + /* extract image row by row */ + if( !(buf = FunImageRowGet(ifun, buf, i, i, NULL)) ) + gerror(stderr, "can't FunImageRowGet: %s\n", iname); + /* write output image row by row */ + if( !FunImageRowPut(ofun, buf, i, i, 0, 0, 0, NULL) ) + gerror(stderr, "can't FunImageRowPut: %s\n", oname); + } + if( buf ) xfree(buf); + break; + case FUN_TABLE: + case FUN_EVENTS: + /* copy the events from input to output */ + while( (ev = FunTableRowGet(ifun, NULL, maxrow, NULL, &got)) ){ + if( (put=FunTableRowPut(ofun, ev, got, 0, NULL)) != got ){ + gerror(stderr, "expected to write %d rows; only wrote %d\n", + got, put); + } + if( ev ) xfree(ev); + } + break; + } + + /* flush and close files */ + if( ofun ) FunClose(ofun); + if( ifun ) FunClose(ifun); + return 0; +} + +#ifdef ANSI_FUNC +static void +usage (char *fname) +#else +static void usage(fname) + char *fname; +#endif +{ + fprintf(stderr, + "usage: %s [-a] [-s] [-t] [-L] iname[ext] [oname ename]\n", + fname); + fprintf(stderr, "optional switches:\n"); + fprintf(stderr, " -a # display all extension headers\n"); + fprintf(stderr, " -s # display 79 chars instead of 80 before the new-line \n"); + fprintf(stderr, " -t # prepend data type char to each line of output\n"); + fprintf(stderr, " -L # output in rdb/starbase list format\n"); + fprintf(stderr, "\n(version: %s)\n", FUN_VERSION); + exit(1); +} + +#ifdef ANSI_FUNC +int +main (int argc, char **argv) +#else +int +main(argc, argv) + int argc; + char **argv; +#endif +{ + int c; + int i; + int args; + int got; + int clen=0; + int extno=0; + int doall=0; + int dotype=0; + int dolist=0; + int rcode=0; + char *s, *t; + char *ind; + char *fmt="%.80s\n"; + char *iname=NULL; + char *oname=NULL; + char *ename=NULL; + char *cname=NULL; + Fun fun; + + /* exit on gio errors */ + if( !getenv("GERROR") ) + setgerror(2); + + /* we want the args in the same order in which they arrived, and + gnu getopt sometimes changes things without this */ + putenv("POSIXLY_CORRECT=true"); + + /* process switch arguments */ + while ((c = getopt(argc, argv, "astL")) != -1){ + switch(c){ + case 'a': + doall = 1; + break; + case 's': + fmt = "%.79s\n"; + break; + case 't': + dotype = 1; + fmt = "%.77s\n"; + break; + case 'L': + dolist = 1; + break; + } + } + + /* get maxrow,if user-specified */ + if( (s=(char *)getenv("FUN_MAXROW")) != NULL ) + maxrow = atoi(s); + + /* check for required arguments */ + args = argc - optind; + if( (args != 1) && (args != 3) ) usage(argv[0]); + + /* input file name */ + iname = xstrdup(argv[optind+0]); + + /* edit expression right here and exit */ + if( args >= 2 ){ + if( args >= 3 ){ + oname = xstrdup(argv[optind+1]); + ename = xstrdup(argv[optind+2]); + } + else{ + ename = xstrdup(argv[optind+1]); + } + rcode = _FunHeadEdit(iname, oname, ename); + goto done; + } + + /* if we are doing all extensions, remove bracket specifcation from base */ + if( doall ){ + if( (ind=strchr(iname, '[')) || (ind=strchr(iname, ',')) ){ + *ind = '\0'; + } + } + + /* set up current name */ + clen = strlen(iname) + SZ_LINE; + cname = xcalloc(clen, sizeof(char)); + + /* set up the first extension */ + if( doall ){ + snprintf(cname, clen, "%s[%d]", iname, extno); + extno++; + } + else{ + strncpy(cname, iname, clen); + } + +again: + /* open the input FITS extension */ + if( !(fun = FunOpen(cname, "r", NULL)) ){ + /* if we are doing all extension, an error means we are done */ + if( doall ) + return(0); + /* not doing all, so if no extension was given, try primary */ + if( !strchr(iname, '[') && !strchr(iname, ',') ){ + snprintf(cname, clen, "%s[0]", iname); + if( !(fun = FunOpen(cname, "r", NULL)) ) + gerror(stderr, "can't FunOpen input file (or find extension): %s\n", + iname); + } + else{ + gerror(stderr, "can't FunOpen input file (or find extension): %s\n", + iname); + } + } + + + if ( dolist ) { + fprintf(stdout, "\n"); + fprintf(stdout, "FITSNAME\t%s\n", iname); + } else { + /* get extension name */ + if( (s=FunParamGets(fun, "EXTNAME", 0, NULL, &got)) ){ + fprintf(stdout, "\t\tExtension: %s", s); + if( (t=FunParamGets(fun, "HDUNAME", 0, NULL, &got)) ) + fprintf(stdout, "/%s", t); + fprintf(stdout, "\n\n"); + if( s ) xfree(s); + if( t ) xfree(t); + } + } + + /* display cards */ + for(i=1; ;i++){ + if( (s = FunParamGets(fun, NULL, i, NULL, &got)) ){ + if( dolist ) { + if( strncmp(s, " ", 8) ) { + /* John did this -- its not my fault */ + fprintf(stdout, "%8.8s\t%s\n", s, + (char *)ft_cardget((FITSCard)s)); + } + } else { + if( dotype ) + fprintf(stdout, "%c ", got); + fprintf(stdout, fmt, s); + } + xfree(s); + } + else{ + break; + } + } + fflush(stdout); + + /* close file */ + FunClose(fun); + + /* if we are processing all extensions, go back for more */ + if( doall ){ + snprintf(cname, clen, "%s[%d]", iname, extno); + extno++; + goto again; + } + +done: + /* clean up */ + if( iname ) xfree(iname); + if( oname ) xfree(oname); + if( cname ) xfree(cname); + if( ename ) xfree(ename); + + return(rcode); +} |