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 <cassert>
26 : #include <limits>
27 :
28 : #include <string.h>
29 : #include <sal/log.hxx>
30 : #include <rtl/character.hxx>
31 : #include <boost/static_assert.hpp>
32 :
33 : /*
34 : inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
35 : const IMPL_RTL_STRCODE* pSrc,
36 : sal_Int32 nCount )
37 : {
38 : while ( nCount > 0 )
39 : {
40 : *pDest = *pSrc;
41 : pDest++;
42 : pSrc++;
43 : nCount--;
44 : }
45 : }
46 : */
47 :
48 : #define rtl_str_ImplCopy( _pDest, _pSrc, _nCount ) \
49 : { \
50 : IMPL_RTL_STRCODE* __mm_pDest = _pDest; \
51 : const IMPL_RTL_STRCODE* __mm_pSrc = _pSrc; \
52 : sal_Int32 __mm_nCount = _nCount; \
53 : while ( __mm_nCount > 0 ) \
54 : { \
55 : *__mm_pDest = *__mm_pSrc; \
56 : __mm_pDest++; \
57 : __mm_pSrc++; \
58 : __mm_nCount--; \
59 : } \
60 : }
61 :
62 : /* ======================================================================= */
63 : /* C-String functions which could be used without the String-Class */
64 : /* ======================================================================= */
65 :
66 20405497 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
67 : SAL_THROW_EXTERN_C()
68 : {
69 20405497 : const IMPL_RTL_STRCODE* pTempStr = pStr;
70 616486258 : while( *pTempStr )
71 575675264 : pTempStr++;
72 20405497 : return pTempStr-pStr;
73 : }
74 :
75 : /* ----------------------------------------------------------------------- */
76 :
77 1104 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
78 : const IMPL_RTL_STRCODE* pStr2 )
79 : SAL_THROW_EXTERN_C()
80 : {
81 : sal_Int32 nRet;
82 83362 : while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
83 41129 : ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
84 : *pStr2 )
85 : {
86 40025 : pStr1++;
87 40025 : pStr2++;
88 : }
89 :
90 1104 : return nRet;
91 : }
92 :
93 : /* ----------------------------------------------------------------------- */
94 :
95 753360 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
96 : sal_Int32 nStr1Len,
97 : const IMPL_RTL_STRCODE* pStr2,
98 : sal_Int32 nStr2Len )
99 : SAL_THROW_EXTERN_C()
100 : {
101 753360 : sal_Int32 nRet = nStr1Len - nStr2Len;
102 753360 : int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
103 :
104 753360 : --pStr1;
105 753360 : --pStr2;
106 753360 : while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ) ;
107 :
108 753360 : if( nCount >= 0 )
109 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
110 450232 : - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
111 :
112 753360 : return nRet;
113 : }
114 :
115 : /* ----------------------------------------------------------------------- */
116 :
117 519 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
118 : sal_Int32 nStr1Len,
119 : const IMPL_RTL_STRCODE* pStr2,
120 : sal_Int32 nStr2Len,
121 : sal_Int32 nShortenedLength )
122 : SAL_THROW_EXTERN_C()
123 : {
124 519 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
125 519 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
126 : sal_Int32 nRet;
127 4551 : while ( (nShortenedLength > 0) &&
128 3831 : (pStr1 < pStr1End) && (pStr2 < pStr2End) )
129 : {
130 3831 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
131 3831 : ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
132 3831 : if ( nRet )
133 318 : return nRet;
134 :
135 3513 : nShortenedLength--;
136 3513 : pStr1++;
137 3513 : pStr2++;
138 : }
139 :
140 201 : if ( nShortenedLength <= 0 )
141 182 : return 0;
142 19 : return nStr1Len - nStr2Len;
143 : }
144 :
145 : /* ----------------------------------------------------------------------- */
146 :
147 2172461 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
148 : sal_Int32 nStr1Len,
149 : const IMPL_RTL_STRCODE* pStr2,
150 : sal_Int32 nStr2Len )
151 : SAL_THROW_EXTERN_C()
152 : {
153 2172461 : const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
154 2172461 : const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
155 : sal_Int32 nRet;
156 61482160 : while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
157 : {
158 57352888 : pStr1Run--;
159 57352888 : pStr2Run--;
160 57352888 : nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
161 57352888 : ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
162 57352888 : if ( nRet )
163 215650 : return nRet;
164 : }
165 :
166 1956811 : return nStr1Len - nStr2Len;
167 : }
168 :
169 : /* ----------------------------------------------------------------------- */
170 :
171 1020132 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
172 : const IMPL_RTL_STRCODE* pStr2 )
173 : SAL_THROW_EXTERN_C()
174 : {
175 : sal_uInt32 c1;
176 510066 : do
177 : {
178 1020132 : c1 = IMPL_RTL_USTRCODE(*pStr1);
179 : sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
180 1020132 : c1, IMPL_RTL_USTRCODE(*pStr2));
181 1020132 : if ( nRet != 0 )
182 510066 : return nRet;
183 :
184 510066 : pStr1++;
185 510066 : pStr2++;
186 : }
187 : while (c1);
188 :
189 85011 : return 0;
190 : }
191 :
192 : /* ----------------------------------------------------------------------- */
193 :
194 85020 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
195 : sal_Int32 nStr1Len,
196 : const IMPL_RTL_STRCODE* pStr2,
197 : sal_Int32 nStr2Len )
198 : SAL_THROW_EXTERN_C()
199 : {
200 85020 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
201 85020 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
202 170084 : while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
203 : {
204 : sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
205 85055 : IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
206 85055 : if ( nRet != 0 )
207 85011 : return nRet;
208 :
209 44 : pStr1++;
210 44 : pStr2++;
211 : }
212 :
213 9 : return nStr1Len - nStr2Len;
214 : }
215 :
216 : /* ----------------------------------------------------------------------- */
217 :
218 3645 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
219 : sal_Int32 nStr1Len,
220 : const IMPL_RTL_STRCODE* pStr2,
221 : sal_Int32 nStr2Len,
222 : sal_Int32 nShortenedLength )
223 : SAL_THROW_EXTERN_C()
224 : {
225 3645 : const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
226 3645 : const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
227 7754 : while ( (nShortenedLength > 0) &&
228 3644 : (pStr1 < pStr1End) && (pStr2 < pStr2End) )
229 : {
230 : sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
231 3644 : IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
232 3644 : if ( nRet != 0 )
233 3180 : return nRet;
234 :
235 464 : nShortenedLength--;
236 464 : pStr1++;
237 464 : pStr2++;
238 : }
239 :
240 465 : if ( nShortenedLength <= 0 )
241 0 : return 0;
242 465 : return nStr1Len - nStr2Len;
243 : }
244 :
245 : /* ----------------------------------------------------------------------- */
246 :
247 256757 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
248 : SAL_THROW_EXTERN_C()
249 : {
250 256757 : return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
251 : }
252 :
253 : /* ----------------------------------------------------------------------- */
254 :
255 1404533 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
256 : sal_Int32 nLen )
257 : SAL_THROW_EXTERN_C()
258 : {
259 1404533 : sal_uInt32 h = static_cast<sal_uInt32>(nLen);
260 69887441 : while ( nLen > 0 )
261 : {
262 67078375 : h = (h*37U) + IMPL_RTL_USTRCODE( *pStr );
263 67078375 : pStr++;
264 67078375 : nLen--;
265 : }
266 1404533 : return static_cast<sal_Int32>(h);
267 : }
268 :
269 : /* ----------------------------------------------------------------------- */
270 :
271 127530 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
272 : IMPL_RTL_STRCODE c )
273 : SAL_THROW_EXTERN_C()
274 : {
275 127530 : const IMPL_RTL_STRCODE* pTempStr = pStr;
276 935434 : while ( *pTempStr )
277 : {
278 807904 : if ( *pTempStr == c )
279 127530 : return pTempStr-pStr;
280 :
281 680374 : pTempStr++;
282 : }
283 :
284 0 : return -1;
285 : }
286 :
287 : /* ----------------------------------------------------------------------- */
288 :
289 3677741 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
290 : sal_Int32 nLen,
291 : IMPL_RTL_STRCODE c )
292 : SAL_THROW_EXTERN_C()
293 : {
294 3677741 : const IMPL_RTL_STRCODE* pTempStr = pStr;
295 109751889 : while ( nLen > 0 )
296 : {
297 104287914 : if ( *pTempStr == c )
298 1891507 : return pTempStr-pStr;
299 :
300 102396407 : pTempStr++;
301 102396407 : nLen--;
302 : }
303 :
304 1786234 : return -1;
305 : }
306 :
307 : /* ----------------------------------------------------------------------- */
308 :
309 1 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
310 : IMPL_RTL_STRCODE c )
311 : SAL_THROW_EXTERN_C()
312 : {
313 1 : return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
314 : }
315 :
316 : /* ----------------------------------------------------------------------- */
317 :
318 808248 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
319 : sal_Int32 nLen,
320 : IMPL_RTL_STRCODE c )
321 : SAL_THROW_EXTERN_C()
322 : {
323 808248 : pStr += nLen;
324 13566363 : while ( nLen > 0 )
325 : {
326 12758053 : nLen--;
327 12758053 : pStr--;
328 :
329 12758053 : if ( *pStr == c )
330 808186 : return nLen;
331 : }
332 :
333 62 : return -1;
334 : }
335 :
336 : /* ----------------------------------------------------------------------- */
337 :
338 1 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
339 : const IMPL_RTL_STRCODE* pSubStr )
340 : SAL_THROW_EXTERN_C()
341 : {
342 : return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
343 1 : pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
344 : }
345 :
346 : /* ----------------------------------------------------------------------- */
347 :
348 5616965 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
349 : sal_Int32 nStrLen,
350 : const IMPL_RTL_STRCODE* pSubStr,
351 : sal_Int32 nSubLen )
352 : SAL_THROW_EXTERN_C()
353 : {
354 : /* faster search for a single character */
355 5616965 : if ( nSubLen < 2 )
356 : {
357 : /* an empty SubString is always not foundable */
358 2157 : if ( nSubLen == 1 )
359 : {
360 2157 : IMPL_RTL_STRCODE c = *pSubStr;
361 2157 : const IMPL_RTL_STRCODE* pTempStr = pStr;
362 34696 : while ( nStrLen > 0 )
363 : {
364 31833 : if ( *pTempStr == c )
365 1451 : return pTempStr-pStr;
366 :
367 30382 : pTempStr++;
368 30382 : nStrLen--;
369 : }
370 : }
371 : }
372 : else
373 : {
374 5614808 : const IMPL_RTL_STRCODE* pTempStr = pStr;
375 217591187 : while ( nStrLen > 0 )
376 : {
377 208403759 : if ( *pTempStr == *pSubStr )
378 : {
379 : /* Compare SubString */
380 11649693 : if ( nSubLen <= nStrLen )
381 : {
382 11607192 : const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
383 11607192 : const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
384 11607192 : sal_Int32 nTempLen = nSubLen;
385 38820936 : while ( nTempLen )
386 : {
387 25214057 : if ( *pTempStr1 != *pTempStr2 )
388 9607505 : break;
389 :
390 15606552 : pTempStr1++;
391 15606552 : pTempStr2++;
392 15606552 : nTempLen--;
393 : }
394 :
395 11607192 : if ( !nTempLen )
396 1999687 : return pTempStr-pStr;
397 : }
398 : else
399 42501 : break;
400 : }
401 :
402 206361571 : nStrLen--;
403 206361571 : pTempStr++;
404 : }
405 : }
406 :
407 3615827 : return -1;
408 : }
409 :
410 : /* ----------------------------------------------------------------------- */
411 :
412 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
413 : const IMPL_RTL_STRCODE* pSubStr )
414 : SAL_THROW_EXTERN_C()
415 : {
416 : return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
417 0 : pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
418 : }
419 :
420 : /* ----------------------------------------------------------------------- */
421 :
422 204 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
423 : sal_Int32 nStrLen,
424 : const IMPL_RTL_STRCODE* pSubStr,
425 : sal_Int32 nSubLen )
426 : SAL_THROW_EXTERN_C()
427 : {
428 : /* faster search for a single character */
429 204 : if ( nSubLen < 2 )
430 : {
431 : /* an empty SubString is always not foundable */
432 0 : if ( nSubLen == 1 )
433 : {
434 0 : IMPL_RTL_STRCODE c = *pSubStr;
435 0 : pStr += nStrLen;
436 0 : while ( nStrLen > 0 )
437 : {
438 0 : nStrLen--;
439 0 : pStr--;
440 :
441 0 : if ( *pStr == c )
442 0 : return nStrLen;
443 : }
444 : }
445 : }
446 : else
447 : {
448 204 : pStr += nStrLen;
449 204 : nStrLen -= nSubLen;
450 204 : pStr -= nSubLen;
451 1660 : while ( nStrLen >= 0 )
452 : {
453 1372 : const IMPL_RTL_STRCODE* pTempStr1 = pStr;
454 1372 : const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
455 1372 : sal_Int32 nTempLen = nSubLen;
456 3104 : while ( nTempLen )
457 : {
458 1612 : if ( *pTempStr1 != *pTempStr2 )
459 1252 : break;
460 :
461 360 : pTempStr1++;
462 360 : pTempStr2++;
463 360 : nTempLen--;
464 : }
465 :
466 1372 : if ( !nTempLen )
467 120 : return nStrLen;
468 :
469 1252 : nStrLen--;
470 1252 : pStr--;
471 : }
472 : }
473 :
474 84 : return -1;
475 : }
476 :
477 : /* ----------------------------------------------------------------------- */
478 :
479 0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
480 : IMPL_RTL_STRCODE cOld,
481 : IMPL_RTL_STRCODE cNew )
482 : SAL_THROW_EXTERN_C()
483 : {
484 0 : while ( *pStr )
485 : {
486 0 : if ( *pStr == cOld )
487 0 : *pStr = cNew;
488 :
489 0 : pStr++;
490 : }
491 0 : }
492 :
493 : /* ----------------------------------------------------------------------- */
494 :
495 0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
496 : sal_Int32 nLen,
497 : IMPL_RTL_STRCODE cOld,
498 : IMPL_RTL_STRCODE cNew )
499 : SAL_THROW_EXTERN_C()
500 : {
501 0 : while ( nLen > 0 )
502 : {
503 0 : if ( *pStr == cOld )
504 0 : *pStr = cNew;
505 :
506 0 : pStr++;
507 0 : nLen--;
508 : }
509 0 : }
510 :
511 : /* ----------------------------------------------------------------------- */
512 :
513 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
514 : SAL_THROW_EXTERN_C()
515 : {
516 0 : while ( *pStr )
517 : {
518 0 : *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
519 :
520 0 : pStr++;
521 : }
522 0 : }
523 :
524 : /* ----------------------------------------------------------------------- */
525 :
526 3999225 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
527 : sal_Int32 nLen )
528 : SAL_THROW_EXTERN_C()
529 : {
530 41991696 : while ( nLen > 0 )
531 : {
532 33993246 : *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
533 :
534 33993246 : pStr++;
535 33993246 : nLen--;
536 : }
537 3999225 : }
538 :
539 : /* ----------------------------------------------------------------------- */
540 :
541 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
542 : SAL_THROW_EXTERN_C()
543 : {
544 0 : while ( *pStr )
545 : {
546 0 : *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
547 :
548 0 : pStr++;
549 : }
550 0 : }
551 :
552 : /* ----------------------------------------------------------------------- */
553 :
554 0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
555 : sal_Int32 nLen )
556 : SAL_THROW_EXTERN_C()
557 : {
558 0 : while ( nLen > 0 )
559 : {
560 0 : *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
561 :
562 0 : pStr++;
563 0 : nLen--;
564 : }
565 0 : }
566 :
567 : /* ----------------------------------------------------------------------- */
568 :
569 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
570 : SAL_THROW_EXTERN_C()
571 : {
572 0 : return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
573 : }
574 :
575 : /* ----------------------------------------------------------------------- */
576 :
577 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
578 : SAL_THROW_EXTERN_C()
579 : {
580 0 : sal_Int32 nPreSpaces = 0;
581 0 : sal_Int32 nPostSpaces = 0;
582 0 : sal_Int32 nIndex = nLen-1;
583 :
584 0 : while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
585 0 : nPreSpaces++;
586 :
587 0 : while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
588 : {
589 0 : nPostSpaces++;
590 0 : nIndex--;
591 : }
592 :
593 0 : if ( nPostSpaces )
594 : {
595 0 : nLen -= nPostSpaces;
596 0 : *(pStr+nLen) = 0;
597 : }
598 :
599 0 : if ( nPreSpaces )
600 : {
601 0 : IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
602 :
603 0 : nLen -= nPreSpaces;
604 0 : nIndex = nLen;
605 :
606 0 : while ( nIndex )
607 : {
608 0 : *pStr = *pNewStr;
609 0 : pStr++;
610 0 : pNewStr++;
611 0 : nIndex--;
612 : }
613 0 : *pStr = 0;
614 : }
615 :
616 0 : return nLen;
617 : }
618 :
619 : /* ----------------------------------------------------------------------- */
620 :
621 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
622 : SAL_THROW_EXTERN_C()
623 : {
624 0 : if ( b )
625 : {
626 0 : *pStr = 't';
627 0 : pStr++;
628 0 : *pStr = 'r';
629 0 : pStr++;
630 0 : *pStr = 'u';
631 0 : pStr++;
632 0 : *pStr = 'e';
633 0 : pStr++;
634 0 : *pStr = 0;
635 0 : return 4;
636 : }
637 : else
638 : {
639 0 : *pStr = 'f';
640 0 : pStr++;
641 0 : *pStr = 'a';
642 0 : pStr++;
643 0 : *pStr = 'l';
644 0 : pStr++;
645 0 : *pStr = 's';
646 0 : pStr++;
647 0 : *pStr = 'e';
648 0 : pStr++;
649 0 : *pStr = 0;
650 0 : return 5;
651 : }
652 : }
653 :
654 : /* ----------------------------------------------------------------------- */
655 :
656 0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
657 : IMPL_RTL_STRCODE c )
658 : SAL_THROW_EXTERN_C()
659 : {
660 0 : *pStr++ = c;
661 0 : *pStr = 0;
662 0 : return 1;
663 : }
664 :
665 : /* ----------------------------------------------------------------------- */
666 :
667 85458 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
668 : sal_Int32 n,
669 : sal_Int16 nRadix )
670 : SAL_THROW_EXTERN_C()
671 : {
672 : sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32];
673 85458 : sal_Char* pBuf = aBuf;
674 85458 : sal_Int32 nLen = 0;
675 : sal_uInt32 nValue;
676 :
677 : /* Radix must be valid */
678 85458 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
679 0 : nRadix = 10;
680 :
681 : /* is value negativ */
682 85458 : if ( n < 0 )
683 : {
684 0 : *pStr = '-';
685 0 : pStr++;
686 0 : nLen++;
687 0 : nValue = n == SAL_MIN_INT32 ? static_cast<sal_uInt32>(n) : -n;
688 : }
689 : else
690 85458 : nValue = n;
691 :
692 : /* create a recursive buffer with all values, except the last one */
693 85606 : do
694 : {
695 85606 : sal_Char nDigit = (sal_Char)(nValue % nRadix);
696 85606 : nValue /= nRadix;
697 85606 : if ( nDigit > 9 )
698 30 : *pBuf = (nDigit-10) + 'a';
699 : else
700 85576 : *pBuf = (nDigit + '0' );
701 85606 : pBuf++;
702 : }
703 : while ( nValue > 0 );
704 :
705 : /* copy the values in the right direction into the destination buffer */
706 85606 : do
707 : {
708 85606 : pBuf--;
709 85606 : *pStr = *pBuf;
710 85606 : pStr++;
711 85606 : nLen++;
712 : }
713 : while ( pBuf != aBuf );
714 85458 : *pStr = 0;
715 :
716 85458 : return nLen;
717 : }
718 :
719 : /* ----------------------------------------------------------------------- */
720 :
721 22 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
722 : sal_Int64 n,
723 : sal_Int16 nRadix )
724 : SAL_THROW_EXTERN_C()
725 : {
726 : sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64];
727 22 : sal_Char* pBuf = aBuf;
728 22 : sal_Int32 nLen = 0;
729 : sal_uInt64 nValue;
730 :
731 : /* Radix must be valid */
732 22 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
733 0 : nRadix = 10;
734 :
735 : /* is value negativ */
736 22 : if ( n < 0 )
737 : {
738 0 : *pStr = '-';
739 0 : pStr++;
740 0 : nLen++;
741 0 : nValue = n == SAL_MIN_INT64 ? static_cast<sal_uInt64>(n) : -n;
742 : }
743 : else
744 22 : nValue = n;
745 :
746 : /* create a recursive buffer with all values, except the last one */
747 22 : do
748 : {
749 22 : sal_Char nDigit = (sal_Char)(nValue % nRadix);
750 22 : nValue /= nRadix;
751 22 : if ( nDigit > 9 )
752 0 : *pBuf = (nDigit-10) + 'a';
753 : else
754 22 : *pBuf = (nDigit + '0' );
755 22 : pBuf++;
756 : }
757 : while ( nValue > 0 );
758 :
759 : /* copy the values in the right direction into the destination buffer */
760 22 : do
761 : {
762 22 : pBuf--;
763 22 : *pStr = *pBuf;
764 22 : pStr++;
765 22 : nLen++;
766 : }
767 : while ( pBuf != aBuf );
768 22 : *pStr = 0;
769 :
770 22 : return nLen;
771 : }
772 :
773 : /* ----------------------------------------------------------------------- */
774 :
775 2 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfUInt64 )( IMPL_RTL_STRCODE* pStr,
776 : sal_uInt64 n,
777 : sal_Int16 nRadix )
778 : SAL_THROW_EXTERN_C()
779 : {
780 : sal_Char aBuf[RTL_STR_MAX_VALUEOFUINT64];
781 2 : sal_Char* pBuf = aBuf;
782 2 : sal_Int32 nLen = 0;
783 : sal_uInt64 nValue;
784 :
785 : /* Radix must be valid */
786 2 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
787 0 : nRadix = 10;
788 :
789 2 : nValue = n;
790 :
791 : /* create a recursive buffer with all values, except the last one */
792 2 : do
793 : {
794 2 : sal_Char nDigit = (sal_Char)(nValue % nRadix);
795 2 : nValue /= nRadix;
796 2 : if ( nDigit > 9 )
797 0 : *pBuf = (nDigit-10) + 'a';
798 : else
799 2 : *pBuf = (nDigit + '0' );
800 2 : pBuf++;
801 : }
802 : while ( nValue > 0 );
803 :
804 : /* copy the values in the right direction into the destination buffer */
805 2 : do
806 : {
807 2 : pBuf--;
808 2 : *pStr = *pBuf;
809 2 : pStr++;
810 2 : nLen++;
811 : }
812 : while ( pBuf != aBuf );
813 2 : *pStr = 0;
814 :
815 2 : return nLen;
816 : }
817 :
818 : /* ----------------------------------------------------------------------- */
819 :
820 0 : sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
821 : SAL_THROW_EXTERN_C()
822 : {
823 0 : if ( *pStr == '1' )
824 0 : return sal_True;
825 :
826 0 : if ( (*pStr == 'T') || (*pStr == 't') )
827 : {
828 0 : pStr++;
829 0 : if ( (*pStr == 'R') || (*pStr == 'r') )
830 : {
831 0 : pStr++;
832 0 : if ( (*pStr == 'U') || (*pStr == 'u') )
833 : {
834 0 : pStr++;
835 0 : if ( (*pStr == 'E') || (*pStr == 'e') )
836 0 : return sal_True;
837 : }
838 : }
839 : }
840 :
841 0 : return sal_False;
842 : }
843 :
844 : /* ----------------------------------------------------------------------- */
845 : namespace {
846 179015 : template<typename T, typename U> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
847 : sal_Int16 nRadix )
848 : {
849 : BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed);
850 : bool bNeg;
851 : sal_Int16 nDigit;
852 179015 : U n = 0;
853 :
854 179015 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
855 0 : nRadix = 10;
856 :
857 : /* Skip whitespaces */
858 358030 : while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
859 0 : pStr++;
860 :
861 179015 : if ( *pStr == '-' )
862 : {
863 115 : bNeg = true;
864 115 : pStr++;
865 : }
866 : else
867 : {
868 178900 : if ( *pStr == '+' )
869 0 : pStr++;
870 178900 : bNeg = false;
871 : }
872 :
873 : T nDiv;
874 : sal_Int16 nMod;
875 179015 : if ( bNeg )
876 : {
877 115 : nDiv = std::numeric_limits<T>::min() / nRadix;
878 115 : nMod = std::numeric_limits<T>::min() % nRadix;
879 : // Cater for C++03 implementations that round the quotient down
880 : // instead of truncating towards zero as mandated by C++11:
881 115 : if ( nMod > 0 )
882 : {
883 0 : --nDiv;
884 0 : nMod -= nRadix;
885 : }
886 115 : nDiv = -nDiv;
887 115 : nMod = -nMod;
888 : }
889 : else
890 : {
891 178900 : nDiv = std::numeric_limits<T>::max() / nRadix;
892 178900 : nMod = std::numeric_limits<T>::max() % nRadix;
893 : }
894 :
895 547192 : while ( *pStr )
896 : {
897 189162 : nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
898 189162 : if ( nDigit < 0 )
899 0 : break;
900 : assert(nDiv > 0);
901 189162 : if( static_cast<U>( nMod < nDigit ? nDiv-1 : nDiv ) < n )
902 0 : return 0;
903 :
904 189162 : n *= nRadix;
905 189162 : n += nDigit;
906 :
907 189162 : pStr++;
908 : }
909 :
910 179015 : if ( bNeg )
911 115 : return n == static_cast<U>(std::numeric_limits<T>::min())
912 115 : ? std::numeric_limits<T>::min() : -static_cast<T>(n);
913 : else
914 178900 : return static_cast<T>(n);
915 : }
916 : }
917 :
918 8958 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
919 : sal_Int16 nRadix )
920 : SAL_THROW_EXTERN_C()
921 : {
922 8958 : return IMPL_RTL_STRNAME( toInt )<sal_Int32, sal_uInt32>(pStr, nRadix);
923 : }
924 :
925 170057 : sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
926 : sal_Int16 nRadix )
927 : SAL_THROW_EXTERN_C()
928 : {
929 170057 : return IMPL_RTL_STRNAME( toInt )<sal_Int64, sal_uInt64>(pStr, nRadix);
930 : }
931 :
932 : /* ----------------------------------------------------------------------- */
933 : namespace {
934 0 : template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
935 : sal_Int16 nRadix )
936 : {
937 : BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
938 : sal_Int16 nDigit;
939 0 : T n = 0;
940 :
941 0 : if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
942 0 : nRadix = 10;
943 :
944 : /* Skip whitespaces */
945 0 : while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
946 0 : ++pStr;
947 :
948 : // skip optional explicit sign
949 0 : if ( *pStr == '+' )
950 0 : ++pStr;
951 :
952 0 : T nDiv = std::numeric_limits<T>::max() / nRadix;
953 0 : sal_Int16 nMod = std::numeric_limits<T>::max() % nRadix;
954 0 : while ( *pStr )
955 : {
956 0 : nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
957 0 : if ( nDigit < 0 )
958 0 : break;
959 0 : if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
960 0 : return 0;
961 :
962 0 : n *= nRadix;
963 0 : n += nDigit;
964 :
965 0 : ++pStr;
966 : }
967 :
968 0 : return n;
969 : }
970 : }
971 :
972 0 : sal_uInt32 SAL_CALL IMPL_RTL_STRNAME( toUInt32 )( const IMPL_RTL_STRCODE* pStr,
973 : sal_Int16 nRadix )
974 : SAL_THROW_EXTERN_C()
975 : {
976 0 : return IMPL_RTL_STRNAME( toUInt )<sal_uInt32>(pStr, nRadix);
977 : }
978 :
979 0 : sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr,
980 : sal_Int16 nRadix )
981 : SAL_THROW_EXTERN_C()
982 : {
983 0 : return IMPL_RTL_STRNAME( toUInt )<sal_uInt64>(pStr, nRadix);
984 : }
985 :
986 : /* ======================================================================= */
987 : /* Internal String-Class help functions */
988 : /* ======================================================================= */
989 :
990 46809584 : static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
991 : {
992 : IMPL_RTL_STRINGDATA * pData
993 46809584 : = (sal::static_int_cast< sal_uInt32 >(nLen)
994 : <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
995 : / sizeof (IMPL_RTL_STRCODE)))
996 : ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory(
997 46809584 : sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE))
998 93619168 : : NULL;
999 46809584 : if (pData != NULL) {
1000 46809584 : pData->refCount = 1;
1001 46809584 : pData->length = nLen;
1002 46809584 : pData->buffer[nLen] = 0;
1003 : }
1004 46809584 : return pData;
1005 : }
1006 :
1007 : /* ----------------------------------------------------------------------- */
1008 :
1009 0 : static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
1010 : IMPL_RTL_STRINGDATA* pStr,
1011 : sal_Int32 nCount )
1012 : {
1013 : IMPL_RTL_STRCODE* pDest;
1014 : const IMPL_RTL_STRCODE* pSrc;
1015 0 : IMPL_RTL_STRINGDATA* pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
1016 : OSL_ASSERT(pData != NULL);
1017 :
1018 0 : pDest = pData->buffer;
1019 0 : pSrc = pStr->buffer;
1020 0 : while ( nCount > 0 )
1021 : {
1022 0 : *pDest = *pSrc;
1023 0 : pDest++;
1024 0 : pSrc++;
1025 0 : nCount--;
1026 : }
1027 :
1028 0 : *ppThis = pData;
1029 :
1030 : RTL_LOG_STRING_NEW( pData );
1031 0 : return pDest;
1032 : }
1033 :
1034 : /* ======================================================================= */
1035 : /* String-Class functions */
1036 : /* ======================================================================= */
1037 :
1038 : #define IMPL_RTL_AQUIRE( pThis ) \
1039 : { \
1040 : if (!SAL_STRING_IS_STATIC (pThis)) \
1041 : osl_atomic_increment( &((pThis)->refCount) ); \
1042 : }
1043 :
1044 : /* ----------------------------------------------------------------------- */
1045 :
1046 13808525 : void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
1047 : SAL_THROW_EXTERN_C()
1048 : {
1049 13808525 : IMPL_RTL_AQUIRE( pThis );
1050 13808525 : }
1051 :
1052 : /* ----------------------------------------------------------------------- */
1053 :
1054 108894748 : void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
1055 : SAL_THROW_EXTERN_C()
1056 : {
1057 108894748 : if (SAL_STRING_IS_STATIC (pThis))
1058 46185024 : return;
1059 :
1060 : /* OString doesn't have an 'intern' */
1061 : #ifdef IMPL_RTL_INTERN
1062 63336748 : if (SAL_STRING_IS_INTERN (pThis))
1063 : {
1064 0 : internRelease (pThis);
1065 0 : return;
1066 : }
1067 : #endif
1068 :
1069 80536013 : if ( !osl_atomic_decrement( &(pThis->refCount) ) )
1070 : {
1071 : RTL_LOG_STRING_DELETE( pThis );
1072 42813663 : rtl_freeMemory( pThis );
1073 : }
1074 : }
1075 :
1076 : /* ----------------------------------------------------------------------- */
1077 :
1078 31229971 : void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
1079 : SAL_THROW_EXTERN_C()
1080 : {
1081 31229971 : if ( *ppThis)
1082 225043 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1083 :
1084 31229971 : *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING);
1085 31229971 : }
1086 :
1087 : /* ----------------------------------------------------------------------- */
1088 :
1089 86940 : IMPL_RTL_STRINGDATA* SAL_CALL IMPL_RTL_STRINGNAME( alloc )( sal_Int32 nLen )
1090 : SAL_THROW_EXTERN_C()
1091 : {
1092 86940 : if ( nLen < 0 )
1093 0 : return NULL;
1094 : else
1095 86940 : return IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1096 : }
1097 :
1098 : /* ----------------------------------------------------------------------- */
1099 :
1100 11864400 : void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
1101 : SAL_THROW_EXTERN_C()
1102 : {
1103 11864400 : if ( nLen <= 0 )
1104 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1105 : else
1106 : {
1107 11864400 : if ( *ppThis)
1108 637621 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1109 :
1110 11864400 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1111 : OSL_ASSERT(*ppThis != NULL);
1112 11864400 : (*ppThis)->length = 0;
1113 :
1114 11864400 : IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
1115 11864400 : memset(pTempStr, 0, nLen*sizeof(IMPL_RTL_STRCODE));
1116 : }
1117 11864400 : }
1118 :
1119 : /* ----------------------------------------------------------------------- */
1120 :
1121 0 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
1122 : const IMPL_RTL_STRINGDATA* pStr )
1123 : SAL_THROW_EXTERN_C()
1124 : {
1125 : IMPL_RTL_STRINGDATA* pOrg;
1126 :
1127 0 : if ( !pStr->length )
1128 : {
1129 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1130 0 : return;
1131 : }
1132 :
1133 0 : pOrg = *ppThis;
1134 0 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
1135 : OSL_ASSERT(*ppThis != NULL);
1136 0 : rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
1137 : RTL_LOG_STRING_NEW( *ppThis );
1138 :
1139 : /* must be done last, if pStr == *ppThis */
1140 0 : if ( pOrg )
1141 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1142 : }
1143 :
1144 : /* ----------------------------------------------------------------------- */
1145 :
1146 1615479 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
1147 : const IMPL_RTL_STRCODE* pCharStr )
1148 : SAL_THROW_EXTERN_C()
1149 : {
1150 : IMPL_RTL_STRCODE* pBuffer;
1151 : IMPL_RTL_STRINGDATA* pOrg;
1152 : sal_Int32 nLen;
1153 :
1154 1615479 : if ( pCharStr )
1155 : {
1156 1615479 : const IMPL_RTL_STRCODE* pTempStr = pCharStr;
1157 47146026 : while( *pTempStr )
1158 43915068 : pTempStr++;
1159 1615479 : nLen = pTempStr-pCharStr;
1160 : }
1161 : else
1162 0 : nLen = 0;
1163 :
1164 1615479 : if ( !nLen )
1165 : {
1166 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1167 1615479 : return;
1168 : }
1169 :
1170 1615479 : pOrg = *ppThis;
1171 1615479 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1172 : OSL_ASSERT(*ppThis != NULL);
1173 1615479 : pBuffer = (*ppThis)->buffer;
1174 43915068 : do
1175 : {
1176 43915068 : *pBuffer = *pCharStr;
1177 43915068 : pBuffer++;
1178 43915068 : pCharStr++;
1179 : }
1180 : while ( *pCharStr );
1181 :
1182 : RTL_LOG_STRING_NEW( *ppThis );
1183 :
1184 : /* must be done last, if pCharStr == *ppThis */
1185 1615479 : if ( pOrg )
1186 42508 : IMPL_RTL_STRINGNAME( release )( pOrg );
1187 : }
1188 :
1189 : /* ----------------------------------------------------------------------- */
1190 :
1191 16814436 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
1192 : const IMPL_RTL_STRCODE* pCharStr,
1193 : sal_Int32 nLen )
1194 : SAL_THROW_EXTERN_C()
1195 : {
1196 : IMPL_RTL_STRINGDATA* pOrg;
1197 :
1198 16814436 : if ( !pCharStr || (nLen <= 0) )
1199 : {
1200 1545 : IMPL_RTL_STRINGNAME( new )( ppThis );
1201 16815981 : return;
1202 : }
1203 :
1204 16812891 : pOrg = *ppThis;
1205 16812891 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1206 : OSL_ASSERT(*ppThis != NULL);
1207 16812891 : rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
1208 :
1209 : RTL_LOG_STRING_NEW( *ppThis );
1210 :
1211 : /* must be done last, if pCharStr == *ppThis */
1212 16812891 : if ( pOrg )
1213 1999668 : IMPL_RTL_STRINGNAME( release )( pOrg );
1214 : }
1215 :
1216 : /* ----------------------------------------------------------------------- */
1217 :
1218 6588996 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromSubString )( IMPL_RTL_STRINGDATA** ppThis,
1219 : const IMPL_RTL_STRINGDATA* pFrom,
1220 : sal_Int32 beginIndex,
1221 : sal_Int32 count )
1222 : SAL_THROW_EXTERN_C()
1223 : {
1224 6588996 : if ( beginIndex == 0 && count == pFrom->length )
1225 : {
1226 31 : IMPL_RTL_STRINGNAME( assign )( ppThis, const_cast< IMPL_RTL_STRINGDATA * >( pFrom ) );
1227 31 : return;
1228 : }
1229 6588965 : if ( count < 0 || beginIndex < 0 || beginIndex + count > pFrom->length )
1230 : {
1231 : assert(false); // fail fast at least in debug builds
1232 0 : IMPL_RTL_STRINGNAME( newFromLiteral )( ppThis, "!!br0ken!!", 10, 0 );
1233 0 : return;
1234 : }
1235 :
1236 6588965 : IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pFrom->buffer + beginIndex, count );
1237 : }
1238 :
1239 : /* ----------------------------------------------------------------------- */
1240 :
1241 : // Used when creating from string literals.
1242 2255511 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromLiteral )( IMPL_RTL_STRINGDATA** ppThis,
1243 : const sal_Char* pCharStr,
1244 : sal_Int32 nLen,
1245 : sal_Int32 allocExtra )
1246 : SAL_THROW_EXTERN_C()
1247 : {
1248 2255511 : if ( nLen + allocExtra == 0 )
1249 : {
1250 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1251 2255511 : return;
1252 : }
1253 :
1254 2255511 : if ( *ppThis )
1255 42510 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1256 :
1257 2255511 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen + allocExtra );
1258 : assert( *ppThis != NULL );
1259 2255511 : if ( (*ppThis) )
1260 : {
1261 2255511 : (*ppThis)->length = nLen; // fix after possible allocExtra != 0
1262 2255511 : (*ppThis)->buffer[nLen] = 0;
1263 2255511 : IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
1264 : sal_Int32 nCount;
1265 68131316 : for( nCount = nLen; nCount > 0; --nCount )
1266 : {
1267 : /* Check ASCII range */
1268 : SAL_WARN_IF( ((unsigned char)*pCharStr) > 127, "rtl.string",
1269 : "rtl_uString_newFromLiteral - Found char > 127" );
1270 : SAL_WARN_IF( ((unsigned char)*pCharStr) == '\0', "rtl.string",
1271 : "rtl_uString_newFromLiteral - Found embedded \\0 character" );
1272 :
1273 65875805 : *pBuffer = *pCharStr;
1274 65875805 : pBuffer++;
1275 65875805 : pCharStr++;
1276 : }
1277 : }
1278 :
1279 : RTL_LOG_STRING_NEW( *ppThis );
1280 : }
1281 :
1282 : /* ----------------------------------------------------------------------- */
1283 :
1284 21256917 : void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
1285 : IMPL_RTL_STRINGDATA* pStr )
1286 : SAL_THROW_EXTERN_C()
1287 : {
1288 : /* must be done at first, if pStr == *ppThis */
1289 21256917 : IMPL_RTL_AQUIRE( pStr );
1290 :
1291 21256917 : if ( *ppThis )
1292 17471649 : IMPL_RTL_STRINGNAME( release )( *ppThis );
1293 :
1294 21256917 : *ppThis = pStr;
1295 21256917 : }
1296 :
1297 : /* ----------------------------------------------------------------------- */
1298 :
1299 3145473 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
1300 : SAL_THROW_EXTERN_C()
1301 : {
1302 3145473 : return pThis->length;
1303 : }
1304 :
1305 : /* ----------------------------------------------------------------------- */
1306 :
1307 4930815 : IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
1308 : SAL_THROW_EXTERN_C()
1309 : {
1310 4930815 : return pThis->buffer;
1311 : }
1312 :
1313 : /* ----------------------------------------------------------------------- */
1314 :
1315 2260410 : void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
1316 : IMPL_RTL_STRINGDATA* pLeft,
1317 : IMPL_RTL_STRINGDATA* pRight )
1318 : SAL_THROW_EXTERN_C()
1319 : {
1320 2260410 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1321 :
1322 : /* Test for 0-Pointer - if not, change newReplaceStrAt! */
1323 2260410 : if ( !pRight || !pRight->length )
1324 : {
1325 42573 : *ppThis = pLeft;
1326 42573 : IMPL_RTL_AQUIRE( pLeft );
1327 : }
1328 2217837 : else if ( !pLeft || !pLeft->length )
1329 : {
1330 104 : *ppThis = pRight;
1331 104 : IMPL_RTL_AQUIRE( pRight );
1332 : }
1333 : else
1334 : {
1335 2217733 : IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
1336 : OSL_ASSERT(pTempStr != NULL);
1337 2217733 : rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
1338 2217733 : rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
1339 2217733 : *ppThis = pTempStr;
1340 :
1341 : RTL_LOG_STRING_NEW( *ppThis );
1342 : }
1343 :
1344 : /* must be done last, if left or right == *ppThis */
1345 2260410 : if ( pOrg )
1346 2260410 : IMPL_RTL_STRINGNAME( release )( pOrg );
1347 2260410 : }
1348 :
1349 : /* ----------------------------------------------------------------------- */
1350 :
1351 0 : void SAL_CALL IMPL_RTL_STRINGNAME( ensureCapacity )( IMPL_RTL_STRINGDATA** ppThis,
1352 : sal_Int32 size )
1353 : SAL_THROW_EXTERN_C()
1354 : {
1355 0 : IMPL_RTL_STRINGDATA* const pOrg = *ppThis;
1356 0 : if ( pOrg->refCount == 1 && pOrg->length >= size )
1357 0 : return;
1358 : assert( pOrg->length <= size ); // do not truncate
1359 0 : IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( size );
1360 0 : rtl_str_ImplCopy( pTempStr->buffer, pOrg->buffer, pOrg->length );
1361 : // right now the length is still the same as of the original
1362 0 : pTempStr->length = pOrg->length;
1363 0 : pTempStr->buffer[ pOrg->length ] = '\0';
1364 0 : *ppThis = pTempStr;
1365 : RTL_LOG_STRING_NEW( *ppThis );
1366 :
1367 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1368 : }
1369 :
1370 : /* ----------------------------------------------------------------------- */
1371 :
1372 0 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
1373 : IMPL_RTL_STRINGDATA* pStr,
1374 : sal_Int32 nIndex,
1375 : sal_Int32 nCount,
1376 : IMPL_RTL_STRINGDATA* pNewSubStr )
1377 : SAL_THROW_EXTERN_C()
1378 : {
1379 : /* Append? */
1380 0 : if ( nIndex >= pStr->length )
1381 : {
1382 : /* newConcat test, if pNewSubStr is 0 */
1383 0 : IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
1384 0 : return;
1385 : }
1386 :
1387 : /* negativ index? */
1388 0 : if ( nIndex < 0 )
1389 : {
1390 0 : nCount -= nIndex;
1391 0 : nIndex = 0;
1392 : }
1393 :
1394 : /* not more than the String length could be deleted */
1395 0 : if ( nCount >= pStr->length-nIndex )
1396 : {
1397 0 : nCount = pStr->length-nIndex;
1398 :
1399 : /* Assign of NewSubStr? */
1400 0 : if ( !nIndex && (nCount >= pStr->length) )
1401 : {
1402 0 : if ( !pNewSubStr )
1403 0 : IMPL_RTL_STRINGNAME( new )( ppThis );
1404 : else
1405 0 : IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
1406 0 : return;
1407 : }
1408 : }
1409 :
1410 : /* Assign of Str? */
1411 0 : if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
1412 : {
1413 0 : IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
1414 0 : return;
1415 : }
1416 :
1417 0 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1418 : IMPL_RTL_STRCODE* pBuffer;
1419 : sal_Int32 nNewLen;
1420 :
1421 : /* Calculate length of the new string */
1422 0 : nNewLen = pStr->length-nCount;
1423 0 : if ( pNewSubStr )
1424 0 : nNewLen += pNewSubStr->length;
1425 :
1426 : /* Alloc New Buffer */
1427 0 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
1428 : OSL_ASSERT(*ppThis != NULL);
1429 0 : pBuffer = (*ppThis)->buffer;
1430 0 : if ( nIndex )
1431 : {
1432 0 : rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
1433 0 : pBuffer += nIndex;
1434 : }
1435 0 : if ( pNewSubStr && pNewSubStr->length )
1436 : {
1437 0 : rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
1438 0 : pBuffer += pNewSubStr->length;
1439 : }
1440 0 : rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
1441 :
1442 : RTL_LOG_STRING_NEW( *ppThis );
1443 : /* must be done last, if pStr or pNewSubStr == *ppThis */
1444 0 : if ( pOrg )
1445 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1446 : }
1447 :
1448 : /* ----------------------------------------------------------------------- */
1449 :
1450 0 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
1451 : IMPL_RTL_STRINGDATA* pStr,
1452 : IMPL_RTL_STRCODE cOld,
1453 : IMPL_RTL_STRCODE cNew )
1454 : SAL_THROW_EXTERN_C()
1455 : {
1456 0 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1457 0 : int bChanged = 0;
1458 0 : sal_Int32 nLen = pStr->length;
1459 0 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1460 :
1461 0 : while ( nLen > 0 )
1462 : {
1463 0 : if ( *pCharStr == cOld )
1464 : {
1465 : /* Copy String */
1466 0 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1467 :
1468 : /* replace/copy rest of the string */
1469 0 : if ( pNewCharStr )
1470 : {
1471 0 : *pNewCharStr = cNew;
1472 0 : pNewCharStr++;
1473 0 : pCharStr++;
1474 0 : nLen--;
1475 :
1476 0 : while ( nLen > 0 )
1477 : {
1478 0 : if ( *pCharStr == cOld )
1479 0 : *pNewCharStr = cNew;
1480 : else
1481 0 : *pNewCharStr = *pCharStr;
1482 :
1483 0 : pNewCharStr++;
1484 0 : pCharStr++;
1485 0 : nLen--;
1486 : }
1487 : }
1488 :
1489 0 : bChanged = 1;
1490 0 : break;
1491 : }
1492 :
1493 0 : pCharStr++;
1494 0 : nLen--;
1495 : }
1496 :
1497 0 : if ( !bChanged )
1498 : {
1499 0 : *ppThis = pStr;
1500 0 : IMPL_RTL_AQUIRE( pStr );
1501 : }
1502 :
1503 : RTL_LOG_STRING_NEW( *ppThis );
1504 : /* must be done last, if pStr == *ppThis */
1505 0 : if ( pOrg )
1506 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1507 0 : }
1508 :
1509 : /* ----------------------------------------------------------------------- */
1510 :
1511 8 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
1512 : IMPL_RTL_STRINGDATA* pStr )
1513 : SAL_THROW_EXTERN_C()
1514 : {
1515 8 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1516 8 : int bChanged = 0;
1517 8 : sal_Int32 nLen = pStr->length;
1518 8 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1519 :
1520 32 : while ( nLen > 0 )
1521 : {
1522 16 : if ( rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr)) )
1523 : {
1524 : /* Copy String */
1525 0 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1526 :
1527 : /* replace/copy rest of the string */
1528 0 : if ( pNewCharStr )
1529 : {
1530 0 : *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
1531 0 : pNewCharStr++;
1532 0 : pCharStr++;
1533 0 : nLen--;
1534 :
1535 0 : while ( nLen > 0 )
1536 : {
1537 0 : *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
1538 :
1539 0 : pNewCharStr++;
1540 0 : pCharStr++;
1541 0 : nLen--;
1542 : }
1543 : }
1544 :
1545 0 : bChanged = 1;
1546 0 : break;
1547 : }
1548 :
1549 16 : pCharStr++;
1550 16 : nLen--;
1551 : }
1552 :
1553 8 : if ( !bChanged )
1554 : {
1555 8 : *ppThis = pStr;
1556 8 : IMPL_RTL_AQUIRE( pStr );
1557 : }
1558 :
1559 : RTL_LOG_STRING_NEW( *ppThis );
1560 : /* must be done last, if pStr == *ppThis */
1561 8 : if ( pOrg )
1562 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1563 8 : }
1564 :
1565 : /* ----------------------------------------------------------------------- */
1566 :
1567 8 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
1568 : IMPL_RTL_STRINGDATA* pStr )
1569 : SAL_THROW_EXTERN_C()
1570 : {
1571 8 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1572 8 : int bChanged = 0;
1573 8 : sal_Int32 nLen = pStr->length;
1574 8 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1575 :
1576 32 : while ( nLen > 0 )
1577 : {
1578 16 : if ( rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr)) )
1579 : {
1580 : /* Copy String */
1581 0 : IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
1582 :
1583 : /* replace/copy rest of the string */
1584 0 : if ( pNewCharStr )
1585 : {
1586 0 : *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
1587 0 : pNewCharStr++;
1588 0 : pCharStr++;
1589 0 : nLen--;
1590 :
1591 0 : while ( nLen > 0 )
1592 : {
1593 0 : *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
1594 :
1595 0 : pNewCharStr++;
1596 0 : pCharStr++;
1597 0 : nLen--;
1598 : }
1599 : }
1600 :
1601 0 : bChanged = 1;
1602 0 : break;
1603 : }
1604 :
1605 16 : pCharStr++;
1606 16 : nLen--;
1607 : }
1608 :
1609 8 : if ( !bChanged )
1610 : {
1611 8 : *ppThis = pStr;
1612 8 : IMPL_RTL_AQUIRE( pStr );
1613 : }
1614 :
1615 : RTL_LOG_STRING_NEW( *ppThis );
1616 : /* must be done last, if pStr == *ppThis */
1617 8 : if ( pOrg )
1618 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1619 8 : }
1620 :
1621 : /* ----------------------------------------------------------------------- */
1622 :
1623 3825708 : void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
1624 : IMPL_RTL_STRINGDATA* pStr )
1625 : SAL_THROW_EXTERN_C()
1626 : {
1627 3825708 : IMPL_RTL_STRINGDATA* pOrg = *ppThis;
1628 3825708 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1629 3825708 : sal_Int32 nPreSpaces = 0;
1630 3825708 : sal_Int32 nPostSpaces = 0;
1631 3825708 : sal_Int32 nLen = pStr->length;
1632 3825708 : sal_Int32 nIndex = nLen-1;
1633 :
1634 7693922 : while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
1635 42506 : nPreSpaces++;
1636 :
1637 7651418 : while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
1638 : {
1639 2 : nPostSpaces++;
1640 2 : nIndex--;
1641 : }
1642 :
1643 3825708 : if ( !nPreSpaces && !nPostSpaces )
1644 : {
1645 3783200 : *ppThis = pStr;
1646 3783200 : IMPL_RTL_AQUIRE( pStr );
1647 : }
1648 : else
1649 : {
1650 42508 : nLen -= nPostSpaces+nPreSpaces;
1651 42508 : *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
1652 : OSL_ASSERT(*ppThis != NULL);
1653 42508 : if ( *ppThis )
1654 42508 : rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
1655 : }
1656 :
1657 : RTL_LOG_STRING_NEW( *ppThis );
1658 : /* must be done last, if pStr == *ppThis */
1659 3825708 : if ( pOrg )
1660 0 : IMPL_RTL_STRINGNAME( release )( pOrg );
1661 3825708 : }
1662 :
1663 : /* ----------------------------------------------------------------------- */
1664 :
1665 388089 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
1666 : IMPL_RTL_STRINGDATA* pStr,
1667 : sal_Int32 nToken,
1668 : IMPL_RTL_STRCODE cTok,
1669 : sal_Int32 nIndex )
1670 : SAL_THROW_EXTERN_C()
1671 : {
1672 388089 : const IMPL_RTL_STRCODE* pCharStr = pStr->buffer;
1673 : const IMPL_RTL_STRCODE* pCharStrStart;
1674 : const IMPL_RTL_STRCODE* pOrgCharStr;
1675 388089 : sal_Int32 nLen = pStr->length-nIndex;
1676 388089 : sal_Int32 nTokCount = 0;
1677 :
1678 : // Set ppThis to an empty string and return -1 if either nToken or nIndex is
1679 : // negative:
1680 388089 : if (nIndex < 0)
1681 0 : nToken = -1;
1682 :
1683 388089 : pCharStr += nIndex;
1684 388089 : pOrgCharStr = pCharStr;
1685 388089 : pCharStrStart = pCharStr;
1686 43550186 : while ( nLen > 0 )
1687 : {
1688 42821885 : if ( *pCharStr == cTok )
1689 : {
1690 90382 : nTokCount++;
1691 :
1692 90382 : if ( nTokCount == nToken )
1693 42505 : pCharStrStart = pCharStr+1;
1694 : else
1695 : {
1696 47877 : if ( nTokCount > nToken )
1697 47877 : break;
1698 : }
1699 : }
1700 :
1701 42774008 : pCharStr++;
1702 42774008 : nLen--;
1703 : }
1704 :
1705 388089 : if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
1706 : {
1707 170 : IMPL_RTL_STRINGNAME( new )( ppThis );
1708 170 : if( (nToken < 0) || (nTokCount < nToken ) )
1709 0 : return -1;
1710 170 : else if( nLen > 0 )
1711 5 : return nIndex+(pCharStr-pOrgCharStr)+1;
1712 165 : else return -1;
1713 : }
1714 : else
1715 : {
1716 387919 : IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
1717 387919 : if ( nLen )
1718 47872 : return nIndex+(pCharStr-pOrgCharStr)+1;
1719 : else
1720 340047 : return -1;
1721 : }
1722 : }
1723 :
1724 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|