ON_String& ON_String::operator=(const ON_String& src) { if (m_s != src.m_s) { if ( src.IsEmpty() ) { Destroy(); Create(); } else if ( src.Header()->ref_count > 0 && 0 == ON_WorkerMemoryPool() ) { Destroy(); src.Header()->ref_count++; m_s = src.m_s; } else { ReserveArray(src.Length()); memcpy( m_s, src.Array(), src.Length()*sizeof(*m_s)); Header()->string_length = src.Length(); } } return *this; }
void ON_wString::AppendToArray( int size, const char* s ) { if ( size > 0 && s && s[0] ) { ReserveArray(size + Header()->string_length ); Header()->string_length += c2w( size, s, Header()->string_capacity-Header()->string_length, &m_s[Header()->string_length] ); m_s[Header()->string_length] = 0; } }
void ON_wString::AppendToArray( int size, const wchar_t* s ) { if ( size > 0 && s && s[0] ) { ReserveArray(size + Header()->string_length ); memcpy(&m_s[Header()->string_length], s, size*sizeof(*m_s)); Header()->string_length += size; m_s[Header()->string_length] = 0; } }
ON_String::ON_String( unsigned char c, int repeat_count ) { Create(); if ( repeat_count > 0 ) { ReserveArray(repeat_count); memset( m_s, c, repeat_count*sizeof(*m_s) ); m_s[repeat_count] = 0; Header()->string_length = repeat_count; } }
void ON_String::SetLength(size_t string_length) { int length = (int)string_length; // for 64 bit compilers if ( length >= Header()->string_capacity ) { ReserveArray(length); } if ( length >= 0 && length <= Header()->string_capacity ) { CopyArray(); Header()->string_length = length; m_s[length] = 0; } }
ON_wString::ON_wString( wchar_t c, int repeat_count ) { int i; Create(); if ( repeat_count > 0 ) { ReserveArray(repeat_count); for (i=0;i<repeat_count;i++) m_s[i] = c; m_s[repeat_count] = 0; Header()->string_length = repeat_count; } }
void ON_wString::CopyToArray( int size, const char* s ) { if ( size > 0 && s && s[0] ) { ReserveArray(size); Header()->string_length = c2w( size, s, Header()->string_capacity, m_s ); m_s[Header()->string_length] = 0; } else { if ( Header()->ref_count > 1 ) Destroy(); else { Header()->string_length = 0; m_s[0] = 0; } } }
void ON_String::CopyToArray( int size, const char* s ) { if ( size > 0 && s && s[0] ) { ReserveArray(size); memcpy(m_s, s, size*sizeof(*m_s)); Header()->string_length = size; m_s[Header()->string_length] = 0; } else { if ( Header()->ref_count > 1 ) Destroy(); else { Header()->string_length = 0; m_s[0] = 0; } } }
void ON_MSC_CDECL ON_String::Format( const unsigned char* sFormat, ...) { #define MAX_MSG_LENGTH 2048 char sMessage[MAX_MSG_LENGTH]; va_list args; /* put formatted message in sMessage */ memset(sMessage,0,sizeof(sMessage)); if (sFormat) { va_start(args, sFormat); on_vsnprintf(sMessage, MAX_MSG_LENGTH-1, (const char*)sFormat, args); sMessage[MAX_MSG_LENGTH-1] = 0; va_end(args); } const int len = Length(sMessage); if ( len < 1 ) { Destroy(); Create(); } else { ReserveArray( len ); CopyToArray( len, sMessage ); } }
int ON_String::Replace( const char* token1, const char* token2 ) { int count = 0; if ( 0 != token1 && 0 != token1[0] ) { if ( 0 == token2 ) token2 = ""; const int len1 = (int)strlen(token1); if ( len1 > 0 ) { const int len2 = (int)strlen(token2); int len = Length(); if ( len >= len1 ) { // in-place ON_SimpleArray<int> n(32); const char* s = m_s; int i; for ( i = 0; i <= len-len1; /*empty*/ ) { if ( strncmp(s,token1,len1) ) { s++; i++; } else { n.Append(i); i += len1; s += len1; } } count = n.Count(); // reserve array space - must be done even when len2 <= len1 // so that shared arrays are not corrupted. const int newlen = len + (count*(len2-len1)); if ( 0 == newlen ) { Destroy(); return count; } CopyArray(); // 24 August 2006 Dale Lear // This used to say // ReserveArray(newlen); // but when newlen < len and the string had multiple // references, the ReserveArray(newlen) call truncated // the input array. ReserveArray( ((newlen<len) ? len : newlen) ); int i0, i1, ni, j; if ( len2 > len1 ) { // copy from back to front i1 = newlen; i0 = len; for ( ni =0; ni < count; ni++ ) n[ni] = n[ni] + len1; for ( ni = count-1; ni >= 0; ni-- ) { j = n[ni]; while ( i0 > j ) { i0--; i1--; m_s[i1] = m_s[i0]; } i1 -= len2; i0 -= len1; memcpy(&m_s[i1],token2,len2*sizeof(m_s[0])); } } else { // copy from front to back i0 = i1 = n[0]; n.Append(len); for ( ni = 0; ni < count; ni++ ) { if ( len2 > 0 ) { memcpy(&m_s[i1],token2,len2*sizeof(m_s[0])); i1 += len2; } i0 += len1; j = n[ni+1]; while ( i0 < j ) { m_s[i1++] = m_s[i0++]; } } } Header()->string_length = newlen; m_s[newlen] = 0; } } } return count; }