1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*89b56da7SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*89b56da7SAndrew Rist * distributed with this work for additional information
6*89b56da7SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*89b56da7SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*89b56da7SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*89b56da7SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist * KIND, either express or implied. See the License for the
17*89b56da7SAndrew Rist * specific language governing permissions and limitations
18*89b56da7SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*89b56da7SAndrew Rist *************************************************************/
21*89b56da7SAndrew Rist
22*89b56da7SAndrew Rist #
23cdf0e10cSrcweir
24cdf0e10cSrcweir // no include "precompiled_tools.hxx" because this is included in other cxx files.
25cdf0e10cSrcweir
26cdf0e10cSrcweir // =======================================================================
27cdf0e10cSrcweir
28cdf0e10cSrcweir #ifdef DBG_UTIL
29cdf0e10cSrcweir
ImplDbgCheckAsciiStr(const sal_Char * pAsciiStr,sal_Int32 nLen)30cdf0e10cSrcweir static sal_Bool ImplDbgCheckAsciiStr( const sal_Char* pAsciiStr, sal_Int32 nLen )
31cdf0e10cSrcweir {
32cdf0e10cSrcweir while ( nLen && *pAsciiStr )
33cdf0e10cSrcweir {
34cdf0e10cSrcweir if ( ((unsigned char)*pAsciiStr) > 127 )
35cdf0e10cSrcweir return sal_False;
36cdf0e10cSrcweir ++pAsciiStr,
37cdf0e10cSrcweir --nLen;
38cdf0e10cSrcweir }
39cdf0e10cSrcweir
40cdf0e10cSrcweir return sal_True;
41cdf0e10cSrcweir }
42cdf0e10cSrcweir
43cdf0e10cSrcweir #endif
44cdf0e10cSrcweir
45cdf0e10cSrcweir // =======================================================================
46cdf0e10cSrcweir
ImplCopyAsciiStr(sal_Unicode * pDest,const sal_Char * pSrc,sal_Int32 nLen)47cdf0e10cSrcweir static void ImplCopyAsciiStr( sal_Unicode* pDest, const sal_Char* pSrc,
48cdf0e10cSrcweir sal_Int32 nLen )
49cdf0e10cSrcweir {
50cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pSrc, nLen ),
51cdf0e10cSrcweir "UniString::CopyAsciiStr() - pAsciiStr include characters > 127" );
52cdf0e10cSrcweir
53cdf0e10cSrcweir while ( nLen )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir *pDest = (unsigned char)*pSrc;
56cdf0e10cSrcweir ++pDest,
57cdf0e10cSrcweir ++pSrc,
58cdf0e10cSrcweir --nLen;
59cdf0e10cSrcweir }
60cdf0e10cSrcweir }
61cdf0e10cSrcweir
62cdf0e10cSrcweir // =======================================================================
63cdf0e10cSrcweir
ImplStringCompareAscii(const sal_Unicode * pStr1,const sal_Char * pStr2)64cdf0e10cSrcweir static sal_Int32 ImplStringCompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2 )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir sal_Int32 nRet;
67cdf0e10cSrcweir while ( ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) &&
68cdf0e10cSrcweir *pStr2 )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir ++pStr1,
71cdf0e10cSrcweir ++pStr2;
72cdf0e10cSrcweir }
73cdf0e10cSrcweir
74cdf0e10cSrcweir return nRet;
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
77cdf0e10cSrcweir // -----------------------------------------------------------------------
78cdf0e10cSrcweir
ImplStringCompareAscii(const sal_Unicode * pStr1,const sal_Char * pStr2,xub_StrLen nCount)79cdf0e10cSrcweir static sal_Int32 ImplStringCompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2,
80cdf0e10cSrcweir xub_StrLen nCount )
81cdf0e10cSrcweir {
82cdf0e10cSrcweir sal_Int32 nRet = 0;
83cdf0e10cSrcweir while ( nCount &&
84cdf0e10cSrcweir ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) &&
85cdf0e10cSrcweir *pStr2 )
86cdf0e10cSrcweir {
87cdf0e10cSrcweir ++pStr1,
88cdf0e10cSrcweir ++pStr2,
89cdf0e10cSrcweir --nCount;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir return nRet;
93cdf0e10cSrcweir }
94cdf0e10cSrcweir
95cdf0e10cSrcweir // -----------------------------------------------------------------------
96cdf0e10cSrcweir
ImplStringCompareWithoutZeroAscii(const sal_Unicode * pStr1,const sal_Char * pStr2,xub_StrLen nCount)97cdf0e10cSrcweir static sal_Int32 ImplStringCompareWithoutZeroAscii( const sal_Unicode* pStr1, const sal_Char* pStr2,
98cdf0e10cSrcweir xub_StrLen nCount )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir sal_Int32 nRet = 0;
101cdf0e10cSrcweir while ( nCount &&
102cdf0e10cSrcweir ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) )
103cdf0e10cSrcweir {
104cdf0e10cSrcweir ++pStr1,
105cdf0e10cSrcweir ++pStr2,
106cdf0e10cSrcweir --nCount;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir
109cdf0e10cSrcweir return nRet;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir // -----------------------------------------------------------------------
113cdf0e10cSrcweir
ImplStringICompareAscii(const sal_Unicode * pStr1,const sal_Char * pStr2)114cdf0e10cSrcweir static sal_Int32 ImplStringICompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2 )
115cdf0e10cSrcweir {
116cdf0e10cSrcweir sal_Int32 nRet;
117cdf0e10cSrcweir sal_Unicode c1;
118cdf0e10cSrcweir sal_Char c2;
119cdf0e10cSrcweir do
120cdf0e10cSrcweir {
121cdf0e10cSrcweir // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln
122cdf0e10cSrcweir c1 = *pStr1;
123cdf0e10cSrcweir c2 = *pStr2;
124cdf0e10cSrcweir if ( (c1 >= 65) && (c1 <= 90) )
125cdf0e10cSrcweir c1 += 32;
126cdf0e10cSrcweir if ( (c2 >= 65) && (c2 <= 90) )
127cdf0e10cSrcweir c2 += 32;
128cdf0e10cSrcweir nRet = ((sal_Int32)c1)-((sal_Int32)((unsigned char)c2));
129cdf0e10cSrcweir if ( nRet != 0 )
130cdf0e10cSrcweir break;
131cdf0e10cSrcweir
132cdf0e10cSrcweir ++pStr1,
133cdf0e10cSrcweir ++pStr2;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir while ( c2 );
136cdf0e10cSrcweir
137cdf0e10cSrcweir return nRet;
138cdf0e10cSrcweir }
139cdf0e10cSrcweir
140cdf0e10cSrcweir // -----------------------------------------------------------------------
141cdf0e10cSrcweir
ImplStringICompareAscii(const sal_Unicode * pStr1,const sal_Char * pStr2,xub_StrLen nCount)142cdf0e10cSrcweir static sal_Int32 ImplStringICompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2,
143cdf0e10cSrcweir xub_StrLen nCount )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir sal_Int32 nRet = 0;
146cdf0e10cSrcweir sal_Unicode c1;
147cdf0e10cSrcweir sal_Char c2;
148cdf0e10cSrcweir do
149cdf0e10cSrcweir {
150cdf0e10cSrcweir if ( !nCount )
151cdf0e10cSrcweir break;
152cdf0e10cSrcweir
153cdf0e10cSrcweir // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln
154cdf0e10cSrcweir c1 = *pStr1;
155cdf0e10cSrcweir c2 = *pStr2;
156cdf0e10cSrcweir if ( (c1 >= 65) && (c1 <= 90) )
157cdf0e10cSrcweir c1 += 32;
158cdf0e10cSrcweir if ( (c2 >= 65) && (c2 <= 90) )
159cdf0e10cSrcweir c2 += 32;
160cdf0e10cSrcweir nRet = ((sal_Int32)c1)-((sal_Int32)((unsigned char)c2));
161cdf0e10cSrcweir if ( nRet != 0 )
162cdf0e10cSrcweir break;
163cdf0e10cSrcweir
164cdf0e10cSrcweir ++pStr1,
165cdf0e10cSrcweir ++pStr2,
166cdf0e10cSrcweir --nCount;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir while ( c2 );
169cdf0e10cSrcweir
170cdf0e10cSrcweir return nRet;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir
173cdf0e10cSrcweir // =======================================================================
174cdf0e10cSrcweir
CreateFromAscii(const sal_Char * pAsciiStr)175cdf0e10cSrcweir UniString UniString::CreateFromAscii( const sal_Char* pAsciiStr )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::CreateFromAscii() - pAsciiStr is NULL" );
178cdf0e10cSrcweir
179cdf0e10cSrcweir // Stringlaenge ermitteln
180cdf0e10cSrcweir xub_StrLen nLen = ImplStringLen( pAsciiStr );
181cdf0e10cSrcweir
182cdf0e10cSrcweir UniString aTempStr;
183cdf0e10cSrcweir if ( nLen )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir ImplCopyAsciiStr( aTempStr.AllocBuffer( nLen ), pAsciiStr, nLen );
186cdf0e10cSrcweir }
187cdf0e10cSrcweir return aTempStr;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
190cdf0e10cSrcweir // -----------------------------------------------------------------------
191cdf0e10cSrcweir
CreateFromAscii(const sal_Char * pAsciiStr,xub_StrLen nLen)192cdf0e10cSrcweir UniString UniString::CreateFromAscii( const sal_Char* pAsciiStr, xub_StrLen nLen )
193cdf0e10cSrcweir {
194cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::CreateFromAscii() - pAsciiStr is NULL" );
195cdf0e10cSrcweir
196cdf0e10cSrcweir // Stringlaenge ermitteln
197cdf0e10cSrcweir if ( nLen == STRING_LEN )
198cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr );
199cdf0e10cSrcweir
200cdf0e10cSrcweir UniString aTempStr;
201cdf0e10cSrcweir
202cdf0e10cSrcweir if ( nLen )
203cdf0e10cSrcweir {
204cdf0e10cSrcweir ImplCopyAsciiStr( aTempStr.AllocBuffer( nLen ), pAsciiStr, nLen );
205cdf0e10cSrcweir }
206cdf0e10cSrcweir return aTempStr;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir
209cdf0e10cSrcweir // -----------------------------------------------------------------------
210cdf0e10cSrcweir
AssignAscii(const sal_Char * pAsciiStr)211cdf0e10cSrcweir UniString& UniString::AssignAscii( const sal_Char* pAsciiStr )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
214cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AssignAscii() - pAsciiStr is NULL" );
215cdf0e10cSrcweir
216cdf0e10cSrcweir // Stringlaenge ermitteln
217cdf0e10cSrcweir xub_StrLen nLen = ImplStringLen( pAsciiStr );
218cdf0e10cSrcweir
219cdf0e10cSrcweir if ( !nLen )
220cdf0e10cSrcweir {
221cdf0e10cSrcweir STRING_NEW((STRING_TYPE **)&mpData);
222cdf0e10cSrcweir }
223cdf0e10cSrcweir else
224cdf0e10cSrcweir {
225cdf0e10cSrcweir // Wenn String genauso lang ist, wie der String, dann direkt kopieren
226cdf0e10cSrcweir if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) )
227cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen );
228cdf0e10cSrcweir else
229cdf0e10cSrcweir {
230cdf0e10cSrcweir // Alte Daten loeschen
231cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
232cdf0e10cSrcweir
233cdf0e10cSrcweir // Daten initialisieren und String kopieren
234cdf0e10cSrcweir mpData = ImplAllocData( nLen );
235cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen );
236cdf0e10cSrcweir }
237cdf0e10cSrcweir }
238cdf0e10cSrcweir
239cdf0e10cSrcweir return *this;
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
242cdf0e10cSrcweir // -----------------------------------------------------------------------
243cdf0e10cSrcweir
AssignAscii(const sal_Char * pAsciiStr,xub_StrLen nLen)244cdf0e10cSrcweir UniString& UniString::AssignAscii( const sal_Char* pAsciiStr, xub_StrLen nLen )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
247cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AssignAscii() - pAsciiStr is NULL" );
248cdf0e10cSrcweir
249cdf0e10cSrcweir if ( nLen == STRING_LEN )
250cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr );
251cdf0e10cSrcweir
252cdf0e10cSrcweir #ifdef DBG_UTIL
253cdf0e10cSrcweir if ( DbgIsAssert() )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir for ( xub_StrLen i = 0; i < nLen; ++i )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir if ( !pAsciiStr[i] )
258cdf0e10cSrcweir {
259cdf0e10cSrcweir DBG_ERROR( "UniString::AssignAscii() : nLen is wrong" );
260cdf0e10cSrcweir }
261cdf0e10cSrcweir }
262cdf0e10cSrcweir }
263cdf0e10cSrcweir #endif
264cdf0e10cSrcweir
265cdf0e10cSrcweir if ( !nLen )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir STRING_NEW((STRING_TYPE **)&mpData);
268cdf0e10cSrcweir }
269cdf0e10cSrcweir else
270cdf0e10cSrcweir {
271cdf0e10cSrcweir // Wenn String genauso lang ist, wie der String, dann direkt kopieren
272cdf0e10cSrcweir if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) )
273cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen );
274cdf0e10cSrcweir else
275cdf0e10cSrcweir {
276cdf0e10cSrcweir // Alte Daten loeschen
277cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
278cdf0e10cSrcweir
279cdf0e10cSrcweir // Daten initialisieren und String kopieren
280cdf0e10cSrcweir mpData = ImplAllocData( nLen );
281cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen );
282cdf0e10cSrcweir }
283cdf0e10cSrcweir }
284cdf0e10cSrcweir
285cdf0e10cSrcweir return *this;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
288cdf0e10cSrcweir // -----------------------------------------------------------------------
289cdf0e10cSrcweir
AppendAscii(const sal_Char * pAsciiStr)290cdf0e10cSrcweir UniString& UniString::AppendAscii( const sal_Char* pAsciiStr )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
293cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AppendAscii() - pAsciiStr is NULL" );
294cdf0e10cSrcweir
295cdf0e10cSrcweir // Stringlaenge ermitteln
296cdf0e10cSrcweir sal_Int32 nCopyLen = ImplStringLen( pAsciiStr );
297cdf0e10cSrcweir
298cdf0e10cSrcweir // Ueberlauf abfangen
299cdf0e10cSrcweir nCopyLen = ImplGetCopyLen( mpData->mnLen, nCopyLen );
300cdf0e10cSrcweir
301cdf0e10cSrcweir // Ist es kein leerer String
302cdf0e10cSrcweir if ( nCopyLen )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir // Neue Datenstruktur und neuen String erzeugen
305cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen );
306cdf0e10cSrcweir
307cdf0e10cSrcweir // String kopieren
308cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, mpData->mnLen*sizeof( sal_Unicode ) );
309cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+mpData->mnLen, pAsciiStr, nCopyLen );
310cdf0e10cSrcweir
311cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen
312cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
313cdf0e10cSrcweir mpData = pNewData;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir
316cdf0e10cSrcweir return *this;
317cdf0e10cSrcweir }
318cdf0e10cSrcweir
319cdf0e10cSrcweir // -----------------------------------------------------------------------
320cdf0e10cSrcweir
AppendAscii(const sal_Char * pAsciiStr,xub_StrLen nLen)321cdf0e10cSrcweir UniString& UniString::AppendAscii( const sal_Char* pAsciiStr, xub_StrLen nLen )
322cdf0e10cSrcweir {
323cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
324cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AppendAscii() - pAsciiStr is NULL" );
325cdf0e10cSrcweir
326cdf0e10cSrcweir if ( nLen == STRING_LEN )
327cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr );
328cdf0e10cSrcweir
329cdf0e10cSrcweir #ifdef DBG_UTIL
330cdf0e10cSrcweir if ( DbgIsAssert() )
331cdf0e10cSrcweir {
332cdf0e10cSrcweir for ( xub_StrLen i = 0; i < nLen; ++i )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir if ( !pAsciiStr[i] )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir DBG_ERROR( "UniString::AppendAscii() : nLen is wrong" );
337cdf0e10cSrcweir }
338cdf0e10cSrcweir }
339cdf0e10cSrcweir }
340cdf0e10cSrcweir #endif
341cdf0e10cSrcweir
342cdf0e10cSrcweir // Ueberlauf abfangen
343cdf0e10cSrcweir sal_Int32 nCopyLen = ImplGetCopyLen( mpData->mnLen, nLen );
344cdf0e10cSrcweir
345cdf0e10cSrcweir // Ist es kein leerer String
346cdf0e10cSrcweir if ( nCopyLen )
347cdf0e10cSrcweir {
348cdf0e10cSrcweir // Neue Datenstruktur und neuen String erzeugen
349cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen );
350cdf0e10cSrcweir
351cdf0e10cSrcweir // String kopieren
352cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, mpData->mnLen*sizeof( sal_Unicode ) );
353cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+mpData->mnLen, pAsciiStr, nCopyLen );
354cdf0e10cSrcweir
355cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen
356cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
357cdf0e10cSrcweir mpData = pNewData;
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
360cdf0e10cSrcweir return *this;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir // -----------------------------------------------------------------------
364cdf0e10cSrcweir
InsertAscii(const char * pAsciiStr,xub_StrLen nIndex)365cdf0e10cSrcweir UniString& UniString::InsertAscii( const char* pAsciiStr, xub_StrLen nIndex )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
368cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::InsertAscii() - pAsciiStr is NULL" );
369cdf0e10cSrcweir
370cdf0e10cSrcweir // Stringlaenge ermitteln
371cdf0e10cSrcweir sal_Int32 nCopyLen = ImplStringLen( pAsciiStr );
372cdf0e10cSrcweir
373cdf0e10cSrcweir // Ueberlauf abfangen
374cdf0e10cSrcweir nCopyLen = ImplGetCopyLen( mpData->mnLen, nCopyLen );
375cdf0e10cSrcweir
376cdf0e10cSrcweir // Ist der einzufuegende String ein Leerstring
377cdf0e10cSrcweir if ( !nCopyLen )
378cdf0e10cSrcweir return *this;
379cdf0e10cSrcweir
380cdf0e10cSrcweir // Index groesser als Laenge
381cdf0e10cSrcweir if ( nIndex > mpData->mnLen )
382cdf0e10cSrcweir nIndex = static_cast< xub_StrLen >(mpData->mnLen);
383cdf0e10cSrcweir
384cdf0e10cSrcweir // Neue Laenge ermitteln und neuen String anlegen
385cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen );
386cdf0e10cSrcweir
387cdf0e10cSrcweir // String kopieren
388cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( sal_Unicode ) );
389cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+nIndex, pAsciiStr, nCopyLen );
390cdf0e10cSrcweir memcpy( pNewData->maStr+nIndex+nCopyLen, mpData->maStr+nIndex,
391cdf0e10cSrcweir (mpData->mnLen-nIndex)*sizeof( sal_Unicode ) );
392cdf0e10cSrcweir
393cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen
394cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
395cdf0e10cSrcweir mpData = pNewData;
396cdf0e10cSrcweir
397cdf0e10cSrcweir return *this;
398cdf0e10cSrcweir }
399cdf0e10cSrcweir
400cdf0e10cSrcweir // -----------------------------------------------------------------------
401cdf0e10cSrcweir
ReplaceAscii(xub_StrLen nIndex,xub_StrLen nCount,const sal_Char * pAsciiStr,xub_StrLen nStrLen)402cdf0e10cSrcweir UniString& UniString::ReplaceAscii( xub_StrLen nIndex, xub_StrLen nCount,
403cdf0e10cSrcweir const sal_Char* pAsciiStr, xub_StrLen nStrLen )
404cdf0e10cSrcweir {
405cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
406cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::ReplaceAscii() - pAsciiStr is NULL" );
407cdf0e10cSrcweir
408cdf0e10cSrcweir // Wenn Index groessergleich Laenge ist, dann ist es ein Append
409cdf0e10cSrcweir if ( nIndex >= mpData->mnLen )
410cdf0e10cSrcweir {
411cdf0e10cSrcweir AppendAscii( pAsciiStr, nStrLen );
412cdf0e10cSrcweir return *this;
413cdf0e10cSrcweir }
414cdf0e10cSrcweir
415cdf0e10cSrcweir // Ist es eine Zuweisung
416cdf0e10cSrcweir if ( (nIndex == 0) && (nCount >= mpData->mnLen) )
417cdf0e10cSrcweir {
418cdf0e10cSrcweir AssignAscii( pAsciiStr, nStrLen );
419cdf0e10cSrcweir return *this;
420cdf0e10cSrcweir }
421cdf0e10cSrcweir
422cdf0e10cSrcweir // Reicht ein Erase
423cdf0e10cSrcweir if ( nStrLen == STRING_LEN )
424cdf0e10cSrcweir nStrLen = ImplStringLen( pAsciiStr );
425cdf0e10cSrcweir if ( !nStrLen )
426cdf0e10cSrcweir return Erase( nIndex, nCount );
427cdf0e10cSrcweir
428cdf0e10cSrcweir // nCount darf nicht ueber das Stringende hinnausgehen
429cdf0e10cSrcweir if ( nCount > mpData->mnLen - nIndex )
430cdf0e10cSrcweir nCount = static_cast< xub_StrLen >(mpData->mnLen-nIndex);
431cdf0e10cSrcweir
432cdf0e10cSrcweir // Reicht eine zeichenweise Zuweisung
433cdf0e10cSrcweir if ( nCount == nStrLen )
434cdf0e10cSrcweir {
435cdf0e10cSrcweir ImplCopyData();
436cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr+nIndex, pAsciiStr, nStrLen );
437cdf0e10cSrcweir return *this;
438cdf0e10cSrcweir }
439cdf0e10cSrcweir
440cdf0e10cSrcweir // Ueberlauf abfangen
441cdf0e10cSrcweir sal_Int32 n = ImplGetCopyLen( mpData->mnLen-nCount, nStrLen );
442cdf0e10cSrcweir
443cdf0e10cSrcweir // Neue Daten anlegen
444cdf0e10cSrcweir STRINGDATA* pNewData = ImplAllocData( mpData->mnLen-nCount+n );
445cdf0e10cSrcweir
446cdf0e10cSrcweir // String kopieren
447cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( STRCODE ) );
448cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+nIndex, pAsciiStr, n );
449cdf0e10cSrcweir memcpy( pNewData->maStr+nIndex+n, mpData->maStr+nIndex+nCount,
450cdf0e10cSrcweir (mpData->mnLen-nIndex-nCount+1)*sizeof( STRCODE ) );
451cdf0e10cSrcweir
452cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen
453cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData);
454cdf0e10cSrcweir mpData = pNewData;
455cdf0e10cSrcweir
456cdf0e10cSrcweir return *this;
457cdf0e10cSrcweir }
458cdf0e10cSrcweir
459cdf0e10cSrcweir // -----------------------------------------------------------------------
460cdf0e10cSrcweir
CompareToAscii(const sal_Char * pAsciiStr,xub_StrLen nLen) const461cdf0e10cSrcweir StringCompare UniString::CompareToAscii( const sal_Char* pAsciiStr,
462cdf0e10cSrcweir xub_StrLen nLen ) const
463cdf0e10cSrcweir {
464cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
465cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ),
466cdf0e10cSrcweir "UniString::CompareToAscii() - pAsciiStr include characters > 127" );
467cdf0e10cSrcweir
468cdf0e10cSrcweir // String vergleichen
469cdf0e10cSrcweir sal_Int32 nCompare = ImplStringCompareAscii( mpData->maStr, pAsciiStr, nLen );
470cdf0e10cSrcweir
471cdf0e10cSrcweir // Rueckgabewert anpassen
472cdf0e10cSrcweir if ( nCompare == 0 )
473cdf0e10cSrcweir return COMPARE_EQUAL;
474cdf0e10cSrcweir else if ( nCompare < 0 )
475cdf0e10cSrcweir return COMPARE_LESS;
476cdf0e10cSrcweir else
477cdf0e10cSrcweir return COMPARE_GREATER;
478cdf0e10cSrcweir }
479cdf0e10cSrcweir
480cdf0e10cSrcweir // -----------------------------------------------------------------------
481cdf0e10cSrcweir
CompareIgnoreCaseToAscii(const sal_Char * pAsciiStr,xub_StrLen nLen) const482cdf0e10cSrcweir StringCompare UniString::CompareIgnoreCaseToAscii( const sal_Char* pAsciiStr,
483cdf0e10cSrcweir xub_StrLen nLen ) const
484cdf0e10cSrcweir {
485cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
486cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ),
487cdf0e10cSrcweir "UniString::CompareIgnoreCaseToAscii() - pAsciiStr include characters > 127" );
488cdf0e10cSrcweir
489cdf0e10cSrcweir // String vergleichen
490cdf0e10cSrcweir sal_Int32 nCompare = ImplStringICompareAscii( mpData->maStr, pAsciiStr, nLen );
491cdf0e10cSrcweir
492cdf0e10cSrcweir // Rueckgabewert anpassen
493cdf0e10cSrcweir if ( nCompare == 0 )
494cdf0e10cSrcweir return COMPARE_EQUAL;
495cdf0e10cSrcweir else if ( nCompare < 0 )
496cdf0e10cSrcweir return COMPARE_LESS;
497cdf0e10cSrcweir else
498cdf0e10cSrcweir return COMPARE_GREATER;
499cdf0e10cSrcweir }
500cdf0e10cSrcweir
501cdf0e10cSrcweir // -----------------------------------------------------------------------
502cdf0e10cSrcweir
EqualsAscii(const sal_Char * pAsciiStr) const503cdf0e10cSrcweir sal_Bool UniString::EqualsAscii( const sal_Char* pAsciiStr ) const
504cdf0e10cSrcweir {
505cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
506cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ),
507cdf0e10cSrcweir "UniString::EqualsAscii() - pAsciiStr include characters > 127" );
508cdf0e10cSrcweir
509cdf0e10cSrcweir return (ImplStringCompareAscii( mpData->maStr, pAsciiStr ) == 0);
510cdf0e10cSrcweir }
511cdf0e10cSrcweir
512cdf0e10cSrcweir // -----------------------------------------------------------------------
513cdf0e10cSrcweir
EqualsIgnoreCaseAscii(const sal_Char * pAsciiStr) const514cdf0e10cSrcweir sal_Bool UniString::EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr ) const
515cdf0e10cSrcweir {
516cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
517cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ),
518cdf0e10cSrcweir "UniString::EqualsIgnoreCaseAscii() - pAsciiStr include characters > 127" );
519cdf0e10cSrcweir
520cdf0e10cSrcweir return (ImplStringICompareAscii( mpData->maStr, pAsciiStr ) == 0);
521cdf0e10cSrcweir }
522cdf0e10cSrcweir
523cdf0e10cSrcweir // -----------------------------------------------------------------------
524cdf0e10cSrcweir
EqualsAscii(const sal_Char * pAsciiStr,xub_StrLen nIndex,xub_StrLen nLen) const525cdf0e10cSrcweir sal_Bool UniString::EqualsAscii( const sal_Char* pAsciiStr,
526cdf0e10cSrcweir xub_StrLen nIndex, xub_StrLen nLen ) const
527cdf0e10cSrcweir {
528cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
529cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ),
530cdf0e10cSrcweir "UniString::EqualsAscii() - pAsciiStr include characters > 127" );
531cdf0e10cSrcweir
532cdf0e10cSrcweir // Are there enough codes for comparing?
533cdf0e10cSrcweir if ( nIndex > mpData->mnLen )
534cdf0e10cSrcweir return (*pAsciiStr == 0);
535cdf0e10cSrcweir
536cdf0e10cSrcweir return (ImplStringCompareAscii( mpData->maStr+nIndex, pAsciiStr, nLen ) == 0);
537cdf0e10cSrcweir }
538cdf0e10cSrcweir
539cdf0e10cSrcweir // -----------------------------------------------------------------------
540cdf0e10cSrcweir
EqualsIgnoreCaseAscii(const sal_Char * pAsciiStr,xub_StrLen nIndex,xub_StrLen nLen) const541cdf0e10cSrcweir sal_Bool UniString::EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr,
542cdf0e10cSrcweir xub_StrLen nIndex, xub_StrLen nLen ) const
543cdf0e10cSrcweir {
544cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
545cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ),
546cdf0e10cSrcweir "UniString::EqualsIgnoreCaseAscii() - pAsciiStr include characters > 127" );
547cdf0e10cSrcweir
548cdf0e10cSrcweir // Are there enough codes for comparing?
549cdf0e10cSrcweir if ( nIndex > mpData->mnLen )
550cdf0e10cSrcweir return (*pAsciiStr == 0);
551cdf0e10cSrcweir
552cdf0e10cSrcweir return (ImplStringICompareAscii( mpData->maStr+nIndex, pAsciiStr, nLen ) == 0);
553cdf0e10cSrcweir }
554cdf0e10cSrcweir
555cdf0e10cSrcweir // -----------------------------------------------------------------------
556cdf0e10cSrcweir
SearchAscii(const sal_Char * pAsciiStr,xub_StrLen nIndex) const557cdf0e10cSrcweir xub_StrLen UniString::SearchAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex ) const
558cdf0e10cSrcweir {
559cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
560cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ),
561cdf0e10cSrcweir "UniString::SearchAscii() - pAsciiStr include characters > 127" );
562cdf0e10cSrcweir
563cdf0e10cSrcweir sal_Int32 nLen = mpData->mnLen;
564cdf0e10cSrcweir xub_StrLen nStrLen = ImplStringLen( pAsciiStr );
565cdf0e10cSrcweir
566cdf0e10cSrcweir // Falls die Laenge des uebergebenen Strings 0 ist oder der Index
567cdf0e10cSrcweir // hinter dem String liegt, dann wurde der String nicht gefunden
568cdf0e10cSrcweir if ( !nStrLen || (nIndex >= nLen) )
569cdf0e10cSrcweir return STRING_NOTFOUND;
570cdf0e10cSrcweir
571cdf0e10cSrcweir const sal_Unicode* pStr = mpData->maStr;
572cdf0e10cSrcweir pStr += nIndex;
573cdf0e10cSrcweir
574cdf0e10cSrcweir if ( nStrLen == 1 )
575cdf0e10cSrcweir {
576cdf0e10cSrcweir sal_Unicode cSearch = (unsigned char)*pAsciiStr;
577cdf0e10cSrcweir while ( nIndex < nLen )
578cdf0e10cSrcweir {
579cdf0e10cSrcweir if ( *pStr == cSearch )
580cdf0e10cSrcweir return nIndex;
581cdf0e10cSrcweir ++pStr,
582cdf0e10cSrcweir ++nIndex;
583cdf0e10cSrcweir }
584cdf0e10cSrcweir }
585cdf0e10cSrcweir else
586cdf0e10cSrcweir {
587cdf0e10cSrcweir // Nur innerhalb des Strings suchen
588cdf0e10cSrcweir while ( nLen - nIndex >= nStrLen )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir // Stimmt der String ueberein
591cdf0e10cSrcweir if ( ImplStringCompareWithoutZeroAscii( pStr, pAsciiStr, nStrLen ) == 0 )
592cdf0e10cSrcweir return nIndex;
593cdf0e10cSrcweir ++pStr,
594cdf0e10cSrcweir ++nIndex;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir }
597cdf0e10cSrcweir
598cdf0e10cSrcweir return STRING_NOTFOUND;
599cdf0e10cSrcweir }
600cdf0e10cSrcweir
601cdf0e10cSrcweir // -----------------------------------------------------------------------
602cdf0e10cSrcweir
SearchAndReplaceAscii(const sal_Char * pAsciiStr,const UniString & rRepStr,xub_StrLen nIndex)603cdf0e10cSrcweir xub_StrLen UniString::SearchAndReplaceAscii( const sal_Char* pAsciiStr, const UniString& rRepStr,
604cdf0e10cSrcweir xub_StrLen nIndex )
605cdf0e10cSrcweir {
606cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
607cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ),
608cdf0e10cSrcweir "UniString::SearchAndReplaceAscii() - pAsciiStr include characters > 127" );
609cdf0e10cSrcweir
610cdf0e10cSrcweir xub_StrLen nSPos = SearchAscii( pAsciiStr, nIndex );
611cdf0e10cSrcweir if ( nSPos != STRING_NOTFOUND )
612cdf0e10cSrcweir Replace( nSPos, ImplStringLen( pAsciiStr ), rRepStr );
613cdf0e10cSrcweir
614cdf0e10cSrcweir return nSPos;
615cdf0e10cSrcweir }
616cdf0e10cSrcweir
617cdf0e10cSrcweir // -----------------------------------------------------------------------
618cdf0e10cSrcweir
SearchAndReplaceAllAscii(const sal_Char * pAsciiStr,const UniString & rRepStr)619cdf0e10cSrcweir void UniString::SearchAndReplaceAllAscii( const sal_Char* pAsciiStr, const UniString& rRepStr )
620cdf0e10cSrcweir {
621cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString );
622cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ),
623cdf0e10cSrcweir "UniString::SearchAndReplaceAllAscii() - pAsciiStr include characters > 127" );
624cdf0e10cSrcweir
625cdf0e10cSrcweir xub_StrLen nCharLen = ImplStringLen( pAsciiStr );
626cdf0e10cSrcweir xub_StrLen nSPos = SearchAscii( pAsciiStr, 0 );
627cdf0e10cSrcweir while ( nSPos != STRING_NOTFOUND )
628cdf0e10cSrcweir {
629cdf0e10cSrcweir Replace( nSPos, nCharLen, rRepStr );
630cdf0e10cSrcweir nSPos = nSPos + rRepStr.Len();
631cdf0e10cSrcweir nSPos = SearchAscii( pAsciiStr, nSPos );
632cdf0e10cSrcweir }
633cdf0e10cSrcweir }
634