diff options
Diffstat (limited to 'fitsy/file.C')
-rw-r--r-- | fitsy/file.C | 511 |
1 files changed, 511 insertions, 0 deletions
diff --git a/fitsy/file.C b/fitsy/file.C new file mode 100644 index 0000000..bf7f2b4 --- /dev/null +++ b/fitsy/file.C @@ -0,0 +1,511 @@ +// Copyright (C) 1999-2018 +// Smithsonian Astrophysical Observatory, Cambridge, MA, USA +// For conditions of distribution and use, see copyright notice in "copyright" + +#include <iostream> +#include <sstream> +#include <iomanip> +using namespace std; + +#include "file.h" + +// extention parser +#undef yyFlexLexer +#define yyFlexLexer ffFlexLexer +#include <FlexLexer.h> + +void* fflval; +ffFlexLexer* fflexx; +extern int ffparse(FitsFile*, ffFlexLexer*); + +int fflex(void* vval, ffFlexLexer* ll) +{ + fflval = vval; + fflexx = ll; + return ll ? ll->yylex() : 0; +} + +void fferror(FitsFile* ff, ffFlexLexer* ll, const char* m) +{ + ff->error(m); + const char* cmd = ll ? ll->YYText() : (const char*)NULL; + if (cmd && cmd[0] != '\n') + ff->error(cmd); +} + +// nrrd parser +#undef yyFlexLexer +#define yyFlexLexer nrrdFlexLexer +#include <FlexLexer.h> + +void* nrrdlval; +nrrdFlexLexer* nrrdlexx; +extern int nrrdparse(FitsFile*, nrrdFlexLexer*); + +int nrrdlex(void* vval, nrrdFlexLexer* ll) +{ + nrrdlval = vval; + nrrdlexx = ll; + return ll ? ll->yylex() : 0; +} + +void nrrderror(FitsFile* nrrd, nrrdFlexLexer* ll, const char* m) +{ + nrrd->error(m); + const char* cmd = ll ? ll->YYText() : (const char*)NULL; + if (cmd && cmd[0] != '\n') + nrrd->error(cmd); +} + +// envi parser +#undef yyFlexLexer +#define yyFlexLexer enviFlexLexer +#include <FlexLexer.h> + +void* envilval; +enviFlexLexer* envilexx; +extern int enviparse(FitsFile*, enviFlexLexer*); + +int envilex(void* vval, enviFlexLexer* ll) +{ + envilval = vval; + envilexx = ll; + return ll ? ll->yylex() : 0; +} + +void envierror(FitsFile* envi, enviFlexLexer* ll, const char* m) +{ + envi->error(m); + const char* cmd = ll ? ll->YYText() : (const char*)NULL; + if (cmd && cmd[0] != '\n') + envi->error(cmd); +} + +FitsFile::FitsFile() +{ + primary_ = NULL; + managePrimary_ = 0; + + head_ = NULL; + manageHead_ = 1; + + data_ = NULL; + dataSize_ = 0; + dataSkip_ = 0; + + ext_ = 0; + inherit_ = 0; + byteswap_ = lsb(); + endian_ = BIG; + valid_ = 0; + + pName_ = NULL; + pExt_ = NULL; + pIndex_ = -1; + + pFilter_ = NULL; + pBinX_ = NULL; + pBinY_ = NULL; + pBinZ_ = NULL; + + pBitpix_ =0; + pWidth_ =0; + pHeight_ =0; + pDepth_ =1; + pSkip_ =0; + pArch_ =NATIVE; + + pEncoding_ =RAW; + + pHPXOrder_ =-1; + pHPXSystem_ =-1; + pHPXLayout_ =-1; + pHPXColumn_ =-1; + pHPXQuad_ =-1; + + pCRPIX3_ =1; + pCRVAL3_ =1; + pCDELT3_ =1; + + pcoord_ =0; + pxvalid_ =0; + pxmin_ =0; + pxmax_ =0; + pyvalid_ =0; + pymin_ =0; + pymax_ =0; + pzvalid_ =0; + pzmin_ =0; + pzmax_ =0; + pbvalid_ =0; + pblock_ =1; +} + +FitsFile::~FitsFile() +{ + if (manageHead_ && head_) + delete head_; + + if (managePrimary_ && primary_) + delete primary_; + + if (pName_) + delete [] pName_; + + if (pExt_) + delete [] pExt_; + + if (pFilter_) + delete [] pFilter_; + + if (pBinX_) + delete [] pBinX_; + + if (pBinY_) + delete [] pBinY_; + + if (pBinZ_) + delete [] pBinZ_; +} + +void FitsFile::parse(const char* fn) +{ + if (fn) { + string x(fn); + istringstream str(x); + + valid_ = 1; + ffFlexLexer* ll = new ffFlexLexer(&str); + ffparse(this, ll); + delete ll; + } + + if (!pBinX_ && !pBinY_) { + char *env; + if ((env = getenv("DS9_BINKEY"))) { + string x(env); + istringstream str(x); + + valid_ = 1; + ffFlexLexer* ll = new ffFlexLexer(&str); + ffparse(this, ll); + delete ll; + } + } + + if (!pWidth_ && !pHeight_ && !pBitpix_) { + char *env; + if ((env = getenv("DS9_ARRAY"))) { + string x(env); + istringstream str(x); + + valid_ = 1; + ffFlexLexer* ll = new ffFlexLexer(&str); + ffparse(this, ll); + delete ll; + } + } +} + +void FitsFile::error(const char* m) +{ + valid_ = 0; + // cerr << m << endl; +} + +int FitsFile::findEnd(const char* blk) +{ + for (int j=0; j<FTY_BLOCK; j+=FTY_CARDLEN) + // only check for 4 chars + if (!strncmp("END ", blk+j,4)) + return 1; + + return 0; +} + +void FitsFile::setpName(const char* n) +{ + if (pName_) + delete [] pName_; + + pName_ = dupstr(n); +} + +void FitsFile::setpExt(const char* n) +{ + if (pExt_) + delete [] pExt_; + + pExt_ = dupstr(n); +} + +void FitsFile::setpBinX(const char* x) +{ + if (pBinX_) + delete [] pBinX_; + + pBinX_ = dupstr(x); +} + +void FitsFile::setpBinY(const char* y) +{ + if (pBinY_) + delete [] pBinY_; + + pBinY_ = dupstr(y); +} + +void FitsFile::setpBinZ(const char* z) +{ + if (pBinZ_) + delete [] pBinZ_; + + pBinZ_ = dupstr(z); +} + +void FitsFile::setpFilter(const char* filt) +{ + if (pFilter_) + delete [] pFilter_; + + pFilter_ = dupstr(filt); +} + +Vector FitsFile::getColMinMax(const char* name) +{ + if (isBinTable()) { + FitsTableHDU* hdu = (FitsTableHDU*)(head()->hdu()); + FitsColumn* col = hdu->find(name); + if (col) { + if (!col->hasMinMax()) { + double zmin = DBL_MAX; + double zmax = -DBL_MAX; + int rowlen = hdu->width(); + int numrow = hdu->rows(); + + char* ptr = (char*)data(); + for (int i=0; i<numrow; i++, ptr+=rowlen) { + // for memory models that support internal paging + ptr = page(ptr, rowlen); + + register double z = col->value(ptr); + if (z < zmin) + zmin = z; + if (z > zmax) + zmax = z; + } + // for memory models that support internal paging + resetpage(); + + col->setMin(zmin); + col->setMax(zmax); + return Vector(zmin,zmax); + } + else + return Vector(col->getMin(), col->getMax()); + } + } + return Vector(); +} + +void FitsFile::setColMinMax(const char* name, const Vector& lim) +{ + if (isBinTable()) { + FitsTableHDU* hdu = (FitsTableHDU*)(head()->hdu()); + FitsColumn* col = hdu->find(name); + if (col) { + Vector ll=lim; + col->setMin(ll[0]); + col->setMax(ll[1]); + } + } +} + +Vector FitsFile::getColDim(const char* name) +{ + if (isBinTable()) { + FitsTableHDU* hdu = (FitsTableHDU*)(head()->hdu()); + FitsColumn* col = hdu->find(name); + if (col) { + if (col->hasTLMinTLMax()) { + Vector lim = col->dimension(); + col->setMin(lim[0]); + col->setMax(lim[1]); + return lim; + } + else + return getColMinMax(name); + } + } + + return Vector(); +} + +int FitsFile::validParams() +{ + if (!pWidth_ || !pHeight_ || !pBitpix_) + return 0; + + // check for valid bitpix + switch (pBitpix_) { + case 8: + case 16: + case -16: + case 32: + case 64: + case -32: + case -64: + break; + default: + return 0; + } + + return 1; +} + +void FitsFile::setByteSwap() +{ + switch (pArch_) { + case BIG: + endian_ = pArch_; + byteswap_ = lsb(); + break; + case LITTLE: + endian_ = pArch_; + byteswap_ = !lsb(); + break; + case NATIVE: + endian_ = lsb() ? LITTLE : BIG; + byteswap_ = 0; + break; + } +} + +void FitsFile::parseNRRD(istream& str) +{ + valid_ = 1; + nrrdFlexLexer* ll = new nrrdFlexLexer(&str); + nrrdparse(this, ll); + delete ll; +} + +void FitsFile::parseENVI(istream& str) +{ + valid_ = 1; + enviFlexLexer* ll = new enviFlexLexer(&str); + enviparse(this, ll); + delete ll; +} + +int FitsFile::find(const char* name) +{ + if (head_) + if (head_->find(name)) + return 1; + + if (primary_ && inherit_) + if (primary_->find(name)) + return 1; + + return 0; +} + +int FitsFile::getLogical(const char* name, int def) +{ + if (head_) + if (head_->find(name)) + return head_->getLogical(name,def); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getLogical(name,def); + + return def; +} + +int FitsFile::getInteger(const char* name, int def) +{ + if (head_) + if (head_->find(name)) + return head_->getInteger(name,def); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getInteger(name,def); + + return def; +} + +double FitsFile::getReal(const char* name, double def) +{ + if (head_) + if (head_->find(name)) + return head_->getReal(name,def); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getReal(name,def); + + return def; +} + +void FitsFile::getComplex(const char* name, double* real, double* img, + double rdef, double idef) +{ + if (head_) + if (head_->find(name)) { + head_->getComplex(name, real, img, rdef, idef); + return; + } + + if (primary_ && inherit_) + if (primary_->find(name)) { + primary_->getComplex(name, real, img, rdef, idef); + return; + } + + *real = rdef; + *img = idef; +} + +char* FitsFile::getString(const char* name) +{ + if (head_) + if (head_->find(name)) + return head_->getString(name); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getString(name); + + return NULL; +} + +char* FitsFile::getComment(const char* name) +{ + if (head_) + if (head_->find(name)) + return head_->getComment(name); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getComment(name); + + return NULL; +} + +char* FitsFile::getKeyword(const char* name) +{ + if (head_) + if (head_->find(name)) + return head_->getKeyword(name); + + if (primary_ && inherit_) + if (primary_->find(name)) + return primary_->getKeyword(name); + + return NULL; +} + + + |