xref: /AOO41X/main/sal/qa/rtl_strings/rtl_String_Utils.cxx (revision 87d2adbc9cadf14644c3679b041b9226f7630199)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sal.hxx"
26 
27 //------------------------------------------------------------------------
28 //------------------------------------------------------------------------
29 
30 #include <math.h>
31 #include <stdlib.h>
32 
33 //------------------------------------------------------------------------
34 //------------------------------------------------------------------------
35 
36 #ifndef _SAL_TYPES_H_
37     #include <sal/types.h>
38 #endif
39 
40 #ifndef _RTL_USTRING_H_
41     #include <rtl/ustring.h>
42 #endif
43 
44 #ifndef _RTL_STRING_HXX_
45     #include <rtl/string.hxx>
46 #endif
47 
48 //------------------------------------------------------------------------
49 //------------------------------------------------------------------------
50 
51 #ifndef _RTL_STRING_UTILS_CONST_H_
52     #include <rtl_String_Utils_Const.h>
53 #endif
54 
55 //------------------------------------------------------------------------
56 //------------------------------------------------------------------------
57 
58 using namespace rtl;
59 
AStringLen(const sal_Char * pAStr)60 sal_uInt32 AStringLen( const sal_Char *pAStr )
61 {
62     sal_uInt32  nStrLen = 0;
63 
64     if ( pAStr != NULL )
65     {
66         const sal_Char *pTempStr = pAStr;
67 
68         while( *pTempStr )
69         {
70             pTempStr++;
71         } // while
72 
73         nStrLen = (sal_uInt32)( pTempStr - pAStr );
74     } // if
75 
76     return nStrLen;
77 } // AStringLen
cpystr(sal_Char * dst,const sal_Char * src)78 sal_Char* cpystr( sal_Char* dst, const sal_Char* src )
79 {
80     const sal_Char* psrc = src;
81     sal_Char* pdst = dst;
82 
83     while( *pdst++ = *psrc++ );
84     return ( dst );
85 }
86 
cpynstr(sal_Char * dst,const sal_Char * src,sal_uInt32 cnt)87 sal_Char* cpynstr( sal_Char* dst, const sal_Char* src, sal_uInt32 cnt )
88 {
89 
90     const sal_Char* psrc = src;
91     sal_Char* pdst = dst;
92     sal_uInt32 len = cnt;
93     sal_uInt32 i;
94 
95     if ( len >= AStringLen(src) )
96     {
97         return( cpystr( dst, src ) );
98     }
99 
100     // copy string by char
101     for( i = 0; i < len; i++ )
102         *pdst++ = *psrc++;
103     *pdst = '\0';
104 
105     return ( dst );
106 }
107 
108 //------------------------------------------------------------------------
cmpstr(const sal_Char * str1,const sal_Char * str2,sal_uInt32 len)109 sal_Bool cmpstr( const sal_Char* str1, const sal_Char* str2, sal_uInt32 len )
110 {
111     const sal_Char* pBuf1 = str1;
112     const sal_Char* pBuf2 = str2;
113     sal_uInt32 i = 0;
114 
115     while ( (*pBuf1 == *pBuf2) && i < len )
116     {
117         (pBuf1)++;
118         (pBuf2)++;
119         i++;
120     }
121     return( i == len );
122 }
123 //------------------------------------------------------------------------
cmpustr(const sal_Unicode * str1,const sal_Unicode * str2,sal_uInt32 len)124 sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2, sal_uInt32 len )
125 {
126     const sal_Unicode* pBuf1 = str1;
127     const sal_Unicode* pBuf2 = str2;
128     sal_uInt32 i = 0;
129 
130     while ( (*pBuf1 == *pBuf2) && i < len )
131     {
132         (pBuf1)++;
133         (pBuf2)++;
134         i++;
135     }
136     return( i == len );
137 }
138 
139 //-----------------------------------------------------------------------
cmpustr(const sal_Unicode * str1,const sal_Unicode * str2)140 sal_Bool cmpustr( const sal_Unicode* str1, const sal_Unicode* str2 )
141 {
142     const sal_Unicode* pBuf1 = str1;
143     const sal_Unicode* pBuf2 = str2;
144     sal_Bool res = sal_True;
145 
146     while ( (*pBuf1 == *pBuf2) && *pBuf1 !='\0' && *pBuf2 != '\0')
147     {
148         (pBuf1)++;
149         (pBuf2)++;
150     }
151     if (*pBuf1 == '\0' && *pBuf2 == '\0')
152         res = sal_True;
153     else
154         res = sal_False;
155     return (res);
156 }
157 
createName(sal_Char * dst,const sal_Char * meth,sal_uInt32 cnt)158 sal_Char* createName( sal_Char* dst, const sal_Char* meth, sal_uInt32 cnt )
159 {
160     sal_Char* pdst = dst;
161     sal_Char nstr[16];
162     sal_Char* pstr = nstr;
163     rtl_str_valueOfInt32( pstr, cnt, 10 );
164 
165     cpystr( pdst, meth );
166     cpystr( pdst+ AStringLen(meth), "_" );
167 
168     if ( cnt < 100 )
169     {
170         cpystr(pdst + AStringLen(pdst), "0" );
171     }
172     if ( cnt < 10 )
173     {
174         cpystr(pdst + AStringLen(pdst), "0" );
175     }
176 
177     cpystr( pdst + AStringLen(pdst), nstr );
178     return( pdst );
179 }
180 
181 //------------------------------------------------------------------------
182 //  testing the method compareTo( const OString & aStr )
183 //------------------------------------------------------------------------
makeComment(char * com,const char * str1,const char * str2,sal_Int32 sgn)184 void makeComment( char *com, const char *str1, const char *str2,
185                                                             sal_Int32 sgn )
186 {
187     cpystr(com, str1);
188     int str1Length = AStringLen( str1 );
189     const char *sign = (sgn == 0) ? " == " : (sgn > 0) ? " > " : " < " ;
190     cpystr(com + str1Length, sign);
191     int signLength = AStringLen(sign);
192     cpystr(com + str1Length + signLength, str2);
193     com[str1Length + signLength + AStringLen(str2)] = 0;
194 }
195 
196 
197 //------------------------------------------------------------------------
198 
AStringToFloatCompare(const sal_Char * pStr,const float nX,const float nEPS)199 sal_Bool AStringToFloatCompare ( const sal_Char  *pStr,
200                                  const float      nX,
201                                  const float      nEPS
202                                 )
203 {
204     sal_Bool cmp = sal_False;
205 
206     if ( pStr != NULL )
207     {
208         ::rtl::OString aStr(pStr);
209 
210         float actNum = 0;
211         float expNum = nX;
212         float eps    = nEPS;
213 
214         actNum = aStr.toFloat();
215 
216         if ( abs( (int)(actNum - expNum) ) <= eps )
217         {
218             cmp = sal_True;
219         } // if
220     } // if
221 
222     return cmp;
223 } // AStringToFloatCompare
224 
225 //------------------------------------------------------------------------
226 
AStringToDoubleCompare(const sal_Char * pStr,const double nX,const double nEPS)227 sal_Bool AStringToDoubleCompare ( const sal_Char  *pStr,
228                                   const double     nX,
229                                   const double     nEPS
230                                 )
231 {
232     sal_Bool cmp = sal_False;
233 
234     if ( pStr != NULL )
235     {
236         ::rtl::OString aStr(pStr);
237 
238         double actNum = 0;
239         double expNum = nX;
240         double eps    = nEPS;
241 
242         actNum = aStr.toDouble();
243 
244         if ( abs( (int)(actNum - expNum) ) <= eps )
245         {
246             cmp = sal_True;
247         } // if
248     } // if
249 
250     return cmp;
251 } // AStringToDoubleCompare
252 
253 //------------------------------------------------------------------------
254 
255 
256 //------------------------------------------------------------------------
257 
UStringLen(const sal_Unicode * pUStr)258 sal_uInt32 UStringLen( const sal_Unicode *pUStr )
259 {
260     sal_uInt32 nUStrLen = 0;
261 
262     if ( pUStr != NULL )
263     {
264         const sal_Unicode *pTempUStr = pUStr;
265 
266         while( *pTempUStr )
267         {
268             pTempUStr++;
269         } // while
270 
271         nUStrLen = (sal_uInt32)( pTempUStr - pUStr );
272     } // if
273 
274     return nUStrLen;
275 } // UStringLen
276 
277 //------------------------------------------------------------------------
278 
AStringIsValid(const sal_Char * pAStr)279 sal_Bool AStringIsValid( const sal_Char  *pAStr )
280 {
281     if ( pAStr != NULL )
282     {
283         sal_uInt32 nLen  = AStringLen( pAStr );
284         sal_uChar  uChar = 0;
285 
286         while ( ( nLen >= 0 ) && ( *pAStr ) )
287         {
288             uChar = (unsigned char)*pAStr;
289 
290             if ( uChar > 127 )
291             {
292                 return sal_False;
293             } // if
294 
295             pAStr++;
296 
297             // Since we are dealing with unsigned integers
298             // we want to make sure that the last number is
299             // indeed zero.
300 
301             if ( nLen > 0 )
302             {
303                 nLen--;
304             } // if
305             else
306             {
307                 break;
308             } // else
309         } // while
310     } // if
311 
312     return sal_True;
313 } // AStringIsValid
314 
315 //------------------------------------------------------------------------
316 
AStringNIsValid(const sal_Char * pAStr,const sal_uInt32 nStrLen)317 sal_Bool AStringNIsValid( const sal_Char   *pAStr,
318                           const sal_uInt32  nStrLen
319                         )
320 {
321     sal_uInt32 nLen  = nStrLen;
322     sal_uChar  uChar = 0;
323 
324     while ( ( nLen >= 0 ) && ( *pAStr ) )
325     {
326         uChar = (unsigned char)*pAStr;
327 
328         if ( uChar > 127 )
329         {
330             return sal_False;
331         } // if
332 
333         pAStr++;
334 
335         // Since we are dealing with unsigned integers
336         // we want to make sure that the last number is
337         // indeed zero.
338 
339         if ( nLen > 0 )
340         {
341             nLen--;
342         } // if
343         else
344         {
345             break;
346         } // else
347     } // while
348 
349     return sal_True;
350 } // AStringNIsValid
351 
352 //------------------------------------------------------------------------
353 
ACharToUCharCompare(const sal_Unicode * pUStr,const sal_Char * pAStr)354 static inline sal_Int32 ACharToUCharCompare( const sal_Unicode *pUStr,
355                                              const sal_Char    *pAStr
356                                            )
357 {
358     sal_Int32  nCmp   = 0;
359     sal_Int32  nUChar = (sal_Int32)*pUStr;
360     sal_Int32  nChar  = (sal_Int32)((unsigned char)*pAStr);
361 
362     nCmp = nUChar - nChar;
363 
364     return  nCmp;
365 } // ACharToUCharCompare
366 
367 //------------------------------------------------------------------------
368 
AStringToUStringCompare(const sal_Unicode * pUStr,const sal_Char * pAStr)369 sal_Int32 AStringToUStringCompare( const sal_Unicode *pUStr,
370                                    const sal_Char    *pAStr
371                                  )
372 {
373     sal_Int32 nCmp = kErrCompareAStringToUString;
374 
375     if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
376     {
377         nCmp = ACharToUCharCompare( pUStr, pAStr );
378 
379         while ( ( nCmp == 0 ) && ( *pAStr ) )
380         {
381             pUStr++;
382             pAStr++;
383 
384             nCmp = ACharToUCharCompare( pUStr, pAStr );
385         } // while
386     } // if
387 
388     return nCmp;
389 } // AStringToUStringCompare
390 
391 //------------------------------------------------------------------------
392 
AStringToUStringNCompare(const sal_Unicode * pUStr,const sal_Char * pAStr,const sal_uInt32 nAStrCount)393 sal_Int32 AStringToUStringNCompare( const sal_Unicode  *pUStr,
394                                     const sal_Char     *pAStr,
395                                     const sal_uInt32    nAStrCount
396                                    )
397 {
398     sal_Int32 nCmp = kErrCompareNAStringToUString;
399 
400     if ( ( pUStr != NULL ) && ( pAStr != NULL ) )
401     {
402         sal_uInt32 nCount = nAStrCount;
403 
404         nCmp = ACharToUCharCompare( pUStr, pAStr );
405 
406         while ( ( nCmp == 0 ) && ( *pAStr ) && ( nCount ) )
407         {
408             pUStr++;
409             pAStr++;
410 
411             nCmp = ACharToUCharCompare( pUStr, pAStr );
412 
413             // Since we are dealing with unsigned integers
414             // we want to make sure that the last number is
415             // indeed zero.
416 
417             if ( nCount > 0 )
418             {
419                 nCount--;
420             } // if
421             else
422             {
423                 break;
424             } // else
425         } // while
426     } // if
427 
428     return nCmp;
429 } // AStringToUStringNCompare
430 
431 //------------------------------------------------------------------------
432 
AStringToRTLUStringCompare(const rtl_uString * pRTLUStr,const sal_Char * pAStr)433 sal_Int32 AStringToRTLUStringCompare( const rtl_uString  *pRTLUStr,
434                                       const sal_Char     *pAStr
435                                     )
436 {
437     sal_Int32 nCmp = kErrCompareAStringToRTLUString;
438 
439     if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
440     {
441         rtl_uString *pRTLUStrCopy = NULL;
442 
443         rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
444 
445         if ( pRTLUStrCopy != NULL )
446         {
447             const sal_Unicode *pUStr = rtl_uString_getStr( pRTLUStrCopy );
448 
449             if ( pUStr != NULL )
450             {
451                 nCmp = AStringToUStringCompare( pUStr, pAStr );
452             } // if
453 
454             rtl_uString_release( pRTLUStrCopy );
455 
456             pRTLUStrCopy = NULL;
457         } // if
458     } // if
459 
460     return nCmp;
461 } // AStringToRTLUStringCompare
462 
463 //------------------------------------------------------------------------
464 
AStringToRTLUStringNCompare(const rtl_uString * pRTLUStr,const sal_Char * pAStr,const sal_uInt32 nAStrCount)465 sal_Int32 AStringToRTLUStringNCompare( const rtl_uString  *pRTLUStr,
466                                        const sal_Char     *pAStr,
467                                        const sal_uInt32    nAStrCount
468                                      )
469 {
470     sal_Int32 nCmp = kErrCompareNAStringToRTLUString;
471 
472     if ( ( pRTLUStr != NULL ) && ( pAStr != NULL ) )
473     {
474         rtl_uString *pRTLUStrCopy = NULL;
475 
476         rtl_uString_newFromString( &pRTLUStrCopy, pRTLUStr );
477 
478         if ( pRTLUStrCopy != NULL )
479         {
480             const sal_Unicode  *pUStr = rtl_uString_getStr( pRTLUStrCopy );
481 
482             if ( pUStr != NULL )
483             {
484                 nCmp = AStringToUStringNCompare( pUStr, pAStr, nAStrCount );
485             } // if
486 
487             rtl_uString_release( pRTLUStrCopy );
488 
489             pRTLUStrCopy = NULL;
490         } // if
491     } // if
492 
493     return nCmp;
494 } // AStringToRTLUStringNCompare
495 
496 //------------------------------------------------------------------------
497 
AStringToUStringCopy(sal_Unicode * pDest,const sal_Char * pSrc)498 sal_Bool AStringToUStringCopy( sal_Unicode     *pDest,
499                                const sal_Char  *pSrc
500                              )
501 {
502     sal_Bool    bCopied = sal_False;
503     sal_uInt32  nCount  = AStringLen( pSrc );
504     sal_uInt32  nLen    = nCount;
505 
506     if (    ( pDest != NULL )
507          && ( pSrc  != NULL )
508          && ( AStringNIsValid( pSrc, nLen ) )
509        )
510     {
511         while ( nCount >= 0 )
512         {
513             *pDest = (unsigned char)*pSrc;
514 
515             pDest++;
516             pSrc++;
517 
518             // Since we are dealing with unsigned integers
519             // we want to make sure that the last number is
520             // indeed zero.
521 
522             if ( nCount > 0 )
523             {
524                 nCount--;
525             } // if
526             else
527             {
528                 break;
529             } // else
530         } // while
531 
532         if ( nCount == 0 )
533         {
534             bCopied = sal_True;
535         } // if
536     } // if
537 
538     return  bCopied;
539 } // AStringToUStringCopy
540 
541 //------------------------------------------------------------------------
542 
AStringToUStringNCopy(sal_Unicode * pDest,const sal_Char * pSrc,const sal_uInt32 nSrcLen)543 sal_Bool AStringToUStringNCopy( sal_Unicode       *pDest,
544                                 const sal_Char    *pSrc,
545                                 const sal_uInt32   nSrcLen
546                               )
547 {
548     sal_Bool    bCopied = sal_False;
549     sal_uInt32  nCount  = nSrcLen;
550     sal_uInt32  nLen    = nSrcLen;
551 
552     if (    ( pDest != NULL )
553          && ( pSrc  != NULL )
554          && ( AStringNIsValid( pSrc, nLen ) )
555        )
556     {
557         while ( nCount >= 0 )
558         {
559             *pDest = (unsigned char)*pSrc;
560 
561             pDest++;
562             pSrc++;
563 
564             // Since we are dealing with unsigned integers
565             // we want to make sure that the last number is
566             // indeed zero.
567 
568             if ( nCount > 0 )
569             {
570                 nCount--;
571             } // if
572             else
573             {
574                 break;
575             } // else
576         } // while
577 
578         if ( nCount == 0 )
579         {
580             bCopied = sal_True;
581         } // if
582     } // if
583 
584     return  bCopied;
585 } // AStringToUStringNCopy
586 
587 //------------------------------------------------------------------------
588 //------------------------------------------------------------------------
589 
590