//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // STRING //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx #if !defined(__XSTRING_CPP__) #define __XSTRING_CPP__ #if 0 #define DBG(...) DebugLog(2, __VA_ARGS__) #else #define DBG(...) #endif #include "XToolsCommon.h" #include "XString.h" #include "XStringW.h" #include "../../Include/Library/printf_lite.h" xsize XStringGrowByDefault = 2; const XString NullXString; void XString::Init(xsize aSize) { m_data = (char*)malloc( (aSize+1)*sizeof(char) ); /* le 0 terminal n'est pas compté dans m_allocatedSize */ /* If want to change that the real allocated size is m_allocatedSize+1, _data method should be changed to limit access (ui > m_allocatedSize change to ui >= m_allocatedSize) */ if ( !m_data ) { DebugLog(2, "XString::Init(%llu) : Xalloc returned NULL. Cpu halted\n", (aSize+1)*sizeof(char)); panic(); } m_allocatedSize = aSize; m_data[0] = 0; } XString::XString() { //Debugf("Construteur\n"); Init(); } XString::~XString() { //Debugf("Destructeur :%s\n", c); delete m_data; // delete nullptr do nothing } void XString::setLength(xsize len) { CheckSize(len); m_data[len] = 0; } /* CheckSize() */ char *XString::CheckSize(xsize nNewSize, xsize nGrowBy) { if ( m_allocatedSize < nNewSize ) { nNewSize += nGrowBy; m_data = (char*)realloc(m_data, (nNewSize+1)*sizeof(char), m_allocatedSize*sizeof(wchar_t)); // realloc is identical to malloc if m_data is NULL if ( !m_data ) { DBG("XString::CheckSize(%d, %d) : Xrealloc(%d, %d, %d) returned NULL. System halted\n", nNewSize, nGrowBy, m_size, (nNewSize+1)*sizeof(char), c); panic(); } m_allocatedSize = nNewSize; } return m_data; } void XString::StrnCpy(const char *buf, xsize len) { if ( buf && *buf && len > 0 ) { CheckSize(len, 0); xsize idx = 0; char* p = _data(0); while ( idx++ < len && (*p++ = *buf++) != 0 ); setLength(idx-1); /* SetLength fait _Data[len]=0 */ }else{ setLength(0); /* SetLength fait _Data[len]=0 */ } } void XString::StrCpy(const char *buf) { if ( buf && *buf ) { StrnCpy(buf, (xsize)strlen(buf)); // overflow ? }else{ setLength(0); /* SetLength fait _Data[len]=0 */ } } //inline void XString::StrnCat(const char *buf, xsize len) { xsize NewLen; if ( buf && *buf && len > 0 ) { NewLen = length()+len; CheckSize(NewLen, 0); memcpy(_data(0)+length(), buf, len); setLength(NewLen); /* SetLength fait data()[len]=0 */ } } void XString::Cat(const XString &uneXString) { CheckSize(length()+uneXString.length()); memcpy(_data(0)+length(), uneXString.m_data, uneXString.length()); setLength(length() + uneXString.length()); } void XString::StrCat(const char *buf) { if ( buf && *buf ) { StrnCat(buf, (xsize)strlen(buf)); // overflow ? } } void XString::Delete(xsize pos, xsize count) { if ( pos < length() ) { if ( count != MAX_XSIZE && pos + count < length() ) { memmove(_data(0)+pos, data()+pos+count, length()-pos-count); setLength(length()-count); // data()[length()] = 0; fait dans setlength(); }else{ setLength(pos); // data()[length()] = 0; fait dans setlength(); } } } void XString::Insert(xsize pos, const XString& Str) { if ( pos < length() ) { CheckSize(length()+Str.length()); memmove(_data(0)+pos+Str.length(), data()+pos, length()-pos+1); // +1 to copy the NULL terminator memcpy(_data(0)+pos, Str.data(), Str.length()); }else{ StrCat(Str); } } // Deactivate assignment during refactoring to avoid confusion //void XString::Replace(char c1, char c2) //{ // char* p; // // p = data(); // while ( *p ) { // if ( *p == c1 ) *p = c2; // p += 1; // } //} // //XString XString::SubStringReplace(char c1, char c2) //{ // char* p; // XString Result; // // p = data(); // while ( *p ) { // if ( *p == c1 ) Result += c2; // else Result += *p; // p++; // } // return Result; //} /* this is used when printf can only output unicode, so we need a conversion back to utf8 */ //static XString* XString_sprintfBuf; //static xsize XString_sprintfBuf_len; //static wchar_t XString_char_wait; // //static unsigned int XString_transmitSPrintf_utf32(const wchar_t wchar1, const wchar_t wchar2) //{ // unsigned int ret = 0; // UINTN utf32_char; // // if ((wchar1 & 0xFC00) == 0xD800) { /* surrogates */ // if ((wchar2 & 0xFC00) == 0xDC00) { // utf32_char = wchar1; // utf32_char &= 0x03FF; // utf32_char <<= 10; // utf32_char |= ((UINTN)wchar2) & 0x03FF; // utf32_char += 0x10000; // ret = 2; // }else{ // // error // return 1; // Ignore wchar1. Tell the caller we used wchar1 // } // }else{ // utf32_char = wchar1; // ret = 1; // } // // /* assertion: utf32_char is a single UTF-4 value */ // int bits; // // if (utf32_char < 0x80) { // (*XString_sprintfBuf) += (char)utf32_char; // bits = -6; // } // else if (utf32_char < 0x800) { // (*XString_sprintfBuf) += (char)(((utf32_char >> 6) & 0x1F) | 0xC0); // bits = 0; // } // else if (utf32_char < 0x10000) { // (*XString_sprintfBuf) += (char)(((utf32_char >> 12) & 0x0F) | 0xE0); // bits = 6; // } // else { // (*XString_sprintfBuf) += (char)(((utf32_char >> 18) & 0x07) | 0xF0); // bits = 12; // } // for (; bits >= 0; bits -= 6) { // (*XString_sprintfBuf) += (char)(((utf32_char >> bits) & 0x3F) | 0x80); // } // return ret; //} // // //static void XString_transmitSPrintf(const wchar_t* buf, size_t nbchar) //{ // // #if __WCHAR_MAX__ <= 0xFFFF // // wchar_t is UTF16 // // unsigned int ret = 1; // if ( XString_char_wait ) { // ret = XString_transmitSPrintf_utf32(XString_char_wait, buf[0]); // XString_char_wait = 0; // } // xsize i; // for ( i = ret-1 ; i < nbchar-1 ; ) // cast ok, ret > // { // ret = XString_transmitSPrintf_utf32(buf[i], buf[i+1]); // i += ret; // } // if ( i < nbchar ) XString_char_wait = buf[i]; // #else // #warning TODO // #endif //} // //void XString::vSPrintf(const char* format, va_list va) //{ // SetLength(0); // // XString_sprintfBuf = this; // XString_sprintfBuf_len = 0; // XString_char_wait = 0; // vprintf_with_callback(format, va, XString_transmitSPrintf); // if ( XString_char_wait ) XString_transmitSPrintf_utf32(XString_char_wait, 0); //} //static XString* XString_sprintfBuf; static void XString_transmitSPrintf(const char* buf, unsigned int nbchar, void* context) { // (*XString_sprintfBuf).StrnCat(buf, nbchar); ((XString*)(context))->StrnCat(buf, (xsize)nbchar); // nbchar cannot be negative } XString& XString::vSPrintf(const char* format, va_list va) { setLength(0); // XString_sprintfBuf = this; vprintf_with_callback(format, va, XString_transmitSPrintf, this); return *this; } //void XString::vSPrintf(const char* format, va_list va) //{ // This is an attempt to use _PPrint from IO.c. Problem is : you have to allocate the memory BEFORE calling it. // POOL_PRINT spc; // PRINT_STATE ps; // // ZeroMem(&spc, sizeof (spc)); // spc.Str = data(); // SetLength(0); // spc.Len = 0; // spc.Maxlen = m_size; // ZeroMem(&ps, sizeof (ps)); // ps.Output = (IN EFI_STATUS (EFIAPI *)(VOID *context, CONST CHAR16 *str))_PoolPrint; // ps.Context = (void*)&spc; // ps.fmt.u.pw = format; // // VA_COPY(ps.args, va); // _PPrint (&ps); // va_end(ps.args); //} XString& XString::SPrintf(const char *Format, ...) { va_list va; va_start(va, Format); vSPrintf(Format, va); va_end(va); return *this; } // Deactivate assignment during refactoring to avoid confusion XString XString::basename() const { if ( lastChar() == PATH_SEPARATOR ) { DebugLog(2, "XString::basename() -> LastChar() == PATH_SEPARATOR"); panic(); } xsize idx = RIdxOf(XString().SPrintf("%c",PATH_SEPARATOR)); // ctor char disabled during refactoring to avoid confusion if ( idx == MAX_XSIZE ) return NullXString; return SubString(idx+1, length()-idx-1); } XString XString::dirname() const { xsize idx = RIdxOf(XString().SPrintf("%c",PATH_SEPARATOR)); // ctor char disabled during refactoring to avoid confusion if ( idx == MAX_XSIZE ) return NullXString; #ifdef __DEV_WIN32__ if ( idx == 1 && *data(0) == PATH_SEPARATOR ) { // this string is an icomplete UNC name : \\server return NullXString; } #endif return SubString(0, idx); } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Constructeurs Chaines //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XString::XString(const XString &aString) { //Debugf("Construteur const String & : %s\n", aString); Init(aString.length()); StrnCpy(aString.data(), aString.length()); } XString::XString(XString&& aString) // Move constructor { m_data = aString.m_data; m_allocatedSize = aString.m_allocatedSize; aString.m_data = 0; aString.m_allocatedSize = 0; } //// Deactivate assignment during refactoring to avoid confusion //XString::XString(const wchar_t *S) //{ // Init(); // SPrintf("%ls", S); //} /* XString::XString(const NSString* const aNSString, NSStringEncoding encoding) { char buf[ [aNSString length]*MB_CUR_MAX+MB_CUR_MAX ]; if ( [aNSString getCString:buf maxLength:[aNSString length]*MB_CUR_MAX+MB_CUR_MAX encoding:encoding] ) { Init(strlen(buf)); StrnCpy(buf); } else { Init(0); } } */ // //XString::XString(const XConstString &aConstString) //{ ////Debugf("Construteur const ConstString & : %s\n", aConstString); // Init( aConstString.length() ); // StrnCpy( aConstString.data() ); //} // Deactivate assignment during refactoring to avoid confusion //XString::XString(const char *S) //{ ////Debugf("Construteur const char * : %s\n", S); // Init((xsize)strlen(S)); // overflow ? // if ( S ) StrCpy(S); //} // //XString::XString(const char *S, xsize count) //{ ////Debugf("Construteur const char *, unsigned int :%s %d\n", S, count); // Init(count); // StrnCpy(S, count); //} //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Constructeurs CaractËres //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Deactivate assignment during refactoring to avoid confusion //XString::XString(char aChar) //{ ////TRACE("Construteur char \n"); // Init(1); // StrnCpy(&aChar, 1); //} //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Constructeurs numériques //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //XString::XString(int i) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Copy Constructor(int) -> (%lu) %d\n", this, i); // len = sprintf(buf,"%d", i); // Init(len); // StrnCpy(buf, len); //} //XString::XString(unsigned int ui) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Copy Constructor(unsigned int) -> (%lu) %u\n", this, ui); // len = sprintf(buf,"%u", ui); // Init(len); // StrnCpy(buf, len); //} // //XString::XString(long l) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Copy Constructor(long) -> (%lu) %ld\n", this, l); // len = sprintf(buf,"%ld", l); // Init(len); // StrnCpy(buf, len); //} // //XString::XString(unsigned long ul) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Copy Constructor(unsigned long long) -> (%lu) %lu\n", this, ul); // len = sprintf(buf,"%lu", ul); // Init(len); // StrnCpy(buf, len); //} // //------------------------------------------------------------------------------------------------- // StringCompare //------------------------------------------------------------------------------------------------- // -1 si buf1 est plus grand // 0 si égal // 1 si buf2 est plus grand //------------------------------------------------------------------------------------------------- XString XString::SubString(xsize pos, xsize count) const { if ( count > length()-pos ) count = length()-pos; return XString().takeValueFrom( &(data()[pos]), count); } xsize XString::IdxOf(char aChar, xsize Pos) const { xsize Idx; for ( Idx=Pos ; Idx length() ) pos = length(); if ( pos < s_len ) return MAX_XSIZE; pos -= s_len; for ( Idx=pos+1 ; Idx-- > 0 ; ) { i = 0; while( i 0 ) { unsigned int ui; if ( FirstCharIsCap ) { data()[0] = Majuscule(data()[0]); ui = 1; }else{ ui = 0; } for ( ; ui < length() ; ui+=1 ) { data()[ui] = to_lower(data(ui)); } } } bool XString::IsLetters() const { const char *p; char aChar; p = data(); if ( !*p ) return false; for ( ; *p ; p+=1 ) { aChar = to_lowerSansAccent(*p); // toutes les lettres, avec accent ou pas, seront dans l'intervalle 'a'..'z' if ( aChar < 'a' ) return false; if ( aChar > 'z' ) return false; } return true; } #endif bool XString::IsDigits() const { const char *p; p = data(); if ( !*p ) return false; for ( ; *p ; p+=1 ) { if ( *p < '0' ) return false; if ( *p > '9' ) return false; } return true; } bool XString::IsDigits(xsize pos, xsize count) const { const char *p; const char *q; if ( pos >= length() ) { DebugLog(2, "XString::IsDigits pos >= length()"); // We should #ifdef this to keep that for debug return false; } if ( pos+count > length() ) { DebugLog(2, "XString::IsDigits pos+count > length()"); // We should #ifdef this to keep that for debug return false; } p = data() + pos; q = p + count; for ( ; p < q ; p+=1 ) { if ( *p < '0' ) return false; if ( *p > '9' ) return false; } return true; } #ifdef NOT_USED_ANYMORE_skqdjfhksqjhfksjqdf bool XString::IsLettersNoAccent() const { const char *p; char aChar; p = data(); if ( !*p ) return false; for ( ; *p ; p+=1 ) { aChar = to_lower(*p); // Uniquement les lettres maj et min sans accent seront dans l'intervalle 'a'..'z' if ( aChar < 'a' ) return false; if ( aChar > 'z' ) return false; } return true; } #endif void XString::removeLastEspCtrl() { char *p; if ( length() > 0 ) { p = _data(0) + length() - 1; if ( *p >= 0 && *p <= ' ' ) { p -= 1; while ( p>data() && *p >= 0 && *p <= ' ' ) p -= 1; if ( p>data() ) { setLength( (xsize)(p-data()+1) ); // safe (p-data()+1 < length() }else{ if ( *p >= 0 && *p <= ' ' ) setLength(0); else setLength(1); } } } } // //int XString::ToInt() const //{ // int i; // // if ( sscanf(data(), "%d", &i) != 1 ) return NOTAINT; // return i; //} // //unsigned int XString::TOUInt() const //{ // unsigned int u; // // if ( sscanf(data(), "%u", &u) != 1 ) return MAXUINT; // return u; //} //------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------- // //bool XString::ReadFromBuf(const char *buf, size_t *idx, size_t count) //{ // xsize longueur; // ////mylog2(::SPrintf("XString::ReadFromBuf *idx=%d count=%d - %d %d %d %d\n", *idx, count, buf[*idx+0], buf[*idx+1], buf[*idx+2], buf[*idx+3]).c); // if ( count-*idx >= sizeof(longueur) ) { // longueur = *((xsize *)(buf+*idx)); ////mylog2(::SPrintf("XString::ReadFromBuf *idx=%d count=%d longueur=%d\n", *idx, count, longueur).c); // *idx += sizeof(longueur); // if ( longueur > 0 && count-*idx>=longueur ) memcpy(DataWithSizeMin(0, longueur), buf+*idx, longueur); // *idx += longueur; // SetLength(longueur); // return true; // }else{ // SetNull(); // return false; // } //} // //bool XString::WriteToBuf(char *buf, size_t *idx, size_t count) const //{ // xsize longueur; // // if ( count-*idx < sizeof(longueur) + length() ) return false; // longueur = length(); // memcpy(buf+*idx, &longueur, sizeof(longueur)); // *idx += sizeof(longueur); // memcpy(buf+*idx, data(), length()); // *idx += length(); // return true; //} // //bool XString::ReadFromFILE(FILE *fp) //{ // unsigned int longueur; // // if ( fread(&longueur, sizeof(longueur), 1, fp) != 1 ) goto fin; // if ( longueur > 0 && fread(DataWithSizeMin(0, longueur), longueur, 1, fp) != 1 ) goto fin; // SetLength(longueur); // return true; // fin: // SetNull(); // return false; //} // //bool XString::WriteToFILE(FILE *fp) const //{ // xsize longueur; // // longueur = length(); // if ( fwrite(&longueur, sizeof(longueur), 1, fp) != 1 ) return false; // if ( longueur > 0 && fwrite(data(), longueur, 1, fp) != 1 ) return false; // return true; //} // //#ifdef __DEVTOOLS_SOCKETS__ //void XString::ReadFromSOCKETT(SOCKET Sock, unsigned int LenMax, unsigned int TO, const char *ErrMsg) //{ // unsigned int longueur; // // SockReceiveT(Sock, &longueur, sizeof(longueur), TO, ErrMsg); // if ( longueur > LenMax ) Throw("Longueur reÁue (%d) supérieure ‡ la longueur max (%d)", longueur, LenMax); // if ( longueur > 0 ) SockReceiveT(Sock, DataWithSizeMin(0, longueur, 0), longueur, TO, ErrMsg); // SetLength(longueur); //} // //bool XString::ReadFromSOCKET(SOCKET Sock, unsigned int LenMax, unsigned int TO, const char *ErrMsg) //{ // try // { // ReadFromSOCKETT(Sock, LenMax, TO, ErrMsg); // SetLastErrorFlag(false); // } // StdCatch(); // return !LastErrorFlag(); //} // //void XString::WriteToSOCKETT(SOCKET Sock, unsigned int TO,const char *ErrMsg) const //{ // unsigned int longueur; // // longueur = length(); // SockSendT(Sock, &longueur, sizeof(longueur), TO, ErrMsg); // if ( longueur > 0 ) SockSendT(Sock, data(), longueur, TO, ErrMsg); //} // //bool XString::WriteToSOCKET(SOCKET Sock, unsigned int TO,const char *ErrMsg) const //{ // try // { // WriteToSOCKET(Sock, TO, ErrMsg); // SetLastErrorFlag(false); // } // StdCatch(); // return !LastErrorFlag(); //} //#endif // //bool XString::ReadFromXBuffer(XRBuffer &unXBuffer) //{ // xsize longueur; // // if ( !unXBuffer.GetXSize(&longueur) ) goto fin; // if ( longueur>0 && !unXBuffer.Get(DataWithSizeMin(0, longueur), longueur) ) goto fin; // SetLength(longueur); // return true; //fin: // SetNull(); // return false; //} // //void XString::CatToXBuffer(XBuffer *unXBuffer) const //{ // (*unXBuffer).Cat(length()); // (*unXBuffer).Cat(data(), length()); //} //************************************************************************************************* // // Opérateurs = // //************************************************************************************************* //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = CaractËres //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Deactivate assignment during refactoring to avoid confusion //const XString &XString::operator =(char aChar) //{ ////TRACE("Operator =char \n"); // StrnCpy(&aChar, 1); // return *this; //} //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = Chaines //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const XString &XString::operator =(const XString &aString) { //TRACE("Operator =const XString&\n"); StrnCpy(aString.data(), aString.length()); return *this; } XString& XString::operator =(XString&& aString) { delete m_data; // delete does nothing if m_data is NULL m_data = aString.m_data; m_allocatedSize = aString.m_allocatedSize; aString.m_data = 0; aString.m_allocatedSize = 0; return *this; } // //const XString &XString::operator =(const XConstString &aConstString) //{ ////TRACE("Operator =const XString&\n"); // StrnCpy(aConstString.data()); // return *this; //} // Deactivate assignment during refactoring to avoid confusion //const XString &XString::operator =(const char *S) //{ ////TRACE("Operator =const char *\n"); // StrCpy(S); // return *this; //} //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = numériques //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // //const XString &XString::operator =(int i) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(int) -> (%lu) %d\n", this, i); // len = sprintf(buf,"%d", i); // StrnCpy(buf, len); // return *this; //} // //const XString &XString::operator =(unsigned int ui) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(long) -> (%lu) %u\n", this, ui); // len = sprintf(buf,"%u", ui); // StrnCpy(buf, len); // return *this; //} // //const XString &XString::operator =(long l) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(long) -> (%lu) %ld\n", this, l); // len = sprintf(buf,"%ld", l); // StrnCpy(buf, len); // return *this; //} // //const XString &XString::operator =(unsigned long ul) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(long) -> (%lu) %lu\n", this, ul); // len = sprintf(buf,"%lu", ul); // StrnCpy(buf, len); // return *this; //} // //************************************************************************************************* // // Opérateurs += // //************************************************************************************************* //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = CaractËres //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Deactivate assignment during refactoring to avoid confusion //const XString &XString::operator +=(char aChar) //{ ////TRACE("Operator +=char \n"); // StrnCat(&aChar, 1); // return *this; //} //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = Chaines //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx const XString &XString::operator +=(const XString &aString) { //TRACE("Operator +=const XString&\n"); StrnCat(aString.data(), aString.length()); return *this; } // //const XString &XString::operator +=(const XConstString &aConstString) //{ ////TRACE("Operator +=const EConstString&\n"); // StrnCat(aConstString.data(), aConstString.length()); // return *this; //} const XString &XString::operator +=(const char *S) { //TRACE("operator +=const char *\n"); StrCat(S); return *this; } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Opérateur = numériques //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // //const XString &XString::operator +=(int i) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(int) -> (%lu) %d\n", this, i); // len = sprintf(buf,"%d", i); // StrnCat(buf, len); // return *this; //} // //const XString &XString::operator +=(unsigned int ui) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(unsigned int) -> (%lu) %u\n", this, ui); // len = sprintf(buf,"%u", ui); // StrnCat(buf, len); // return *this; //} // //const XString &XString::operator +=(long l) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(long) -> (%lu) %ld\n", this, l); // len = sprintf(buf,"%ld", l); // StrnCat(buf, len); // return *this; //} // //const XString &XString::operator +=(unsigned long ul) //{ // char buf[1024]; // unsigned int len; // ////TRACE("Opérateur =(unsigned long long) -> (%lu) %lu\n", this, ul); // len = sprintf(buf,"%lu", ul); // StrnCat(buf, len); // return *this; //} //----------------------------------------------------------------------------- // Fonction //----------------------------------------------------------------------------- XString operator"" _XS ( const char* s, size_t len) { XString returnValue; if ( len > MAX_XSIZE ) len = MAX_XSIZE; returnValue.takeValueFrom(s, len); return returnValue; // don't do "return returnValue.takeValueFrom(s, len)" because it break the return value optimization. } XString SPrintf(const char *format, ...) { va_list va; XString str; va_start (va, format); str.vSPrintf(format, va); va_end(va); return str; } XString SubString(const char *s, xsize s_len, xsize pos, xsize count) { if ( pos >= s_len ) return NullXString; if ( s_len-pos < count ) count = s_len-pos; return XString().takeValueFrom( s+pos, count ); } #ifdef NOT_USED_ANYMORE_skqdjfhksqjhfksjqdf XString ToAlpha(const char *S) { XString ReturnValue; unsigned int i; for ( i=0 ; S[i] ; i+=1 ) { ReturnValue += ToAlpha(S[i]); } return ReturnValue; } XString ToAlpha(const XString &S) { XString ReturnValue; unsigned int i; for ( i=0 ; i=0 && S[i] < ' ' ) ReturnValue += 'x'; /* Les char sont signés !!! */ // else ReturnValue += S[i]; // } // return ReturnValue; //} #endif