| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #include <osl/interlck.h> |
| |
| #ifndef _RTL_STRING_HXX_ |
| #include <rtl/strbuf.hxx> |
| #endif |
| #include <rtl/memory.h> |
| |
| /* |
| #include <rtl/alloc.h> |
| */ |
| |
| |
| |
| /************************************************************************* |
| * rtl_stringbuffer_newFromStr_WithLength |
| */ |
| void SAL_CALL rtl_stringbuffer_newFromStr_WithLength( rtl_String ** newStr, |
| const sal_Char * value, |
| sal_Int32 count ) |
| { |
| if (!value) |
| { |
| rtl_string_new_WithLength( newStr, 16 ); |
| return; |
| } |
| |
| rtl_string_new_WithLength( newStr, count + 16 ); |
| (*newStr)->length = count; |
| rtl_copyMemory( (*newStr)->buffer, value, count ); |
| return; |
| } |
| |
| /************************************************************************* |
| * rtl_stringbuffer_newFromStringBuffer |
| */ |
| sal_Int32 SAL_CALL rtl_stringbuffer_newFromStringBuffer( rtl_String ** newStr, |
| sal_Int32 capacity, |
| rtl_String * oldStr ) |
| { |
| sal_Int32 newCapacity = capacity; |
| |
| if (newCapacity < oldStr->length) |
| newCapacity = oldStr->length; |
| |
| rtl_string_new_WithLength( newStr, newCapacity ); |
| if (oldStr->length > 0) { |
| (*newStr)->length = oldStr->length; |
| rtl_copyMemory( (*newStr)->buffer, oldStr->buffer, oldStr->length ); |
| } |
| return newCapacity; |
| } |
| |
| /************************************************************************* |
| * rtl_stringbuffer_ensureCapacity |
| */ |
| void SAL_CALL rtl_stringbuffer_ensureCapacity |
| (rtl_String ** This, sal_Int32* capacity, sal_Int32 minimumCapacity) |
| { |
| if (minimumCapacity > *capacity) |
| { |
| rtl_String * pTmp = *This; |
| rtl_String * pNew = NULL; |
| *capacity = ((*This)->length + 1) * 2; |
| if (minimumCapacity > *capacity) |
| /* still lower, set to the minimum capacity */ |
| *capacity = minimumCapacity; |
| |
| rtl_string_new_WithLength(&pNew, *capacity); |
| pNew->length = (*This)->length; |
| *This = pNew; |
| |
| rtl_copyMemory( (*This)->buffer, pTmp->buffer, pTmp->length ); |
| rtl_string_release( pTmp ); |
| } |
| } |
| |
| /************************************************************************* |
| * rtl_stringbuffer_insert |
| */ |
| void SAL_CALL rtl_stringbuffer_insert( rtl_String ** This, |
| sal_Int32 * capacity, |
| sal_Int32 offset, |
| const sal_Char * str, |
| sal_Int32 len ) |
| { |
| sal_Int32 nOldLen; |
| sal_Char * pBuf; |
| sal_Int32 n; |
| if( len != 0 ) |
| { |
| if (*capacity < (*This)->length + len) |
| rtl_stringbuffer_ensureCapacity( This, capacity, (*This)->length + len ); |
| |
| /* |
| if( len == 1 ) |
| This->buffer |
| */ |
| nOldLen = (*This)->length; |
| pBuf = (*This)->buffer; |
| |
| /* copy the tail */ |
| n = (nOldLen - offset); |
| if( n == 1 ) |
| /* optimized for 1 character */ |
| pBuf[offset + len] = pBuf[offset]; |
| else if( n > 1 ) |
| rtl_moveMemory( pBuf + offset + len, pBuf + offset, n * sizeof(sal_Char) ); |
| |
| /* insert the new characters */ |
| n = len; |
| if( len == 1 ) |
| /* optimized for 1 character */ |
| pBuf[offset] = *str; |
| else if( n > 1 ) |
| rtl_copyMemory( pBuf + offset, str, len * sizeof(sal_Char) ); |
| (*This)->length = nOldLen + len; |
| pBuf[ nOldLen + len ] = 0; |
| } |
| } |
| |