/*--------------------------------------------------------------------------*/
int ffcpfl(fitsfile *infptr,    /* I - FITS file pointer to input file  */
           fitsfile *outfptr,   /* I - FITS file pointer to output file */
           int previous,        /* I - copy any previous HDUs?   */
           int current,         /* I - copy the current HDU?     */
           int following,       /* I - copy any following HDUs?   */
           int *status)         /* IO - error status     */
/*
  copy all or part of the input file to the output file.
*/
{
    int hdunum, ii;

    if (*status > 0)
        return(*status);

    if (infptr == outfptr)
        return(*status = SAME_FILE);

    ffghdn(infptr, &hdunum);

    if (previous) {   /* copy any previous HDUs */
        for (ii=1; ii < hdunum; ii++) {
            ffmahd(infptr, ii, NULL, status);
            ffcopy(infptr, outfptr, 0, status);
        }
    }

    if (current && (*status <= 0) ) {  /* copy current HDU */
        ffmahd(infptr, hdunum, NULL, status);
        ffcopy(infptr, outfptr, 0, status);
    }

    if (following && (*status <= 0) ) { /* copy any remaining HDUs */
        ii = hdunum + 1;
        while (1)
        { 
            if (ffmahd(infptr, ii, NULL, status) ) {
                 /* reset expected end of file status */
                 if (*status == END_OF_FILE)
                    *status = 0;
                 break;
            }

            if (ffcopy(infptr, outfptr, 0, status))
                 break;  /* quit on unexpected error */

            ii++;
        }
    }

    ffmahd(infptr, hdunum, NULL, status);  /* restore initial position */
    return(*status);
}
Exemple #2
0
/* process this command */
static int ProcessCmd(char *cmd, char **args, int narg, int node, int tty)
{
  char tbuf[SZ_LINE];
  Finfo finfo, tfinfo;
#if HAVE_CFITSIO
  int xlims[2], ylims[2], bin, got, hdutype, hdunum, ncard;
  int status=0, tstatus=0;
  int dims[2];
  double cens[2];
  char extname[FLEN_CARD];
  char *cols[2] = {"X", "Y"};
  char *ofile="stdout";
  char *section=NULL;
  char *filter=NULL;
  char *slice=NULL;
  char *cardstr=NULL;
  void *tcens=NULL;
  fitsfile *ifptr, *ofptr, *tfptr;
#endif
  switch(*cmd){
  case 'f':
    if( !strcmp(cmd, "fitsFile") ){
      if( narg ){
	if( !(tfinfo=FinfoLookup(args[0])) ){
	  fprintf(stderr, NOIMAGE, args[0]);
	  return 1;
	}
      } else if( !(tfinfo=FinfoGetCurrent()) ){
	fprintf(stderr, NOFINFO, cmd);
	return 1;
      }
      if( tfinfo->fitsfile ){
	if( node ) fprintf(stdout, "fitsFile\r");
	fprintf(stdout, "%s %s\n", tfinfo->fname, tfinfo->fitsfile);
	fflush(stdout);
      }
      return 0;
    }
    break;
    break;
  case 'i':
    if( !strcmp(cmd, "image") ){
      if( !narg ){
	fprintf(stderr, WRONGARGS, cmd, 1, 0);
	return 1;
      }
      /* new image */
      if( !(finfo = FinfoNew(args[0])) ){
	return 1;
      }
      /* make it current */
      FinfoSetCurrent(finfo);
      if( node ) fprintf(stdout, "image\r");
      /* return the FITS file name, if possible */
      fprintf(stdout, "%s %s\n",
	      finfo->fname, finfo->fitsfile ? finfo->fitsfile : "?");
      fflush(stdout);
      return 0;
    } else if( !strcmp(cmd, "image_") ){
      if( !narg ){
	fprintf(stderr, WRONGARGS, cmd, 1, 0);
	return 1;
      }
      /* new image */
      if( !(finfo = FinfoNew(args[0])) ){
	return 1;
      }
      /* make it current */
      FinfoSetCurrent(finfo);
      /* no output! */
      return 0;
    } else if( !strcmp(cmd, "imsection") ){
#if HAVE_CFITSIO
      if( !(finfo=FinfoGetCurrent()) ){
	fprintf(stderr, NOFINFO, cmd);
	return 1;
      }
      if( narg < 2 ){
	fprintf(stderr, WRONGARGS2, cmd, 2);
	return 1;
      }
      ifptr = openFITSFile(finfo->fitsfile, READONLY, EXTLIST, &hdutype,
			   &status);
      if( status ){
	fprintf(stderr, "ERROR: can't open FITS file '%s'\n", finfo->fitsfile);
	return 1;
      }
      /* process args */
      ofile = args[0];
      section = args[1];
      if( narg >= 3 && args[2] ){
	filter = args[2];
      }
      if( narg >= 4 && args[3] ){
	slice = args[3];
      }
      if( !section || !(got = parseSection(ifptr, hdutype, section,
					   xlims, ylims, dims, cens, &bin)) ){
	fprintf(stderr,
		"ERROR: can't parse section for '%s' [%s]\n",
		finfo->fitsfile, (args && args[0]) ? args[0] : "NONE");
	return 1;
      }
      /* output image */
      fits_create_file(&ofptr, ofile, &status);
      if( status ){
	fits_get_errstatus(status, tbuf);
	fprintf(stderr,
		"ERROR: can't open output FITS file to section '%s' [%s]\n",
		finfo->fitsfile, tbuf);
	return 1;
      }
      switch(hdutype){
      case IMAGE_HDU:
	/* image: let cfitsio make a section */
	if( copyImageSection(ifptr, ofptr, dims, cens, bin, slice, &status) ){
	  fits_get_errstatus(status, tbuf);
	  fprintf(stderr,
		  "ERROR: can't copy image section for '%s' [%s]\n",
		  finfo->fitsfile, tbuf);
	  return 1;
	}
	break;
      default:
	/* table: let jsfitsio create an image section by binning the table */
	tfptr = filterTableToImage(ifptr, filter, cols, dims, cens, 1, &status);
	if( status ){
	  fits_get_errstatus(status, tbuf);
	  fprintf(stderr,
		  "ERROR: can't create image from table for '%s' [%s]\n",
		  finfo->fitsfile, tbuf);
	  return 1;
	}
	fits_read_key(tfptr, TSTRING, "CTYPE1", tbuf, NULL, &status);
	if( status == 0 ){
	  if( strstr(tbuf, "--HPX") || strstr(tbuf, "--hpx") ){
	    tcens = cens;
	  }
	}
	status = 0;

	/* copy section to new image */
	if( copyImageSection(tfptr, ofptr, dims, tcens, bin, NULL, &status) ){
	  fits_get_errstatus(status, tbuf);
	  fprintf(stderr,
		  "ERROR: can't copy image section for '%s' [%s]\n",
		  finfo->fitsfile, tbuf);
	  return 1;
	}
	tstatus = 0;
	closeFITSFile(tfptr, &tstatus);
	break;
      }
      if( status ){
	fits_get_errstatus(status, tbuf);
	fprintf(stderr,
		"ERROR: can't create section FITS file for '%s' [%s]\n",
		finfo->fitsfile, tbuf);
	closeFITSFile(ofptr, &status);
	return 1;
      }
      // return a json object with info about original data
      fprintf(stdout, "{\"file\":\"%s\"", finfo->fitsfile);
      fprintf(stdout, ",\"type\":%d", hdutype);
      ffghdn(ifptr, &hdunum);
      fprintf(stdout, ",\"extnum\":%d", hdunum-1);
      tstatus=0;
      ffgky(ifptr, TSTRING, "EXTNAME", extname, NULL, &tstatus);
      if( !tstatus ){
	fprintf(stdout, ",\"extname\":\"%s\"", extname);
      }
      fprintf(stdout, ",\"hdus\":");
      _listhdu(finfo->fitsfile, NULL);
      tstatus=0;
      getHeaderToString(ifptr, &cardstr, &ncard, &tstatus);
      if( cardstr ){
	fprintf(stdout, ",\"ncard\":%d",ncard);
	fprintf(stdout, ",\"cardstr\":\"%s\"",cardstr);
	free(cardstr);
      }
      fprintf(stdout, "}\n");
      fflush(stdout);
      tstatus=0;
      closeFITSFile(ifptr, &tstatus);
      tstatus=0;
      closeFITSFile(ofptr, &tstatus);
      return 0;
#else
      fprintf(stderr,
	      "ERROR: for section support, build js9helper with cfitsio\n");
      return 1;
#endif
    } else if( !strcmp(cmd, "info") ){
      if( tty ){
	if( !(finfo=FinfoGetCurrent()) ){
	  fprintf(stderr, NOFINFO, cmd);
	  return 1;
	}
	/* make sure we have a wcs */
	fprintf(stdout, "fname:\t%s\n", finfo->fname);
	fprintf(stdout, "fits:\t%s\n", finfo->fitsfile?finfo->fitsfile:"N/A");
	fflush(stdout);
      }
      return 0;
    }
    break;
  case 'l':
    /* list all images */
    if( !strcmp(cmd, "list") ){
      FinfoList(stdout);
      return 0;
#if HAVE_CFITSIO
    } else if( !strcmp(cmd, "listhdus") ){
      if( !(finfo=FinfoGetCurrent()) ){
	fprintf(stderr, NOFINFO, cmd);
	return 1;
      }
      _listhdu(finfo->fitsfile, NULL);
      fflush(stdout);
      return 0;
#endif
    }
    break;
  case 's':
    if( !strcmp(cmd, "setDataPath") ){
      if( narg ){
	setenv("JS9_DATAPATH", args[0], 1);
	if( node ) fprintf(stdout, "setDataPath\r");
	fprintf(stdout, "%s\n", getenv("JS9_DATAPATH"));
	fflush(stdout);
      } else {
	fprintf(stderr, WRONGARGS, cmd, 1, 0);
	return 1;
      }
      return 0;
    }
    break;
  case 'u':
    if( !strcmp(cmd, "unimage") ){
      if( !narg ){
	fprintf(stderr, WRONGARGS, cmd, 1, 0);
	return 1;
      }
      /* close this image */
      FinfoFree(args[0]);
      return 0;
    }
    break;
  case '#':
  case '\0':
    return 0;
  default:
    break;
  }
  /* if we reached here, we did not recognize the command */
  fprintf(stderr, "ERROR: unknown command '%s'\n", cmd);
  /* return the news */
  return 2;
}