//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 "printf_lite.h" #ifndef memcpy #define memcpy(dest,source,count) CopyMem(dest,(void*)(source),(UINTN)(count)) #endif #ifndef strlen #define strlen(str) (xsize)(AsciiStrLen(str)) #endif #ifndef memmove #define memmove(dest,source,count) CopyMem(dest,source,(UINTN)(count)) #endif xsize XStringGrowByDefault = 1024; const XString NullXString; void XString::Init(xsize aSize) { c = (char*)Xalloc( (aSize+1)*sizeof(char) ); /* le 0 terminal n'est pas compté dans mSize */ if ( !c ) { DebugLog(2, "XString::Init(%d) : Xalloc returned NULL. Cpu halted\n", (aSize+1)*sizeof(char)); panic(); } m_allocatedSize = aSize; c[0] = 0; } XString::XString() { //Debugf("Construteur\n"); Init(); } XString::~XString() { //Debugf("Destructeur :%s\n", c); delete c; } void XString::SetLength(xsize len) { CheckSize(len); c[len] = 0; } /* CheckSize() */ char *XString::CheckSize(xsize nNewSize, xsize nGrowBy) { if ( m_allocatedSize < nNewSize ) { nNewSize += nGrowBy; c = (char*)Xrealloc(m_allocatedSize*sizeof(wchar_t), (nNewSize+1)*sizeof(char), c); if ( !c ) { 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 c; } void XString::StrnCpy(const char *buf, xsize len) { if ( buf && *buf && len > 0 ) { CheckSize(len, 0); xsize idx = 0; char* p = data(); 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()+length(), buf, len); SetLength(NewLen); /* SetLength fait data()[len]=0 */ } } void XString::Cat(const XString &uneXString) { CheckSize(length()+uneXString.length()); memcpy(data()+length(), uneXString.c, uneXString.length()); SetLength(length() + uneXString.length()); } inline void XString::StrnCat(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()+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()+pos+Str.length(), data()+pos, length()-pos+1); // +1 to copy the NULL terminator memcpy(data()+pos, Str.data(), Str.length()); }else{ StrnCat(Str); } } 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; } // //void XString::vSPrintf(const char *Format, va_list va) //{ // char buf[16384]; // faire mieux un jour... // int nb; // // #if defined(__DEV_BORLANDC__) || defined(__DEV_UNIX__) // nb = vsprintf(buf, Format, va); // #elif defined(__DEV_WIN32__) // nb = _vsnprintf(buf, sizeof(buf), Format, va); // #else // #error Plateforme false supportee // #endif // if ( nb > 0 ) StrnCpy(buf, nb); // else SetNull(); //} 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 #error 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); // 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); } void XString::SPrintf(const char *Format, ...) { va_list va; va_start(va, Format); vSPrintf(Format, va); va_end(va); } // //XStringW XString::wcs() //{ // XBuffer xbuf; //// wchar_t buf[length() + 1]; // size_t nbchar = mbstowcs((wchar_t *)xbuf.DataWithSizeMin(0, sizeof(wchar_t)*length()), c, length()); // if ( nbchar == (size_t)-1 ) throw("XString::wcs() -> Conversion error"); // return XStringW((wchar_t *)xbuf.data(), xsize(nbchar)); // safe cast : nbchar cannot be > than Length //} XString XString::basename() const { if ( LastChar() == PATH_SEPARATOR ) { DebugLog(2, "XString::basename() -> LastChar() == PATH_SEPARATOR"); panic(); } xsize idx = RIdxOf(PATH_SEPARATOR); if ( idx == MAX_XSIZE ) return NullXString; return SubString(idx+1, length()-idx-1); } XString XString::dirname() const { xsize idx = RIdxOf(PATH_SEPARATOR); 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(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() ); //} 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 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( &(data()[pos]), count); } xsize XString::IdxOf(char aChar, xsize Pos) const { xsize Idx; for ( Idx=Pos ; Idx length() ) Pos = length(); if ( Pos < S.length() ) return MAX_XSIZE; Pos -= S.length(); 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] = Minuscule(data()[ui]); } } } bool XString::IsLetters() const { const char *p; char aChar; p = data(); if ( !*p ) return false; for ( ; *p ; p+=1 ) { aChar = MinusculeSansAccent(*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 = Minuscule(*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() + 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 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; } #ifdef __AFXWIN_H__ const XString &XString::operator =(const CString &aCString) { //TRACE("Operator =const CString&\n"); StrnCpy(aCString, aCString.GetLength()); return *this; } #endif #ifdef _WX_WXSTRINGH__ const XString &XString::operator =(const wxString &awxString) { //TRACE("Operator =const wxString&\n"); StrnCpy(awxString.mb_str(), awxString.length()); return *this; } #endif // //const XString &XString::operator =(const XConstString &aConstString) //{ ////TRACE("Operator =const XString&\n"); // StrnCpy(aConstString.data()); // return *this; //} 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 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"); StrnCat(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 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 pos, xsize count) { if ( strlen(S)-pos < count ) count = (xsize)(strlen(S)-pos); // overflow ? return ( XString(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