#ifndef __cstring #define __cstring #include #if defined(G4USE_NAMESPACE) using std::string; #endif #ifndef G4USE_OLDSTL #include #else #include #endif #include "rw/defs.h" #if defined(__KCC) #include #define std_string std::string #define std_istream std::istream #define std_ws std::ws #else #define std_string string #define std_istream istream #define std_ws ws #endif #if defined(WIN32) #define strcasecmp _stricmp #endif class RWCString; class RWCSubString { public: inline RWCSubString(const RWCSubString&); inline RWCSubString& operator=(const char*); inline RWCSubString& operator=(const RWCString&s); inline RWCSubString& operator=(const RWCSubString&s); inline char& operator()(size_t i); inline char operator()(size_t i) const; inline char& operator[](size_t i); inline char operator[](size_t i) const; size_t length() const{return extent;} size_t start() const{return mystart;} //void toLower(); //void toUpper(); // For detecting null substrings: RWBoolean isNull() const {return extent==0 ? true : false;} int operator!() const {return extent==0 ? 1 : 0;} inline RWBoolean operator==(RWCString) const; inline RWBoolean operator==(const char*) const; inline RWBoolean operator!=(RWCString) const; inline RWBoolean operator!=(const char*) const; private: RWCSubString(RWCString&str,size_t s,size_t e): mystring(&str),mystart(s),extent(e){} RWCString* mystring; size_t mystart; size_t extent; friend class RWCString; }; //#define std class RWCString : public std_string { public: enum caseCompare { exact, ignoreCase }; enum stripType { leading, trailing, both }; inline RWCString ( const char * ); RWCString ( char c ) { char str[2]; str[0]=c; str[1]='\0'; std_string::operator=(str); } RWCString (){} RWCString ( const RWCString& s):std_string(s){} RWCString( const RWCSubString&s ):std_string(*(s.mystring),s.mystart,s.extent){} RWCString ( const std_string s ):std_string(s){} RWCString& operator=(const RWCString&s) { std_string::operator=(s); return *this; } RWCString& operator=(const std_string&s) { std_string::operator=(s); return *this; } RWCString& operator=(const char* s) { std_string::operator=(s); return *this; } virtual ~RWCString (){} inline char operator () (size_t) const; char& operator () (size_t i){return std_string::operator[](i);} int compareTo(const char*s,caseCompare mode=exact) { //GB:OSF1-cxx if(mode=exact) if(mode==exact) return strcmp(c_str(),s); else return strcasecmp(c_str(),s); } int compareTo(const RWCString&s,caseCompare mode=exact) { //GB:OSF1-cxx if(mode=exact) if(mode==exact) return strcmp(data(),s.data()); else return strcasecmp(data(),s.data()); } RWCString& operator+=(const RWCSubString&s) { RWCString tmp(s); std_string::operator+=(tmp); return *this; } RWCString& operator+=(const char*s) { std_string::operator+=(s); return *this; } RWCString& operator+=(const std_string &s) { std_string::operator+=(s); return *this; } RWCString& operator+=(const char &c) { std_string::operator+=(c); return *this; } RWBoolean operator==(const RWCString &s) const { const string *a=this; const string *b=&s; return *a==*b; } RWBoolean operator==(const char* s) const { const string *a=this; const string b=s; return *a==b; } RWBoolean operator!=(const RWCString &s) const { const string *a=this; const string *b=&s; return *a!=*b; } RWBoolean operator!=(const char* s) const { const string *a=this; const string b=s; return *a!=b; } //inline RWCString operator () (unsigned int, unsigned int); inline operator const char*() const {return c_str();}; RWCString& prepend (const char*str) { insert(0,str); return *this; } RWCString& append(const RWCString&s) { std_string::operator+=(s); return *this; } inline std_istream& readLine ( std_istream&, RWBoolean skipWhite=true); inline RWCString& replace (unsigned int, unsigned int, const char*, unsigned int ); RWCString& replace(size_t pos,size_t n,const char*s) { std_string::replace(pos,n,s); return *this; } RWCString& remove(size_t n) { if(nreplace(mystart,extent,s.mystring->data(),s.length()); extent=s.length(); return *this; } RWCSubString& RWCSubString::operator=(const char*s) { mystring->replace(mystart,extent,s,strlen(s)); extent=strlen(s); return *this; } char& RWCSubString::operator()(size_t i) {return mystring->operator[](mystart+i);} char RWCSubString::operator()(size_t i) const {return mystring->operator[](mystart+i);} char& RWCSubString::operator[](size_t i) {return mystring->operator[](mystart+i);} char RWCSubString::operator[](size_t i) const {return mystring->operator[](mystart+i);} RWBoolean RWCSubString::operator==(RWCString s) const { return mystring->substr(mystart,extent)==s ? true:false; } RWBoolean RWCSubString::operator==(const char* s) const { return mystring->substr(mystart,extent)==string(s) ? true:false; } RWBoolean RWCSubString::operator!=(RWCString s) const { return mystring->substr(mystart,extent)!=string(s) ? true:false; } RWBoolean RWCSubString::operator!=(const char* s) const { return mystring->substr(mystart,extent)!=string(s) ? true:false; } //#include //GB:OSF1-cxx : #include RWCString::RWCString ( const char * astring ) : std_string ( astring ) {} void RWCString::toLower ( void ) { for (int i=0; i<=size();i++) { //GB:HP-UX-aCC,Linux-KCC (*this)[i] = tolower((*this)[i]); at(i) = tolower(at(i)); } } void RWCString::toUpper ( void ) { for (int i=0; i<=size();i++) { //GB:HP-UX-aCC,Linux-KCC (*this)[i] = toupper((*this)[i]); at(i) = toupper(at(i)); } } std_istream& RWCString::readLine ( std_istream& s, RWBoolean skipWhite/*GB:OSF1-cxx =true*/ ) { char tmp[256]; if ( skipWhite ) { s >> std_ws; s.getline(tmp,256); *this=tmp; } else { s.getline(tmp,256); *this=tmp; } return s; } RWCString& RWCString::replace (unsigned int start, unsigned int nbytes, const char* buff, unsigned int n2 ) { std_string::replace ( start, nbytes, buff, n2 ); return *this; } RWCString RWCString::strip ( int stripType=trailing, char c=' ' ) { RWCString retVal = *this; if(length()==0) return retVal; int i; switch ( stripType ) { case leading: { for(i=0;i=0;i--) if (std_string::operator[](i) != c) break; retVal = substr(0,i+1); } break; case both: { for(i=0;i=0;i--) if (tmp.std_string::operator[](i) != c) break; retVal = tmp.substr(0,i+1); } } return retVal; } // "cs" optional parameter is NOT implemented ! size_t RWCString::index( const RWCString& s, size_t ln, size_t st, RWCString::caseCompare cs ) const { return std_string::find( s.c_str(), st, ln ); } // "cmp" optional parameter is NOT implemented ! // N.B.: The hash value returned is generally DIFFERENT from the // one returned by the original RW function. // Users should not rely on the specific return value. char RWCString::operator () (size_t i) const { return operator[](i); } size_t RWCString::index (const char* str,int pos) const { return std_string::find(str,pos); } size_t RWCString::index (char c,int pos) const { return std_string::find(c,pos); } #endif