#pragma once #include #define STRBBUFFER_NO_MYPTR template class StrBBuffer : public std::basic_string { public: StrBBuffer(){}; StrBBuffer(const STR* s,long len) { Set(s,len); } StrBBuffer(const STR c) { Set(&c,1); } ~StrBBuffer(void){} long FindFirstElemInSet(long start, STR* set,long nPat) { if((set==NULL)||(nPat<0)||(start>long(std::basic_string::length()))) return -1; long RetVal = -1; size_type ActPos = npos; for(long i=0;i::find(set[i],start); if(ActPos!=npos) { if((RetVal==-1)||(long(ActPos)std::basic_string::length())) return -1; if(start<0) start = 0; size_type RetVal = std::basic_string::find(chr,start,nPat); if(RetVal==npos) return -1; return RetVal; } STR* Set(const STR* s,long len) { if((s==NULL)||(len<0)) return NULL; std::basic_string::assign(s,len); #ifdef STRBBUFFER_NO_MYPTR return (STR*) std::basic_string::data(); #else return std::basic_string::_Myptr(); #endif }; STR& Set(STR& s,long len) { std::basic_string::assign(&s,len); #ifdef STRBBUFFER_NO_MYPTR STR* lps = (STR*) std::basic_string::data(); return lps[0]; #else return *std::basic_string::_Myptr(); #endif }; // Zuweisung von nChr Elementen s an den Puffer STR& Set(long nChr,STR& s) { std::basic_string::assign(nChr,s); #ifdef STRBBUFFER_NO_MYPTR const STR* lps = std::basic_string::data(); return (STR&)lps[0]; #else return *std::basic_string::_Myptr(); #endif }; // Reserviert einen Puffer von einer bestimmten Länge void ReserveBuffer(long ReqSize,STR& FillElem) { // std::basic_string::resize( if(long(std::basic_string::length())::resize(ReqSize,FillElem); // BlockSet(std::basic_string::length(),FillElem,ReqSize-std::basic_string::length()); } } void SetLen(long len) { std::basic_string::resize(len); } void StripTrailing(const STR& chr) { long nPos = -1; nPos = (long)std::basic_string::find_last_not_of(chr,nPos); if(nPos>0) std::basic_string::resize(nPos+1); } long Add(const STR* s,long len, const STR& TermElem) { StripTrailing(TermElem); return Add(s,len); } long Add(const STR* s,long len) { if((s!=NULL)&&(len>=0)) { std::basic_string::append(s,len); } return (long)std::basic_string::length(); } long AddElem(const STR& c,const STR& TermElem) { StripTrailing(TermElem); return AddElem(c); } long AddElem(const STR& c) { std::basic_string::operator +=(c); return (long)std::basic_string::length(); } long Insert (long pos, STR const * s, long len) { if (len) { long leng = (long)std::basic_string::length(); if (pos < 0 || pos > leng) pos = leng; std::basic_string::insert(pos,s,len); } return (long) std::basic_string::length(); } long remove (long pos, long len) { if (pos >= 0 && pos < long(std::basic_string::length())) { if(len==-1) len = long(std::basic_string::length()) - pos; std::basic_string::erase(pos,len); } return (long)std::basic_string::length(); } //************************************************************************* // Replace a part or the whole buffer. // If the buffer is not big enough, it is grown to the size that fits // for the resulting string. // pos = Position, ab welcher ersetzt werden soll // s = Source-Puffer // clen = Länge des zu ersetzenden Abschnittes im Originalstring // len = Länge des einzufügenden Puffers (s) // InitChr = character to initialize the growing sequency //************************************************************************* long ReplaceAndGrow(long pos, STR const * s, long clen, long len,STR& InitChr) { if((s==NULL)||(len<0)||(pos<0)||(clen<0)) return std::basic_string::length(); // Wachsen angesagt? long leng = std::basic_string::length(); if((pos+clen)>leng) ReserveBuffer(pos+clen,InitChr); return replace(pos,s,clen,len); } //************************************************************************* // Replace a part of the buffer // pos = Position, ab welcher ersetzt werden soll // s = Source-Puffer // clen = Länge des zu ersetzenden Abschnittes im Originalstring // len = Länge des einzufügenden Puffers (s) //************************************************************************* long replace (long pos, STR const * s, long clen, long len) { if((s==NULL)||(len<0)||(pos<0)) return (long)std::basic_string::length(); long leng = long(std::basic_string::length()); if ((pos >= 0)&&(pos < leng)) { // Wenn ungültig, gehe davon aus, daß ganzer String // zu ersetzen ist. if (clen < 0) clen = (long)leng - pos; if((pos+clen)>leng) clen = long(leng-pos); //if (clen < 0 || (pos + clen) > leng) // clen = long(leng - pos); //if (pos > leng) // pos = leng; std::basic_string::replace(pos,len,s,clen); } return long(std::basic_string::length()); } StrBBuffer & left (long len, STR padch) { if (len < 0) return right (long(-len), padch); long leng = std::basic_string::length(); if (len != leng) { if (len > leng) BlockSet(leng,padch,len - leng); else std::basic_string::erase(len); } return *this; } StrBBuffer & right (long len, STR padch) { if (len < 0) return left(-1, padch); long leng = std::basic_string::length(); if (len != leng) { if (len > leng) { #ifdef STRBBUFFER_NO_MYPTR std::basic_string _buf = std::basic_string::data(); #else std::basic_string _buf = this->_Myptr(); #endif STR* _ptr = (STR*)_buf.c_str(); std::basic_string::erase(); BlockSet(0,padch,len-leng); std::basic_string::append(_ptr); } else { // String muß schrumpfen, also herunterkopieren der Daten #ifdef STRBBUFFER_NO_MYPTR std::basic_string _buf = std::basic_string::data(); #else std::basic_string _buf = this->_Myptr(); #endif STR* _ptr = (STR*)_buf.c_str(); std::basic_string::assign(_ptr+(leng-len),len); }; } return *this; } //***************************************************************************** //***************************************************************************** StrBBuffer & mid (long pos, long len, STR padch) { if (pos <= 0) return left(len, padch); long leng = std::basic_string::length(); if (pos > leng) pos = leng; if (leng < len) // Are we padding? { long nlen = long((len - (leng - pos)) / 2); if (nlen > 0) { #ifdef STRBBUFFER_NO_MYPTR std::basic_string _buf = std::basic_string::data(); #else std::basic_string _buf = this->_Myptr(); #endif STR* _ptr = (STR*)_buf.c_str(); std::basic_string::assign(_ptr + pos,leng - pos); BlockSet((leng - pos),padch,nlen); } } else if(leng > len) { // String muß schrumpfen: Block aus der Mitte heraus nach // links kopieren und Länge anpassen. #ifdef STRBBUFFER_NO_MYPTR std::basic_string _buf = std::basic_string::data(); #else std::basic_string _buf = this->_Myptr(); #endif STR* _ptr = (STR*)_buf.c_str(); std::basic_string::assign(_ptr + (pos-1),len); }; return *this; } //************************************************************************* //************************************************************************* STR* BlockSet(long DestOffs,STR& val,long cnt) { // if(DestOffs>m_Len) // return m_Data; // Wachsen angesagt? if(long(std::basic_string::length())<(DestOffs+cnt)) { LONG lGrow = (DestOffs+cnt) - long(std::basic_string::length()); std::basic_string::append(lGrow,val); }; #ifdef STRBBUFFER_NO_MYPTR return (STR*) std::basic_string::data(); #else return std::basic_string::_Myptr(); #endif } long Len(void){return (long)std::basic_string::length();}; void Clear(void) { std::basic_string::clear(); } // Liefert nur den Zeiger STR* Get(void) { #ifdef STRBBUFFER_NO_MYPTR return (STR*) std::basic_string::data(); #else return std::basic_string::_Myptr(); #endif } // Liefert den Zeiger und die Anzahl von Elementen ohne Terminierung STR* Get(long* nElem) { if(nElem) *nElem = long(std::basic_string::length()); #ifdef STRBBUFFER_NO_MYPTR return (STR*) std::basic_string::data(); #else return std::basic_string::_Myptr(); #endif } // Liefert einen terminierten String. STR* Get(const STR& TermElem,long* nElem) { UINT len = (UINT) std::basic_string::length(); if(len>0) { #ifdef STRBBUFFER_NO_MYPTR STR* lps = (STR*) std::basic_string::data(); #else STR* lps = std::basic_string::_Myptr(); #endif if(lps[len-1]!=TermElem) std::basic_string::operator +=(TermElem); // std::basic_string::resize(len+1,TermElem); } else std::basic_string::operator +=(TermElem); // std::basic_string::append(TermElem,1); // STR* lpStr = std::basic_string::_Myptr(); // long len = std::basic_string:: // std::basic_string::operator +=(TermElem); // this += TermElem; if(nElem) *nElem = (long)std::basic_string::length(); #ifdef STRBBUFFER_NO_MYPTR return (STR*) std::basic_string::data(); #else return std::basic_string::_Myptr(); #endif } //************************************************************************* // Schneidet den String ab //************************************************************************* long TruncateLeft(long nElem) { if(nElem>=long(std::basic_string::length())) std::basic_string::clear(); else { std::basic_string::erase(0,nElem); }; return long(std::basic_string::length()); } long TruncateRight(long nElem) { if(nElem>=long(std::basic_string::length())) std::basic_string::clear(); else { std::basic_string::erase(std::basic_string::length()-nElem,nElem); } return (long)std::basic_string::length(); } //long TruncateChr(STR& chr,bool left,bool right) //{ // return TruncateChrc(chr,left,right); //} long TruncateChr(STR chr,bool left,bool right) { if(std::basic_string::length()==0) return (unsigned long)std::basic_string::length(); unsigned long start,end; start = 0; end = 0; if(right) { unsigned long nRemove = 0; #ifdef STRBBUFFER_NO_MYPTR STR* _mp = (STR*) std::basic_string::data(); #else STR* _mp = std::basic_string::_Myptr(); #endif for(start = (unsigned long)std::basic_string::length(); (start>0)&&(_mp[start-1]==chr); start--, nRemove++) { DWORD dwRes = 0; } std::basic_string::erase(start,nRemove); } if(left) { end = (unsigned long)std::basic_string::find_first_not_of(chr); std::basic_string::erase(0,end); } //if(end) // TruncateRight(end); //if(start) // TruncateLeft(start); return (unsigned long) std::basic_string::length(); } };