#include #include #include #include #include #include #include #include #include #include #include #include "runn.h" #include "FBase.h" using namespace std; namespace iret { FBase::FBase(const char *typ,const char *nam){ int lxn=strlen(typ); type=new char[lxn+1]; tpnm=-1; nmnm=-1; strcpy(type,typ); lxn=strlen(nam); name=new char[lxn+1]; strcpy(name,nam); cflag=0; oflag=0; pflag=get_qflag(); eflag=1; } FBase::FBase(const char *typ,int tpn,const char *nam){ int lxn=strlen(typ); type=new char[lxn+1]; tpnm=tpn; nmnm=-1; strcpy(type,typ); lxn=strlen(nam); name=new char[lxn+1]; strcpy(name,nam); cflag=0; oflag=0; pflag=get_qflag(); eflag=1; } FBase::FBase(const char *typ,const char *nam,const char *pt){ int lxn=strlen(typ); type=new char[lxn+1]; tpnm=-1; nmnm=-1; strcpy(type,typ); lxn=strlen(nam); name=new char[lxn+1]; strcpy(name,nam); cflag=0; oflag=0; pflag=get_qflag(); if(*pt!=':')set_path_name(pt); else set_path_internal(pt+1); } FBase::~FBase(void){ delete [] type; delete [] name; } void FBase::set_type_num(int tn){tpnm=tn;} void FBase::set_name_num(int nn){nmnm=nn;} void FBase::change_type(const char *typ){ if(type!=NULL)delete [] type; int lxn=strlen(typ); type=new char[lxn+1]; strcpy(type,typ); } void FBase::change_name(const char *nam){ if(name!=NULL)delete [] name; int lxn=strlen(nam); name=new char[lxn+1]; strcpy(name,nam); } void FBase::set_name(const char *nam){ if(name!=NULL)delete [] name; int lxn=strlen(nam); name=new char[lxn+1]; strcpy(name,nam); } void FBase::subname(const char *tph,const char *tpl,const char *nm){ char cnam[max_str]; long i=strlen(tpl); strcpy(cnam,tpl); cnam[i]='_'; cnam[i+1]='\0'; strcat(cnam,nm); change_type(tph); change_name(cnam); } void FBase::set_path_internal(const char *pt){ long len; if(pt&&(len=strlen(pt))){ eflag=0; path=new char[len+1]; strcpy(path,pt); } else eflag=1; } void FBase::set_path_name(const char *pa){ long len; if(pa&&(len=strlen(pa))){ eflag=2; pnam=new char[len+1]; strcpy(pnam,pa); } else eflag=1; } void FBase::map_down(FBase *pFb){ pFb->change_type(type); pFb->change_name(name); pFb->set_type_num(tpnm); pFb->set_name_num(nmnm); pFb->pflag=pflag; if(eflag==2)pFb->set_path_name(pnam); else if(!eflag)pFb->set_path_internal(path); } void FBase::map_down_sub(FBase *pFb,const char *subtype){ pFb->subname(type,name,subtype); pFb->set_type_num(tpnm); pFb->set_name_num(nmnm); pFb->pflag=pflag; if(eflag==2)pFb->set_path_name(pnam); else if(!eflag)pFb->set_path_internal(path); } void FBase::get_pathx(char *nam,const char *ch){ char cnam[256]; ifstream fin; if(eflag==2){ strcpy(cnam,"path_"); strcat(cnam,pnam); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path"); fin.open(cnam,ios::in); if(!fin.is_open()){ cout << "Path file for type " << type << " does not exist!" << endl; exit(0); } } fin.getline(nam,256); fin.close(); } else if(eflag){ strcpy(cnam,"path_"); strcat(cnam,type); strcat(cnam,"_"); strcat(cnam,name); strcat(cnam,"."); strcat(cnam,ch); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path_"); strcat(cnam,type); strcat(cnam,"_"); strcat(cnam,name); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path_"); strcat(cnam,type); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path"); fin.open(cnam,ios::in); if(!fin.is_open()){ cout << "Path file for type " << type << " does not exist!" << endl; exit(0); } } } } fin.getline(nam,256); fin.close(); } else { strcpy(nam,path); } if(tpnm<0)strcat(nam,type); else cat_num(type,tpnm,nam); strcat(nam,"_"); if(nmnm<0)strcat(nam,name); else cat_num(name,nmnm,nam); strcat(nam,"."); strcat(nam,ch); } void FBase::get_pathx(char *nam,long n,const char *ch){ char cnam[256],bnam[256]; ifstream fin; if(eflag==2){ strcpy(cnam,"path_"); strcat(cnam,pnam); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path"); fin.open(cnam,ios::in); if(!fin.is_open()){ cout << "Path file for type " << type << " does not exist!" << endl; exit(0); } } fin.getline(nam,256); fin.close(); } else if(eflag){ strcpy(cnam,"path_"); strcat(cnam,type); strcat(cnam,"_"); strcat(cnam,name); strcat(cnam,"."); strcat(cnam,ch); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path_"); strcat(cnam,type); strcat(cnam,"_"); strcat(cnam,name); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path_"); strcat(cnam,type); fin.open(cnam,ios::in); if(!fin.is_open()){ fin.clear(); strcpy(cnam,"path"); fin.open(cnam,ios::in); if(!fin.is_open()){ cout << "Path file for type " << type << " does not exist!" << endl; exit(0); } } } } fin.getline(nam,256); fin.close(); } else { strcpy(nam,path); } if(tpnm<0)strcat(nam,type); else cat_num(type,tpnm,nam); strcat(nam,"_"); strcat(nam,add_num(name,n,bnam)); strcat(nam,"."); strcat(nam,ch); } char *FBase::add_num(const char *ptr,long n,char *buf){ char cnam[100]; long_str(cnam,n); strcpy(buf,ptr); strcat(buf,cnam); return(buf); } char *FBase::cat_num(const char *ptr,long n,char *buf){ char cnam[100]; long_str(cnam,n); strcat(buf,ptr); strcat(buf,cnam); return(buf); } int FBase::Gcom(int sflag){ if((cflag&sflag)&&!(oflag&sflag)){ oflag=oflag|sflag; return(1); } else return(0); } int FBase::Rcom(int sflag){ if((cflag&sflag)&&(oflag&sflag)){ oflag=oflag&(~sflag); return(1); } else return(0); } ifstream *FBase::get_Istr(const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,a); ifstream *pfin=new ifstream(cnam,mode); if(pfin->is_open())return(pfin); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } ofstream *FBase::get_Ostr(const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,a); ofstream *pfout=new ofstream(cnam,mode); if(pfout->is_open())return(pfout); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } fstream *FBase::get_Fstr(const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,a); fstream *pfstr=new fstream(cnam,mode); if(pfstr->is_open())return(pfstr); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } ifstream *FBase::get_Istr(long n,const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,n,a); ifstream *pfin=new ifstream(cnam,mode); if(pfin->is_open())return(pfin); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } ofstream *FBase::get_Ostr(long n,const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,n,a); ofstream *pfout=new ofstream(cnam,mode); if(pfout->is_open())return(pfout); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } fstream *FBase::get_Fstr(long n,const char *a,ios::openmode mode){ char cnam[max_str]; get_pathx(cnam,n,a); fstream *pfstr=new fstream(cnam,mode); if(pfstr->is_open())return(pfstr); else { cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } } void FBase::dst_Istr(ifstream *pfin){ if(!pfin)return; if(!pfin->is_open()){ cout << "File not open!" << endl; exit(0); } delete pfin; } void FBase::dst_Ostr(ofstream *pfout){ if(!pfout)return; if(!pfout->is_open()){ cout << "File not open!" << endl; exit(0); } delete pfout; } void FBase::dst_Fstr(fstream *pfstr){ if(!pfstr)return; if(!pfstr->is_open()){ cout << "File not open!" << endl; exit(0); } delete pfstr; } long FBase::get_Fsiz(const char *a){ if(!Exists(a))return(0); int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size \ determination" << endl;exit(0);} ::close(fld); return(datf.st_size); } long FBase::get_Fsiz(long n,const char *a){ if(!Exists(n,a))return(0); int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,n,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size \ determination" << endl;exit(0);} ::close(fld); return(datf.st_size); } char *FBase::get_Read(const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size \ determination" << endl;exit(0);} ::close(fld); char *ptr=new char[datf.st_size]; ifstream fin(cnam,ios::in); if(!fin.is_open()){ cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } fin.read(ptr,datf.st_size); return(ptr); } char *FBase::get_Read(long n,const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,n,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size \ determination" << endl;exit(0);} ::close(fld); char *ptr=new char[datf.st_size]; ifstream fin(cnam,ios::in); if(!fin.is_open()){ cout << "Error: " << cnam << " failed to open!" << endl; exit(0); } fin.read(ptr,datf.st_size); return(ptr); } char *FBase::get_Mmap(const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} char *ptr=(char*)mmap(0,datf.st_size,PROT_READ,MAP_PRIVATE|MAP_NORESERVE,fld,0); if(ptr==MAP_FAILED){cout << cnam << " failed to map" << endl;exit(0);} ::close(fld); return(ptr); } char *FBase::get_Mmap(long n,const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,n,a); fld=::open(cnam,O_RDONLY); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} char *ptr=(char*)mmap(0,datf.st_size,PROT_READ,MAP_PRIVATE|MAP_NORESERVE,fld,0); if(ptr==MAP_FAILED){cout << cnam << " failed to map" << endl;exit(0);} ::close(fld); return(ptr); } char *FBase::get_Wmap(const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,a); fld=::open(cnam,O_RDWR); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} char *ptr=(char*)mmap(0,datf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fld,0); if(ptr==MAP_FAILED){cout << cnam << " failed to map" << endl;exit(0);} ::close(fld); return(ptr); } char *FBase::get_Wmap(long n,const char *a){ int fld; struct stat datf; char cnam[max_str]; get_pathx(cnam,n,a); fld=::open(cnam,O_RDWR); if(fld<=0){cout << cnam << " failed to open" << endl;exit(0);} if(fstat(fld,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} char *ptr=(char*)mmap(0,datf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fld,0); if(ptr==MAP_FAILED){cout << cnam << " failed to map" << endl;exit(0);} ::close(fld); return(ptr); } void FBase::dst_Mmap(const char *a,char *ptr){ struct stat datf; char cnam[max_str]; if(ptr==NULL){cout << "NULL pointer" << endl;return;} get_pathx(cnam,a); if(stat(cnam,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} if(munmap(ptr,datf.st_size)){cout << cnam << " failed to unmap" << endl;exit(0);} ptr=NULL; } void FBase::dst_Mmap(long n,const char *a,char *ptr){ struct stat datf; char cnam[max_str]; if(ptr==NULL){cout << "NULL pointer" << endl;return;} get_pathx(cnam,n,a); if(stat(cnam,&datf)){cout << cnam << " failed on size determination" << endl;exit(0);} if(munmap(ptr,datf.st_size)){cout << cnam << " failed to unmap" << endl;exit(0);} ptr=NULL; } void FBase::bin_Writ(const char *a,long nm,char *ptr){ ofstream *pfout=get_Ostr(a,ios::out); long k=100000,i=0; while(i+kwrite((char*)ptr,k); i+=k; ptr=ptr+k; } pfout->write((char*)ptr,nm-i); pfout->close(); delete pfout; } void FBase::bin_Writ(long n,const char *a,long nm,char *ptr){ ofstream *pfout=get_Ostr(n,a,ios::out); long k=100000,i=0; while(i+kwrite((char*)ptr,k); i+=k; ptr=ptr+k; } pfout->write((char*)ptr,nm-i); pfout->close(); delete pfout; } int FBase::Exists(const char *a){ char cnam[max_str]; get_pathx(cnam,a); ifstream fin(cnam,ios::in); if(fin.is_open()){ fin.close(); return(1); } else return(0); } int FBase::Exists(long n,const char *a){ char cnam[max_str]; get_pathx(cnam,n,a); ifstream fin(cnam,ios::in); if(fin.is_open()){ fin.close(); return(1); } else return(0); } void FBase::mark(long ct, int ivl, const char *what){ if(pflag&&(ct%ivl==0)){ cout << what << " count=" << ct << endl; } } }