2020-03-12 15:40:38 +01:00
//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"
2020-03-21 14:12:26 +01:00
# include "../../Include/Library/printf_lite.h"
2020-03-12 15:40:38 +01:00
2020-03-21 14:12:26 +01:00
xsize XStringGrowByDefault = 2 ;
2020-03-12 15:40:38 +01:00
const XString NullXString ;
void XString : : Init ( xsize aSize )
{
2020-03-28 17:17:02 +01:00
m_data = ( char * ) malloc ( ( aSize + 1 ) * sizeof ( char ) ) ; /* le 0 terminal n'est pas compté dans m_allocatedSize */
2020-04-05 14:25:39 +02:00
/* 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) */
2020-03-26 13:59:20 +01:00
if ( ! m_data ) {
DebugLog ( 2 , " XString::Init(%llu) : Xalloc returned NULL. Cpu halted \n " , ( aSize + 1 ) * sizeof ( char ) ) ;
2020-03-12 15:40:38 +01:00
panic ( ) ;
}
m_allocatedSize = aSize ;
2020-03-26 13:59:20 +01:00
m_data [ 0 ] = 0 ;
2020-03-12 15:40:38 +01:00
}
XString : : XString ( )
{
//Debugf("Construteur\n");
Init ( ) ;
}
XString : : ~ XString ( )
{
//Debugf("Destructeur :%s\n", c);
2020-03-28 17:17:02 +01:00
delete m_data ; // delete nullptr do nothing
2020-03-12 15:40:38 +01:00
}
2020-03-26 13:59:20 +01:00
void XString : : setLength ( xsize len )
2020-03-12 15:40:38 +01:00
{
CheckSize ( len ) ;
2020-03-26 13:59:20 +01:00
m_data [ len ] = 0 ;
2020-03-12 15:40:38 +01:00
}
/* CheckSize() */
char * XString : : CheckSize ( xsize nNewSize , xsize nGrowBy )
{
if ( m_allocatedSize < nNewSize )
{
nNewSize + = nGrowBy ;
2020-03-28 17:17:02 +01:00
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
2020-03-26 13:59:20 +01:00
if ( ! m_data ) {
2020-03-12 15:40:38 +01:00
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 ;
}
2020-03-26 13:59:20 +01:00
return m_data ;
2020-03-12 15:40:38 +01:00
}
void XString : : StrnCpy ( const char * buf , xsize len )
{
if ( buf & & * buf & & len > 0 ) {
CheckSize ( len , 0 ) ;
xsize idx = 0 ;
2020-03-26 13:59:20 +01:00
char * p = _data ( 0 ) ;
2020-03-12 17:16:18 +01:00
while ( idx + + < len & & ( * p + + = * buf + + ) ! = 0 ) ;
2020-03-26 13:59:20 +01:00
setLength ( idx - 1 ) ; /* SetLength fait _Data[len]=0 */
2020-03-12 15:40:38 +01:00
} else {
2020-03-26 13:59:20 +01:00
setLength ( 0 ) ; /* SetLength fait _Data[len]=0 */
2020-03-12 15:40:38 +01:00
}
}
void XString : : StrCpy ( const char * buf )
{
if ( buf & & * buf ) {
StrnCpy ( buf , ( xsize ) strlen ( buf ) ) ; // overflow ?
} else {
2020-03-26 13:59:20 +01:00
setLength ( 0 ) ; /* SetLength fait _Data[len]=0 */
2020-03-12 15:40:38 +01:00
}
}
//inline
void XString : : StrnCat ( const char * buf , xsize len )
{
xsize NewLen ;
if ( buf & & * buf & & len > 0 ) {
NewLen = length ( ) + len ;
CheckSize ( NewLen , 0 ) ;
2020-03-26 13:59:20 +01:00
memcpy ( _data ( 0 ) + length ( ) , buf , len ) ;
setLength ( NewLen ) ; /* SetLength fait data()[len]=0 */
2020-03-12 15:40:38 +01:00
}
}
void XString : : Cat ( const XString & uneXString )
{
CheckSize ( length ( ) + uneXString . length ( ) ) ;
2020-03-26 13:59:20 +01:00
memcpy ( _data ( 0 ) + length ( ) , uneXString . m_data , uneXString . length ( ) ) ;
setLength ( length ( ) + uneXString . length ( ) ) ;
2020-03-12 15:40:38 +01:00
}
2020-03-21 14:12:26 +01:00
void XString : : StrCat ( const char * buf )
2020-03-12 15:40:38 +01:00
{
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 ( ) ) {
2020-03-26 13:59:20 +01:00
memmove ( _data ( 0 ) + pos , data ( ) + pos + count , length ( ) - pos - count ) ;
setLength ( length ( ) - count ) ;
2020-03-12 15:40:38 +01:00
// data()[length()] = 0; fait dans setlength();
} else {
2020-03-26 13:59:20 +01:00
setLength ( pos ) ;
2020-03-12 15:40:38 +01:00
// data()[length()] = 0; fait dans setlength();
}
}
}
void XString : : Insert ( xsize pos , const XString & Str )
{
if ( pos < length ( ) ) {
CheckSize ( length ( ) + Str . length ( ) ) ;
2020-03-26 13:59:20 +01:00
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 ( ) ) ;
2020-03-12 15:40:38 +01:00
} else {
2020-03-21 14:12:26 +01:00
StrCat ( Str ) ;
2020-03-12 15:40:38 +01:00
}
}
2020-03-21 14:12:26 +01:00
// 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;
//}
2020-03-12 15:40:38 +01:00
2020-03-21 14:12:26 +01:00
/* 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;
//}
2020-03-12 15:40:38 +01:00
//
2020-03-21 14:12:26 +01:00
//
//static void XString_transmitSPrintf(const wchar_t* buf, size_t nbchar)
2020-03-12 15:40:38 +01:00
//{
//
2020-03-21 14:12:26 +01:00
// #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];
2020-03-12 15:40:38 +01:00
// #else
2020-03-21 14:12:26 +01:00
// #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);
2020-03-12 15:40:38 +01:00
//}
2020-03-21 14:12:26 +01:00
//static XString* XString_sprintfBuf;
2020-03-12 15:40:38 +01:00
2020-03-21 14:12:26 +01:00
static void XString_transmitSPrintf ( const char * buf , unsigned int nbchar , void * context )
2020-03-12 15:40:38 +01:00
{
2020-03-21 14:12:26 +01:00
// (*XString_sprintfBuf).StrnCat(buf, nbchar);
( ( XString * ) ( context ) ) - > StrnCat ( buf , ( xsize ) nbchar ) ; // nbchar cannot be negative
2020-03-12 15:40:38 +01:00
}
2020-03-21 14:12:26 +01:00
XString & XString : : vSPrintf ( const char * format , va_list va )
2020-03-12 15:40:38 +01:00
{
2020-03-26 13:59:20 +01:00
setLength ( 0 ) ;
2020-03-12 15:40:38 +01:00
2020-03-21 14:12:26 +01:00
// XString_sprintfBuf = this;
vprintf_with_callback ( format , va , XString_transmitSPrintf , this ) ;
return * this ;
}
//void XString::vSPrintf(const char* format, va_list va)
//{
2020-03-12 15:40:38 +01:00
// 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);
2020-03-21 14:12:26 +01:00
// va_end(ps.args);
//}
2020-03-12 15:40:38 +01:00
2020-03-21 14:12:26 +01:00
XString & XString : : SPrintf ( const char * Format , . . . )
2020-03-12 15:40:38 +01:00
{
va_list va ;
va_start ( va , Format ) ;
vSPrintf ( Format , va ) ;
va_end ( va ) ;
2020-03-21 14:12:26 +01:00
return * this ;
2020-03-12 15:40:38 +01:00
}
2020-03-21 14:12:26 +01:00
// Deactivate assignment during refactoring to avoid confusion
2020-03-12 15:40:38 +01:00
XString XString : : basename ( ) const
{
2020-03-26 13:59:20 +01:00
if ( lastChar ( ) = = PATH_SEPARATOR ) {
2020-03-12 15:40:38 +01:00
DebugLog ( 2 , " XString::basename() -> LastChar() == PATH_SEPARATOR " ) ;
panic ( ) ;
}
2020-03-21 14:12:26 +01:00
xsize idx = RIdxOf ( XString ( ) . SPrintf ( " %c " , PATH_SEPARATOR ) ) ; // ctor char disabled during refactoring to avoid confusion
2020-03-12 15:40:38 +01:00
if ( idx = = MAX_XSIZE ) return NullXString ;
return SubString ( idx + 1 , length ( ) - idx - 1 ) ;
}
XString XString : : dirname ( ) const
{
2020-03-21 14:12:26 +01:00
xsize idx = RIdxOf ( XString ( ) . SPrintf ( " %c " , PATH_SEPARATOR ) ) ; // ctor char disabled during refactoring to avoid confusion
2020-03-12 15:40:38 +01:00
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 ( ) ) ;
}
2020-03-28 17:17:02 +01:00
XString : : XString ( XString & & aString ) // Move constructor
{
m_data = aString . m_data ;
m_allocatedSize = aString . m_allocatedSize ;
aString . m_data = 0 ;
aString . m_allocatedSize = 0 ;
}
2020-03-21 14:12:26 +01:00
//// Deactivate assignment during refactoring to avoid confusion
//XString::XString(const wchar_t *S)
//{
// Init();
// SPrintf("%ls", S);
//}
2020-03-12 15:40:38 +01:00
/*
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() );
//}
2020-03-21 14:12:26 +01:00
// 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);
//}
2020-03-12 15:40:38 +01:00
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Constructeurs CaractËres
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2020-03-21 14:12:26 +01:00
// Deactivate assignment during refactoring to avoid confusion
//XString::XString(char aChar)
//{
////TRACE("Construteur char \n");
// Init(1);
// StrnCpy(&aChar, 1);
//}
2020-03-12 15:40:38 +01:00
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Constructeurs numériques
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2020-03-21 14:12:26 +01:00
2020-03-12 15:40:38 +01:00
//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);
//}
2020-03-21 14:12:26 +01:00
2020-03-12 15:40:38 +01:00
//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 ;
2020-03-21 14:12:26 +01:00
return XString ( ) . takeValueFrom ( & ( data ( ) [ pos ] ) , count ) ;
2020-03-12 15:40:38 +01:00
}
xsize XString : : IdxOf ( char aChar , xsize Pos ) const
{
xsize Idx ;
for ( Idx = Pos ; Idx < length ( ) ; Idx + = 1 ) {
if ( data ( ) [ Idx ] = = aChar ) return Idx ;
}
return MAX_XSIZE ;
}
2020-04-05 14:25:39 +02:00
xsize XString : : IdxOf ( const char * s , xsize s_len , xsize pos ) const
2020-03-12 15:40:38 +01:00
{
xsize i ;
xsize Idx ;
2020-04-05 14:25:39 +02:00
if ( length ( ) < s_len ) return MAX_XSIZE ;
for ( Idx = pos ; Idx < = length ( ) - s_len ; Idx + = 1 ) {
2020-03-12 15:40:38 +01:00
i = 0 ;
2020-04-05 14:25:39 +02:00
while ( i < s_len & & ( data ( ) [ Idx + i ] - s [ i ] ) = = 0 ) i + = 1 ;
if ( i = = s_len ) return Idx ;
2020-03-12 15:40:38 +01:00
}
return MAX_XSIZE ;
}
2020-04-05 14:25:39 +02:00
xsize XString : : IdxOfIC ( const char * s , xsize s_len , xsize pos ) const
2020-03-12 15:40:38 +01:00
{
xsize i ;
xsize Idx ;
2020-04-05 14:25:39 +02:00
if ( length ( ) < s_len ) return MAX_XSIZE ;
for ( Idx = pos ; Idx < = length ( ) - s_len ; Idx + = 1 ) {
2020-03-12 15:40:38 +01:00
i = 0 ;
2020-04-05 14:25:39 +02:00
while ( i < s_len & & ( to_lower ( * data ( Idx + i ) ) - to_lower ( s [ i ] ) ) = = 0 ) i + = 1 ;
if ( i = = s_len ) return Idx ;
2020-03-12 15:40:38 +01:00
}
return MAX_XSIZE ;
}
2020-04-05 14:25:39 +02:00
# ifdef NOT_USED_ANYMORE_skqdjfhksqjhfksjqdf
2020-03-12 15:40:38 +01:00
unsigned int XString : : IdxOfIAC ( const XString & S , xsize Pos ) const
{
xsize i ;
xsize Idx ;
if ( length ( ) < S . length ( ) ) return MAX_XSIZE ;
for ( Idx = Pos ; Idx < = length ( ) - S . length ( ) ; Idx + = 1 ) {
i = 0 ;
2020-04-05 14:25:39 +02:00
while ( i < S . length ( ) & & ( to_lowerSansAccent ( data ( Idx + i ) ) - to_lowerSansAccent ( S [ i ] ) ) = = 0 ) i + = 1 ;
2020-03-12 15:40:38 +01:00
if ( i = = S . length ( ) ) return Idx ;
}
return MAX_XSIZE ;
}
# endif
2020-04-05 14:25:39 +02:00
xsize XString : : RIdxOf ( const char * s , xsize s_len , xsize pos ) const
2020-03-12 15:40:38 +01:00
{
xsize i ;
xsize Idx ;
2020-04-05 14:25:39 +02:00
if ( s_len = = 0 ) return MAX_XSIZE ;
if ( pos > length ( ) ) pos = length ( ) ;
if ( pos < s_len ) return MAX_XSIZE ;
pos - = s_len ;
for ( Idx = pos + 1 ; Idx - - > 0 ; ) {
2020-03-12 15:40:38 +01:00
i = 0 ;
2020-04-05 14:25:39 +02:00
while ( i < s_len & & * data ( Idx + i ) = = s [ i ] ) i + = 1 ;
if ( i = = s_len ) return Idx ;
2020-03-12 15:40:38 +01:00
}
return MAX_XSIZE ;
}
# ifdef NOT_USED_ANYMORE_skqdjfhksqjhfksjqdf
bool XString : : DeleteIC ( const XString & S )
{
xsize Idx ;
Idx = IdxOfIC ( S ) ;
if ( Idx = = MAX_XSIZE ) return false ;
Delete ( Idx , S . length ( ) ) ;
return YES ;
}
# endif
# ifdef NOT_USED_ANYMORE_skqdjfhksqjhfksjqdf
void XString : : ToLower ( bool FirstCharIsCap )
{
if ( length ( ) > 0 )
{
unsigned int ui ;
if ( FirstCharIsCap ) {
data ( ) [ 0 ] = Majuscule ( data ( ) [ 0 ] ) ;
ui = 1 ;
} else {
ui = 0 ;
}
for ( ; ui < length ( ) ; ui + = 1 ) {
2020-04-05 14:25:39 +02:00
data ( ) [ ui ] = to_lower ( data ( ui ) ) ;
2020-03-12 15:40:38 +01:00
}
}
}
bool XString : : IsLetters ( ) const
{
const char * p ;
char aChar ;
p = data ( ) ;
if ( ! * p ) return false ;
for ( ; * p ; p + = 1 ) {
2020-04-05 14:25:39 +02:00
aChar = to_lowerSansAccent ( * p ) ; // toutes les lettres, avec accent ou pas, seront dans l'intervalle 'a'..'z'
2020-03-12 15:40:38 +01:00
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 ) {
2020-04-05 14:25:39 +02:00
aChar = to_lower ( * p ) ; // Uniquement les lettres maj et min sans accent seront dans l'intervalle 'a'..'z'
2020-03-12 15:40:38 +01:00
if ( aChar < ' a ' ) return false ;
if ( aChar > ' z ' ) return false ;
}
return true ;
}
# endif
2020-03-26 13:59:20 +01:00
void XString : : removeLastEspCtrl ( )
2020-03-12 15:40:38 +01:00
{
char * p ;
if ( length ( ) > 0 ) {
2020-03-26 13:59:20 +01:00
p = _data ( 0 ) + length ( ) - 1 ;
2020-03-12 15:40:38 +01:00
if ( * p > = 0 & & * p < = ' ' ) {
p - = 1 ;
while ( p > data ( ) & & * p > = 0 & & * p < = ' ' ) p - = 1 ;
if ( p > data ( ) ) {
2020-03-26 13:59:20 +01:00
setLength ( ( xsize ) ( p - data ( ) + 1 ) ) ; // safe (p-data()+1 < length()
2020-03-12 15:40:38 +01:00
} else {
2020-03-26 13:59:20 +01:00
if ( * p > = 0 & & * p < = ' ' ) setLength ( 0 ) ;
else setLength ( 1 ) ;
2020-03-12 15:40:38 +01:00
}
}
}
}
//
//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
2020-03-21 14:12:26 +01:00
// Deactivate assignment during refactoring to avoid confusion
//const XString &XString::operator =(char aChar)
//{
////TRACE("Operator =char \n");
// StrnCpy(&aChar, 1);
// return *this;
//}
2020-03-12 15:40:38 +01:00
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// Opérateur = Chaines
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
const XString & XString : : operator = ( const XString & aString )
{
//TRACE("Operator =const XString&\n");
StrnCpy ( aString . data ( ) , aString . length ( ) ) ;
return * this ;
}
2020-03-28 17:17:02 +01:00
XString & XString : : operator = ( XString & & aString )
2020-03-12 15:40:38 +01:00
{
2020-03-28 17:17:02 +01:00
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 ;
2020-03-12 15:40:38 +01:00
return * this ;
}
//
//const XString &XString::operator =(const XConstString &aConstString)
//{
////TRACE("Operator =const XString&\n");
// StrnCpy(aConstString.data());
// return *this;
//}
2020-03-21 14:12:26 +01:00
// Deactivate assignment during refactoring to avoid confusion
//const XString &XString::operator =(const char *S)
//{
////TRACE("Operator =const char *\n");
// StrCpy(S);
// return *this;
//}
2020-03-12 15:40:38 +01:00
//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
2020-03-21 14:12:26 +01:00
// Deactivate assignment during refactoring to avoid confusion
//const XString &XString::operator +=(char aChar)
//{
////TRACE("Operator +=char \n");
// StrnCat(&aChar, 1);
// return *this;
//}
2020-03-12 15:40:38 +01:00
//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");
2020-03-21 14:12:26 +01:00
StrCat ( S ) ;
2020-03-12 15:40:38 +01:00
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
//-----------------------------------------------------------------------------
2020-03-29 11:40:13 +02:00
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.
}
2020-03-12 15:40:38 +01:00
XString SPrintf ( const char * format , . . . )
{
2020-03-21 14:12:26 +01:00
va_list va ;
2020-03-12 15:40:38 +01:00
XString str ;
2020-03-21 14:12:26 +01:00
va_start ( va , format ) ;
2020-03-12 15:40:38 +01:00
str . vSPrintf ( format , va ) ;
2020-03-21 14:12:26 +01:00
va_end ( va ) ;
2020-03-12 15:40:38 +01:00
return str ;
}
2020-04-05 14:25:39 +02:00
XString SubString ( const char * s , xsize s_len , xsize pos , xsize count )
2020-03-12 15:40:38 +01:00
{
2020-04-05 14:25:39 +02:00
if ( pos > = s_len ) return NullXString ;
if ( s_len - pos < count ) count = s_len - pos ;
return XString ( ) . takeValueFrom ( s + pos , count ) ;
2020-03-12 15:40:38 +01:00
}
# 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 < S . length ( ) ; i + = 1 ) {
ReturnValue + = ToAlpha ( S [ i ] ) ;
}
return ReturnValue ;
}
XString ToLower ( const char * S , bool FirstCharIsCap )
{
XString ReturnValue ;
unsigned int ui ;
if ( S & & * S ) {
if ( FirstCharIsCap ) ReturnValue = Majuscule ( S [ 0 ] ) ;
2020-04-05 14:25:39 +02:00
else ReturnValue = to_lower ( S [ 0 ] ) ;
2020-03-12 15:40:38 +01:00
for ( ui = 1 ; S [ ui ] ; ui + = 1 ) {
2020-04-05 14:25:39 +02:00
ReturnValue + = to_lower ( S [ ui ] ) ;
2020-03-12 15:40:38 +01:00
}
}
return ReturnValue ;
}
XString ToUpper ( const char * S )
{
XString ReturnValue ;
unsigned int ui ;
if ( S & & * S ) {
for ( ui = 0 ; S [ ui ] ; ui + = 1 ) {
ReturnValue + = Majuscule ( S [ ui ] ) ;
}
}
return ReturnValue ;
}
# endif
2020-03-28 17:17:02 +01:00
// Deactivate during refactoring to avoid confusion
2020-03-21 14:12:26 +01:00
//XString CleanCtrl(const XString &S)
//{
// XString ReturnValue;
// xsize i;
//
// for ( i=0 ; i<S.length() ; i+=1 ) {
// if ( S[i] >=0 && S[i] < ' ' ) ReturnValue += 'x'; /* Les char sont signés !!! */
// else ReturnValue += S[i];
// }
// return ReturnValue;
//}
2020-03-12 15:40:38 +01:00
# endif