xref: /aoo41x/main/sal/rtl/source/byteseq.c (revision 647f063d)
1*647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*647f063dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*647f063dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*647f063dSAndrew Rist  * distributed with this work for additional information
6*647f063dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*647f063dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*647f063dSAndrew Rist  * "License"); you may not use this file except in compliance
9*647f063dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*647f063dSAndrew Rist  *
11*647f063dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*647f063dSAndrew Rist  *
13*647f063dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*647f063dSAndrew Rist  * software distributed under the License is distributed on an
15*647f063dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*647f063dSAndrew Rist  * KIND, either express or implied.  See the License for the
17*647f063dSAndrew Rist  * specific language governing permissions and limitations
18*647f063dSAndrew Rist  * under the License.
19*647f063dSAndrew Rist  *
20*647f063dSAndrew Rist  *************************************************************/
21*647f063dSAndrew Rist 
22*647f063dSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include <osl/diagnose.h>
25cdf0e10cSrcweir #include <osl/interlck.h>
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <rtl/byteseq.h>
28cdf0e10cSrcweir #include <rtl/alloc.h>
29cdf0e10cSrcweir #include <rtl/memory.h>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir /* static data to be referenced by all empty strings
32cdf0e10cSrcweir  * the refCount is predefined to 1 and must never become 0 !
33cdf0e10cSrcweir  */
34cdf0e10cSrcweir static sal_Sequence aEmpty_rtl_ByteSeq =
35cdf0e10cSrcweir {
36cdf0e10cSrcweir     1,      /* sal_Int32    refCount;   */
37cdf0e10cSrcweir     0,      /* sal_Int32    length;     */
38cdf0e10cSrcweir     { 0 }   /* sal_Unicode  buffer[1];  */
39cdf0e10cSrcweir };
40cdf0e10cSrcweir 
41cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_reference2One(sal_Sequence ** ppSequence)42cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_reference2One(
43cdf0e10cSrcweir 	sal_Sequence ** ppSequence )
44cdf0e10cSrcweir {
45cdf0e10cSrcweir 	sal_Sequence * pSequence, * pNew;
46cdf0e10cSrcweir 	sal_Int32 nElements;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir 	OSL_ENSURE( ppSequence, "### null ptr!" );
49cdf0e10cSrcweir 	pSequence = *ppSequence;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir 	if (pSequence->nRefCount > 1)
52cdf0e10cSrcweir 	{
53cdf0e10cSrcweir 		nElements = pSequence->nElements;
54cdf0e10cSrcweir 		if (nElements)
55cdf0e10cSrcweir 		{
56cdf0e10cSrcweir 			pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nElements );
57cdf0e10cSrcweir 
58cdf0e10cSrcweir             if ( pNew != 0 )
59cdf0e10cSrcweir                 rtl_copyMemory( pNew->elements, pSequence->elements, nElements );
60cdf0e10cSrcweir 
61cdf0e10cSrcweir             if (! osl_decrementInterlockedCount( &pSequence->nRefCount ))
62cdf0e10cSrcweir                 rtl_freeMemory( pSequence );
63cdf0e10cSrcweir 		}
64cdf0e10cSrcweir 		else
65cdf0e10cSrcweir 		{
66cdf0e10cSrcweir 			pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE );
67cdf0e10cSrcweir 		}
68cdf0e10cSrcweir 
69cdf0e10cSrcweir         if ( pNew != 0 )
70cdf0e10cSrcweir         {
71cdf0e10cSrcweir             pNew->nRefCount = 1;
72cdf0e10cSrcweir             pNew->nElements = nElements;
73cdf0e10cSrcweir         }
74cdf0e10cSrcweir 
75cdf0e10cSrcweir         *ppSequence = pNew;
76cdf0e10cSrcweir 	}
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_realloc(sal_Sequence ** ppSequence,sal_Int32 nSize)80cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_realloc(
81cdf0e10cSrcweir 	sal_Sequence ** ppSequence, sal_Int32 nSize )
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	sal_Sequence * pSequence, * pNew;
84cdf0e10cSrcweir 	sal_Int32 nElements;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir 	OSL_ENSURE( ppSequence, "### null ptr!" );
87cdf0e10cSrcweir 	pSequence = *ppSequence;
88cdf0e10cSrcweir 	nElements = pSequence->nElements;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 	if (nElements == nSize)
91cdf0e10cSrcweir 		return;
92cdf0e10cSrcweir 
93cdf0e10cSrcweir 	if (pSequence->nRefCount > 1) // split
94cdf0e10cSrcweir 	{
95cdf0e10cSrcweir 		pNew = (sal_Sequence *)rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nSize );
96cdf0e10cSrcweir 
97cdf0e10cSrcweir         if ( pNew != 0 )
98cdf0e10cSrcweir         {
99cdf0e10cSrcweir             if (nSize > nElements)
100cdf0e10cSrcweir             {
101cdf0e10cSrcweir                 rtl_copyMemory( pNew->elements, pSequence->elements, nElements );
102cdf0e10cSrcweir                 rtl_zeroMemory( pNew->elements + nElements, nSize - nElements );
103cdf0e10cSrcweir             }
104cdf0e10cSrcweir             else
105cdf0e10cSrcweir             {
106cdf0e10cSrcweir                 rtl_copyMemory( pNew->elements, pSequence->elements, nSize );
107cdf0e10cSrcweir             }
108cdf0e10cSrcweir         }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir         if (! osl_decrementInterlockedCount( &pSequence->nRefCount ))
111cdf0e10cSrcweir             rtl_freeMemory( pSequence );
112cdf0e10cSrcweir 		pSequence = pNew;
113cdf0e10cSrcweir 	}
114cdf0e10cSrcweir 	else
115cdf0e10cSrcweir 	{
116cdf0e10cSrcweir 		pSequence = (sal_Sequence *)rtl_reallocateMemory(
117cdf0e10cSrcweir 			pSequence, SAL_SEQUENCE_HEADER_SIZE + nSize );
118cdf0e10cSrcweir 	}
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     if ( pSequence != 0 )
121cdf0e10cSrcweir     {
122cdf0e10cSrcweir         pSequence->nRefCount = 1;
123cdf0e10cSrcweir         pSequence->nElements = nSize;
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	*ppSequence = pSequence;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
129cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_acquire(sal_Sequence * pSequence)130cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_acquire( sal_Sequence *pSequence )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir 	OSL_ASSERT( pSequence );
133cdf0e10cSrcweir 	osl_incrementInterlockedCount( &(pSequence->nRefCount) );
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_release(sal_Sequence * pSequence)137cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_release( sal_Sequence *pSequence )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir     if ( pSequence != 0 )
140cdf0e10cSrcweir     {
141cdf0e10cSrcweir         if (! osl_decrementInterlockedCount( &(pSequence->nRefCount )) )
142cdf0e10cSrcweir         {
143cdf0e10cSrcweir             rtl_freeMemory( pSequence );
144cdf0e10cSrcweir         }
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_construct(sal_Sequence ** ppSequence,sal_Int32 nLength)149cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_construct( sal_Sequence **ppSequence , sal_Int32 nLength )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir 	OSL_ASSERT( ppSequence );
152cdf0e10cSrcweir 	if( *ppSequence )
153cdf0e10cSrcweir 	{
154cdf0e10cSrcweir 		rtl_byte_sequence_release( *ppSequence );
155cdf0e10cSrcweir 		*ppSequence = 0;
156cdf0e10cSrcweir 	}
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	if( nLength )
159cdf0e10cSrcweir 	{
160cdf0e10cSrcweir 		*ppSequence = (sal_Sequence *) rtl_allocateZeroMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
161cdf0e10cSrcweir 
162cdf0e10cSrcweir         if ( *ppSequence != 0 )
163cdf0e10cSrcweir         {
164cdf0e10cSrcweir             (*ppSequence)->nRefCount = 1;
165cdf0e10cSrcweir             (*ppSequence)->nElements = nLength;
166cdf0e10cSrcweir         }
167cdf0e10cSrcweir 	}
168cdf0e10cSrcweir 	else
169cdf0e10cSrcweir 	{
170cdf0e10cSrcweir 		*ppSequence = &aEmpty_rtl_ByteSeq;
171cdf0e10cSrcweir 		rtl_byte_sequence_acquire( *ppSequence );
172cdf0e10cSrcweir 	}
173cdf0e10cSrcweir }
174cdf0e10cSrcweir 
175cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_constructNoDefault(sal_Sequence ** ppSequence,sal_Int32 nLength)176cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_constructNoDefault(	sal_Sequence **ppSequence , sal_Int32 nLength )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir 	OSL_ASSERT( ppSequence );
179cdf0e10cSrcweir 	if( *ppSequence )
180cdf0e10cSrcweir 	{
181cdf0e10cSrcweir 		rtl_byte_sequence_release( *ppSequence );
182cdf0e10cSrcweir 		*ppSequence = 0;
183cdf0e10cSrcweir 	}
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	*ppSequence = (sal_Sequence *) rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
186cdf0e10cSrcweir 
187cdf0e10cSrcweir 	if ( *ppSequence != 0 )
188cdf0e10cSrcweir 	{
189cdf0e10cSrcweir 		(*ppSequence)->nRefCount = 1;
190cdf0e10cSrcweir 		(*ppSequence)->nElements = nLength;
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
194cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_constructFromArray(sal_Sequence ** ppSequence,const sal_Int8 * pData,sal_Int32 nLength)195cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_constructFromArray(
196cdf0e10cSrcweir 	sal_Sequence **ppSequence, const sal_Int8 *pData , sal_Int32 nLength )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir 	rtl_byte_sequence_constructNoDefault( ppSequence , nLength );
199cdf0e10cSrcweir     if ( *ppSequence != 0 )
200cdf0e10cSrcweir         rtl_copyMemory( (*ppSequence)->elements, pData, nLength );
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_assign(sal_Sequence ** ppSequence,sal_Sequence * pSequence)204cdf0e10cSrcweir void SAL_CALL rtl_byte_sequence_assign( sal_Sequence **ppSequence , sal_Sequence *pSequence )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	if ( *ppSequence != pSequence)
207cdf0e10cSrcweir 	{
208cdf0e10cSrcweir 		if( *ppSequence )
209cdf0e10cSrcweir 		{
210cdf0e10cSrcweir 			rtl_byte_sequence_release( *ppSequence );
211cdf0e10cSrcweir 		}
212cdf0e10cSrcweir 		*ppSequence = pSequence;
213cdf0e10cSrcweir 		rtl_byte_sequence_acquire( *ppSequence );
214cdf0e10cSrcweir 	}
215cdf0e10cSrcweir //	else
216cdf0e10cSrcweir //      nothing to do
217cdf0e10cSrcweir 
218cdf0e10cSrcweir }
219cdf0e10cSrcweir 
220cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_equals(sal_Sequence * pSequence1,sal_Sequence * pSequence2)221cdf0e10cSrcweir sal_Bool SAL_CALL rtl_byte_sequence_equals( sal_Sequence *pSequence1 , sal_Sequence *pSequence2 )
222cdf0e10cSrcweir {
223cdf0e10cSrcweir 	OSL_ASSERT( pSequence1 );
224cdf0e10cSrcweir 	OSL_ASSERT( pSequence2 );
225cdf0e10cSrcweir 	if (pSequence1 == pSequence2)
226cdf0e10cSrcweir 	{
227cdf0e10cSrcweir 		return sal_True;
228cdf0e10cSrcweir 	}
229cdf0e10cSrcweir 	if (pSequence1->nElements != pSequence2->nElements)
230cdf0e10cSrcweir 	{
231cdf0e10cSrcweir 		return sal_False;
232cdf0e10cSrcweir 	}
233cdf0e10cSrcweir 	return (sal_Bool)
234cdf0e10cSrcweir         (rtl_compareMemory(
235cdf0e10cSrcweir             pSequence1->elements, pSequence2->elements, pSequence1->nElements )
236cdf0e10cSrcweir          == 0);
237cdf0e10cSrcweir }
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 
240cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_getConstArray(sal_Sequence * pSequence)241cdf0e10cSrcweir const sal_Int8 *SAL_CALL rtl_byte_sequence_getConstArray( sal_Sequence *pSequence )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir 	return ((const sal_Int8*)(pSequence->elements));
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir //==================================================================================================
rtl_byte_sequence_getLength(sal_Sequence * pSequence)247cdf0e10cSrcweir sal_Int32 SAL_CALL rtl_byte_sequence_getLength( sal_Sequence *pSequence )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir 	return pSequence->nElements;
250cdf0e10cSrcweir }
251