File: | sal/rtl/source/ustring.cxx |
Location: | line 987, column 9 |
Description: | Dereference of null pointer (loaded from variable 'indexUtf16') |
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/diagnose.h> |
40 | #include <osl/interlck.h> |
41 | #include <rtl/alloc.h> |
42 | #include <osl/mutex.h> |
43 | #include <osl/doublecheckedlocking.h> |
44 | #include <rtl/tencinfo.h> |
45 | |
46 | #include <string.h> |
47 | #include <sal/alloca.h> |
48 | #include <sal/log.hxx> |
49 | |
50 | #include "hash.hxx" |
51 | #include "strimp.hxx" |
52 | #include "surrogates.hxx" |
53 | #include <rtl/ustring.h> |
54 | |
55 | #include "rtl/math.h" |
56 | #include "rtl/tencinfo.h" |
57 | |
58 | /* ======================================================================= */ |
59 | |
60 | /* static data to be referenced by all empty strings |
61 | * the refCount is predefined to 1 and must never become 0 ! |
62 | */ |
63 | static rtl_uString const aImplEmpty_rtl_uString = |
64 | { |
65 | (sal_Int32) (SAL_STRING_INTERN_FLAG0x80000000|SAL_STRING_STATIC_FLAG0x40000000|1), /*sal_Int32 refCount; */ |
66 | 0, /*sal_Int32 length; */ |
67 | { 0 } /*sal_Unicode buffer[1];*/ |
68 | }; |
69 | |
70 | /* ======================================================================= */ |
71 | |
72 | #define IMPL_RTL_STRCODEsal_Unicode sal_Unicode |
73 | #define IMPL_RTL_USTRCODE( c )(c) (c) |
74 | #define IMPL_RTL_STRNAME( n )rtl_ustr_n rtl_ustr_ ## n |
75 | |
76 | #define IMPL_RTL_STRINGNAME( n )rtl_uString_n rtl_uString_ ## n |
77 | #define IMPL_RTL_STRINGDATArtl_uString rtl_uString |
78 | #define IMPL_RTL_EMPTYSTRINGaImplEmpty_rtl_uString aImplEmpty_rtl_uString |
79 | #define IMPL_RTL_INTERN |
80 | static void internRelease (rtl_uString *pThis); |
81 | |
82 | /* ======================================================================= */ |
83 | |
84 | /* Include String/UString template code */ |
85 | |
86 | #include "strtmpl.cxx" |
87 | |
88 | sal_Int32 rtl_ustr_indexOfAscii_WithLength( |
89 | sal_Unicode const * str, sal_Int32 len, |
90 | char const * subStr, sal_Int32 subLen) SAL_THROW_EXTERN_C()throw () |
91 | { |
92 | if (subLen > 0 && subLen <= len) { |
93 | sal_Int32 i; |
94 | for (i = 0; i <= len - subLen; ++i) { |
95 | if (rtl_ustr_asciil_reverseEquals_WithLength( |
96 | str + i, subStr, subLen)) |
97 | { |
98 | return i; |
99 | } |
100 | } |
101 | } |
102 | return -1; |
103 | } |
104 | |
105 | sal_Int32 rtl_ustr_lastIndexOfAscii_WithLength( |
106 | sal_Unicode const * str, sal_Int32 len, |
107 | char const * subStr, sal_Int32 subLen) SAL_THROW_EXTERN_C()throw () |
108 | { |
109 | if (subLen > 0 && subLen <= len) { |
110 | sal_Int32 i; |
111 | for (i = len - subLen; i >= 0; --i) { |
112 | if (rtl_ustr_asciil_reverseEquals_WithLength( |
113 | str + i, subStr, subLen)) |
114 | { |
115 | return i; |
116 | } |
117 | } |
118 | } |
119 | return -1; |
120 | } |
121 | |
122 | sal_Int32 SAL_CALL rtl_ustr_valueOfFloat(sal_Unicode * pStr, float f) |
123 | SAL_THROW_EXTERN_C()throw () |
124 | { |
125 | rtl_uString * pResult = NULL__null; |
126 | sal_Int32 nLen; |
127 | rtl_math_doubleToUString( |
128 | &pResult, 0, 0, f, rtl_math_StringFormat_G, |
129 | RTL_USTR_MAX_VALUEOFFLOAT15 - RTL_CONSTASCII_LENGTH("-x.E-xxx")((sal_Int32)((sizeof ("-x.E-xxx") / sizeof (("-x.E-xxx")[0])) -1)), '.', 0, |
130 | 0, sal_True((sal_Bool)1)); |
131 | nLen = pResult->length; |
132 | OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFFLOAT)do { if (true && (!(nLen < 15))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "132" ": "), "OSL_ASSERT: %s", "nLen < RTL_USTR_MAX_VALUEOFFLOAT" ); } } while (false); |
133 | memcpy(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode)); |
134 | rtl_uString_release(pResult); |
135 | return nLen; |
136 | } |
137 | |
138 | sal_Int32 SAL_CALL rtl_ustr_valueOfDouble(sal_Unicode * pStr, double d) |
139 | SAL_THROW_EXTERN_C()throw () |
140 | { |
141 | rtl_uString * pResult = NULL__null; |
142 | sal_Int32 nLen; |
143 | rtl_math_doubleToUString( |
144 | &pResult, 0, 0, d, rtl_math_StringFormat_G, |
145 | RTL_USTR_MAX_VALUEOFDOUBLE25 - RTL_CONSTASCII_LENGTH("-x.E-xxx")((sal_Int32)((sizeof ("-x.E-xxx") / sizeof (("-x.E-xxx")[0])) -1)), '.', 0, |
146 | 0, sal_True((sal_Bool)1)); |
147 | nLen = pResult->length; |
148 | OSL_ASSERT(nLen < RTL_USTR_MAX_VALUEOFDOUBLE)do { if (true && (!(nLen < 25))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "148" ": "), "OSL_ASSERT: %s", "nLen < RTL_USTR_MAX_VALUEOFDOUBLE" ); } } while (false); |
149 | memcpy(pStr, pResult->buffer, (nLen + 1) * sizeof(sal_Unicode)); |
150 | rtl_uString_release(pResult); |
151 | return nLen; |
152 | } |
153 | |
154 | float SAL_CALL rtl_ustr_toFloat(sal_Unicode const * pStr) SAL_THROW_EXTERN_C()throw () |
155 | { |
156 | return (float) rtl_math_uStringToDouble(pStr, |
157 | pStr + rtl_ustr_getLength(pStr), |
158 | '.', 0, 0, 0); |
159 | } |
160 | |
161 | double SAL_CALL rtl_ustr_toDouble(sal_Unicode const * pStr) SAL_THROW_EXTERN_C()throw () |
162 | { |
163 | return rtl_math_uStringToDouble(pStr, pStr + rtl_ustr_getLength(pStr), '.', |
164 | 0, 0, 0); |
165 | } |
166 | |
167 | /* ======================================================================= */ |
168 | |
169 | sal_Int32 SAL_CALL rtl_ustr_ascii_compare( const sal_Unicode* pStr1, |
170 | const sal_Char* pStr2 ) |
171 | SAL_THROW_EXTERN_C()throw () |
172 | { |
173 | sal_Int32 nRet; |
174 | while ( ((nRet = ((sal_Int32)(*pStr1))- |
175 | ((sal_Int32)((unsigned char)(*pStr2)))) == 0) && |
176 | *pStr2 ) |
177 | { |
178 | /* Check ASCII range */ |
179 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare - Found char > 127") == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "180" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare - Found char > 127")); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compare - Found char > 127"; ::sal ::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "180" ": "), sal_detail_stream); } } } while (false) |
180 | "rtl_ustr_ascii_compare - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare - Found char > 127") == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "180" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare - Found char > 127")); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compare - Found char > 127"; ::sal ::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "180" ": "), sal_detail_stream); } } } while (false); |
181 | pStr1++; |
182 | pStr2++; |
183 | } |
184 | |
185 | return nRet; |
186 | } |
187 | |
188 | /* ----------------------------------------------------------------------- */ |
189 | |
190 | sal_Int32 SAL_CALL rtl_ustr_ascii_compare_WithLength( const sal_Unicode* pStr1, |
191 | sal_Int32 nStr1Len, |
192 | const sal_Char* pStr2 ) |
193 | SAL_THROW_EXTERN_C()throw () |
194 | { |
195 | sal_Int32 nRet = 0; |
196 | while( ((nRet = (nStr1Len ? (sal_Int32)(*pStr1) : 0)- |
197 | ((sal_Int32)((unsigned char)(*pStr2)))) == 0) && |
198 | nStr1Len && *pStr2 ) |
199 | { |
200 | /* Check ASCII range */ |
201 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "202" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "202" ": "), sal_detail_stream); } } } while (false) |
202 | "rtl_ustr_ascii_compare_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "202" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "202" ": "), sal_detail_stream); } } } while (false); |
203 | pStr1++; |
204 | pStr2++; |
205 | nStr1Len--; |
206 | } |
207 | |
208 | return nRet; |
209 | } |
210 | |
211 | /* ----------------------------------------------------------------------- */ |
212 | |
213 | sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompare_WithLength( const sal_Unicode* pStr1, |
214 | sal_Int32 nStr1Len, |
215 | const sal_Char* pStr2, |
216 | sal_Int32 nShortenedLength ) |
217 | SAL_THROW_EXTERN_C()throw () |
218 | { |
219 | const sal_Unicode* pStr1End = pStr1 + nStr1Len; |
220 | sal_Int32 nRet; |
221 | while ( (nShortenedLength > 0) && |
222 | (pStr1 < pStr1End) && *pStr2 ) |
223 | { |
224 | /* Check ASCII range */ |
225 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "226" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "226" ": "), sal_detail_stream); } } } while (false) |
226 | "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "226" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_shortenedCompare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "226" ": "), sal_detail_stream); } } } while (false); |
227 | |
228 | nRet = ((sal_Int32)*pStr1)- |
229 | ((sal_Int32)(unsigned char)*pStr2); |
230 | if ( nRet != 0 ) |
231 | return nRet; |
232 | |
233 | nShortenedLength--; |
234 | pStr1++; |
235 | pStr2++; |
236 | } |
237 | |
238 | if ( nShortenedLength <= 0 ) |
239 | return 0; |
240 | |
241 | if ( *pStr2 ) |
242 | { |
243 | OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" )do { if (true && (!(pStr1 == pStr1End))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "243" ": "), "%s", "pStr1 == pStr1End failed"); } } while (false); |
244 | // first is a substring of the second string => less (negative value) |
245 | nRet = -1; |
246 | } |
247 | else |
248 | { |
249 | // greater or equal |
250 | nRet = pStr1End - pStr1; |
251 | } |
252 | |
253 | return nRet; |
254 | } |
255 | |
256 | /* ----------------------------------------------------------------------- */ |
257 | |
258 | sal_Int32 SAL_CALL rtl_ustr_asciil_reverseCompare_WithLength( const sal_Unicode* pStr1, |
259 | sal_Int32 nStr1Len, |
260 | const sal_Char* pStr2, |
261 | sal_Int32 nStr2Len ) |
262 | SAL_THROW_EXTERN_C()throw () |
263 | { |
264 | const sal_Unicode* pStr1Run = pStr1+nStr1Len; |
265 | const sal_Char* pStr2Run = pStr2+nStr2Len; |
266 | sal_Int32 nRet; |
267 | while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) ) |
268 | { |
269 | /* Check ASCII range */ |
270 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "271" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "271" ": "), sal_detail_stream); } } } while (false) |
271 | "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "271" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_asciil_reverseCompare_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "271" ": "), sal_detail_stream); } } } while (false); |
272 | pStr1Run--; |
273 | pStr2Run--; |
274 | nRet = ((sal_Int32)*pStr1Run)-((sal_Int32)*pStr2Run); |
275 | if ( nRet ) |
276 | return nRet; |
277 | } |
278 | |
279 | return nStr1Len - nStr2Len; |
280 | } |
281 | |
282 | /* ----------------------------------------------------------------------- */ |
283 | |
284 | sal_Bool SAL_CALL rtl_ustr_asciil_reverseEquals_WithLength( const sal_Unicode* pStr1, |
285 | const sal_Char* pStr2, |
286 | sal_Int32 nStrLen ) |
287 | SAL_THROW_EXTERN_C()throw () |
288 | { |
289 | const sal_Unicode* pStr1Run = pStr1+nStrLen; |
290 | const sal_Char* pStr2Run = pStr2+nStrLen; |
291 | while ( pStr1 < pStr1Run ) |
292 | { |
293 | /* Check ASCII range */ |
294 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "295" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "295" ": "), sal_detail_stream); } } } while (false) |
295 | "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "295" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_asciil_reverseEquals_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "295" ": "), sal_detail_stream); } } } while (false); |
296 | pStr1Run--; |
297 | pStr2Run--; |
298 | if( *pStr1Run != (sal_Unicode)*pStr2Run ) |
299 | return sal_False((sal_Bool)0); |
300 | } |
301 | |
302 | return sal_True((sal_Bool)1); |
303 | } |
304 | |
305 | /* ----------------------------------------------------------------------- */ |
306 | |
307 | sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase( const sal_Unicode* pStr1, |
308 | const sal_Char* pStr2 ) |
309 | SAL_THROW_EXTERN_C()throw () |
310 | { |
311 | sal_Int32 nRet; |
312 | sal_Int32 c1; |
313 | sal_Int32 c2; |
314 | do |
315 | { |
316 | /* Check ASCII range */ |
317 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "318" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "318" ": "), sal_detail_stream); } } } while (false) |
318 | "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "318" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "318" ": "), sal_detail_stream); } } } while (false); |
319 | /* If character between 'A' and 'Z', than convert it to lowercase */ |
320 | c1 = (sal_Int32)*pStr1; |
321 | c2 = (sal_Int32)((unsigned char)*pStr2); |
322 | if ( (c1 >= 65) && (c1 <= 90) ) |
323 | c1 += 32; |
324 | if ( (c2 >= 65) && (c2 <= 90) ) |
325 | c2 += 32; |
326 | nRet = c1-c2; |
327 | if ( nRet != 0 ) |
328 | return nRet; |
329 | |
330 | pStr1++; |
331 | pStr2++; |
332 | } |
333 | while ( c2 ); |
334 | |
335 | return 0; |
336 | } |
337 | |
338 | /* ----------------------------------------------------------------------- */ |
339 | |
340 | sal_Int32 SAL_CALL rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1, |
341 | sal_Int32 nStr1Len, |
342 | const sal_Char* pStr2 ) |
343 | SAL_THROW_EXTERN_C()throw () |
344 | { |
345 | sal_Int32 nRet; |
346 | sal_Int32 c1; |
347 | sal_Int32 c2; |
348 | do |
349 | { |
350 | /* Check ASCII range */ |
351 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "352" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "352" ": "), sal_detail_stream); } } } while (false) |
352 | "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "352" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "352" ": "), sal_detail_stream); } } } while (false); |
353 | if ( !nStr1Len ) |
354 | return *pStr2 == '\0' ? 0 : -1; |
355 | |
356 | /* If character between 'A' and 'Z', than convert it to lowercase */ |
357 | c1 = (sal_Int32)*pStr1; |
358 | c2 = (sal_Int32)((unsigned char)*pStr2); |
359 | if ( (c1 >= 65) && (c1 <= 90) ) |
360 | c1 += 32; |
361 | if ( (c2 >= 65) && (c2 <= 90) ) |
362 | c2 += 32; |
363 | nRet = c1-c2; |
364 | if ( nRet != 0 ) |
365 | return nRet; |
366 | |
367 | pStr1++; |
368 | pStr2++; |
369 | nStr1Len--; |
370 | } |
371 | while( c2 ); |
372 | |
373 | return 0; |
374 | } |
375 | |
376 | sal_Int32 rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths( |
377 | sal_Unicode const * first, sal_Int32 firstLen, |
378 | char const * second, sal_Int32 secondLen) SAL_THROW_EXTERN_C()throw () |
379 | { |
380 | sal_Int32 i; |
381 | sal_Int32 len = firstLen < secondLen ? firstLen : secondLen; |
382 | for (i = 0; i < len; ++i) { |
383 | /* Check ASCII range */ |
384 | SAL_WARN_IF( ((unsigned char)*second) > 127, "rtl.string",do { if (true && (((unsigned char)*second) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "385" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "385" ": "), sal_detail_stream); } } } while (false) |
385 | "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" )do { if (true && (((unsigned char)*second) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "385" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "385" ": "), sal_detail_stream); } } } while (false); |
386 | sal_Int32 c1 = *first++; |
387 | sal_Int32 c2 = (unsigned char) *second++; |
388 | sal_Int32 d; |
389 | if (c1 >= 65 && c1 <= 90) { |
390 | c1 += 32; |
391 | } |
392 | if (c2 >= 65 && c2 <= 90) { |
393 | c2 += 32; |
394 | } |
395 | d = c1 - c2; |
396 | if (d != 0) { |
397 | return d; |
398 | } |
399 | } |
400 | return firstLen - secondLen; |
401 | } |
402 | |
403 | /* ----------------------------------------------------------------------- */ |
404 | |
405 | sal_Int32 SAL_CALL rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( const sal_Unicode* pStr1, |
406 | sal_Int32 nStr1Len, |
407 | const sal_Char* pStr2, |
408 | sal_Int32 nShortenedLength ) |
409 | SAL_THROW_EXTERN_C()throw () |
410 | { |
411 | const sal_Unicode* pStr1End = pStr1 + nStr1Len; |
412 | sal_Int32 nRet; |
413 | sal_Int32 c1; |
414 | sal_Int32 c2; |
415 | while ( (nShortenedLength > 0) && |
416 | (pStr1 < pStr1End) && *pStr2 ) |
417 | { |
418 | /* Check ASCII range */ |
419 | SAL_WARN_IF( ((unsigned char)*pStr2) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "420" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "420" ": "), sal_detail_stream); } } } while (false) |
420 | "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" )do { if (true && (((unsigned char)*pStr2) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "420" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength - Found char > 127" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "420" ": "), sal_detail_stream); } } } while (false); |
421 | |
422 | /* If character between 'A' and 'Z', than convert it to lowercase */ |
423 | c1 = (sal_Int32)*pStr1; |
424 | c2 = (sal_Int32)((unsigned char)*pStr2); |
425 | if ( (c1 >= 65) && (c1 <= 90) ) |
426 | c1 += 32; |
427 | if ( (c2 >= 65) && (c2 <= 90) ) |
428 | c2 += 32; |
429 | nRet = c1-c2; |
430 | if ( nRet != 0 ) |
431 | return nRet; |
432 | |
433 | nShortenedLength--; |
434 | pStr1++; |
435 | pStr2++; |
436 | } |
437 | |
438 | if ( nShortenedLength <= 0 ) |
439 | return 0; |
440 | |
441 | if ( *pStr2 ) |
442 | { |
443 | OSL_ENSURE( pStr1 == pStr1End, "pStr1 == pStr1End failed" )do { if (true && (!(pStr1 == pStr1End))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "443" ": "), "%s", "pStr1 == pStr1End failed"); } } while (false); |
444 | // first is a substring of the second string => less (negative value) |
445 | nRet = -1; |
446 | } |
447 | else |
448 | { |
449 | // greater or equal |
450 | nRet = pStr1End - pStr1; |
451 | } |
452 | |
453 | return nRet; |
454 | } |
455 | |
456 | /* ----------------------------------------------------------------------- */ |
457 | |
458 | void SAL_CALL rtl_uString_newFromAscii( rtl_uString** ppThis, |
459 | const sal_Char* pCharStr ) |
460 | SAL_THROW_EXTERN_C()throw () |
461 | { |
462 | sal_Int32 nLen; |
463 | |
464 | if ( pCharStr ) |
465 | { |
466 | const sal_Char* pTempStr = pCharStr; |
467 | while( *pTempStr ) |
468 | pTempStr++; |
469 | nLen = pTempStr-pCharStr; |
470 | } |
471 | else |
472 | nLen = 0; |
473 | |
474 | if ( !nLen ) |
475 | { |
476 | IMPL_RTL_STRINGNAME( new )rtl_uString_new( ppThis ); |
477 | return; |
478 | } |
479 | |
480 | if ( *ppThis ) |
481 | IMPL_RTL_STRINGNAME( release )rtl_uString_release( *ppThis ); |
482 | |
483 | *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nLen ); |
484 | OSL_ASSERT(*ppThis != NULL)do { if (true && (!(*ppThis != __null))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "484" ": "), "OSL_ASSERT: %s", "*ppThis != NULL"); } } while (false); |
485 | if ( (*ppThis) ) |
486 | { |
487 | IMPL_RTL_STRCODEsal_Unicode* pBuffer = (*ppThis)->buffer; |
488 | do |
489 | { |
490 | /* Check ASCII range */ |
491 | SAL_WARN_IF( ((unsigned char)*pCharStr) > 127, "rtl.string",do { if (true && (((unsigned char)*pCharStr) > 127 )) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_uString_newFromAscii - Found char > 127") == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "492" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_uString_newFromAscii - Found char > 127") ); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_uString_newFromAscii - Found char > 127"; :: sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "492" ": "), sal_detail_stream); } } } while (false) |
492 | "rtl_uString_newFromAscii - Found char > 127" )do { if (true && (((unsigned char)*pCharStr) > 127 )) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_uString_newFromAscii - Found char > 127") == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "492" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_uString_newFromAscii - Found char > 127") ); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_uString_newFromAscii - Found char > 127"; :: sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "492" ": "), sal_detail_stream); } } } while (false); |
493 | |
494 | *pBuffer = *pCharStr; |
495 | pBuffer++; |
496 | pCharStr++; |
497 | } |
498 | while ( *pCharStr ); |
499 | } |
500 | |
501 | RTL_LOG_STRING_NEW( *ppThis ); |
502 | } |
503 | |
504 | void SAL_CALL rtl_uString_newFromCodePoints( |
505 | rtl_uString ** newString, sal_uInt32 const * codePoints, |
506 | sal_Int32 codePointCount) SAL_THROW_EXTERN_C()throw () |
507 | { |
508 | sal_Int32 n; |
509 | sal_Int32 i; |
510 | sal_Unicode * p; |
511 | OSL_ASSERT(do { if (true && (!(newString != __null && (codePoints != __null || codePointCount == 0) && codePointCount >= 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "514" ": "), "OSL_ASSERT: %s", "newString != NULL && (codePoints != NULL || codePointCount == 0) && codePointCount >= 0" ); } } while (false) |
512 | newString != NULL &&do { if (true && (!(newString != __null && (codePoints != __null || codePointCount == 0) && codePointCount >= 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "514" ": "), "OSL_ASSERT: %s", "newString != NULL && (codePoints != NULL || codePointCount == 0) && codePointCount >= 0" ); } } while (false) |
513 | (codePoints != NULL || codePointCount == 0) &&do { if (true && (!(newString != __null && (codePoints != __null || codePointCount == 0) && codePointCount >= 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "514" ": "), "OSL_ASSERT: %s", "newString != NULL && (codePoints != NULL || codePointCount == 0) && codePointCount >= 0" ); } } while (false) |
514 | codePointCount >= 0)do { if (true && (!(newString != __null && (codePoints != __null || codePointCount == 0) && codePointCount >= 0))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "514" ": "), "OSL_ASSERT: %s", "newString != NULL && (codePoints != NULL || codePointCount == 0) && codePointCount >= 0" ); } } while (false); |
515 | if (codePointCount == 0) { |
516 | rtl_uString_new(newString); |
517 | return; |
518 | } |
519 | if (*newString != NULL__null) { |
520 | rtl_uString_release(*newString); |
521 | } |
522 | n = codePointCount; |
523 | for (i = 0; i < codePointCount; ++i) { |
524 | OSL_ASSERT(codePoints[i] <= 0x10FFFF)do { if (true && (!(codePoints[i] <= 0x10FFFF))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "524" ": "), "OSL_ASSERT: %s", "codePoints[i] <= 0x10FFFF" ); } } while (false); |
525 | if (codePoints[i] >= 0x10000) { |
526 | ++n; |
527 | } |
528 | } |
529 | /* Builds on the assumption that sal_Int32 uses 32 bit two's complement |
530 | representation with wrap around (the necessary number of UTF-16 code |
531 | units will be no larger than 2 * SAL_MAX_INT32, represented as |
532 | sal_Int32 -2): */ |
533 | if (n < 0) { |
534 | *newString = NULL__null; |
535 | return; |
536 | } |
537 | *newString = rtl_uString_ImplAlloc(n); |
538 | if (*newString == NULL__null) { |
539 | return; |
540 | } |
541 | p = (*newString)->buffer; |
542 | for (i = 0; i < codePointCount; ++i) { |
543 | sal_uInt32 c = codePoints[i]; |
544 | if (c < 0x10000) { |
545 | *p++ = (sal_Unicode) c; |
546 | } else { |
547 | c -= 0x10000; |
548 | *p++ = (sal_Unicode) ((c >> 10) | SAL_RTL_FIRST_HIGH_SURROGATE0xD800); |
549 | *p++ = (sal_Unicode) ((c & 0x3FF) | SAL_RTL_FIRST_LOW_SURROGATE0xDC00); |
550 | } |
551 | } |
552 | RTL_LOG_STRING_NEW( *newString ); |
553 | } |
554 | |
555 | /* ======================================================================= */ |
556 | |
557 | static int rtl_ImplGetFastUTF8UnicodeLen( const sal_Char* pStr, sal_Int32 nLen ) |
558 | { |
559 | int n; |
560 | sal_uChar c; |
561 | const sal_Char* pEndStr; |
562 | |
563 | n = 0; |
564 | pEndStr = pStr+nLen; |
565 | while ( pStr < pEndStr ) |
566 | { |
567 | c = (sal_uChar)*pStr; |
568 | |
569 | if ( !(c & 0x80) ) |
570 | pStr++; |
571 | else if ( (c & 0xE0) == 0xC0 ) |
572 | pStr += 2; |
573 | else if ( (c & 0xF0) == 0xE0 ) |
574 | pStr += 3; |
575 | else if ( (c & 0xF8) == 0xF0 ) |
576 | pStr += 4; |
577 | else if ( (c & 0xFC) == 0xF8 ) |
578 | pStr += 5; |
579 | else if ( (c & 0xFE) == 0xFC ) |
580 | pStr += 6; |
581 | else |
582 | pStr++; |
583 | |
584 | n++; |
585 | } |
586 | |
587 | return n; |
588 | } |
589 | |
590 | /* ----------------------------------------------------------------------- */ |
591 | |
592 | static void rtl_string2UString_status( rtl_uString** ppThis, |
593 | const sal_Char* pStr, |
594 | sal_Int32 nLen, |
595 | rtl_TextEncoding eTextEncoding, |
596 | sal_uInt32 nCvtFlags, |
597 | sal_uInt32 *pInfo ) |
598 | { |
599 | OSL_ENSURE(nLen == 0 || rtl_isOctetTextEncoding(eTextEncoding),do { if (true && (!(nLen == 0 || rtl_isOctetTextEncoding (eTextEncoding)))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "600" ": "), "%s", "rtl_string2UString_status() - Wrong TextEncoding" ); } } while (false) |
600 | "rtl_string2UString_status() - Wrong TextEncoding" )do { if (true && (!(nLen == 0 || rtl_isOctetTextEncoding (eTextEncoding)))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "600" ": "), "%s", "rtl_string2UString_status() - Wrong TextEncoding" ); } } while (false); |
601 | |
602 | if ( !nLen ) |
603 | { |
604 | rtl_uString_new( ppThis ); |
605 | if (pInfo != NULL__null) { |
606 | *pInfo = 0; |
607 | } |
608 | } |
609 | else |
610 | { |
611 | if ( *ppThis ) |
612 | IMPL_RTL_STRINGNAME( release )rtl_uString_release( *ppThis ); |
613 | |
614 | /* Optimization for US-ASCII */ |
615 | if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) |
616 | { |
617 | IMPL_RTL_STRCODEsal_Unicode* pBuffer; |
618 | *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nLen ); |
619 | if (*ppThis == NULL__null) { |
620 | if (pInfo != NULL__null) { |
621 | *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR((sal_uInt32)0x0001) | |
622 | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004); |
623 | } |
624 | return; |
625 | } |
626 | pBuffer = (*ppThis)->buffer; |
627 | do |
628 | { |
629 | /* Check ASCII range */ |
630 | SAL_WARN_IF( ((unsigned char)*pStr) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "631" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "631" ": "), sal_detail_stream); } } } while (false) |
631 | "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )do { if (true && (((unsigned char)*pStr) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "631" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_string2UString_status() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "631" ": "), sal_detail_stream); } } } while (false); |
632 | |
633 | *pBuffer = *pStr; |
634 | pBuffer++; |
635 | pStr++; |
636 | nLen--; |
637 | } |
638 | while ( nLen ); |
639 | if (pInfo != NULL__null) { |
640 | *pInfo = 0; |
641 | } |
642 | } |
643 | else |
644 | { |
645 | rtl_uString* pTemp; |
646 | rtl_uString* pTemp2 = NULL__null; |
647 | rtl_TextToUnicodeConverter hConverter; |
648 | sal_uInt32 nInfo; |
649 | sal_Size nSrcBytes; |
650 | sal_Size nDestChars; |
651 | sal_Size nNewLen; |
652 | |
653 | /* Optimization for UTF-8 - we try to calculate the exact length */ |
654 | /* For all other encoding we try the maximum - and reallocate |
655 | the buffer if needed */ |
656 | if ( eTextEncoding == RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)) ) |
657 | { |
658 | nNewLen = rtl_ImplGetFastUTF8UnicodeLen( pStr, nLen ); |
659 | /* Includes the string only ASCII, then we could copy |
660 | the buffer faster */ |
661 | if ( nNewLen == (sal_Size)nLen ) |
662 | { |
663 | IMPL_RTL_STRCODEsal_Unicode* pBuffer; |
664 | *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nLen ); |
665 | if (*ppThis == NULL__null) |
666 | { |
667 | if (pInfo != NULL__null) { |
668 | *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR((sal_uInt32)0x0001) | |
669 | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004); |
670 | } |
671 | return; |
672 | } |
673 | pBuffer = (*ppThis)->buffer; |
674 | do |
675 | { |
676 | /* Check ASCII range */ |
677 | SAL_WARN_IF( ((unsigned char)*pStr) > 127, "rtl.string",do { if (true && (((unsigned char)*pStr) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_string2UString_status() - UTF8 test encoding is wrong" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "678" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_string2UString_status() - UTF8 test encoding is wrong" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_string2UString_status() - UTF8 test encoding is wrong" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "678" ": "), sal_detail_stream); } } } while (false) |
678 | "rtl_string2UString_status() - UTF8 test encoding is wrong" )do { if (true && (((unsigned char)*pStr) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_string2UString_status() - UTF8 test encoding is wrong" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "678" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_string2UString_status() - UTF8 test encoding is wrong" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_string2UString_status() - UTF8 test encoding is wrong" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "678" ": "), sal_detail_stream); } } } while (false); |
679 | |
680 | *pBuffer = *pStr; |
681 | pBuffer++; |
682 | pStr++; |
683 | nLen--; |
684 | } |
685 | while ( nLen ); |
686 | if (pInfo != NULL__null) { |
687 | *pInfo = 0; |
688 | } |
689 | RTL_LOG_STRING_NEW( *ppThis ); |
690 | return; |
691 | } |
692 | } |
693 | else |
694 | nNewLen = nLen; |
695 | |
696 | nCvtFlags |= RTL_TEXTTOUNICODE_FLAGS_FLUSH((sal_uInt32)0x8000); |
697 | hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); |
698 | |
699 | pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nNewLen ); |
700 | if (pTemp == NULL__null) { |
701 | if (pInfo != NULL__null) { |
702 | *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR((sal_uInt32)0x0001) | |
703 | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004); |
704 | } |
705 | return; |
706 | } |
707 | nDestChars = rtl_convertTextToUnicode( hConverter, 0, |
708 | pStr, nLen, |
709 | pTemp->buffer, nNewLen, |
710 | nCvtFlags, |
711 | &nInfo, &nSrcBytes ); |
712 | |
713 | /* Buffer not big enough, try again with enough space */ |
714 | /* Shouldn't be the case, but if we get textencoding which |
715 | could results in more unicode characters we have this |
716 | code here. Could be the case for apple encodings */ |
717 | while ( nInfo & RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004) ) |
718 | { |
719 | rtl_freeMemory( pTemp ); |
720 | nNewLen += 8; |
721 | pTemp = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nNewLen ); |
722 | if (pTemp == NULL__null) { |
723 | if (pInfo != NULL__null) { |
724 | *pInfo = RTL_TEXTTOUNICODE_INFO_ERROR((sal_uInt32)0x0001) | |
725 | RTL_TEXTTOUNICODE_INFO_DESTBUFFERTOSMALL((sal_uInt32)0x0004); |
726 | } |
727 | return; |
728 | } |
729 | nDestChars = rtl_convertTextToUnicode( hConverter, 0, |
730 | pStr, nLen, |
731 | pTemp->buffer, nNewLen, |
732 | nCvtFlags, |
733 | &nInfo, &nSrcBytes ); |
734 | } |
735 | |
736 | if (pInfo) |
737 | *pInfo = nInfo; |
738 | |
739 | /* Set the buffer to the correct size or if there is too |
740 | much overhead, reallocate to the correct size */ |
741 | if ( nNewLen > nDestChars+8 ) |
742 | { |
743 | pTemp2 = IMPL_RTL_STRINGNAME( ImplAlloc )rtl_uString_ImplAlloc( nDestChars ); |
744 | } |
745 | if (pTemp2 != NULL__null) |
746 | { |
747 | rtl_str_ImplCopy(pTemp2->buffer, pTemp->buffer, nDestChars){ sal_Unicode* __mm_pDest = pTemp2->buffer; const sal_Unicode * __mm_pSrc = pTemp->buffer; sal_Int32 __mm_nCount = nDestChars ; while ( __mm_nCount > 0 ) { *__mm_pDest = *__mm_pSrc; __mm_pDest ++; __mm_pSrc++; __mm_nCount--; } }; |
748 | rtl_freeMemory(pTemp); |
749 | pTemp = pTemp2; |
750 | } |
751 | else |
752 | { |
753 | pTemp->length = nDestChars; |
754 | pTemp->buffer[nDestChars] = 0; |
755 | } |
756 | |
757 | rtl_destroyTextToUnicodeConverter( hConverter ); |
758 | *ppThis = pTemp; |
759 | |
760 | /* Results the conversion in an empty buffer - |
761 | create an empty string */ |
762 | if ( pTemp && !nDestChars ) |
763 | rtl_uString_new( ppThis ); |
764 | } |
765 | } |
766 | RTL_LOG_STRING_NEW( *ppThis ); |
767 | } |
768 | |
769 | void SAL_CALL rtl_string2UString( rtl_uString** ppThis, |
770 | const sal_Char* pStr, |
771 | sal_Int32 nLen, |
772 | rtl_TextEncoding eTextEncoding, |
773 | sal_uInt32 nCvtFlags ) SAL_THROW_EXTERN_C()throw () |
774 | { |
775 | rtl_string2UString_status( ppThis, pStr, nLen, eTextEncoding, |
776 | nCvtFlags, NULL__null ); |
777 | } |
778 | |
779 | /* ----------------------------------------------------------------------- */ |
780 | |
781 | enum StrLifecycle { |
782 | CANNOT_RETURN, |
783 | CAN_RETURN = 1 |
784 | }; |
785 | |
786 | static oslMutex |
787 | getInternMutex() |
788 | { |
789 | static oslMutex pPoolGuard = NULL__null; |
790 | if( !pPoolGuard ) |
791 | { |
792 | oslMutex pGlobalGuard; |
793 | pGlobalGuard = *osl_getGlobalMutex(); |
794 | osl_acquireMutex( pGlobalGuard ); |
795 | if( !pPoolGuard ) |
796 | { |
797 | oslMutex p = osl_createMutex(); |
798 | OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); |
799 | pPoolGuard = p; |
800 | } |
801 | osl_releaseMutex( pGlobalGuard ); |
802 | } |
803 | else |
804 | { |
805 | OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER(); |
806 | } |
807 | |
808 | return pPoolGuard; |
809 | } |
810 | |
811 | /* returns true if we found a dup in the pool */ |
812 | static void rtl_ustring_intern_internal( rtl_uString ** newStr, |
813 | rtl_uString * str, |
814 | StrLifecycle can_return ) |
815 | { |
816 | oslMutex pPoolMutex; |
817 | |
818 | pPoolMutex = getInternMutex(); |
819 | |
820 | osl_acquireMutex( pPoolMutex ); |
821 | |
822 | *newStr = rtl_str_hash_intern (str, can_return); |
823 | |
824 | osl_releaseMutex( pPoolMutex ); |
825 | |
826 | if( can_return && *newStr != str ) |
827 | { /* we dupped, then found a match */ |
828 | rtl_freeMemory( str ); |
829 | } |
830 | } |
831 | |
832 | void SAL_CALL rtl_uString_intern( rtl_uString ** newStr, |
833 | rtl_uString * str) SAL_THROW_EXTERN_C()throw () |
834 | { |
835 | if (SAL_STRING_IS_INTERN(str)((str)->refCount & 0x80000000)) |
836 | { |
837 | IMPL_RTL_AQUIRE( str ){ if (!((str)->refCount & 0x40000000)) osl_incrementInterlockedCount ( &((str)->refCount) ); }; |
838 | *newStr = str; |
839 | } |
840 | else |
841 | { |
842 | rtl_uString *pOrg = *newStr; |
843 | *newStr = NULL__null; |
844 | rtl_ustring_intern_internal( newStr, str, CANNOT_RETURN ); |
845 | if (pOrg) |
846 | rtl_uString_release (pOrg); |
847 | } |
848 | } |
849 | |
850 | static int rtl_canGuessUOutputLength( int len, rtl_TextEncoding eTextEncoding ) |
851 | { |
852 | // FIXME: Maybe we should use a bit flag in the higher bits of the |
853 | // eTextEncoding value itself to determine the encoding type. But if we |
854 | // do, be sure to mask the value in certain places that expect the values |
855 | // to be numbered serially from 0 and up. One such place is |
856 | // Impl_getTextEncodingData(). |
857 | |
858 | switch ( eTextEncoding ) |
859 | { |
860 | // 1 to 1 (with no zero elements) |
861 | case RTL_TEXTENCODING_IBM_437(((rtl_TextEncoding) 3)): |
862 | case RTL_TEXTENCODING_IBM_850(((rtl_TextEncoding) 4)): |
863 | case RTL_TEXTENCODING_IBM_860(((rtl_TextEncoding) 5)): |
864 | case RTL_TEXTENCODING_IBM_861(((rtl_TextEncoding) 6)): |
865 | case RTL_TEXTENCODING_IBM_863(((rtl_TextEncoding) 7)): |
866 | case RTL_TEXTENCODING_IBM_865(((rtl_TextEncoding) 8)): |
867 | return len; |
868 | break; |
869 | } |
870 | return 0; |
871 | } |
872 | |
873 | void SAL_CALL rtl_uString_internConvert( rtl_uString ** newStr, |
874 | const sal_Char * str, |
875 | sal_Int32 len, |
876 | rtl_TextEncoding eTextEncoding, |
877 | sal_uInt32 convertFlags, |
878 | sal_uInt32 * pInfo ) |
879 | SAL_THROW_EXTERN_C()throw () |
880 | { |
881 | rtl_uString *scratch; |
882 | |
883 | if (*newStr) |
884 | { |
885 | rtl_uString_release (*newStr); |
886 | *newStr = NULL__null; |
887 | } |
888 | |
889 | if ( len < 256 ) |
890 | { // try various optimisations |
891 | sal_Int32 ulen; |
892 | if ( len < 0 ) |
893 | len = strlen( str ); |
894 | if ( eTextEncoding == RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) |
895 | { |
896 | int i; |
897 | rtl_uString *pScratch; |
898 | pScratch = static_cast< rtl_uString * >( |
899 | alloca(sizeof (rtl_uString) + len * sizeof (IMPL_RTL_STRCODE))__builtin_alloca (sizeof (rtl_uString) + len * sizeof (sal_Unicode ))); |
900 | for (i = 0; i < len; i++) |
901 | { |
902 | /* Check ASCII range */ |
903 | SAL_WARN_IF( ((unsigned char)str[i]) > 127, "rtl.string",do { if (true && (((unsigned char)str[i]) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "904" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "904" ": "), sal_detail_stream); } } } while (false) |
904 | "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )do { if (true && (((unsigned char)str[i]) > 127)) { if (sizeof ::sal::detail::getResult( ::sal::detail::StreamStart () << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ) == 1) { ::sal_detail_log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "904" ": "), ::sal::detail::unwrapStream( ::sal::detail::StreamStart () << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" )); } else { ::std::ostringstream sal_detail_stream; sal_detail_stream << "rtl_ustring_internConvert() - Found char > 127 and RTL_TEXTENCODING_ASCII_US is specified" ; ::sal::detail::log( (::SAL_DETAIL_LOG_LEVEL_WARN), ("rtl.string" ), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "904" ": "), sal_detail_stream); } } } while (false); |
905 | pScratch->buffer[i] = str[i]; |
906 | } |
907 | pScratch->length = len; |
908 | rtl_ustring_intern_internal( newStr, pScratch, CANNOT_RETURN ); |
909 | return; |
910 | } |
911 | else if ( (ulen = rtl_canGuessUOutputLength(len, eTextEncoding)) != 0 ) |
912 | { |
913 | rtl_uString *pScratch; |
914 | rtl_TextToUnicodeConverter hConverter; |
915 | sal_Size nSrcBytes; |
916 | sal_uInt32 nInfo; |
917 | |
918 | pScratch = static_cast< rtl_uString * >( |
919 | alloca(__builtin_alloca (sizeof (rtl_uString) + ulen * sizeof (sal_Unicode )) |
920 | sizeof (rtl_uString) + ulen * sizeof (IMPL_RTL_STRCODE))__builtin_alloca (sizeof (rtl_uString) + ulen * sizeof (sal_Unicode ))); |
921 | |
922 | hConverter = rtl_createTextToUnicodeConverter( eTextEncoding ); |
923 | rtl_convertTextToUnicode( |
924 | hConverter, 0, str, len, pScratch->buffer, ulen, convertFlags, &nInfo, &nSrcBytes ); |
925 | rtl_destroyTextToUnicodeConverter( hConverter ); |
926 | |
927 | if (pInfo) |
928 | *pInfo = nInfo; |
929 | |
930 | pScratch->length = ulen; |
931 | rtl_ustring_intern_internal( newStr, pScratch, CANNOT_RETURN ); |
932 | return; |
933 | } |
934 | |
935 | /* FIXME: we want a nice UTF-8 / alloca shortcut here */ |
936 | } |
937 | |
938 | scratch = NULL__null; |
939 | rtl_string2UString_status( &scratch, str, len, eTextEncoding, convertFlags, |
940 | pInfo ); |
941 | if (!scratch) { |
942 | return; |
943 | } |
944 | rtl_ustring_intern_internal( newStr, scratch, CAN_RETURN ); |
945 | } |
946 | |
947 | static void |
948 | internRelease (rtl_uString *pThis) |
949 | { |
950 | oslMutex pPoolMutex; |
951 | |
952 | rtl_uString *pFree = NULL__null; |
953 | if ( SAL_STRING_REFCOUNT(((osl_decrementInterlockedCount( &(pThis->refCount) )) & 0x3fffffff) |
954 | osl_decrementInterlockedCount( &(pThis->refCount) ) )((osl_decrementInterlockedCount( &(pThis->refCount) )) & 0x3fffffff) == 0) |
955 | { |
956 | pPoolMutex = getInternMutex(); |
957 | osl_acquireMutex( pPoolMutex ); |
958 | |
959 | rtl_str_hash_remove (pThis); |
960 | |
961 | /* May have been separately acquired */ |
962 | if ( SAL_STRING_REFCOUNT(((osl_incrementInterlockedCount( &(pThis->refCount) )) & 0x3fffffff) |
963 | osl_incrementInterlockedCount( &(pThis->refCount) ) )((osl_incrementInterlockedCount( &(pThis->refCount) )) & 0x3fffffff) == 1 ) |
964 | { |
965 | /* we got the last ref */ |
966 | pFree = pThis; |
967 | } |
968 | else /* very unusual */ |
969 | { |
970 | internRelease (pThis); |
971 | } |
972 | |
973 | osl_releaseMutex( pPoolMutex ); |
974 | } |
975 | if (pFree) |
976 | rtl_freeMemory (pFree); |
977 | } |
978 | |
979 | sal_uInt32 SAL_CALL rtl_uString_iterateCodePoints( |
980 | rtl_uString const * string, sal_Int32 * indexUtf16, |
981 | sal_Int32 incrementCodePoints) |
982 | { |
983 | sal_Int32 n; |
984 | sal_Unicode cu; |
985 | sal_uInt32 cp; |
986 | OSL_ASSERT(string != NULL && indexUtf16 != NULL)do { if (true && (!(string != __null && indexUtf16 != __null))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "986" ": "), "OSL_ASSERT: %s", "string != NULL && indexUtf16 != NULL" ); } } while (false); |
987 | n = *indexUtf16; |
Dereference of null pointer (loaded from variable 'indexUtf16') | |
988 | OSL_ASSERT(n >= 0 && n <= string->length)do { if (true && (!(n >= 0 && n <= string ->length))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "988" ": "), "OSL_ASSERT: %s", "n >= 0 && n <= string->length" ); } } while (false); |
989 | while (incrementCodePoints < 0) { |
990 | OSL_ASSERT(n > 0)do { if (true && (!(n > 0))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "990" ": "), "OSL_ASSERT: %s", "n > 0"); } } while (false ); |
991 | cu = string->buffer[--n]; |
992 | if (SAL_RTL_IS_LOW_SURROGATE(cu)((cu) >= 0xDC00 && (cu) <= 0xDFFF) && n != 0 && |
993 | SAL_RTL_IS_HIGH_SURROGATE(string->buffer[n - 1])((string->buffer[n - 1]) >= 0xD800 && (string-> buffer[n - 1]) <= 0xDBFF)) |
994 | { |
995 | --n; |
996 | } |
997 | ++incrementCodePoints; |
998 | } |
999 | OSL_ASSERT(n >= 0 && n < string->length)do { if (true && (!(n >= 0 && n < string ->length))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "999" ": "), "OSL_ASSERT: %s", "n >= 0 && n < string->length" ); } } while (false); |
1000 | cu = string->buffer[n]; |
1001 | if (SAL_RTL_IS_HIGH_SURROGATE(cu)((cu) >= 0xD800 && (cu) <= 0xDBFF) && string->length - n >= 2 && |
1002 | SAL_RTL_IS_LOW_SURROGATE(string->buffer[n + 1])((string->buffer[n + 1]) >= 0xDC00 && (string-> buffer[n + 1]) <= 0xDFFF)) |
1003 | { |
1004 | cp = SAL_RTL_COMBINE_SURROGATES(cu, string->buffer[n + 1])((((cu) - 0xD800) << 10) + ((string->buffer[n + 1]) - 0xDC00) + 0x10000); |
1005 | } else { |
1006 | cp = cu; |
1007 | } |
1008 | while (incrementCodePoints > 0) { |
1009 | OSL_ASSERT(n < string->length)do { if (true && (!(n < string->length))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "1009" ": "), "OSL_ASSERT: %s", "n < string->length" ); } } while (false); |
1010 | cu = string->buffer[n++]; |
1011 | if (SAL_RTL_IS_HIGH_SURROGATE(cu)((cu) >= 0xD800 && (cu) <= 0xDBFF) && n != string->length && |
1012 | SAL_RTL_IS_LOW_SURROGATE(string->buffer[n])((string->buffer[n]) >= 0xDC00 && (string->buffer [n]) <= 0xDFFF)) |
1013 | { |
1014 | ++n; |
1015 | } |
1016 | --incrementCodePoints; |
1017 | } |
1018 | OSL_ASSERT(n >= 0 && n <= string->length)do { if (true && (!(n >= 0 && n <= string ->length))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" ":" "1018" ": "), "OSL_ASSERT: %s", "n >= 0 && n <= string->length" ); } } while (false); |
1019 | *indexUtf16 = n; |
1020 | return cp; |
1021 | } |
1022 | |
1023 | sal_Bool rtl_convertStringToUString( |
1024 | rtl_uString ** target, char const * source, sal_Int32 length, |
1025 | rtl_TextEncoding encoding, sal_uInt32 flags) SAL_THROW_EXTERN_C()throw () |
1026 | { |
1027 | sal_uInt32 info; |
1028 | rtl_string2UString_status(target, source, length, encoding, flags, &info); |
1029 | return (sal_Bool) ((info & RTL_TEXTTOUNICODE_INFO_ERROR((sal_uInt32)0x0001)) == 0); |
1030 | } |
1031 | |
1032 | void rtl_uString_newReplaceFirst( |
1033 | rtl_uString ** newStr, rtl_uString * str, rtl_uString const * from, |
1034 | rtl_uString const * to, sal_Int32 * index) SAL_THROW_EXTERN_C()throw () |
1035 | { |
1036 | assert(str != 0)((str != 0) ? static_cast<void> (0) : __assert_fail ("str != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1036 , __PRETTY_FUNCTION__)); |
1037 | assert(index != 0)((index != 0) ? static_cast<void> (0) : __assert_fail ( "index != 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1037, __PRETTY_FUNCTION__)); |
1038 | 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/ustring.cxx", 1038 , __PRETTY_FUNCTION__)); |
1039 | assert(from != 0)((from != 0) ? static_cast<void> (0) : __assert_fail ("from != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1039 , __PRETTY_FUNCTION__)); |
1040 | assert(to != 0)((to != 0) ? static_cast<void> (0) : __assert_fail ("to != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1040 , __PRETTY_FUNCTION__)); |
1041 | sal_Int32 i = rtl_ustr_indexOfStr_WithLength( |
1042 | str->buffer + *index, str->length - *index, from->buffer, from->length); |
1043 | if (i == -1) { |
1044 | rtl_uString_assign(newStr, str); |
1045 | } else { |
1046 | 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/ustring.cxx" , 1046, __PRETTY_FUNCTION__)); |
1047 | i += *index; |
1048 | assert(from->length <= str->length)((from->length <= str->length) ? static_cast<void > (0) : __assert_fail ("from->length <= str->length" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1048 , __PRETTY_FUNCTION__)); |
1049 | if (str->length - from->length > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF) - to->length) { |
1050 | std::abort(); |
1051 | } |
1052 | sal_Int32 n = str->length - from->length + to->length; |
1053 | rtl_uString_acquire(str); // in case *newStr == str |
1054 | rtl_uString_new_WithLength(newStr, n); |
1055 | if (n != 0) { |
1056 | (*newStr)->length = n; |
1057 | 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/ustring.cxx", 1057 , __PRETTY_FUNCTION__)); |
1058 | memcpy( |
1059 | (*newStr)->buffer, str->buffer, i * sizeof (sal_Unicode)); |
1060 | memcpy( |
1061 | (*newStr)->buffer + i, to->buffer, |
1062 | to->length * sizeof (sal_Unicode)); |
1063 | memcpy( |
1064 | (*newStr)->buffer + i + to->length, |
1065 | str->buffer + i + from->length, |
1066 | (str->length - i - from->length) * sizeof (sal_Unicode)); |
1067 | } |
1068 | rtl_uString_release(str); |
1069 | } |
1070 | *index = i; |
1071 | } |
1072 | |
1073 | void rtl_uString_newReplaceFirstAsciiL( |
1074 | rtl_uString ** newStr, rtl_uString * str, char const * from, |
1075 | sal_Int32 fromLength, rtl_uString const * to, sal_Int32 * index) |
1076 | SAL_THROW_EXTERN_C()throw () |
1077 | { |
1078 | assert(str != 0)((str != 0) ? static_cast<void> (0) : __assert_fail ("str != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1078 , __PRETTY_FUNCTION__)); |
1079 | assert(index != 0)((index != 0) ? static_cast<void> (0) : __assert_fail ( "index != 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1079, __PRETTY_FUNCTION__)); |
1080 | 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/ustring.cxx", 1080 , __PRETTY_FUNCTION__)); |
1081 | assert(fromLength >= 0)((fromLength >= 0) ? static_cast<void> (0) : __assert_fail ("fromLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1081, __PRETTY_FUNCTION__)); |
1082 | assert(to != 0)((to != 0) ? static_cast<void> (0) : __assert_fail ("to != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1082 , __PRETTY_FUNCTION__)); |
1083 | sal_Int32 i = rtl_ustr_indexOfAscii_WithLength( |
1084 | str->buffer + *index, str->length - *index, from, fromLength); |
1085 | if (i == -1) { |
1086 | rtl_uString_assign(newStr, str); |
1087 | } else { |
1088 | 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/ustring.cxx" , 1088, __PRETTY_FUNCTION__)); |
1089 | i += *index; |
1090 | assert(fromLength <= str->length)((fromLength <= str->length) ? static_cast<void> ( 0) : __assert_fail ("fromLength <= str->length", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1090, __PRETTY_FUNCTION__)); |
1091 | if (str->length - fromLength > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF) - to->length) { |
1092 | std::abort(); |
1093 | } |
1094 | sal_Int32 n = str->length - fromLength + to->length; |
1095 | rtl_uString_acquire(str); // in case *newStr == str |
1096 | if (n != 0) { |
1097 | rtl_uString_new_WithLength(newStr, n); |
1098 | (*newStr)->length = n; |
1099 | 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/ustring.cxx", 1099 , __PRETTY_FUNCTION__)); |
1100 | memcpy( |
1101 | (*newStr)->buffer, str->buffer, i * sizeof (sal_Unicode)); |
1102 | memcpy( |
1103 | (*newStr)->buffer + i, to->buffer, |
1104 | to->length * sizeof (sal_Unicode)); |
1105 | memcpy( |
1106 | (*newStr)->buffer + i + to->length, |
1107 | str->buffer + i + fromLength, |
1108 | (str->length - i - fromLength) * sizeof (sal_Unicode)); |
1109 | } |
1110 | rtl_uString_release(str); |
1111 | } |
1112 | *index = i; |
1113 | } |
1114 | |
1115 | void rtl_uString_newReplaceFirstAsciiLAsciiL( |
1116 | rtl_uString ** newStr, rtl_uString * str, char const * from, |
1117 | sal_Int32 fromLength, char const * to, sal_Int32 toLength, |
1118 | sal_Int32 * index) SAL_THROW_EXTERN_C()throw () |
1119 | { |
1120 | assert(str != 0)((str != 0) ? static_cast<void> (0) : __assert_fail ("str != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1120 , __PRETTY_FUNCTION__)); |
1121 | assert(index != 0)((index != 0) ? static_cast<void> (0) : __assert_fail ( "index != 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1121, __PRETTY_FUNCTION__)); |
1122 | 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/ustring.cxx", 1122 , __PRETTY_FUNCTION__)); |
1123 | assert(fromLength >= 0)((fromLength >= 0) ? static_cast<void> (0) : __assert_fail ("fromLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1123, __PRETTY_FUNCTION__)); |
1124 | assert(to != 0)((to != 0) ? static_cast<void> (0) : __assert_fail ("to != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1124 , __PRETTY_FUNCTION__)); |
1125 | assert(toLength >= 0)((toLength >= 0) ? static_cast<void> (0) : __assert_fail ("toLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1125, __PRETTY_FUNCTION__)); |
1126 | sal_Int32 i = rtl_ustr_indexOfAscii_WithLength( |
1127 | str->buffer + *index, str->length - *index, from, fromLength); |
1128 | if (i == -1) { |
1129 | rtl_uString_assign(newStr, str); |
1130 | } else { |
1131 | 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/ustring.cxx" , 1131, __PRETTY_FUNCTION__)); |
1132 | i += *index; |
1133 | assert(fromLength <= str->length)((fromLength <= str->length) ? static_cast<void> ( 0) : __assert_fail ("fromLength <= str->length", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1133, __PRETTY_FUNCTION__)); |
1134 | if (str->length - fromLength > SAL_MAX_INT32((sal_Int32) 0x7FFFFFFF) - toLength) { |
1135 | std::abort(); |
1136 | } |
1137 | sal_Int32 n = str->length - fromLength + toLength; |
1138 | rtl_uString_acquire(str); // in case *newStr == str |
1139 | if (n != 0) { |
1140 | rtl_uString_new_WithLength(newStr, n); |
1141 | (*newStr)->length = n; |
1142 | 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/ustring.cxx", 1142 , __PRETTY_FUNCTION__)); |
1143 | memcpy( |
1144 | (*newStr)->buffer, str->buffer, i * sizeof (sal_Unicode)); |
1145 | for (sal_Int32 j = 0; j != toLength; ++j) { |
1146 | assert(static_cast< unsigned char >(to[j]) <= 0x7F)((static_cast< unsigned char >(to[j]) <= 0x7F) ? static_cast <void> (0) : __assert_fail ("static_cast< unsigned char >(to[j]) <= 0x7F" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1146 , __PRETTY_FUNCTION__)); |
1147 | (*newStr)->buffer[i + j] = to[j]; |
1148 | } |
1149 | memcpy( |
1150 | (*newStr)->buffer + i + toLength, |
1151 | str->buffer + i + fromLength, |
1152 | (str->length - i - fromLength) * sizeof (sal_Unicode)); |
1153 | } |
1154 | rtl_uString_release(str); |
1155 | } |
1156 | *index = i; |
1157 | } |
1158 | |
1159 | void rtl_uString_newReplaceAll( |
1160 | rtl_uString ** newStr, rtl_uString * str, rtl_uString const * from, |
1161 | rtl_uString const * to) SAL_THROW_EXTERN_C()throw () |
1162 | { |
1163 | assert(to != 0)((to != 0) ? static_cast<void> (0) : __assert_fail ("to != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1163 , __PRETTY_FUNCTION__)); |
1164 | rtl_uString_assign(newStr, str); |
1165 | for (sal_Int32 i = 0;; i += to->length) { |
1166 | rtl_uString_newReplaceFirst(newStr, *newStr, from, to, &i); |
1167 | if (i == -1) { |
1168 | break; |
1169 | } |
1170 | } |
1171 | } |
1172 | |
1173 | void rtl_uString_newReplaceAllAsciiL( |
1174 | rtl_uString ** newStr, rtl_uString * str, char const * from, |
1175 | sal_Int32 fromLength, rtl_uString const * to) SAL_THROW_EXTERN_C()throw () |
1176 | { |
1177 | assert(to != 0)((to != 0) ? static_cast<void> (0) : __assert_fail ("to != 0" , "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx", 1177 , __PRETTY_FUNCTION__)); |
1178 | rtl_uString_assign(newStr, str); |
1179 | for (sal_Int32 i = 0;; i += to->length) { |
1180 | rtl_uString_newReplaceFirstAsciiL( |
1181 | newStr, *newStr, from, fromLength, to, &i); |
1182 | if (i == -1) { |
1183 | break; |
1184 | } |
1185 | } |
1186 | } |
1187 | |
1188 | void rtl_uString_newReplaceAllAsciiLAsciiL( |
1189 | rtl_uString ** newStr, rtl_uString * str, char const * from, |
1190 | sal_Int32 fromLength, char const * to, sal_Int32 toLength) |
1191 | SAL_THROW_EXTERN_C()throw () |
1192 | { |
1193 | assert(toLength >= 0)((toLength >= 0) ? static_cast<void> (0) : __assert_fail ("toLength >= 0", "/usr/local/src/libreoffice/sal/rtl/source/ustring.cxx" , 1193, __PRETTY_FUNCTION__)); |
1194 | rtl_uString_assign(newStr, str); |
1195 | for (sal_Int32 i = 0;; i += toLength) { |
1196 | rtl_uString_newReplaceFirstAsciiLAsciiL( |
1197 | newStr, *newStr, from, fromLength, to, toLength, &i); |
1198 | if (i == -1) { |
1199 | break; |
1200 | } |
1201 | } |
1202 | } |
1203 | |
1204 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |