summaryrefslogtreecommitdiff
path: root/src/core/xbstring.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/xbstring.cpp')
-rwxr-xr-xsrc/core/xbstring.cpp163
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;
}