Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : /* ======================================================================= */
21 : /* Internal C-String help functions which could be used without the */
22 : /* String-Class */
23 : /* ======================================================================= */
24 :
25 : #include <string.h>
26 : #include <sal/log.hxx>
27 :
28 : /*
29 : inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
30 : const IMPL_RTL_STRCODE* pSrc,
31 : sal_Int32 nCount )
32 : {
33 : while ( nCount > 0 )
34 : {
35 : *pDest = *pSrc;
36 : pDest++;
37 : pSrc++;
38 : nCount--;
39 : }
40 : }
41 : */
42 :
43 : #define rtl_str_ImplCopy( _pDest, _pSrc, _nCount ) \
44 : { \
45 : IMPL_RTL_STRCODE* __mm_pDest = _pDest; \
46 : const IMPL_RTL_STRCODE* __mm_pSrc = _pSrc; \
47 : sal_Int32 __mm_nCount = _nCount; \
48 : while ( __mm_nCount > 0 ) \
49 : { \
50 : *__mm_pDest = *__mm_pSrc; \
51 : __mm_pDest++; \
52 : __mm_pSrc++; \
53 : __mm_nCount--; \
54 : } \
55 : }
56 :
57 : /* ======================================================================= */
58 : /* C-String functions which could be used without the String-Class */
59 : /* ======================================================================= */
60 :
61 9821063 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
62 : SAL_THROW_EXTERN_C()
63 : {
64 9821063 : const IMPL_RTL_STRCODE* pTempStr = pStr;
65 408141728 : while( *pTempStr )
66 388499602 : pTempStr++;
67 9821063 : return pTempStr-pStr;
68 : }
69 :
70 : /* ----------------------------------------------------------------------- */
71 :
72 774898 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
73 : const IMPL_RTL_STRCODE* pStr2 )
74 : SAL_THROW_EXTERN_C()
75 : {
76 : sal_Int32 nRet;
77 26588054 : while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
78 : ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
79 : *pStr2 )
80 : {
81 25038258 : pStr1++;
82 25038258 : pStr2++;
83 : }
84 :
85 774898 : return nRet;
86 : }
87 :
88 : /* ----------------------------------------------------------------------- */
89 :
90 39401871 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
91 : sal_Int32 nStr1Len,
92 : const IMPL_RTL_STRCODE* pStr2,
93 : sal_Int32 nStr2Len )
94 : SAL_THROW_EXTERN_C()
95 : {
96 39401871 : sal_Int32 nRet = nStr1Len - nStr2Len;
97 39401871 : int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
98 :
99 39401871 : --pStr1;
100 39401871 : --pStr2;
101 39401871 : while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ) ;
102 :
103 39401871 : if( nCount >= 0 )
104 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
105 26159090 : - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
106 :
107 39401871 : return nRet;
108 : }
109 :
110 : /* ----------------------------------------------------------------------- */
111 :
112 979437 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
113 : sal_Int32 nStr1Len,
114 : const IMPL_RTL_STRCODE* pStr2,
115 : sal_Int32 nStr2Len,
116 : sal_Int32 nShortenedLength )
117 : SAL_THROW_EXTERN_C()
118 : {
119 979437 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
120 979437 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
121 : sal_Int32 nRet;
122 2428804 : while ( (nShortenedLength > 0) &&
123 : (pStr1 < pStr1End) && (pStr2 < pStr2End) )
124 : {
125 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
126 1400551 : ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
127 1400551 : if ( nRet )
128 930621 : return nRet;
129 :
130 469930 : nShortenedLength--;
131 469930 : pStr1++;
132 469930 : pStr2++;
133 : }
134 :
135 48816 : if ( nShortenedLength <= 0 )
136 42068 : return 0;
137 6748 : return nStr1Len - nStr2Len;
138 : }
139 :
140 : /* ----------------------------------------------------------------------- */
141 :
142 6625783 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
143 : sal_Int32 nStr1Len,
144 : const IMPL_RTL_STRCODE* pStr2,
145 : sal_Int32 nStr2Len )
146 : SAL_THROW_EXTERN_C()
147 : {
148 6625783 : const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
149 6625783 : const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
150 : sal_Int32 nRet;
151 53624293 : while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
152 : {
153 43101119 : pStr1Run--;
154 43101119 : pStr2Run--;
155 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
156 43101119 : ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
157 43101119 : if ( nRet )
158 2728392 : return nRet;
159 : }
160 :
161 3897391 : return nStr1Len - nStr2Len;
162 : }
163 :
164 : /* ----------------------------------------------------------------------- */
165 :
166 15350 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
167 : const IMPL_RTL_STRCODE* pStr2 )
168 : SAL_THROW_EXTERN_C()
169 : {
170 : sal_Int32 nRet;
171 : sal_Int32 c1;
172 : sal_Int32 c2;
173 7852 : do
174 : {
175 : /* If character between 'A' and 'Z', than convert it to lowercase */
176 15350 : c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
177 15350 : c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
178 15350 : if ( (c1 >= 65) && (c1 <= 90) )
179 11302 : c1 += 32;
180 15350 : if ( (c2 >= 65) && (c2 <= 90) )
181 11300 : c2 += 32;
182 15350 : nRet = c1-c2;
183 15350 : if ( nRet != 0 )
184 7498 : return nRet;
185 :
186 7852 : pStr1++;
187 7852 : pStr2++;
188 : }
189 : while ( c2 );
190 :
191 1265 : return 0;
192 : }
193 :
194 : /* ----------------------------------------------------------------------- */
195 :
196 311243 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
197 : sal_Int32 nStr1Len,
198 : const IMPL_RTL_STRCODE* pStr2,
199 : sal_Int32 nStr2Len )
200 : SAL_THROW_EXTERN_C()
201 : {
202 311243 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
203 311243 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
204 : sal_Int32 nRet;
205 : sal_Int32 c1;
206 : sal_Int32 c2;
207 1244777 : while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
208 : {
209 : /* If character between 'A' and 'Z', than convert it to lowercase */
210 802658 : c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
211 802658 : c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
212 802658 : if ( (c1 >= 65) && (c1 <= 90) )
213 491189 : c1 += 32;
214 802658 : if ( (c2 >= 65) && (c2 <= 90) )
215 734061 : c2 += 32;
216 802658 : nRet = c1-c2;
217 802658 : if ( nRet != 0 )
218 180367 : return nRet;
219 :
220 622291 : pStr1++;
221 622291 : pStr2++;
222 : }
223 :
224 130876 : return nStr1Len - nStr2Len;
225 : }
226 :
227 : /* ----------------------------------------------------------------------- */
228 :
229 148915 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
230 : sal_Int32 nStr1Len,
231 : const IMPL_RTL_STRCODE* pStr2,
232 : sal_Int32 nStr2Len,
233 : sal_Int32 nShortenedLength )
234 : SAL_THROW_EXTERN_C()
235 : {
236 148915 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
237 148915 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
238 : sal_Int32 nRet;
239 : sal_Int32 c1;
240 : sal_Int32 c2;
241 326530 : while ( (nShortenedLength > 0) &&
242 : (pStr1 < pStr1End) && (pStr2 < pStr2End) )
243 : {
244 : /* If character between 'A' and 'Z', than convert it to lowercase */
245 161766 : c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
246 161766 : c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
247 161766 : if ( (c1 >= 65) && (c1 <= 90) )
248 220 : c1 += 32;
249 161766 : if ( (c2 >= 65) && (c2 <= 90) )
250 9 : c2 += 32;
251 161766 : nRet = c1-c2;
252 161766 : if ( nRet != 0 )
253 133066 : return nRet;
254 :
255 28700 : nShortenedLength--;
256 28700 : pStr1++;
257 28700 : pStr2++;
258 : }
259 :
260 15849 : if ( nShortenedLength <= 0 )
261 4746 : return 0;
262 11103 : return nStr1Len - nStr2Len;
263 : }
264 :
265 : /* ----------------------------------------------------------------------- */
266 :
267 812084 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
268 : SAL_THROW_EXTERN_C()
269 : {
270 812084 : return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
271 : }
272 :
273 : /* ----------------------------------------------------------------------- */
274 :
275 8583125 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
276 : sal_Int32 nLen )
277 : SAL_THROW_EXTERN_C()
278 : {
279 8583125 : sal_Int32 h = nLen;
280 :
281 8583125 : if ( nLen < 256 )
282 : {
283 136298684 : while ( nLen > 0 )
284 : {
285 119133188 : h = (h*37) + IMPL_RTL_USTRCODE( *pStr );
286 119133188 : pStr++;
287 119133188 : nLen--;
288 : }
289 : }
290 : else
291 : {
292 : sal_Int32 nSkip;
293 377 : const IMPL_RTL_STRCODE* pEndStr = pStr+nLen-5;
294 :
295 : /* only sample some characters */
296 : /* the first 3, some characters between, and the last 5 */
297 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
298 377 : pStr++;
299 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
300 377 : pStr++;
301 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
302 377 : pStr++;
303 :
304 377 : if ( nLen < 32 )
305 0 : nSkip = nLen / 4;
306 : else
307 377 : nSkip = nLen / 8;
308 377 : nLen -= 8;
309 3770 : while ( nLen > 0 )
310 : {
311 3016 : h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
312 3016 : pStr += nSkip;
313 3016 : nLen -= nSkip;
314 : }
315 :
316 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
317 377 : pEndStr++;
318 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
319 377 : pEndStr++;
320 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
321 377 : pEndStr++;
322 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
323 377 : pEndStr++;
324 377 : h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
325 : }
326 :
327 8583125 : return h;
328 : }
329 :
330 : /* ----------------------------------------------------------------------- */
331 :
332 2139 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
333 : IMPL_RTL_STRCODE c )
334 : SAL_THROW_EXTERN_C()
335 : {
336 2139 : const IMPL_RTL_STRCODE* pTempStr = pStr;
337 20302 : while ( *pTempStr )
338 : {
339 18163 : if ( *pTempStr == c )
340 2139 : return pTempStr-pStr;
341 :
342 16024 : pTempStr++;
343 : }
344 :
345 0 : return -1;
346 : }
347 :
348 : /* ----------------------------------------------------------------------- */
349 :
350 10314927 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
351 : sal_Int32 nLen,
352 : IMPL_RTL_STRCODE c )
353 : SAL_THROW_EXTERN_C()
354 : {
355 10314927 : const IMPL_RTL_STRCODE* pTempStr = pStr;
356 116325368 : while ( nLen > 0 )
357 : {
358 103458349 : if ( *pTempStr == c )
359 7762835 : return pTempStr-pStr;
360 :
361 95695514 : pTempStr++;
362 95695514 : nLen--;
363 : }
364 :
365 2552092 : return -1;
366 : }
367 :
368 : /* ----------------------------------------------------------------------- */
369 :
370 10 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
371 : IMPL_RTL_STRCODE c )
372 : SAL_THROW_EXTERN_C()
373 : {
374 10 : return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
375 : }
376 :
377 : /* ----------------------------------------------------------------------- */
378 :
379 1137696 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
380 : sal_Int32 nLen,
381 : IMPL_RTL_STRCODE c )
382 : SAL_THROW_EXTERN_C()
383 : {
384 1137696 : pStr += nLen;
385 16036806 : while ( nLen > 0 )
386 : {
387 14756713 : nLen--;
388 14756713 : pStr--;
389 :
390 14756713 : if ( *pStr == c )
391 995299 : return nLen;
392 : }
393 :
394 142397 : return -1;
395 : }
396 :
397 : /* ----------------------------------------------------------------------- */
398 :
399 31 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
400 : const IMPL_RTL_STRCODE* pSubStr )
401 : SAL_THROW_EXTERN_C()
402 : {
403 : return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
404 31 : pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
405 : }
406 :
407 : /* ----------------------------------------------------------------------- */
408 :
409 4183903 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
410 : sal_Int32 nStrLen,
411 : const IMPL_RTL_STRCODE* pSubStr,
412 : sal_Int32 nSubLen )
413 : SAL_THROW_EXTERN_C()
414 : {
415 : /* faster search for a single character */
416 4183903 : if ( nSubLen < 2 )
417 : {
418 : /* an empty SubString is always not foundable */
419 376526 : if ( nSubLen == 1 )
420 : {
421 376522 : IMPL_RTL_STRCODE c = *pSubStr;
422 376522 : const IMPL_RTL_STRCODE* pTempStr = pStr;
423 3766148 : while ( nStrLen > 0 )
424 : {
425 3171712 : if ( *pTempStr == c )
426 158608 : return pTempStr-pStr;
427 :
428 3013104 : pTempStr++;
429 3013104 : nStrLen--;
430 : }
431 : }
432 : }
433 : else
434 : {
435 3807377 : const IMPL_RTL_STRCODE* pTempStr = pStr;
436 460616908 : while ( nStrLen > 0 )
437 : {
438 453968110 : if ( *pTempStr == *pSubStr )
439 : {
440 : /* Compare SubString */
441 5455232 : if ( nSubLen <= nStrLen )
442 : {
443 5347509 : const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
444 5347509 : const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
445 5347509 : sal_Int32 nTempLen = nSubLen;
446 19750821 : while ( nTempLen )
447 : {
448 13545079 : if ( *pTempStr1 != *pTempStr2 )
449 4489276 : break;
450 :
451 9055803 : pTempStr1++;
452 9055803 : pTempStr2++;
453 9055803 : nTempLen--;
454 : }
455 :
456 5347509 : if ( !nTempLen )
457 858233 : return pTempStr-pStr;
458 : }
459 : else
460 107723 : break;
461 : }
462 :
463 453002154 : nStrLen--;
464 453002154 : pTempStr++;
465 : }
466 : }
467 :
468 3167062 : return -1;
469 : }
470 :
471 : /* ----------------------------------------------------------------------- */
472 :
473 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
474 : const IMPL_RTL_STRCODE* pSubStr )
475 : SAL_THROW_EXTERN_C()
476 : {
477 : return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
478 0 : pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
479 : }
480 :
481 : /* ----------------------------------------------------------------------- */
482 :
483 14117 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
484 : sal_Int32 nStrLen,
485 : const IMPL_RTL_STRCODE* pSubStr,
486 : sal_Int32 nSubLen )
487 : SAL_THROW_EXTERN_C()
488 : {
489 : /* faster search for a single character */
490 14117 : if ( nSubLen < 2 )
491 : {
492 : /* an empty SubString is always not foundable */
493 878 : if ( nSubLen == 1 )
494 : {
495 878 : IMPL_RTL_STRCODE c = *pSubStr;
496 878 : pStr += nStrLen;
497 5488 : while ( nStrLen > 0 )
498 : {
499 4610 : nStrLen--;
500 4610 : pStr--;
501 :
502 4610 : if ( *pStr == c )
503 878 : return nStrLen;
504 : }
505 : }
506 : }
507 : else
508 : {
509 13239 : pStr += nStrLen;
510 13239 : nStrLen -= nSubLen;
511 13239 : pStr -= nSubLen;
512 354530 : while ( nStrLen >= 0 )
513 : {
514 336492 : const IMPL_RTL_STRCODE* pTempStr1 = pStr;
515 336492 : const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
516 336492 : sal_Int32 nTempLen = nSubLen;
517 707191 : while ( nTempLen )
518 : {
519 362259 : if ( *pTempStr1 != *pTempStr2 )
520 328052 : break;
521 :
522 34207 : pTempStr1++;
523 34207 : pTempStr2++;
524 34207 : nTempLen--;
525 : }
526 :
527 336492 : if ( !nTempLen )
528 8440 : return nStrLen;
529 :
530 328052 : nStrLen--;
531 328052 : pStr--;
532 : }
533 : }
534 :
535 4799 : return -1;
536 : }
537 :
538 : /* ----------------------------------------------------------------------- */
539 :
540 0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
541 : IMPL_RTL_STRCODE cOld,
542 : IMPL_RTL_STRCODE cNew )
543 : SAL_THROW_EXTERN_C()
544 : {
545 0 : while ( *pStr )
546 : {
547 0 : if ( *pStr == cOld )
548 0 : *pStr = cNew;
549 :
550 0 : pStr++;
551 : }
552 0 : }
553 :
554 : /* ----------------------------------------------------------------------- */
555 :
556 0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
557 : sal_Int32 nLen,
558 : IMPL_RTL_STRCODE cOld,
559 : IMPL_RTL_STRCODE cNew )
560 : SAL_THROW_EXTERN_C()
561 : {
562 0 : while ( nLen > 0 )
563 : {
564 0 : if ( *pStr == cOld )
565 0 : *pStr = cNew;
566 :
567 0 : pStr++;
568 0 : nLen--;
569 : }
570 0 : }
571 :
572 : /* ----------------------------------------------------------------------- */
573 :
574 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
575 : SAL_THROW_EXTERN_C()
576 : {
577 0 : while ( *pStr )
578 : {
579 : /* Between A-Z (65-90), than to lowercase (+32) */
580 0 : if ( (*pStr >= 65) && (*pStr <= 90) )
581 0 : *pStr += 32;
582 :
583 0 : pStr++;
584 : }
585 0 : }
586 :
587 : /* ----------------------------------------------------------------------- */
588 :
589 763333 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
590 : sal_Int32 nLen )
591 : SAL_THROW_EXTERN_C()
592 : {
593 7993749 : while ( nLen > 0 )
594 : {
595 : /* Between A-Z (65-90), than to lowercase (+32) */
596 6467083 : if ( (*pStr >= 65) && (*pStr <= 90) )
597 19554 : *pStr += 32;
598 :
599 6467083 : pStr++;
600 6467083 : nLen--;
601 : }
602 763333 : }
603 :
604 : /* ----------------------------------------------------------------------- */
605 :
606 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
607 : SAL_THROW_EXTERN_C()
608 : {
609 0 : while ( *pStr )
610 : {
611 : /* Between a-z (97-122), than to uppercase (-32) */
612 0 : if ( (*pStr >= 97) && (*pStr <= 122) )
613 0 : *pStr -= 32;
614 :
615 0 : pStr++;
616 : }
617 0 : }
618 :
619 : /* ----------------------------------------------------------------------- */
620 :
621 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
622 : sal_Int32 nLen )
623 : SAL_THROW_EXTERN_C()
624 : {
625 0 : while ( nLen > 0 )
626 : {
627 : /* Between a-z (97-122), than to uppercase (-32) */
628 0 : if ( (*pStr >= 97) && (*pStr <= 122) )
629 0 : *pStr -= 32;
630 :
631 0 : pStr++;
632 0 : nLen--;
633 : }
634 0 : }
635 :
636 : /* ----------------------------------------------------------------------- */
637 :
638 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
639 : SAL_THROW_EXTERN_C()
640 : {
641 0 : return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
642 : }
643 :
644 : /* ----------------------------------------------------------------------- */
645 :
646 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
647 : SAL_THROW_EXTERN_C()
648 : {
649 0 : sal_Int32 nPreSpaces = 0;
650 0 : sal_Int32 nPostSpaces = 0;
651 0 : sal_Int32 nIndex = nLen-1;
652 :
653 0 : while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
654 0 : nPreSpaces++;
655 :
656 0 : while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
657 : {
658 0 : nPostSpaces++;
659 0 : nIndex--;
660 : }
661 :
662 0 : if ( nPostSpaces )
663 : {
664 0 : nLen -= nPostSpaces;
665 0 : *(pStr+nLen) = 0;
666 : }
667 :
668 0 : if ( nPreSpaces )
669 : {
670 0 : IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
671 :
672 0 : nLen -= nPreSpaces;
673 0 : nIndex = nLen;
674 :
675 0 : while ( nIndex )
676 : {
677 0 : *pStr = *pNewStr;
678 0 : pStr++;
679 0 : pNewStr++;
680 0 : nIndex--;
681 : }
682 0 : *pStr = 0;
683 : }
684 :
685 0 : return nLen;
686 : }
687 :
688 : /* ----------------------------------------------------------------------- */
689 :
690 19 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
691 : SAL_THROW_EXTERN_C()
692 : {
693 19 : if ( b )
694 : {
695 11 : *pStr = 't';
696 11 : pStr++;
697 11 : *pStr = 'r';
698 11 : pStr++;
699 11 : *pStr = 'u';
700 11 : pStr++;
701 11 : *pStr = 'e';
702 11 : pStr++;
703 11 : *pStr = 0;
704 11 : return 4;
705 : }
706 : else
707 : {
708 8 : *pStr = 'f';
709 8 : pStr++;
710 8 : *pStr = 'a';
711 8 : pStr++;
712 8 : *pStr = 'l';
713 8 : pStr++;
714 8 : *pStr = 's';
715 8 : pStr++;
716 8 : *pStr = 'e';
717 8 : pStr++;
718 8 : *pStr = 0;
719 8 : return 5;
720 : }
721 : }
722 :
723 : /* ----------------------------------------------------------------------- */
724 :
725 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
726 : IMPL_RTL_STRCODE c )
727 : SAL_THROW_EXTERN_C()
728 : {
729 0 : *pStr++ = c;
730 0 : *pStr = 0;
731 0 : return 1;
732 : }
733 :
734 : /* ----------------------------------------------------------------------- */
735 :
736 554530 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
737 : sal_Int32 n,
738 : sal_Int16 nRadix )
739 : SAL_THROW_EXTERN_C()
740 : {
741 : sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32];
742 554530 : sal_Char* pBuf = aBuf;
743 554530 : sal_Int32 nLen = 0;
744 : sal_uInt32 nValue;
745 :
746 : /* Radix must be valid */
747 554530 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
748 5 : nRadix = 10;
749 :
750 : /* is value negativ */
751 554530 : if ( n < 0 )
752 : {
753 956 : *pStr = '-';
754 956 : pStr++;
755 956 : nLen++;
756 956 : nValue = -n; /* FIXME this code is not portable for n == -2147483648
757 : (smallest negative value for sal_Int32) */
758 : }
759 : else
760 553574 : nValue = n;
761 :
762 : /* create a recursive buffer with all values, except the last one */
763 1028380 : do
764 : {
765 1028380 : sal_Char nDigit = (sal_Char)(nValue % nRadix);
766 1028380 : nValue /= nRadix;
767 1028380 : if ( nDigit > 9 )
768 76234 : *pBuf = (nDigit-10) + 'a';
769 : else
770 952146 : *pBuf = (nDigit + '0' );
771 1028380 : pBuf++;
772 : }
773 : while ( nValue > 0 );
774 :
775 : /* copy the values in the right direction into the destination buffer */
776 1028380 : do
777 : {
778 1028380 : pBuf--;
779 1028380 : *pStr = *pBuf;
780 1028380 : pStr++;
781 1028380 : nLen++;
782 : }
783 : while ( pBuf != aBuf );
784 554530 : *pStr = 0;
785 :
786 554530 : return nLen;
787 : }
788 :
789 : /* ----------------------------------------------------------------------- */
790 :
791 31034 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
792 : sal_Int64 n,
793 : sal_Int16 nRadix )
794 : SAL_THROW_EXTERN_C()
795 : {
796 : sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64];
797 31034 : sal_Char* pBuf = aBuf;
798 31034 : sal_Int32 nLen = 0;
799 : sal_uInt64 nValue;
800 :
801 : /* Radix must be valid */
802 31034 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
803 5 : nRadix = 10;
804 :
805 : /* is value negativ */
806 31034 : if ( n < 0 )
807 : {
808 170 : *pStr = '-';
809 170 : pStr++;
810 170 : nLen++;
811 170 : nValue = -n; /* FIXME this code is not portable for
812 : n == -9223372036854775808 (smallest negative value for
813 : sal_Int64) */
814 : }
815 : else
816 30864 : nValue = n;
817 :
818 : /* create a recursive buffer with all values, except the last one */
819 147849 : do
820 : {
821 147849 : sal_Char nDigit = (sal_Char)(nValue % nRadix);
822 147849 : nValue /= nRadix;
823 147849 : if ( nDigit > 9 )
824 11647 : *pBuf = (nDigit-10) + 'a';
825 : else
826 136202 : *pBuf = (nDigit + '0' );
827 147849 : pBuf++;
828 : }
829 : while ( nValue > 0 );
830 :
831 : /* copy the values in the right direction into the destination buffer */
832 147849 : do
833 : {
834 147849 : pBuf--;
835 147849 : *pStr = *pBuf;
836 147849 : pStr++;
837 147849 : nLen++;
838 : }
839 : while ( pBuf != aBuf );
840 31034 : *pStr = 0;
841 :
842 31034 : return nLen;
843 : }
844 :
845 : /* ----------------------------------------------------------------------- */
846 :
847 216 : sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
848 : SAL_THROW_EXTERN_C()
849 : {
850 216 : if ( *pStr == '1' )
851 0 : return sal_True;
852 :
853 216 : if ( (*pStr == 'T') || (*pStr == 't') )
854 : {
855 0 : pStr++;
856 0 : if ( (*pStr == 'R') || (*pStr == 'r') )
857 : {
858 0 : pStr++;
859 0 : if ( (*pStr == 'U') || (*pStr == 'u') )
860 : {
861 0 : pStr++;
862 0 : if ( (*pStr == 'E') || (*pStr == 'e') )
863 0 : return sal_True;
864 : }
865 : }
866 : }
867 :
868 216 : return sal_False;
869 : }
870 :
871 : /* ----------------------------------------------------------------------- */
872 :
873 175123 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
874 : sal_Int16 nRadix )
875 : SAL_THROW_EXTERN_C()
876 : {
877 : sal_Bool bNeg;
878 : sal_Int16 nDigit;
879 175123 : sal_Int32 n = 0;
880 :
881 175123 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
882 0 : nRadix = 10;
883 :
884 : /* Skip whitespaces */
885 350252 : while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
886 6 : pStr++;
887 :
888 175123 : if ( *pStr == '-' )
889 : {
890 3666 : bNeg = sal_True;
891 3666 : pStr++;
892 : }
893 : else
894 : {
895 171457 : if ( *pStr == '+' )
896 0 : pStr++;
897 171457 : bNeg = sal_False;
898 : }
899 :
900 675980 : while ( *pStr )
901 : {
902 339490 : nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
903 339490 : if ( nDigit < 0 )
904 13756 : break;
905 :
906 325734 : n *= nRadix;
907 325734 : n += nDigit;
908 :
909 325734 : pStr++;
910 : }
911 :
912 175123 : if ( bNeg )
913 3666 : return -n;
914 : else
915 171457 : return n;
916 : }
917 :
918 : /* ----------------------------------------------------------------------- */
919 :
920 1944 : sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
921 : sal_Int16 nRadix )
922 : SAL_THROW_EXTERN_C()
923 : {
924 : sal_Bool bNeg;
925 : sal_Int16 nDigit;
926 1944 : sal_Int64 n = 0;
927 :
928 1944 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
929 0 : nRadix = 10;
930 :
931 : /* Skip whitespaces */
932 3888 : while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
933 0 : pStr++;
934 :
935 1944 : if ( *pStr == '-' )
936 : {
937 85 : bNeg = sal_True;
938 85 : pStr++;
939 : }
940 : else
941 : {
942 1859 : if ( *pStr == '+' )
943 0 : pStr++;
944 1859 : bNeg = sal_False;
945 : }
946 :
947 14295 : while ( *pStr )
948 : {
949 10407 : nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
950 10407 : if ( nDigit < 0 )
951 0 : break;
952 :
953 10407 : n *= nRadix;
954 10407 : n += nDigit;
955 :
956 10407 : pStr++;
957 : }
958 :
959 1944 : if ( bNeg )
960 85 : return -n;
961 : else
962 1859 : return n;
963 : }
964 :
965 : /* ======================================================================= */
966 : /* Internal String-Class help functions */
967 : /* ======================================================================= */
968 :
969 53732880 : static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
970 : {
971 : IMPL_RTL_STRINGDATA * pData
972 53732880 : = (sal::static_int_cast< sal_uInt32 >(nLen)
973 : <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
974 : / sizeof (IMPL_RTL_STRCODE)))
975 : ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory(
976 53732880 : sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE))
977 107465760 : : NULL;
978 53732880 : if (pData != NULL) {
979 53732880 : pData->refCount = 1;
980 53732880 : pData->length = nLen;
981 53732880 : pData->buffer[nLen] = 0;
982 : }
983 53732880 : return pData;
984 : }
985 :
986 : /* ----------------------------------------------------------------------- */
987 :
988 1462224 : static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
989 : IMPL_RTL_STRINGDATA* pStr,
990 : sal_Int32 nCount )
991 : {
992 : IMPL_RTL_STRCODE* pDest;
993 : const IMPL_RTL_STRCODE* pSrc;
994 1462224 : IMPL_RTL_STRINGDATA* pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
995 : OSL_ASSERT(pData != NULL);
996 :
997 1462224 : pDest = pData->buffer;
998 1462224 : pSrc = pStr->buffer;
999 5449715 : while ( nCount > 0 )
1000 : {
1001 2525267 : *pDest = *pSrc;
1002 2525267 : pDest++;
1003 2525267 : pSrc++;
1004 2525267 : nCount--;
1005 : }
1006 :
1007 1462224 : *ppThis = pData;
1008 :
1009 : RTL_LOG_STRING_NEW( pData );
1010 1462224 : return pDest;
1011 : }
1012 :
1013 : /* ======================================================================= */
1014 : /* String-Class functions */
1015 : /* ======================================================================= */
1016 :
1017 : #define IMPL_RTL_AQUIRE( pThis ) \
1018 : { \
1019 : if (!SAL_STRING_IS_STATIC (pThis)) \
1020 : osl_atomic_increment( &((pThis)->refCount) ); \
1021 : }
1022 :
1023 : /* ----------------------------------------------------------------------- */
1024 :
1025 40008716 : void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
1026 : SAL_THROW_EXTERN_C()
1027 : {
1028 40008716 : IMPL_RTL_AQUIRE( pThis );
1029 40008716 : }
1030 :
1031 : /* ----------------------------------------------------------------------- */
1032 :
1033 146577521 : void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
1034 : SAL_THROW_EXTERN_C()
1035 : {
1036 146577521 : if (SAL_STRING_IS_STATIC (pThis))
1037 110640632 : return;
1038 :
1039 : /* OString doesn't have an 'intern' */
1040 : #ifdef IMPL_RTL_INTERN
1041 52464184 : if (SAL_STRING_IS_INTERN (pThis))
1042 : {
1043 91240 : internRelease (pThis);
1044 91240 : return;
1045 : }
1046 : #endif
1047 :
1048 156575732 : if ( pThis->refCount == 1 ||
1049 52172574 : !osl_atomic_decrement( &(pThis->refCount) ) )
1050 : {
1051 : RTL_LOG_STRING_DELETE( pThis );
1052 52230584 : rtl_freeMemory( pThis );
1053 : }
1054 : }
1055 :
1056 : /* ----------------------------------------------------------------------- */
1057 :
1058 33603025 : void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
1059 : SAL_THROW_EXTERN_C()
1060 : {
1061 33603025 : if ( *ppThis)
1062 3363123 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1063 :
1064 33603025 : *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING);
1065 33603025 : }
1066 :
1067 : /* ----------------------------------------------------------------------- */
1068 :
1069 1119518 : IMPL_RTL_STRINGDATA* SAL_CALL IMPL_RTL_STRINGNAME( alloc )( sal_Int32 nLen )
1070 : SAL_THROW_EXTERN_C()
1071 : {
1072 1119518 : if ( nLen < 0 )
1073 0 : return NULL;
1074 : else
1075 1119518 : return IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1076 : }
1077 :
1078 : /* ----------------------------------------------------------------------- */
1079 :
1080 6382613 : void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
1081 : SAL_THROW_EXTERN_C()
1082 : {
1083 6382613 : if ( nLen <= 0 )
1084 23543 : IMPL_RTL_STRINGNAME( new )( ppThis );
1085 : else
1086 : {
1087 6359070 : if ( *ppThis)
1088 302155 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1089 :
1090 6359070 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1091 : OSL_ASSERT(*ppThis != NULL);
1092 6359070 : (*ppThis)->length = 0;
1093 :
1094 6359070 : IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
1095 6359070 : memset(pTempStr, 0, nLen*sizeof(IMPL_RTL_STRCODE));
1096 : }
1097 6382613 : }
1098 :
1099 : /* ----------------------------------------------------------------------- */
1100 :
1101 14291 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
1102 : const IMPL_RTL_STRINGDATA* pStr )
1103 : SAL_THROW_EXTERN_C()
1104 : {
1105 : IMPL_RTL_STRINGDATA* pOrg;
1106 :
1107 14291 : if ( !pStr->length )
1108 : {
1109 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1110 14291 : return;
1111 : }
1112 :
1113 14291 : pOrg = *ppThis;
1114 14291 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
1115 : OSL_ASSERT(*ppThis != NULL);
1116 14291 : rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
1117 : RTL_LOG_STRING_NEW( *ppThis );
1118 :
1119 : /* must be done last, if pStr == *ppThis */
1120 14291 : if ( pOrg )
1121 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1122 : }
1123 :
1124 : /* ----------------------------------------------------------------------- */
1125 :
1126 9887286 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
1127 : const IMPL_RTL_STRCODE* pCharStr )
1128 : SAL_THROW_EXTERN_C()
1129 : {
1130 : IMPL_RTL_STRCODE* pBuffer;
1131 : IMPL_RTL_STRINGDATA* pOrg;
1132 : sal_Int32 nLen;
1133 :
1134 9887286 : if ( pCharStr )
1135 : {
1136 9886587 : const IMPL_RTL_STRCODE* pTempStr = pCharStr;
1137 235345550 : while( *pTempStr )
1138 215572376 : pTempStr++;
1139 9886587 : nLen = pTempStr-pCharStr;
1140 : }
1141 : else
1142 699 : nLen = 0;
1143 :
1144 9887286 : if ( !nLen )
1145 : {
1146 355176 : IMPL_RTL_STRINGNAME( new )( ppThis );
1147 10242462 : return;
1148 : }
1149 :
1150 9532110 : pOrg = *ppThis;
1151 9532110 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1152 : OSL_ASSERT(*ppThis != NULL);
1153 9532110 : pBuffer = (*ppThis)->buffer;
1154 215572376 : do
1155 : {
1156 215572376 : *pBuffer = *pCharStr;
1157 215572376 : pBuffer++;
1158 215572376 : pCharStr++;
1159 : }
1160 : while ( *pCharStr );
1161 :
1162 : RTL_LOG_STRING_NEW( *ppThis );
1163 :
1164 : /* must be done last, if pCharStr == *ppThis */
1165 9532110 : if ( pOrg )
1166 19042 : IMPL_RTL_STRINGNAME( release )( pOrg );
1167 : }
1168 :
1169 : /* ----------------------------------------------------------------------- */
1170 :
1171 14035665 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
1172 : const IMPL_RTL_STRCODE* pCharStr,
1173 : sal_Int32 nLen )
1174 : SAL_THROW_EXTERN_C()
1175 : {
1176 : IMPL_RTL_STRINGDATA* pOrg;
1177 :
1178 14035665 : if ( !pCharStr || (nLen <= 0) )
1179 : {
1180 70881 : IMPL_RTL_STRINGNAME( new )( ppThis );
1181 14106546 : return;
1182 : }
1183 :
1184 13964784 : pOrg = *ppThis;
1185 13964784 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1186 : OSL_ASSERT(*ppThis != NULL);
1187 13964784 : rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
1188 :
1189 : RTL_LOG_STRING_NEW( *ppThis );
1190 :
1191 : /* must be done last, if pCharStr == *ppThis */
1192 13964784 : if ( pOrg )
1193 384594 : IMPL_RTL_STRINGNAME( release )( pOrg );
1194 : }
1195 :
1196 : /* ----------------------------------------------------------------------- */
1197 :
1198 3671275 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromSubString )( IMPL_RTL_STRINGDATA** ppThis,
1199 : const IMPL_RTL_STRINGDATA* pFrom,
1200 : sal_Int32 beginIndex,
1201 : sal_Int32 count )
1202 : SAL_THROW_EXTERN_C()
1203 : {
1204 3671275 : if ( beginIndex == 0 && count == pFrom->length )
1205 : {
1206 461440 : IMPL_RTL_STRINGNAME( assign )( ppThis, const_cast< IMPL_RTL_STRINGDATA * >( pFrom ) );
1207 461440 : return;
1208 : }
1209 3209835 : if ( count < 0 || beginIndex < 0 || beginIndex + count > pFrom->length )
1210 : {
1211 : OSL_FAIL( "Out of bounds substring access" );
1212 1 : IMPL_RTL_STRINGNAME( newFromLiteral )( ppThis, "!!br0ken!!", 10, 0 );
1213 1 : return;
1214 : }
1215 :
1216 3209834 : IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pFrom->buffer + beginIndex, count );
1217 : }
1218 :
1219 : /* ----------------------------------------------------------------------- */
1220 :
1221 : // Used when creating from string literals.
1222 4174515 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromLiteral )( IMPL_RTL_STRINGDATA** ppThis,
1223 : const sal_Char* pCharStr,
1224 : sal_Int32 nLen,
1225 : sal_Int32 allocExtra )
1226 : SAL_THROW_EXTERN_C()
1227 : {
1228 4174515 : if ( nLen + allocExtra == 0 )
1229 : {
1230 360056 : IMPL_RTL_STRINGNAME( new )( ppThis );
1231 4534571 : return;
1232 : }
1233 :
1234 3814459 : if ( *ppThis )
1235 211610 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1236 :
1237 3814459 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen + allocExtra );
1238 : assert( *ppThis != NULL );
1239 3814459 : if ( (*ppThis) )
1240 : {
1241 3814459 : (*ppThis)->length = nLen; // fix after possible allocExtra != 0
1242 3814459 : (*ppThis)->buffer[nLen] = 0;
1243 3814459 : IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
1244 : sal_Int32 nCount;
1245 41097065 : for( nCount = nLen; nCount > 0; --nCount )
1246 : {
1247 : /* Check ASCII range */
1248 : SAL_WARN_IF( ((unsigned char)*pCharStr) > 127, "rtl.string",
1249 : "rtl_uString_newFromLiteral - Found char > 127" );
1250 : SAL_WARN_IF( ((unsigned char)*pCharStr) == '\0', "rtl.string",
1251 : "rtl_uString_newFromLiteral - Found embedded \\0 character" );
1252 :
1253 37282606 : *pBuffer = *pCharStr;
1254 37282606 : pBuffer++;
1255 37282606 : pCharStr++;
1256 : }
1257 : }
1258 :
1259 : RTL_LOG_STRING_NEW( *ppThis );
1260 : }
1261 :
1262 : /* ----------------------------------------------------------------------- */
1263 :
1264 22069511 : void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
1265 : IMPL_RTL_STRINGDATA* pStr )
1266 : SAL_THROW_EXTERN_C()
1267 : {
1268 : /* must be done at first, if pStr == *ppThis */
1269 22069511 : IMPL_RTL_AQUIRE( pStr );
1270 :
1271 22069511 : if ( *ppThis )
1272 21202194 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1273 :
1274 22069511 : *ppThis = pStr;
1275 22069511 : }
1276 :
1277 : /* ----------------------------------------------------------------------- */
1278 :
1279 172212 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
1280 : SAL_THROW_EXTERN_C()
1281 : {
1282 172212 : return pThis->length;
1283 : }
1284 :
1285 : /* ----------------------------------------------------------------------- */
1286 :
1287 355253 : IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
1288 : SAL_THROW_EXTERN_C()
1289 : {
1290 355253 : return pThis->buffer;
1291 : }
1292 :
1293 : /* ----------------------------------------------------------------------- */
1294 :
1295 7814672 : void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
1296 : IMPL_RTL_STRINGDATA* pLeft,
1297 : IMPL_RTL_STRINGDATA* pRight )
1298 : SAL_THROW_EXTERN_C()
1299 : {
1300 7814672 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1301 :
1302 : /* Test for 0-Pointer - if not, change newReplaceStrAt! */
1303 7814672 : if ( !pRight || !pRight->length )
1304 : {
1305 31483 : *ppThis = pLeft;
1306 31483 : IMPL_RTL_AQUIRE( pLeft );
1307 : }
1308 7783189 : else if ( !pLeft || !pLeft->length )
1309 : {
1310 1005114 : *ppThis = pRight;
1311 1005114 : IMPL_RTL_AQUIRE( pRight );
1312 : }
1313 : else
1314 : {
1315 6778075 : IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
1316 : OSL_ASSERT(pTempStr != NULL);
1317 6778075 : rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
1318 6778075 : rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
1319 6778075 : *ppThis = pTempStr;
1320 :
1321 : RTL_LOG_STRING_NEW( *ppThis );
1322 : }
1323 :
1324 : /* must be done last, if left or right == *ppThis */
1325 7814672 : if ( pOrg )
1326 7762070 : IMPL_RTL_STRINGNAME( release )( pOrg );
1327 7814672 : }
1328 :
1329 : /* ----------------------------------------------------------------------- */
1330 :
1331 451 : void SAL_CALL IMPL_RTL_STRINGNAME( ensureCapacity )( IMPL_RTL_STRINGDATA** ppThis,
1332 : sal_Int32 size )
1333 : SAL_THROW_EXTERN_C()
1334 : {
1335 451 : IMPL_RTL_STRINGDATA* const pOrg = *ppThis;
1336 451 : if ( pOrg->refCount == 1 && pOrg->length >= size )
1337 453 : return;
1338 : assert( pOrg->length <= size ); // do not truncate
1339 449 : IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( size );
1340 449 : rtl_str_ImplCopy( pTempStr->buffer, pOrg->buffer, pOrg->length );
1341 : // right now the length is still the same as of the original
1342 449 : pTempStr->length = pOrg->length;
1343 449 : pTempStr->buffer[ pOrg->length ] = '\0';
1344 449 : *ppThis = pTempStr;
1345 : RTL_LOG_STRING_NEW( *ppThis );
1346 :
1347 : /* must be done last, if pStr == *ppThis */
1348 449 : if ( pOrg )
1349 449 : IMPL_RTL_STRINGNAME( release )( pOrg );
1350 : }
1351 :
1352 : /* ----------------------------------------------------------------------- */
1353 :
1354 149391 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
1355 : IMPL_RTL_STRINGDATA* pStr,
1356 : sal_Int32 nIndex,
1357 : sal_Int32 nCount,
1358 : IMPL_RTL_STRINGDATA* pNewSubStr )
1359 : SAL_THROW_EXTERN_C()
1360 : {
1361 : /* Append? */
1362 149391 : if ( nIndex >= pStr->length )
1363 : {
1364 : /* newConcat test, if pNewSubStr is 0 */
1365 52602 : IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
1366 52602 : return;
1367 : }
1368 :
1369 : /* negativ index? */
1370 96789 : if ( nIndex < 0 )
1371 : {
1372 0 : nCount -= nIndex;
1373 0 : nIndex = 0;
1374 : }
1375 :
1376 : /* not more than the String length could be deleted */
1377 96789 : if ( nCount >= pStr->length-nIndex )
1378 : {
1379 27308 : nCount = pStr->length-nIndex;
1380 :
1381 : /* Assign of NewSubStr? */
1382 27308 : if ( !nIndex && (nCount >= pStr->length) )
1383 : {
1384 4464 : if ( !pNewSubStr )
1385 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1386 : else
1387 4464 : IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
1388 4464 : return;
1389 : }
1390 : }
1391 :
1392 : /* Assign of Str? */
1393 92325 : if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
1394 : {
1395 0 : IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
1396 0 : return;
1397 : }
1398 :
1399 92325 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1400 : IMPL_RTL_STRCODE* pBuffer;
1401 : sal_Int32 nNewLen;
1402 :
1403 : /* Calculate length of the new string */
1404 92325 : nNewLen = pStr->length-nCount;
1405 92325 : if ( pNewSubStr )
1406 92325 : nNewLen += pNewSubStr->length;
1407 :
1408 : /* Alloc New Buffer */
1409 92325 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
1410 : OSL_ASSERT(*ppThis != NULL);
1411 92325 : pBuffer = (*ppThis)->buffer;
1412 92325 : if ( nIndex )
1413 : {
1414 29278 : rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
1415 29278 : pBuffer += nIndex;
1416 : }
1417 92325 : if ( pNewSubStr && pNewSubStr->length )
1418 : {
1419 92167 : rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
1420 92167 : pBuffer += pNewSubStr->length;
1421 : }
1422 92325 : rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
1423 :
1424 : RTL_LOG_STRING_NEW( *ppThis );
1425 : /* must be done last, if pStr or pNewSubStr == *ppThis */
1426 92325 : if ( pOrg )
1427 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1428 : }
1429 :
1430 : /* ----------------------------------------------------------------------- */
1431 :
1432 122557 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
1433 : IMPL_RTL_STRINGDATA* pStr,
1434 : IMPL_RTL_STRCODE cOld,
1435 : IMPL_RTL_STRCODE cNew )
1436 : SAL_THROW_EXTERN_C()
1437 : {
1438 122557 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1439 122557 : int bChanged = 0;
1440 122557 : sal_Int32 nLen = pStr->length;
1441 122557 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1442 :
1443 3772219 : while ( nLen > 0 )
1444 : {
1445 3587240 : if ( *pCharStr == cOld )
1446 : {
1447 : /* Copy String */
1448 60135 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1449 :
1450 : /* replace/copy rest of the string */
1451 60135 : if ( pNewCharStr )
1452 : {
1453 60135 : *pNewCharStr = cNew;
1454 60135 : pNewCharStr++;
1455 60135 : pCharStr++;
1456 60135 : nLen--;
1457 :
1458 2043456 : while ( nLen > 0 )
1459 : {
1460 1923186 : if ( *pCharStr == cOld )
1461 183294 : *pNewCharStr = cNew;
1462 : else
1463 1739892 : *pNewCharStr = *pCharStr;
1464 :
1465 1923186 : pNewCharStr++;
1466 1923186 : pCharStr++;
1467 1923186 : nLen--;
1468 : }
1469 : }
1470 :
1471 60135 : bChanged = 1;
1472 60135 : break;
1473 : }
1474 :
1475 3527105 : pCharStr++;
1476 3527105 : nLen--;
1477 : }
1478 :
1479 122557 : if ( !bChanged )
1480 : {
1481 62422 : *ppThis = pStr;
1482 62422 : IMPL_RTL_AQUIRE( pStr );
1483 : }
1484 :
1485 : RTL_LOG_STRING_NEW( *ppThis );
1486 : /* must be done last, if pStr == *ppThis */
1487 122557 : if ( pOrg )
1488 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1489 122557 : }
1490 :
1491 : /* ----------------------------------------------------------------------- */
1492 :
1493 1721140 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
1494 : IMPL_RTL_STRINGDATA* pStr )
1495 : SAL_THROW_EXTERN_C()
1496 : {
1497 1721140 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1498 1721140 : int bChanged = 0;
1499 1721140 : sal_Int32 nLen = pStr->length;
1500 1721140 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1501 :
1502 6345716 : while ( nLen > 0 )
1503 : {
1504 : /* Between A-Z (65-90), than to lowercase (+32) */
1505 4252132 : if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
1506 : {
1507 : /* Copy String */
1508 1348696 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1509 :
1510 : /* replace/copy rest of the string */
1511 1348696 : if ( pNewCharStr )
1512 : {
1513 : /* to lowercase (+32) */
1514 1348696 : *pNewCharStr = *pCharStr+32;
1515 1348696 : pNewCharStr++;
1516 1348696 : pCharStr++;
1517 1348696 : nLen--;
1518 :
1519 10385638 : while ( nLen > 0 )
1520 : {
1521 : /* Between A-Z (65-90), than to lowercase (+32) */
1522 7688246 : if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
1523 3441565 : *pNewCharStr = *pCharStr+32;
1524 : else
1525 4246681 : *pNewCharStr = *pCharStr;
1526 :
1527 7688246 : pNewCharStr++;
1528 7688246 : pCharStr++;
1529 7688246 : nLen--;
1530 : }
1531 : }
1532 :
1533 1348696 : bChanged = 1;
1534 1348696 : break;
1535 : }
1536 :
1537 2903436 : pCharStr++;
1538 2903436 : nLen--;
1539 : }
1540 :
1541 1721140 : if ( !bChanged )
1542 : {
1543 372444 : *ppThis = pStr;
1544 372444 : IMPL_RTL_AQUIRE( pStr );
1545 : }
1546 :
1547 : RTL_LOG_STRING_NEW( *ppThis );
1548 : /* must be done last, if pStr == *ppThis */
1549 1721140 : if ( pOrg )
1550 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1551 1721140 : }
1552 :
1553 : /* ----------------------------------------------------------------------- */
1554 :
1555 384229 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
1556 : IMPL_RTL_STRINGDATA* pStr )
1557 : SAL_THROW_EXTERN_C()
1558 : {
1559 384229 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1560 384229 : int bChanged = 0;
1561 384229 : sal_Int32 nLen = pStr->length;
1562 384229 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1563 :
1564 1827172 : while ( nLen > 0 )
1565 : {
1566 : /* Between a-z (97-122), than to uppercase (-32) */
1567 1112107 : if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
1568 : {
1569 : /* Copy String */
1570 53393 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1571 :
1572 : /* replace/copy rest of the string */
1573 53393 : if ( pNewCharStr )
1574 : {
1575 : /* to uppercase (-32) */
1576 53393 : *pNewCharStr = *pCharStr-32;
1577 53393 : pNewCharStr++;
1578 53393 : pCharStr++;
1579 53393 : nLen--;
1580 :
1581 1094230 : while ( nLen > 0 )
1582 : {
1583 : /* Between a-z (97-122), than to uppercase (-32) */
1584 987444 : if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
1585 723468 : *pNewCharStr = *pCharStr-32;
1586 : else
1587 263976 : *pNewCharStr = *pCharStr;
1588 :
1589 987444 : pNewCharStr++;
1590 987444 : pCharStr++;
1591 987444 : nLen--;
1592 : }
1593 : }
1594 :
1595 53393 : bChanged = 1;
1596 53393 : break;
1597 : }
1598 :
1599 1058714 : pCharStr++;
1600 1058714 : nLen--;
1601 : }
1602 :
1603 384229 : if ( !bChanged )
1604 : {
1605 330836 : *ppThis = pStr;
1606 330836 : IMPL_RTL_AQUIRE( pStr );
1607 : }
1608 :
1609 : RTL_LOG_STRING_NEW( *ppThis );
1610 : /* must be done last, if pStr == *ppThis */
1611 384229 : if ( pOrg )
1612 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1613 384229 : }
1614 :
1615 : /* ----------------------------------------------------------------------- */
1616 :
1617 567402 : void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
1618 : IMPL_RTL_STRINGDATA* pStr )
1619 : SAL_THROW_EXTERN_C()
1620 : {
1621 567402 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1622 567402 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1623 567402 : sal_Int32 nPreSpaces = 0;
1624 567402 : sal_Int32 nPostSpaces = 0;
1625 567402 : sal_Int32 nLen = pStr->length;
1626 567402 : sal_Int32 nIndex = nLen-1;
1627 :
1628 1750626 : while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
1629 615822 : nPreSpaces++;
1630 :
1631 1382852 : while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
1632 : {
1633 248048 : nPostSpaces++;
1634 248048 : nIndex--;
1635 : }
1636 :
1637 567402 : if ( !nPreSpaces && !nPostSpaces )
1638 : {
1639 39987 : *ppThis = pStr;
1640 39987 : IMPL_RTL_AQUIRE( pStr );
1641 : }
1642 : else
1643 : {
1644 527415 : nLen -= nPostSpaces+nPreSpaces;
1645 527415 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1646 : OSL_ASSERT(*ppThis != NULL);
1647 527415 : if ( *ppThis )
1648 527415 : rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
1649 : }
1650 :
1651 : RTL_LOG_STRING_NEW( *ppThis );
1652 : /* must be done last, if pStr == *ppThis */
1653 567402 : if ( pOrg )
1654 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1655 567402 : }
1656 :
1657 : /* ----------------------------------------------------------------------- */
1658 :
1659 10314017 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
1660 : IMPL_RTL_STRINGDATA* pStr,
1661 : sal_Int32 nToken,
1662 : IMPL_RTL_STRCODE cTok,
1663 : sal_Int32 nIndex )
1664 : SAL_THROW_EXTERN_C()
1665 : {
1666 10314017 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1667 : const IMPL_RTL_STRCODE* pCharStrStart;
1668 : const IMPL_RTL_STRCODE* pOrgCharStr;
1669 10314017 : sal_Int32 nLen = pStr->length-nIndex;
1670 10314017 : sal_Int32 nTokCount = 0;
1671 :
1672 : // Set ppThis to an empty string and return -1 if either nToken or nIndex is
1673 : // negative:
1674 10314017 : if (nIndex < 0)
1675 82 : nToken = -1;
1676 :
1677 10314017 : pCharStr += nIndex;
1678 10314017 : pOrgCharStr = pCharStr;
1679 10314017 : pCharStrStart = pCharStr;
1680 174151513 : while ( nLen > 0 )
1681 : {
1682 162169718 : if ( *pCharStr == cTok )
1683 : {
1684 9454395 : nTokCount++;
1685 :
1686 9454395 : if ( nTokCount == nToken )
1687 647015 : pCharStrStart = pCharStr+1;
1688 : else
1689 : {
1690 8807380 : if ( nTokCount > nToken )
1691 8646239 : break;
1692 : }
1693 : }
1694 :
1695 153523479 : pCharStr++;
1696 153523479 : nLen--;
1697 : }
1698 :
1699 10314017 : if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
1700 : {
1701 2950142 : IMPL_RTL_STRINGNAME( new )( ppThis );
1702 2950142 : if( (nToken < 0) || (nTokCount < nToken ) )
1703 84 : return -1;
1704 2950058 : else if( nLen > 0 )
1705 2864303 : return nIndex+(pCharStr-pOrgCharStr)+1;
1706 85755 : else return -1;
1707 : }
1708 : else
1709 : {
1710 7363875 : IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
1711 7363875 : if ( nLen )
1712 5781920 : return nIndex+(pCharStr-pOrgCharStr)+1;
1713 : else
1714 1581955 : return -1;
1715 : }
1716 : }
1717 :
1718 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|