diff options
Diffstat (limited to 'src/core/xbstring.cpp')
-rwxr-xr-x | src/core/xbstring.cpp | 163 |
1 files changed, 110 insertions, 53 deletions
diff --git a/src/core/xbstring.cpp b/src/core/xbstring.cpp index 701e50e..89cefb6 100755 --- a/src/core/xbstring.cpp +++ b/src/core/xbstring.cpp @@ -2,7 +2,7 @@ XBase64 Software Library -Copyright (c) 1997,2003,2014,2021,2022 Gary A Kunkel +Copyright (c) 1997,2003,2014,2021,2022,2023 Gary A Kunkel The xb64 software library is covered under the terms of the GPL Version 3, 2007 license. @@ -175,7 +175,7 @@ xbString &xbString::operator+=( const xbString &s ) { *t++ = s.GetCharacter(i+1); data[newLen] = '\0'; - size += Len; + size == 0 ? size += (Len + 1) : size += Len; return (*this); } @@ -197,7 +197,8 @@ xbString &xbString::operator+=( const char *s ) { for( xbUInt32 i = 0; i < Len; i++ ) data[i+oldLen] = s[i]; data[newLen] = '\0'; - size += Len; + // size += Len; + size == 0 ? size+= (Len + 1) : size += Len; return (*this); } /************************************************************************/ @@ -211,7 +212,8 @@ xbString &xbString::operator+=( char c ) { data = (char *)realloc(data, oldLen+Len+1); data[oldLen] = c; data[oldLen+1] = 0; - size++; + // size++; + size == 0 ? size += 2 : size++; return (*this); } /************************************************************************/ @@ -237,7 +239,8 @@ xbString &xbString::operator-=( const xbString &s ) { data[i+oldLen] = s.GetCharacter(i+1); data[newLen] = '\0'; - size += Len; + //size += Len; + size == 0 ? size += (Len+1) : size += Len; Rtrim(); return (*this); } @@ -265,7 +268,9 @@ xbString &xbString::operator-=(const char *s) { data[i+oldLen] = s[i]; data[newLen] = '\0'; - size += Len; + //size += Len; + size == 0 ? size += (Len+1) : size += Len; + Rtrim(); return (*this); } @@ -278,7 +283,10 @@ xbString &xbString::operator-=(const char *s) { xbString &xbString::operator-=(const char c) { Rtrim(); xbUInt32 oldSize = size; - size += 1; + + // size += 1; + size == 0 ? size += 2 : size += 1; + data = (char *)realloc( data, size ); if( oldSize == 0 ) data[0] = 0; data[size-2] = c; @@ -534,7 +542,10 @@ xbString &xbString::AddBackSlash( char c ) { if( data ) free( data ); data = p; - size += lCnt; + + // size += lCnt; + size == 0 ? size += (lCnt+1) : size += lCnt; + return *this; } /************************************************************************/ @@ -571,26 +582,37 @@ xbString &xbString::Append( char c ) { /************************************************************************/ //! @brief Append data to string. /*! - \param s String data to append. + \param s String data to append. \param ulByteCount Maximum number of bytes to append. \returns Reference to this string. */ xbString &xbString::Append( const char *s, xbUInt32 ulByteCount ) { - if (s == NULL) return (*this); - xbUInt32 oldLen = this->Len(); - xbUInt32 newLen = ulByteCount + oldLen; + if ( s == NULL || !*s || ulByteCount == 0) + return (*this); - data = (char *)realloc(data, newLen+1); + xbUInt32 ulOrigLen = this->Len(); - if(oldLen == 0) - data[0] = 0; + // s might not be null byte at the end, can't use strlen + // xbUInt32 ulAddLen = strlen( s ); + xbUInt32 ulAddLen = 0; + const char *p = s; - for( xbUInt32 i = 0; i < ulByteCount; i++ ) - data[i+oldLen] = s[i]; + while( ulAddLen < ulByteCount && *p ){ + p++; + ulAddLen++; + } - data[newLen] = '\0'; - size += ulByteCount; + if( ulAddLen > ulByteCount ) + ulAddLen = ulByteCount; + + size = ulOrigLen + ulAddLen + 1; + data = (char *) realloc( data, size ); + + for( xbUInt32 i = 0; i < ulAddLen; i++ ) + data[i+ulOrigLen] = s[i]; + + data[size-1] = 0x00; return (*this); } @@ -616,7 +638,10 @@ xbString &xbString::Assign(const char * sStr, xbUInt32 ulStartPos, xbUInt32 ulCo if((( ulCopyLen - 1) + ulStartPos ) > lLen ) ulCopyLen = lLen - ulStartPos + 1; data = (char *)calloc(1, ulCopyLen + 1); - size = ulCopyLen; + + //size = ulCopyLen + 1; + size == 0 ? size += (ulCopyLen+1) : size += ulCopyLen; + for( xbUInt32 i = 0; i < ulCopyLen; i++ ) data[i] = sStr[i + ulStartPos - ((xbUInt32) 1)]; data[ulCopyLen] = '\0'; @@ -643,7 +668,9 @@ xbString &xbString::Assign(const char * sStr, xbUInt32 ulStartPos){ xbUInt32 ulCopyLen; ulCopyLen = ulSrcLen - ulStartPos + 1; data = (char *)calloc(1, ulCopyLen + 1); - size = ulCopyLen; + + size = ulCopyLen + 1; + for( xbUInt32 i = 0; i < ulCopyLen; i++ ) data[i] = sStr[i + ulStartPos - ((xbUInt32) 1)]; data[ulCopyLen] = '\0'; @@ -672,7 +699,7 @@ xbString &xbString::Assign(const xbString& sStr, xbUInt32 ulStartPos, xbUInt32 u if((( ulCopyLen - 1) + ulStartPos ) > ulSrcLen ) ulCopyLen = ulSrcLen - ulStartPos + 1; data = (char *)calloc(1, ulCopyLen + 1); - size = ulCopyLen; + size = ulCopyLen + 1; for( xbUInt32 i = 0; i < ulCopyLen; i++ ) data[i] = sStr[i + ulStartPos]; data[ulCopyLen] = '\0'; @@ -703,6 +730,7 @@ xbString &xbString::Assign(const xbString& sStr, xbUInt32 ulStartPos){ for( xbUInt32 i = 0; i < ulCopyLen; i++ ) data[i] = sStr[i + ulStartPos]; data[ulCopyLen] = '\0'; + size++; return (*this); } /************************************************************************/ @@ -895,6 +923,21 @@ void xbString::DumpHex( const char * title ) const { /************************************************************************/ //! @brief Extract an element out of a delimited string. /*! + \param sSrc Source string. + \param cDelim Delimiter. + \param lSkipCnt Number of delimiters to skip. + \param iOpt 0 - ignore single and double quotes.<br> + 1 - ignore delimiters between single or double quotes. + \returns Reference to string extracted from element. +*/ +xbString &xbString::ExtractElement( xbString &sSrc, char cDelim, xbUInt32 lSkipCnt, xbInt16 iOpt ) +{ + return ExtractElement( sSrc.Str(), cDelim, lSkipCnt, iOpt ); +} + +/************************************************************************/ +//! @brief Extract an element out of a delimited string. +/*! \param pSrc Source string. \param cDelim Delimiter. \param lSkipCnt Number of delimiters to skip. @@ -1043,6 +1086,8 @@ xbUInt32 xbString::GetLastPos(const char* s) const{ /************************************************************************/ //! @brief Get the path separator out of the string. /*! + This method assumes the string is a valid path name. + If it is, it returns either / or \. \returns Char value containing either / or \ depending on OS. */ char xbString::GetPathSeparator() const { @@ -1147,12 +1192,15 @@ xbString &xbString::Ltrim(){ s++; size--; } + xbUInt32 i; for( i = 0; i < size; i++ ) data[i] = data[i+s]; data[i] = 0x00; data = (char *) realloc( data, size ); + return *this; + } /************************************************************************/ @@ -1162,10 +1210,6 @@ xbString &xbString::Ltrim(){ \returns Reference to this string. */ xbString &xbString::Ltrunc( xbUInt32 ulCnt ){ - // left truncate cnt bytes - - char * ndata; - char * p; if( ulCnt >= size ){ if( size > 0 ){ free( data ); @@ -1174,6 +1218,9 @@ xbString &xbString::Ltrunc( xbUInt32 ulCnt ){ } return *this; } + + char * ndata; + char * p; ndata = (char *) calloc( 1, size - ulCnt ); p = data; p += ulCnt; @@ -1203,12 +1250,27 @@ xbString &xbString::Mid( xbUInt32 ulStartPos, xbUInt32 ulTargLen ){ return( *this ); if( ulStartPos > Len() ) return( *this ); +/* + // Resize( ulTargLen + 1 ); char *pTarg = data; char *pSrc = data + ulStartPos - 1; for( xbUInt32 l = 0; l < ulTargLen; l++ ) *pTarg++ = *pSrc++; *pTarg = 0x00; - Resize( ulTargLen + 1 ); + // Resize( ulTargLen + 1 ); + */ + + char * newData = (char *) calloc( 1, ulTargLen + 1 ); + char *pTarg = newData; + char *pSrc = data + ulStartPos - 1; + for( xbUInt32 l = 0; l < ulTargLen; l++ ) + *pTarg++ = *pSrc++; + *pTarg = 0x00; + + free( data ); + data = newData; + size = ulTargLen + 1; + return *this; } @@ -1300,8 +1362,6 @@ xbUInt32 xbString::Pos(char c, xbUInt32 ulStartPos ) const { return 0; } - - /************************************************************************/ //! @brief Determine position of a given character /*! @@ -1323,7 +1383,6 @@ xbUInt32 xbString::Pos(char c) const { p++; } } - if( iFound ) return iPos + 1; else @@ -1396,10 +1455,6 @@ xbString &xbString::Remove(xbUInt32 ulStartPos, xbUInt32 ulDelSize ) { return( *this ); } - - - - /************************************************************************/ //! @brief Replace a value within a string with another value /*! @@ -1457,6 +1512,7 @@ xbString &xbString::Replace( const char *sReplace, const char *sReplaceWith, xbI free(data); data = sBuf2; + size = ulNewLen; } } return *this; @@ -1471,12 +1527,11 @@ xbString &xbString::Replace( const char *sReplace, const char *sReplaceWith, xbI //the new size includes the null termination byte xbString &xbString::Resize(xbUInt32 ulSize) { -// data = (char *) realloc((void *) data, ulSize ); +// data = (char *) realloc( data, ulSize ); // original - data = (char *)realloc(data, ulSize); - + data = (char *) realloc( data, ulSize ); if( ulSize > 0 ) data[ulSize-1] = 0; @@ -1495,6 +1550,8 @@ xbString &xbString::Rtrim(){ xbUInt32 l = Len(); if( l == 0 ) return *this; + + xbUInt32 ulOrigSize = size; l--; for(;;) { @@ -1506,6 +1563,9 @@ xbString &xbString::Rtrim(){ break; l--; } + + if( ulOrigSize != size ) + data = (char * ) realloc( data, size ); return *this; } @@ -1525,7 +1585,7 @@ xbString &xbString::Set( const char *s ) { free(data); data = NULL; } - if(s == NULL ) { + if( s == NULL || !*s ) { if( data ) free( data ); data = NULL; @@ -1546,14 +1606,17 @@ xbString &xbString::Set( const char *s ) { */ xbString &xbString::Set( const xbString &s ) { +// if( s.Str() == NULL || s.Len() == 0 ){ + if( s.Str() == NULL ){ if( data ) free( data ); data = NULL; size = 0; } else { - char *p = (char *) calloc( 1, s.Len() + 1 ); + xbUInt32 ulLen = s.Len(); + char *p = (char *) calloc( 1, ulLen + 1 ); xb_strcpy( p, s.Str()); - size = s.Len() + 1; + size = ulLen + 1; if( data ) free( data ); data = p; } @@ -1619,12 +1682,8 @@ xbString &xbString::Sprintf( const char *sFormat, ...) { xbInt32 iRc; va_list ap; - char *t; -// if( data ) -// free( data ); - #ifdef HAVE__VSNPRINTF_S_F va_start( ap, sFormat ); @@ -1646,7 +1705,7 @@ xbString &xbString::Sprintf( const char *sFormat, ...) { va_start( ap, sFormat ); // size = (xbUInt32) vsprintf_s( NULL, 0, sFormat, ap ) + 1; - size = _vscprintf( sFormat, ap ) + 1; + size = (xbUInt32) _vscprintf( sFormat, ap ) + 1; va_end( ap ); t = (char *) malloc( size ); @@ -1772,7 +1831,6 @@ xbString &xbString::Trim(){ return *this; } - /************************************************************************/ //! @brief Private function used for reallocateing memory /*! @@ -1816,11 +1874,8 @@ char * xbString::xb_realloc( char * pIn, xbUInt32 iLen ){ char * xbString::xb_strcpy( char *sTarget, const char *sSource ){ char *temp = sTarget; - while( *sSource != '\0'){ + while( *sSource != '\0') *sTarget++ = *sSource++; -// sTarget++; -// sSource++; - } *sTarget= '\0'; return temp; } @@ -1890,7 +1945,8 @@ xbString &xbString::ZapChar( char c ){ } } *t = 0x00; - Resize( size ); + + data = (char *) realloc( data, size ); return *this; } @@ -1914,7 +1970,6 @@ xbString &xbString::ZapLeadingChar( char c ){ return *this; } - /************************************************************************/ //! @brief Remove trailing character from a string. /*! @@ -1926,7 +1981,7 @@ xbString &xbString::ZapTrailingChar( char c ){ xbUInt32 l = Len(); if( l == 0 ) return *this; - + xbUInt32 ulOrigSize = size; l--; for(;;) { if( data[l] != c ) @@ -1937,6 +1992,8 @@ xbString &xbString::ZapTrailingChar( char c ){ break; l--; } + if( ulOrigSize != size ) + data = (char *) realloc( data, size ); return *this; } |