File: | sal/rtl/source/string.cxx |
Location: | line 299, column 13 |
Description: | Access to field 'length' results in a dereference of a null pointer (loaded from variable 'pTemp') |
1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | |||
2 | /************************************************************************* | |||
3 | * | |||
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |||
5 | * | |||
6 | * Copyright 2000, 2010 Oracle and/or its affiliates. | |||
7 | * | |||
8 | * OpenOffice.org - a multi-platform office productivity suite | |||
9 | * | |||
10 | * This file is part of OpenOffice.org. | |||
11 | * | |||
12 | * OpenOffice.org is free software: you can redistribute it and/or modify | |||
13 | * it under the terms of the GNU Lesser General Public License version 3 | |||
14 | * only, as published by the Free Software Foundation. | |||
15 | * | |||
16 | * OpenOffice.org is distributed in the hope that it will be useful, | |||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
19 | * GNU Lesser General Public License version 3 for more details | |||
20 | * (a copy is included in the LICENSE file that accompanied this code). | |||
21 | * | |||
22 | * You should have received a copy of the GNU Lesser General Public License | |||
23 | * version 3 along with OpenOffice.org. If not, see | |||
24 | * <http://www.openoffice.org/license.html> | |||
25 | * for a copy of the LGPLv3 License. | |||
26 | * | |||
27 | ************************************************************************/ | |||
28 | ||||
29 | #include "sal/config.h" | |||
30 | ||||
31 | #if defined(_MSC_VER) && (_MSC_VER >= 1400) | |||
32 | #pragma warning(disable:4738) // storing 32-bit float result in memory, possible loss of performance | |||
33 | #endif | |||
34 | ||||
35 | #include <cassert> | |||
36 | #include <cstdlib> | |||
37 | ||||
38 | #include <rtl/memory.h> | |||
39 | #include <osl/interlck.h> | |||
40 | #include <rtl/alloc.h> | |||
41 | #include <osl/diagnose.h> | |||
42 | #include <rtl/tencinfo.h> | |||
43 | ||||
44 | #include "strimp.hxx" | |||
45 | #include "surrogates.hxx" | |||
46 | #include <rtl/string.h> | |||
47 | ||||
48 | #include "rtl/math.h" | |||
49 | #include "rtl/tencinfo.h" | |||
50 | ||||
51 | /* ======================================================================= */ | |||
52 | ||||
53 | /* static data to be referenced by all empty strings | |||
54 | * the refCount is predefined to 1 and must never become 0 ! | |||
55 | */ | |||
56 | static rtl_String const aImplEmpty_rtl_String = | |||
57 | { | |||
58 | SAL_STRING_STATIC_FLAG0x40000000|1, | |||
59 | /* sal_Int32 refCount; */ | |||
60 | 0, /* sal_Int32 length; */ | |||
61 | { 0 } /* sal_Char buffer[1]; */ | |||
62 | }; | |||
63 | ||||
64 | /* ======================================================================= */ | |||
65 | ||||
66 | #define IMPL_RTL_STRCODEsal_Char sal_Char | |||
67 | #define IMPL_RTL_USTRCODE( c )((unsigned char)c) ((unsigned char)c) | |||
68 | #define IMPL_RTL_STRNAME( n )rtl_str_n rtl_str_ ## n | |||
69 | ||||
70 | #define IMPL_RTL_STRINGNAME( n )rtl_string_n rtl_string_ ## n | |||
71 | #define IMPL_RTL_STRINGDATArtl_String rtl_String | |||
72 | #define IMPL_RTL_EMPTYSTRINGaImplEmpty_rtl_String aImplEmpty_rtl_String | |||
73 | ||||
74 | #undef RTL_LOG_STRING_NEW | |||
75 | #define RTL_LOG_STRING_NEW(s) | |||
76 | #undef RTL_LOG_STRING_DELETE | |||
77 | #define RTL_LOG_STRING_DELETE(s) | |||
78 | ||||
79 | /* ======================================================================= */ | |||
80 | ||||
81 | /* Include String/UString template code */ | |||
82 | ||||
83 | #include "strtmpl.cxx" | |||
84 | ||||
85 | sal_Int32 SAL_CALL rtl_str_valueOfFloat(sal_Char * pStr, float f) | |||
86 | SAL_THROW_EXTERN_C()throw () | |||
87 | { | |||
88 | rtl_String * pResult = NULL__null; | |||
89 | sal_Int32 nLen; | |||
90 | rtl_math_doubleToString( | |||
91 | &pResult, 0, 0, f, rtl_math_StringFormat_G, | |||
92 | RTL_STR_MAX_VALUEOFFLOAT15 - RTL_CONSTASCII_LENGTH("-x.E-xxx")((sal_Int32)((sizeof ("-x.E-xxx") / sizeof (("-x.E-xxx")[0])) -1)), '.', 0, 0, | |||
93 | sal_True((sal_Bool)1)); | |||
94 | nLen = pResult->length; | |||
95 | OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFFLOAT)do { if (true && (!(nLen < 15))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "95" ": "), "OSL_ASSERT: %s", "nLen < RTL_STR_MAX_VALUEOFFLOAT" ); } } while (false); | |||
96 | memcpy(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char)); | |||
97 | rtl_string_release(pResult); | |||
98 | return nLen; | |||
99 | } | |||
100 | ||||
101 | sal_Int32 SAL_CALL rtl_str_valueOfDouble(sal_Char * pStr, double d) | |||
102 | SAL_THROW_EXTERN_C()throw () | |||
103 | { | |||
104 | rtl_String * pResult = NULL__null; | |||
105 | sal_Int32 nLen; | |||
106 | rtl_math_doubleToString( | |||
107 | &pResult, 0, 0, d, rtl_math_StringFormat_G, | |||
108 | RTL_STR_MAX_VALUEOFDOUBLE25 - RTL_CONSTASCII_LENGTH("-x.E-xxx")((sal_Int32)((sizeof ("-x.E-xxx") / sizeof (("-x.E-xxx")[0])) -1)), '.', 0, | |||
109 | 0, sal_True((sal_Bool)1)); | |||
110 | nLen = pResult->length; | |||
111 | OSL_ASSERT(nLen < RTL_STR_MAX_VALUEOFDOUBLE)do { if (true && (!(nLen < 25))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "111" ": "), "OSL_ASSERT: %s", "nLen < RTL_STR_MAX_VALUEOFDOUBLE" ); } } while (false); | |||
112 | memcpy(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Char)); | |||
113 | rtl_string_release(pResult); | |||
114 | return nLen; | |||
115 | } | |||
116 | ||||
117 | float SAL_CALL rtl_str_toFloat(sal_Char const * pStr) SAL_THROW_EXTERN_C()throw () | |||
118 | { | |||
119 | return (float) rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr), | |||
120 | '.', 0, 0, 0); | |||
121 | } | |||
122 | ||||
123 | double SAL_CALL rtl_str_toDouble(sal_Char const * pStr) SAL_THROW_EXTERN_C()throw () | |||
124 | { | |||
125 | return rtl_math_stringToDouble(pStr, pStr + rtl_str_getLength(pStr), '.', 0, | |||
126 | 0, 0); | |||
127 | } | |||
128 | ||||
129 | /* ======================================================================= */ | |||
130 | ||||
131 | static int rtl_ImplGetFastUTF8ByteLen( const sal_Unicode* pStr, sal_Int32 nLen ) | |||
132 | { | |||
133 | int n; | |||
134 | sal_Unicode c; | |||
135 | sal_uInt32 nUCS4Char; | |||
136 | const sal_Unicode* pEndStr; | |||
137 | ||||
138 | n = 0; | |||
139 | pEndStr = pStr+nLen; | |||
140 | while ( pStr < pEndStr ) | |||
141 | { | |||
142 | c = *pStr; | |||
143 | ||||
144 | if ( c < 0x80 ) | |||
145 | n++; | |||
146 | else if ( c < 0x800 ) | |||
147 | n += 2; | |||
148 | else | |||
149 | { | |||
150 | if ( !SAL_RTL_IS_HIGH_SURROGATE(c)((c) >= 0xD800 && (c) <= 0xDBFF) ) | |||
151 | n += 3; | |||
152 | else | |||
153 | { | |||
154 | nUCS4Char = c; | |||
155 | ||||
156 | if ( pStr+1 < pEndStr ) | |||
157 | { | |||
158 | c = *(pStr+1); | |||
159 | if ( SAL_RTL_IS_LOW_SURROGATE(c)((c) >= 0xDC00 && (c) <= 0xDFFF) ) | |||
160 | { | |||
161 | nUCS4Char = SAL_RTL_COMBINE_SURROGATES(nUCS4Char, c)((((nUCS4Char) - 0xD800) << 10) + ((c) - 0xDC00) + 0x10000 ); | |||
162 | pStr++; | |||
163 | } | |||
164 | } | |||
165 | ||||
166 | if ( nUCS4Char < 0x10000 ) | |||
167 | n += 3; | |||
168 | else if ( nUCS4Char < 0x200000 ) | |||
169 | n += 4; | |||
170 | else if ( nUCS4Char < 0x4000000 ) | |||
171 | n += 5; | |||
172 | else | |||
173 | n += 6; | |||
174 | } | |||
175 | } | |||
176 | ||||
177 | pStr++; | |||
178 | } | |||
179 | ||||
180 | return n; | |||
181 | } | |||
182 | ||||
183 | /* ----------------------------------------------------------------------- */ | |||
184 | ||||
185 | sal_Bool SAL_CALL rtl_impl_convertUStringToString(rtl_String ** pTarget, | |||
186 | sal_Unicode const * pSource, | |||
187 | sal_Int32 nLength, | |||
188 | rtl_TextEncoding nEncoding, | |||
189 | sal_uInt32 nFlags, | |||
190 | sal_Bool bCheckErrors) | |||
191 | { | |||
192 | OSL_ASSERT(pTarget != NULLdo { if (true && (!(pTarget != __null && (pSource != __null || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "195" ": "), "OSL_ASSERT: %s", "pTarget != NULL && (pSource != NULL || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))" ); } } while (false) | |||
193 | && (pSource != NULL || nLength == 0)do { if (true && (!(pTarget != __null && (pSource != __null || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "195" ": "), "OSL_ASSERT: %s", "pTarget != NULL && (pSource != NULL || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))" ); } } while (false) | |||
194 | && nLength >= 0do { if (true && (!(pTarget != __null && (pSource != __null || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "195" ": "), "OSL_ASSERT: %s", "pTarget != NULL && (pSource != NULL || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))" ); } } while (false) | |||
195 | && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding)))do { if (true && (!(pTarget != __null && (pSource != __null || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "195" ": "), "OSL_ASSERT: %s", "pTarget != NULL && (pSource != NULL || nLength == 0) && nLength >= 0 && (nLength == 0 || rtl_isOctetTextEncoding(nEncoding))" ); } } while (false); | |||
196 | ||||
197 | if ( !nLength ) | |||
198 | rtl_string_new( pTarget ); | |||
199 | else | |||
200 | { | |||
201 | rtl_String* pTemp; | |||
202 | rtl_UnicodeToTextConverter hConverter; | |||
203 | sal_uInt32 nInfo; | |||
204 | sal_Size nSrcChars; | |||
205 | sal_Size nDestBytes; | |||
206 | sal_Size nNewLen; | |||
207 | sal_Size nNotConvertedChars; | |||
208 | sal_Size nMaxCharLen; | |||
209 | ||||
210 | /* Optimization for UTF-8 - we try to calculate the exact length */ | |||
211 | /* For all other encoding we try an good estimation */ | |||
212 | if ( nEncoding == RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)) ) | |||
213 | { | |||
214 | nNewLen = rtl_ImplGetFastUTF8ByteLen( pSource, nLength ); | |||
215 | /* Includes the string only ASCII, then we could copy | |||
216 | the buffer faster */ | |||
217 | if ( nNewLen == (sal_Size)nLength ) | |||
218 | { | |||
219 | IMPL_RTL_STRCODEsal_Char* pBuffer; | |||
220 | if ( *pTarget ) | |||
221 | IMPL_RTL_STRINGNAME( release )rtl_string_release( *pTarget ); | |||
222 | *pTarget = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_string_ImplAlloc( nLength ); | |||
223 | OSL_ASSERT(*pTarget != NULL)do { if (true && (!(*pTarget != __null))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "223" ": "), "OSL_ASSERT: %s", "*pTarget != NULL"); } } while (false); | |||
224 | pBuffer = (*pTarget)->buffer; | |||
225 | do | |||
226 | { | |||
227 | /* Check ASCII range */ | |||
228 | OSL_ENSURE( *pSource <= 127,do { if (true && (!(*pSource <= 127))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "229" ": "), "%s", "rtl_uString2String() - UTF8 test is encoding is wrong" ); } } while (false) | |||
229 | "rtl_uString2String() - UTF8 test is encoding is wrong" )do { if (true && (!(*pSource <= 127))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "229" ": "), "%s", "rtl_uString2String() - UTF8 test is encoding is wrong" ); } } while (false); | |||
230 | ||||
231 | *pBuffer = (IMPL_RTL_STRCODEsal_Char)(unsigned char)*pSource; | |||
232 | pBuffer++; | |||
233 | pSource++; | |||
234 | nLength--; | |||
235 | } | |||
236 | while ( nLength ); | |||
237 | return sal_True((sal_Bool)1); | |||
238 | } | |||
239 | ||||
240 | nMaxCharLen = 4; | |||
241 | } | |||
242 | else | |||
243 | { | |||
244 | rtl_TextEncodingInfo aTextEncInfo; | |||
245 | aTextEncInfo.StructSize = sizeof( aTextEncInfo ); | |||
246 | if ( !rtl_getTextEncodingInfo( nEncoding, &aTextEncInfo ) ) | |||
247 | { | |||
248 | aTextEncInfo.AverageCharSize = 1; | |||
249 | aTextEncInfo.MaximumCharSize = 8; | |||
250 | } | |||
251 | ||||
252 | nNewLen = nLength*aTextEncInfo.AverageCharSize; | |||
253 | nMaxCharLen = aTextEncInfo.MaximumCharSize; | |||
254 | } | |||
255 | ||||
256 | nFlags |= RTL_UNICODETOTEXT_FLAGS_FLUSH((sal_uInt32)0x8000); | |||
257 | hConverter = rtl_createUnicodeToTextConverter( nEncoding ); | |||
258 | ||||
259 | for (;;) | |||
260 | { | |||
261 | pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_string_ImplAlloc( nNewLen ); | |||
262 | OSL_ASSERT(pTemp != NULL)do { if (true && (!(pTemp != __null))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "262" ": "), "OSL_ASSERT: %s", "pTemp != NULL"); } } while (false); | |||
263 | nDestBytes = rtl_convertUnicodeToText( hConverter, 0, | |||
264 | pSource, nLength, | |||
265 | pTemp->buffer, nNewLen, | |||
266 | nFlags, | |||
267 | &nInfo, &nSrcChars ); | |||
268 | if (bCheckErrors && (nInfo & RTL_UNICODETOTEXT_INFO_ERROR((sal_uInt32)0x0001)) != 0) | |||
269 | { | |||
270 | rtl_freeMemory(pTemp); | |||
271 | rtl_destroyUnicodeToTextConverter(hConverter); | |||
272 | return sal_False((sal_Bool)0); | |||
273 | } | |||
274 | ||||
275 | if ((nInfo & RTL_UNICODETOTEXT_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004)) == 0) | |||
276 | break; | |||
277 | ||||
278 | /* Buffer not big enough, try again with enough space */ | |||
279 | rtl_freeMemory( pTemp ); | |||
280 | ||||
281 | /* Try with the max. count of characters with | |||
282 | additional overhead for replacing functionality */ | |||
283 | nNotConvertedChars = nLength-nSrcChars; | |||
284 | nNewLen = nDestBytes+(nNotConvertedChars*nMaxCharLen)+nNotConvertedChars+4; | |||
285 | } | |||
286 | ||||
287 | /* Set the buffer to the correct size or is there to | |||
288 | much overhead, reallocate to the correct size */ | |||
289 | if ( nNewLen > nDestBytes+8 ) | |||
290 | { | |||
291 | rtl_String* pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_string_ImplAlloc( nDestBytes ); | |||
292 | OSL_ASSERT(pTemp2 != NULL)do { if (true && (!(pTemp2 != __null))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/string.cxx" ":" "292" ": "), "OSL_ASSERT: %s", "pTemp2 != NULL"); } } while (false); | |||
293 | rtl_str_ImplCopy( pTemp2->buffer, pTemp->buffer, nDestBytes ){ sal_Char* __mm_pDest = pTemp2->buffer; const sal_Char* __mm_pSrc = pTemp->buffer; sal_Int32 __mm_nCount = nDestBytes; while ( __mm_nCount > 0 ) { *__mm_pDest = *__mm_pSrc; __mm_pDest ++; __mm_pSrc++; __mm_nCount--; } }; | |||
294 | rtl_freeMemory( pTemp ); | |||
295 | pTemp = pTemp2; | |||
296 | } | |||
297 | else | |||
298 | { | |||
299 | pTemp->length = nDestBytes; | |||
| ||||
300 | pTemp->buffer[nDestBytes] = 0; | |||
301 | } | |||
302 | ||||
303 | rtl_destroyUnicodeToTextConverter( hConverter ); | |||
304 | if ( *pTarget ) | |||
305 | IMPL_RTL_STRINGNAME( release )rtl_string_release( *pTarget ); | |||
306 | *pTarget = pTemp; | |||
307 | ||||
308 | /* Results the conversion in an empty buffer - | |||
309 | create an empty string */ | |||
310 | if ( pTemp && !nDestBytes ) | |||
311 | rtl_string_new( pTarget ); | |||
312 | } | |||
313 | return sal_True((sal_Bool)1); | |||
314 | } | |||
315 | ||||
316 | void SAL_CALL rtl_uString2String( rtl_String** ppThis, | |||
317 | const sal_Unicode* pUStr, | |||
318 | sal_Int32 nULen, | |||
319 | rtl_TextEncoding eTextEncoding, | |||
320 | sal_uInt32 nCvtFlags ) | |||
321 | SAL_THROW_EXTERN_C()throw () | |||
322 | { | |||
323 | rtl_impl_convertUStringToString(ppThis, pUStr, nULen, eTextEncoding, | |||
324 | nCvtFlags, sal_False((sal_Bool)0)); | |||
325 | } | |||
326 | ||||
327 | sal_Bool SAL_CALL rtl_convertUStringToString(rtl_String ** pTarget, | |||
328 | sal_Unicode const * pSource, | |||
329 | sal_Int32 nLength, | |||
330 | rtl_TextEncoding nEncoding, | |||
331 | sal_uInt32 nFlags) | |||
332 | SAL_THROW_EXTERN_C()throw () | |||
333 | { | |||
334 | return rtl_impl_convertUStringToString(pTarget, pSource, nLength, nEncoding, | |||
| ||||
335 | nFlags, sal_True((sal_Bool)1)); | |||
336 | } | |||
337 | ||||
338 | void rtl_string_newReplaceFirst( | |||
339 | rtl_String ** newStr, rtl_String * str, char const * from, | |||
340 | sal_Int32 fromLength, char const * to, sal_Int32 toLength, | |||
341 | sal_Int32 * index) SAL_THROW_EXTERN_C()throw () | |||
342 | { | |||
343 | assert(str != 0)((str != 0) ? static_cast<void> (0) : __assert_fail ("str != 0" , "/usr/local/src/libreoffice/sal/rtl/source/string.cxx", 343 , __PRETTY_FUNCTION__)); | |||
344 | assert(index != 0)((index != 0) ? static_cast<void> (0) : __assert_fail ( "index != 0", "/usr/local/src/libreoffice/sal/rtl/source/string.cxx" , 344, __PRETTY_FUNCTION__)); | |||
345 | assert(*index >= 0 && *index <= str->length)((*index >= 0 && *index <= str->length) ? static_cast <void> (0) : __assert_fail ("*index >= 0 && *index <= str->length" , "/usr/local/src/libreoffice/sal/rtl/source/string.cxx", 345 , __PRETTY_FUNCTION__)); | |||
346 | assert(fromLength >= 0)((fromLength >= 0) ? static_cast<void> (0) : __assert_fail ("fromLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/string.cxx" , 346, __PRETTY_FUNCTION__)); | |||
347 | assert(toLength >= 0)((toLength >= 0) ? static_cast<void> (0) : __assert_fail ("toLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/string.cxx" , 347, __PRETTY_FUNCTION__)); | |||
348 | sal_Int32 i = rtl_str_indexOfStr_WithLength( | |||
349 | str->buffer + *index, str->length - *index, from, fromLength); | |||
350 | if (i == -1) { | |||
351 | rtl_string_assign(newStr, str); | |||
352 | } else { | |||
353 | assert(i <= str->length - *index)((i <= str->length - *index) ? static_cast<void> ( 0) : __assert_fail ("i <= str->length - *index", "/usr/local/src/libreoffice/sal/rtl/source/string.cxx" , 353, __PRETTY_FUNCTION__)); | |||
354 | i += *index; | |||
355 | assert(fromLength <= str->length)((fromLength <= str->length) ? static_cast<void> ( 0) : __assert_fail ("fromLength <= str->length", "/usr/local/src/libreoffice/sal/rtl/source/string.cxx" , 355, __PRETTY_FUNCTION__)); | |||
356 | if (str->length - fromLength > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF) - toLength) { | |||
357 | std::abort(); | |||
358 | } | |||
359 | sal_Int32 n = str->length - fromLength + toLength; | |||
360 | rtl_string_acquire(str); // in case *newStr == str | |||
361 | rtl_string_new_WithLength(newStr, n); | |||
362 | if (n != 0) { | |||
363 | (*newStr)->length = n; | |||
364 | assert(i >= 0 && i < str->length)((i >= 0 && i < str->length) ? static_cast< void> (0) : __assert_fail ("i >= 0 && i < str->length" , "/usr/local/src/libreoffice/sal/rtl/source/string.cxx", 364 , __PRETTY_FUNCTION__)); | |||
365 | memcpy((*newStr)->buffer, str->buffer, i); | |||
366 | memcpy((*newStr)->buffer + i, to, toLength); | |||
367 | memcpy( | |||
368 | (*newStr)->buffer + i + toLength, str->buffer + i + fromLength, | |||
369 | str->length - i - fromLength); | |||
370 | } | |||
371 | rtl_string_release(str); | |||
372 | } | |||
373 | *index = i; | |||
374 | } | |||
375 | ||||
376 | void rtl_string_newReplaceAll( | |||
377 | rtl_String ** newStr, rtl_String * str, char const * from, | |||
378 | sal_Int32 fromLength, char const * to, sal_Int32 toLength) | |||
379 | SAL_THROW_EXTERN_C()throw () | |||
380 | { | |||
381 | rtl_string_assign(newStr, str); | |||
382 | for (sal_Int32 i = 0;; i += toLength) { | |||
383 | rtl_string_newReplaceFirst( | |||
384 | newStr, *newStr, from, fromLength, to, toLength, &i); | |||
385 | if (i == -1) { | |||
386 | break; | |||
387 | } | |||
388 | } | |||
389 | } | |||
390 | ||||
391 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |