void DwString::_copy() { if(mRep->mRefCount > 1) { size_t size = mLength + 1; char *newBuf = mem_alloc(&size); assert(newBuf != 0); if(newBuf != 0) { char *to = newBuf; const char *from = mRep->mBuffer + mStart; mem_copy(from, mLength, to); to[mLength] = 0; DwStringRep *rep = new DwStringRep(newBuf, size); assert(rep != 0); if(rep != 0) { delete_rep_safely(mRep); mRep = rep; mStart = 0; } else /* if (rep == 0) */ { mem_free(newBuf); mLength = 0; } } else /* if (newBuf == 0) */ { mLength = 0; } } }
void DwString::reserve(size_t aSize) { if(mRep->mRefCount == 1 && aSize < mRep->mSize && mRep != sEmptyRep) { return; } size_t size = aSize + 1; char *newBuf = mem_alloc(&size); assert(newBuf != 0); if(newBuf != 0) { char *to = newBuf; const char *from = mRep->mBuffer + mStart; mem_copy(from, mLength, to); to[mLength] = 0; DwStringRep *rep = new DwStringRep(newBuf, size); assert(rep != 0); if(rep != 0) { delete_rep_safely(mRep); mRep = rep; mStart = 0; } else { mem_free(newBuf); } } }
void DwString::TakeBuffer(char* aBuf, size_t aSize, size_t aStart, size_t aLen) { assert(aBuf != 0); DwStringRep* rep = new DwStringRep(aBuf, aSize); assert(rep != 0); if (rep) { delete_rep_safely(mRep); mRep = rep; mStart = aStart; mLength = aLen; } }
DwString& DwString::assign(const DwString& aStr, size_t aPos, size_t aLen) { assert(aPos <= aStr.mLength); size_t pos = DW_MIN(aPos, aStr.mLength); size_t len = DW_MIN(aLen, aStr.mLength - pos); if (mRep == aStr.mRep) { mStart = aStr.mStart + pos; mLength = len; } else { delete_rep_safely(mRep); mRep = new_rep_reference(aStr.mRep); mStart = aStr.mStart + pos; mLength = len; } return *this; }
void DwString::CopyTo(DwString* aStr) const { assert(aStr != 0); if (!aStr) return; size_t len = mLength; size_t size = len + 1; char* buf = mem_alloc(&size); assert(buf != 0); if (buf != 0) { mem_copy(mRep->mBuffer+mStart, len, buf); buf[len] = 0; DwStringRep* rep = new DwStringRep(buf, size); assert(rep != 0); if (rep != 0) { aStr->mRep = rep; delete_rep_safely(aStr->mRep); aStr->mStart = 0; aStr->mLength = len; } } }
DwString::~DwString() { assert(mRep != 0); delete_rep_safely(mRep); DEV_STMT(mRep = 0) }
void DwString::_replace(size_t aPos1, size_t aLen1, size_t aLen2, char aChar) { assert(aPos1 <= mLength); size_t pos1 = DW_MIN(aPos1, mLength); size_t len1 = DW_MIN(aLen1, mLength - pos1); assert(mStart + mLength - len1 < ((size_t) - 1) - aLen2); size_t len2 = DW_MIN(aLen2, ((size_t) - 1) - (mStart + mLength - len1)); size_t i; char *to; const char *from; size_t newLen = mLength - len1 + len2; // Is new string empty? if(newLen == 0) { if(mRep != sEmptyRep) { delete_rep_safely(mRep); mRep = new_rep_reference(sEmptyRep); mStart = 0; mLength = 0; } } // Is buffer shared? Is buffer too small? else if(mRep->mRefCount > 1 || newLen >= mRep->mSize) { size_t size = newLen + 1; char *newBuf = mem_alloc(&size); assert(newBuf != 0); if(newBuf != 0) { to = newBuf; from = mRep->mBuffer + mStart; for(i = 0; i < pos1; ++i) *to++ = *from++; for(i = 0; i < len2; ++i) *to++ = aChar; from = mRep->mBuffer + mStart + pos1 + len1; for(i = 0; i < mLength - pos1 - len1; ++i) *to++ = *from++; *to = 0; DwStringRep *rep = new DwStringRep(newBuf, size); assert(rep != 0); if(rep != 0) { delete_rep_safely(mRep); mRep = rep; mStart = 0; mLength = newLen; } } } // Is the replacement smaller than the replaced? else if(len2 < len1) { to = mRep->mBuffer + mStart + pos1; for(i = 0; i < len2; ++i) *to++ = aChar; from = mRep->mBuffer + mStart + pos1 + len1; for(i = 0; i < mLength - pos1 - len1; ++i) *to++ = *from++; *to = 0; mLength = newLen; } // Is there enough room at end of buffer? else if(mStart + newLen < mRep->mSize) { to = mRep->mBuffer + mStart + newLen; from = mRep->mBuffer + mStart + mLength - 1; *to-- = 0; for(i = 0; i < mLength - pos1 - len1; ++i) *to-- = *from--; for(i = 0; i < len2; ++i) *to-- = aChar; mLength = newLen; } // Is there enough room at beginning of buffer? else if(len2 - len1 <= mStart) { to = mRep->mBuffer + mStart - (len2 - len1); from = mRep->mBuffer + mStart; for(i = 0; i < pos1; ++i) *to++ = *from++; for(i = 0; i < len2; ++i) *to++ = aChar; mStart -= len2 - len1; mLength = newLen; } // There's enough room, but we must move characters. else { to = mRep->mBuffer + newLen; from = mRep->mBuffer + mStart + mLength - 1; *to-- = 0; for(i = 0; i < mLength - pos1 - len1; ++i) *to-- = *from--; to = mRep->mBuffer; from = mRep->mBuffer + mStart; for(i = 0; i < pos1; ++i) *to++ = *from++; for(i = 0; i < len2; ++i) *to++ = aChar; mStart = 0; mLength = newLen; } }