1647f063dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3647f063dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4647f063dSAndrew Rist * or more contributor license agreements. See the NOTICE file
5647f063dSAndrew Rist * distributed with this work for additional information
6647f063dSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7647f063dSAndrew Rist * to you under the Apache License, Version 2.0 (the
8647f063dSAndrew Rist * "License"); you may not use this file except in compliance
9647f063dSAndrew Rist * with the License. You may obtain a copy of the License at
10647f063dSAndrew Rist *
11647f063dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12647f063dSAndrew Rist *
13647f063dSAndrew Rist * Unless required by applicable law or agreed to in writing,
14647f063dSAndrew Rist * software distributed under the License is distributed on an
15647f063dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16647f063dSAndrew Rist * KIND, either express or implied. See the License for the
17647f063dSAndrew Rist * specific language governing permissions and limitations
18647f063dSAndrew Rist * under the License.
19647f063dSAndrew Rist *
20647f063dSAndrew Rist *************************************************************/
21647f063dSAndrew Rist
22647f063dSAndrew 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
58*509a48ffSpfg if ( pNew != NULL )
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
69*509a48ffSpfg if ( pNew != NULL )
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
97*509a48ffSpfg if ( pNew != NULL )
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
120*509a48ffSpfg if ( pSequence != NULL )
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 {
139*509a48ffSpfg if ( pSequence != NULL )
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 );
155*509a48ffSpfg *ppSequence = NULL;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
158cdf0e10cSrcweir if( nLength )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir *ppSequence = (sal_Sequence *) rtl_allocateZeroMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
161cdf0e10cSrcweir
162*509a48ffSpfg if ( *ppSequence != NULL )
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 );
182*509a48ffSpfg *ppSequence = NULL;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
185cdf0e10cSrcweir *ppSequence = (sal_Sequence *) rtl_allocateMemory( SAL_SEQUENCE_HEADER_SIZE + nLength );
186cdf0e10cSrcweir
187*509a48ffSpfg if ( *ppSequence != NULL )
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 );
199*509a48ffSpfg if ( *ppSequence != NULL )
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