2020-02-15 15:51:18 +01:00
//*************************************************************************************************
//*************************************************************************************************
//
// STRING
//
//*************************************************************************************************
//*************************************************************************************************
# if !defined(__XSTRINGW_H__)
# define __XSTRINGW_H__
2020-02-23 21:23:31 +01:00
# include "XToolsCommon.h"
2020-02-24 14:07:24 +01:00
# include "utf8Conversion.h"
2020-02-15 15:51:18 +01:00
# define LPATH_SEPARATOR L'\\'
extern UINTN XStringWGrowByDefault ;
2020-03-12 15:40:38 +01:00
//extern void __GLOBAL__sub_I_XStringW();
2020-02-15 15:51:18 +01:00
class XStringW
{
protected :
wchar_t * m_data ;
UINTN m_len ;
2020-03-09 02:12:24 +01:00
UINTN m_allocatedSize ;
2020-02-15 15:51:18 +01:00
2020-03-21 14:12:26 +01:00
// convenience method. Did it this way to avoid #define in header. They can have an impact on other heade.rs
xsize min ( xsize x1 , xsize x2 ) const { if ( x1 < x2 ) return x1 ; return x2 ; }
2020-02-15 15:51:18 +01:00
public :
void Init ( UINTN aSize = 0 ) ;
XStringW ( ) ;
XStringW ( const XStringW & aString ) ;
2020-03-10 17:50:55 +01:00
// XStringW(const wchar_t *);
// XStringW(const wchar_t* S, UINTN count);
// XStringW(const wchar_t);
// XStringW(const char*);
2020-02-24 14:07:24 +01:00
2020-02-15 15:51:18 +01:00
~ XStringW ( ) ;
protected :
wchar_t * CheckSize ( UINTN nNewSize , UINTN nGrowBy = XStringWGrowByDefault ) ;
public :
2020-02-23 21:23:31 +01:00
const wchar_t * data ( UINTN ui = 0 ) const { return m_data + ui ; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
2020-03-11 15:23:58 +01:00
const wchar_t * data ( INTN i ) const { if ( i < 0 ) panic ( " const wchar_t *data(INTN i=0) const -> i < 0 " ) ; return m_data + i ; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
// const wchar_t *data(int i=0) const { if ( i<0 ) panic("const wchar_t *data(int i=0) const -> i < 0"); return m_data+i; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
2020-02-23 21:23:31 +01:00
wchar_t * data ( UINTN ui = 0 ) { return m_data + ui ; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
2020-03-11 15:23:58 +01:00
wchar_t * data ( INTN i ) { if ( i < 0 ) panic ( " wchar_t *data(INTN i=0) -> i < 0 " ) ; return m_data + i ; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
// wchar_t *data(int i) { if ( i<0 ) panic("wchar_t *data(int i=0) -> i < 0"); return m_data+i; } // do not multiply by sizeof(wchar_t), it's done by the compiler.
2020-02-15 15:51:18 +01:00
wchar_t * dataWithSizeMin ( UINTN pos , UINTN sizeMin , UINTN nGrowBy = XStringWGrowByDefault ) { CheckSize ( sizeMin , nGrowBy ) ; return data ( pos ) ; }
2020-03-21 14:12:26 +01:00
wchar_t * forgetDataWithoutFreeing ( ) ;
2020-02-15 15:51:18 +01:00
UINTN length ( ) const { return m_len ; }
2020-03-09 02:12:24 +01:00
UINTN size ( ) const { return m_len ; }
UINTN allocatedSize ( ) const { return m_allocatedSize ; }
2020-02-15 15:51:18 +01:00
void SetLength ( UINTN len ) ;
2020-03-10 12:51:04 +01:00
const wchar_t * s ( ) { return m_data ; }
2020-02-15 15:51:18 +01:00
2020-03-11 15:23:58 +01:00
/* Empty ? */
2020-03-10 12:51:04 +01:00
void setEmpty ( ) { m_len = 0 ; }
bool isEmpty ( ) const { return size ( ) = = 0 ; }
// bool IsNull() const { return size() == 0 ; }
// bool NotNull() const { return size() > 0 ; }
2020-02-15 15:51:18 +01:00
/* Cast */
operator const wchar_t * ( ) const { return data ( ) ; }
# if defined(__APPLE__) && defined(__OBJC__)
operator NSString * ( ) const { return [ [ [ NSString alloc ] initWithBytes : data ( ) length : length ( ) * sizeof ( wchar_t ) encoding : NSUTF32LittleEndianStringEncoding ] autorelease ] ; }
# endif
int ToInt ( ) const ;
UINTN ToUInt ( ) const ;
// XString mbs() const;
/* [] */
2020-03-11 15:27:07 +01:00
wchar_t operator [ ] ( int i ) const { return * data ( ( INTN ) i ) ; }
2020-02-15 15:51:18 +01:00
wchar_t operator [ ] ( UINTN i ) const { return * data ( i ) ; }
2020-03-11 15:27:07 +01:00
wchar_t & operator [ ] ( int i ) { return * data ( ( INTN ) i ) ; }
2020-02-15 15:51:18 +01:00
wchar_t & operator [ ] ( UINTN i ) { return * data ( i ) ; }
wchar_t LastChar ( ) const { if ( length ( ) > 0 ) return data ( ) [ length ( ) - 1 ] ; else return 0 ; }
void RemoveLastEspCtrl ( ) ;
void SetNull ( ) { SetLength ( 0 ) ; } ;
void StrnCpy ( const wchar_t * buf , UINTN len ) ;
void StrCpy ( const wchar_t * buf ) ;
void StrnCat ( const wchar_t * buf , UINTN len ) ;
void StrCat ( const wchar_t * buf ) ;
void StrCat ( const XStringW & uneXStringW ) ;
void Delete ( UINTN pos , UINTN count = 1 ) ;
void Insert ( UINTN pos , const XStringW & Str ) ;
2020-03-21 14:12:26 +01:00
void vSPrintf ( const char * format , va_list va ) ;
2020-02-25 14:55:39 +01:00
# ifndef _MSC_VER
void SPrintf ( const char * format , . . . ) __attribute__ ( ( __format__ ( __printf__ , 2 , 3 ) ) ) ;
# else
void SPrintf ( const char * format , . . . ) ;
# endif // !__MSC_VER
2020-02-25 11:29:33 +01:00
2020-02-15 15:51:18 +01:00
const XStringW & operator = ( const XStringW & aString ) ;
2020-03-10 17:50:55 +01:00
// const XStringW &operator =(const wchar_t* S) {fdsf};
// const XStringW &operator =(wchar_t);
const XStringW & takeValueFrom ( const wchar_t * S ) ;
const XStringW & takeValueFrom ( const char * S ) ;
2020-02-15 15:51:18 +01:00
const XStringW & operator + = ( const XStringW & ) ;
const XStringW & operator + = ( const wchar_t * S ) ;
const XStringW & operator + = ( wchar_t ) ;
XStringW SubString ( UINTN pos , UINTN count ) const ;
2020-02-24 14:07:24 +01:00
UINTN IdxOf ( wchar_t c , UINTN Pos = 0 ) const ;
2020-02-15 15:51:18 +01:00
UINTN IdxOf ( const XStringW & S , UINTN Pos = 0 ) const ;
2020-02-23 21:23:31 +01:00
UINTN RIdxOf ( const wchar_t c , UINTN Pos = MAX_XSIZE ) const ;
UINTN RIdxOf ( const XStringW & S , UINTN Pos = MAX_XSIZE ) const ;
2020-02-15 15:51:18 +01:00
void ToLower ( bool FirstCharIsCap = false ) ;
bool IsLetters ( ) const ;
bool IsLettersNoAccent ( ) const ;
bool IsDigits ( ) const ;
bool IsDigits ( UINTN pos , UINTN count ) const ;
2020-02-23 21:23:31 +01:00
bool ExistIn ( const XStringW & S ) const { return IdxOf ( S ) ! = MAX_XSIZE ; }
2020-02-15 15:51:18 +01:00
void Replace ( wchar_t c1 , wchar_t c2 ) ;
XStringW SubStringReplace ( wchar_t c1 , wchar_t c2 ) ;
2020-03-21 14:12:26 +01:00
int Compare ( const wchar_t * S ) const { return ( int ) memcmp ( data ( ) , S , min ( wcslen ( S ) , length ( ) ) * sizeof ( wchar_t ) ) ; }
2020-02-15 15:51:18 +01:00
bool Equal ( const wchar_t * S ) const { return Compare ( S ) = = 0 ; } ;
2020-03-21 14:12:26 +01:00
bool BeginingEqual ( const wchar_t * S ) const { return ( memcmp ( data ( ) , S , wcslen ( S ) ) = = 0 ) ; }
bool SubStringEqual ( UINTN Pos , const wchar_t * S ) const { return ( memcmp ( data ( Pos ) , S , wcslen ( S ) ) = = 0 ) ; }
2020-02-15 15:51:18 +01:00
XStringW basename ( ) const ;
XStringW dirname ( ) const ;
// bool ReadFromBuf(const char *buf, UINTN *idx, UINTN count);
// bool WriteToBuf(char *buf, UINTN *idx, UINTN count) const;
// bool ReadFromFILE(FILE *fp);
// bool WriteToFILE(FILE *fp) const;
//
// bool ReadFromXBuffer(XRBuffer &unXBuffer); // Impossible de mettre le XBuffer en const car il y a une variable d'instance de XBuffer incrémentée par ReadFromXBuffer
// void CatToXBuffer(XBuffer *unXBuffer) const;
// void WriteToXBuffer(XBuffer *unXBuffer, UINTN *idx) const;
public :
// + operator
// with XStringW
friend XStringW operator + ( const XStringW & p1 , const XStringW & p2 ) { XStringW s ; s = p1 ; s + = p2 ; return s ; }
// with const wchar_t
friend XStringW operator + ( const XStringW & p1 , const wchar_t * p2 ) { XStringW s ; s = p1 ; s + = p2 ; return s ; }
2020-03-10 17:50:55 +01:00
friend XStringW operator + ( const wchar_t * p1 , const XStringW & p2 ) { XStringW s ; s . StrCat ( p1 ) ; s . StrCat ( p2 ) ; return s ; }
2020-02-15 15:51:18 +01:00
// // with wchar_t
// friend XStringW operator + (const XStringW& p1, wchar_t p2 ) { XStringW s; s=p1; s+=p2; return s; }
// friend XStringW operator + (wchar_t p1, const XStringW& p2 ) { XStringW s; s=p1; s+=p2; return s; }
2020-03-21 14:12:26 +01:00
2020-02-15 15:51:18 +01:00
// == operator
friend bool operator = = ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) = = 0 ; }
friend bool operator = = ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) = = 0 ; }
friend bool operator = = ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) = = 0 ; }
friend bool operator ! = ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) ! = 0 ; }
friend bool operator ! = ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) ! = 0 ; }
friend bool operator ! = ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) ! = 0 ; }
friend bool operator < ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) < 0 ; }
friend bool operator < ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) < 0 ; }
friend bool operator < ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) > 0 ; }
friend bool operator > ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) > 0 ; }
friend bool operator > ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) > 0 ; }
friend bool operator > ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) < 0 ; }
friend bool operator < = ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) < = 0 ; }
friend bool operator < = ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) < = 0 ; }
friend bool operator < = ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) > = 0 ; }
friend bool operator > = ( const XStringW & s1 , const XStringW & s2 ) { return s1 . Compare ( s2 ) > = 0 ; }
friend bool operator > = ( const XStringW & s1 , const wchar_t * s2 ) { return s1 . Compare ( s2 ) > = 0 ; }
friend bool operator > = ( const wchar_t * s1 , const XStringW & s2 ) { return s2 . Compare ( s1 ) < = 0 ; }
} ;
//extern const XStringW NullXStringW;
2020-02-25 14:55:39 +01:00
# ifndef _MSC_VER
2020-03-12 15:40:38 +01:00
XStringW WPrintf ( const char * format , . . . ) __attribute__ ( ( __format__ ( __printf__ , 1 , 2 ) ) ) ;
2020-02-25 14:55:39 +01:00
# else
2020-03-12 15:40:38 +01:00
XStringW WPrintf ( const char * format , . . . ) ;
2020-02-25 14:55:39 +01:00
# endif // !__MSC_VER
2020-02-25 11:29:33 +01:00
2020-02-15 15:51:18 +01:00
XStringW SubString ( const wchar_t * S , UINTN pos , UINTN count ) ;
XStringW CleanCtrl ( const XStringW & S ) ;
# endif