#if !defined(__TFitsHdr_h)
#define __TFitsHdr_h

short fitsnum(short);
int fitsnum(int);
float fitsnum(float);
double fitsnum(double);
int isFits(char *);

//Binary FITS A-string I-short J-long E-float D-double B-byte(char) ex. 10A 5E

class TFitsHdr{
 private:
 char *hdr[1024],name[128];
 int nlines;
 int FindParam(char *param);
 char *str2upper(char *x);
 char *ParamLine(char *iname, char *com);
 public:
  TFitsHdr(void){nlines=0;};
  TFitsHdr(char *line){makeHdr(line);};
  void makeHdr(char *); 
  ~TFitsHdr(void){Clear();};
  void Clear(void){for(int i=0;i<nlines;i++) if(hdr[i])delete[] hdr[i]; nlines=0;};
  int Assign(TFitsHdr &);
  char *GetLine(int ind){if((ind>=0)&&(ind<nlines)) return hdr[ind];else return 0;};
  int GetSize(void){if(nlines<1) return 0;int j=nlines/36; if(nlines%36) j++; return j*2880;};
  int AddLine(char *);
  int PutHistory(char * com);
  int PutComment(char *com=0);
  int PutParam(char *iname, char param, char *com=0);
  int PutParam(char *iname, char *param, char *com=0);
  int PutParam(char *iname, int param, char *com=0);
  int PutParam(char *iname, float param, char *com=0);
  int PutParam(char *iname, double param, char *com=0);
  int GetParam(char *iname, char &param);
  int GetParam(char *iname, char *param);
  int GetParam(char *iname, int &param);
  int GetParam(char *iname, float &param);
  int GetParam(char *iname, double &param);
  char* WriteToMem(int &size);
  int LoadFromMem(char *mem);
  int GetDataSize(void);
};

class TBinExt{
private:
 int nfield,shift[100],size,nrows,cursor,dcur;
 int form[100][2];//form[#][1]= form size form[#][0]=form type
    // A-string I-short J-long E-float D-double B-byte
 char *data,out[16],*bigdata,str[4000];
 char type[100][16];
 int FindParam(char *);
public:
 TBinExt(void){data=0;size=0;nfield=0;nrows=0;cursor=0;dcur=-1;};
 ~TBinExt(void){if(data) delete[] data;};
 void Clear(void){size=0;nfield=0;nrows=0;cursor=0;
      if(data) delete[] data;data=0;dcur=-1;}
 void SetCursor(int i=0){cursor=i;}
 void SetData(char *x){bigdata=x;dcur=0;};
 void SetNextData(void){if(!bigdata||(dcur>=nrows)||(dcur<0)) return;data=bigdata+dcur*size;dcur++;};
 int LoadNextData(void);
 int LoadForms(TFitsHdr &);
 int ReadData( char *buf, int i=0);
 int GetFieldSize(int);
 int GetFieldSize(char *);
 int GetRows(void){return nrows;};
 char *GetField(int ii, char *c=0);
 char *GetField(char *name, char *c=0);
 char *GetNextField(char *c=0);
 char *ClassInfo(void);
 int SetField(char *name, char *value, int vsize);
 int SetField(char *name, int value);
 int SetField(char *name, short value);
 int SetField(char *name, float value);
 int SetField(char *name, double value);
};
#endif

