Пример #1
0
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;
        }
    }
}
Пример #2
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);
        }
    }
}
Пример #3
0
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;
    }
}
Пример #4
0
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;
}
Пример #5
0
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;
        }
    }
}
Пример #6
0
DwString::~DwString()
{
    assert(mRep != 0);
    delete_rep_safely(mRep);
    DEV_STMT(mRep = 0)
}
Пример #7
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;
    }
}