xref: /AOO41X/main/tools/source/string/strascii.cxx (revision 89b56da77b74925c286b3e777681ba8dda16bf41)
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