xref: /AOO42X/main/autodoc/source/cosv/strings/string.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
1*8a106958SDamjan Jovanovic /**************************************************************
2*8a106958SDamjan Jovanovic  *
3*8a106958SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*8a106958SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*8a106958SDamjan Jovanovic  * distributed with this work for additional information
6*8a106958SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*8a106958SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*8a106958SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*8a106958SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*8a106958SDamjan Jovanovic  *
11*8a106958SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*8a106958SDamjan Jovanovic  *
13*8a106958SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*8a106958SDamjan Jovanovic  * software distributed under the License is distributed on an
15*8a106958SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*8a106958SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*8a106958SDamjan Jovanovic  * specific language governing permissions and limitations
18*8a106958SDamjan Jovanovic  * under the License.
19*8a106958SDamjan Jovanovic  *
20*8a106958SDamjan Jovanovic  *************************************************************/
21*8a106958SDamjan Jovanovic 
22*8a106958SDamjan Jovanovic 
23*8a106958SDamjan Jovanovic 
24*8a106958SDamjan Jovanovic #include <precomp.h>
25*8a106958SDamjan Jovanovic #include <cosv/string.hxx>
26*8a106958SDamjan Jovanovic 
27*8a106958SDamjan Jovanovic // NOT FULLY DECLARED SERVICES
28*8a106958SDamjan Jovanovic #include <string.h>
29*8a106958SDamjan Jovanovic #include <cosv/comfunc.hxx>
30*8a106958SDamjan Jovanovic 
31*8a106958SDamjan Jovanovic 
32*8a106958SDamjan Jovanovic 
33*8a106958SDamjan Jovanovic 
34*8a106958SDamjan Jovanovic namespace csv
35*8a106958SDamjan Jovanovic {
36*8a106958SDamjan Jovanovic 
37*8a106958SDamjan Jovanovic 
38*8a106958SDamjan Jovanovic inline const char *
str_from_StringOffset(const String & i_rStr,str::size i_nOffset)39*8a106958SDamjan Jovanovic str_from_StringOffset( const String &     i_rStr,
40*8a106958SDamjan Jovanovic                        str::size       i_nOffset )
41*8a106958SDamjan Jovanovic {
42*8a106958SDamjan Jovanovic     return i_nOffset < i_rStr.size()
43*8a106958SDamjan Jovanovic                 ?   i_rStr.c_str() + i_nOffset
44*8a106958SDamjan Jovanovic                 :   "";
45*8a106958SDamjan Jovanovic }
46*8a106958SDamjan Jovanovic 
47*8a106958SDamjan Jovanovic inline const char *
str_from_ptr(const char * i_str)48*8a106958SDamjan Jovanovic str_from_ptr( const char * i_str )
49*8a106958SDamjan Jovanovic {
50*8a106958SDamjan Jovanovic 
51*8a106958SDamjan Jovanovic     return valid_str(i_str);
52*8a106958SDamjan Jovanovic }
53*8a106958SDamjan Jovanovic 
54*8a106958SDamjan Jovanovic 
55*8a106958SDamjan Jovanovic //*********************     String::S_Data    **********************//
56*8a106958SDamjan Jovanovic 
57*8a106958SDamjan Jovanovic inline String::
S_Data()58*8a106958SDamjan Jovanovic S_Data::S_Data()
59*8a106958SDamjan Jovanovic     :   nCount(1)
60*8a106958SDamjan Jovanovic {
61*8a106958SDamjan Jovanovic }
62*8a106958SDamjan Jovanovic 
63*8a106958SDamjan Jovanovic String::
S_Data(const char * i_sData,size_type i_nValidLength)64*8a106958SDamjan Jovanovic S_Data::S_Data( const char *        i_sData,
65*8a106958SDamjan Jovanovic                 size_type           i_nValidLength )
66*8a106958SDamjan Jovanovic     :   aStr( str_from_ptr(i_sData),
67*8a106958SDamjan Jovanovic               (i_nValidLength != str::maxsize
68*8a106958SDamjan Jovanovic                     ?   i_nValidLength
69*8a106958SDamjan Jovanovic                     :   strlen(i_sData)) ),
70*8a106958SDamjan Jovanovic         nCount(1)
71*8a106958SDamjan Jovanovic {
72*8a106958SDamjan Jovanovic }
73*8a106958SDamjan Jovanovic 
74*8a106958SDamjan Jovanovic String::
~S_Data()75*8a106958SDamjan Jovanovic S_Data::~S_Data()
76*8a106958SDamjan Jovanovic {
77*8a106958SDamjan Jovanovic     csv_assert( nCount == 0 );
78*8a106958SDamjan Jovanovic }
79*8a106958SDamjan Jovanovic 
80*8a106958SDamjan Jovanovic const String::S_Data *
81*8a106958SDamjan Jovanovic String::
Acquire() const82*8a106958SDamjan Jovanovic S_Data::Acquire() const
83*8a106958SDamjan Jovanovic {
84*8a106958SDamjan Jovanovic #ifdef CSV_NO_MUTABLE
85*8a106958SDamjan Jovanovic     ++ (const_cast< uintt& >(nCount));
86*8a106958SDamjan Jovanovic #else
87*8a106958SDamjan Jovanovic     ++nCount;
88*8a106958SDamjan Jovanovic #endif
89*8a106958SDamjan Jovanovic     return this;
90*8a106958SDamjan Jovanovic }
91*8a106958SDamjan Jovanovic 
92*8a106958SDamjan Jovanovic void
93*8a106958SDamjan Jovanovic String::
Release() const94*8a106958SDamjan Jovanovic S_Data::Release() const
95*8a106958SDamjan Jovanovic {
96*8a106958SDamjan Jovanovic #ifdef CSV_NO_MUTABLE
97*8a106958SDamjan Jovanovic     -- (const_cast< uintt& >(nCount));
98*8a106958SDamjan Jovanovic #else
99*8a106958SDamjan Jovanovic     --nCount;
100*8a106958SDamjan Jovanovic #endif
101*8a106958SDamjan Jovanovic     if (nCount == 0)
102*8a106958SDamjan Jovanovic         delete (const_cast< S_Data* >(this));
103*8a106958SDamjan Jovanovic }
104*8a106958SDamjan Jovanovic 
105*8a106958SDamjan Jovanovic 
106*8a106958SDamjan Jovanovic //**************************     String    **************************//
107*8a106958SDamjan Jovanovic 
108*8a106958SDamjan Jovanovic 
String()109*8a106958SDamjan Jovanovic String::String()
110*8a106958SDamjan Jovanovic     :   pd( String::Null_().pd->Acquire() )
111*8a106958SDamjan Jovanovic {
112*8a106958SDamjan Jovanovic }
113*8a106958SDamjan Jovanovic 
String(const char * i_str)114*8a106958SDamjan Jovanovic String::String( const char * i_str )
115*8a106958SDamjan Jovanovic     :   pd( new S_Data(i_str) )
116*8a106958SDamjan Jovanovic {
117*8a106958SDamjan Jovanovic }
118*8a106958SDamjan Jovanovic 
String(const char * i_str,size_type i_nLength)119*8a106958SDamjan Jovanovic String::String( const char *        i_str,
120*8a106958SDamjan Jovanovic                 size_type           i_nLength )
121*8a106958SDamjan Jovanovic     :   pd( new S_Data(i_str, i_nLength) )
122*8a106958SDamjan Jovanovic {
123*8a106958SDamjan Jovanovic }
124*8a106958SDamjan Jovanovic 
125*8a106958SDamjan Jovanovic /*  For efficiency see the previous c'tor.
126*8a106958SDamjan Jovanovic */
String(const self & i_rStr,position_type i_nStartPosition,size_type i_nLength)127*8a106958SDamjan Jovanovic String::String( const self &        i_rStr,
128*8a106958SDamjan Jovanovic                 position_type       i_nStartPosition,
129*8a106958SDamjan Jovanovic                 size_type           i_nLength )
130*8a106958SDamjan Jovanovic     :   pd( new S_Data(str_from_StringOffset(i_rStr, i_nStartPosition), i_nLength) )
131*8a106958SDamjan Jovanovic {
132*8a106958SDamjan Jovanovic }
133*8a106958SDamjan Jovanovic 
String(const_iterator i_itBegin,const_iterator i_itEnd)134*8a106958SDamjan Jovanovic String::String( const_iterator i_itBegin,
135*8a106958SDamjan Jovanovic                 const_iterator i_itEnd )
136*8a106958SDamjan Jovanovic     :   pd( new S_Data(i_itBegin, size_type(i_itEnd - i_itBegin)) )
137*8a106958SDamjan Jovanovic {
138*8a106958SDamjan Jovanovic }
139*8a106958SDamjan Jovanovic 
String(const self & i_rStr)140*8a106958SDamjan Jovanovic String::String( const self & i_rStr )
141*8a106958SDamjan Jovanovic     :   pd( i_rStr.pd->Acquire() )
142*8a106958SDamjan Jovanovic {
143*8a106958SDamjan Jovanovic }
144*8a106958SDamjan Jovanovic 
~String()145*8a106958SDamjan Jovanovic String::~String()
146*8a106958SDamjan Jovanovic {
147*8a106958SDamjan Jovanovic     pd->Release();
148*8a106958SDamjan Jovanovic }
149*8a106958SDamjan Jovanovic 
150*8a106958SDamjan Jovanovic 
151*8a106958SDamjan Jovanovic String &
operator =(const self & i_rStr)152*8a106958SDamjan Jovanovic String::operator=( const self & i_rStr )
153*8a106958SDamjan Jovanovic {
154*8a106958SDamjan Jovanovic     i_rStr.pd->Acquire();
155*8a106958SDamjan Jovanovic     pd->Release();
156*8a106958SDamjan Jovanovic     pd = i_rStr.pd;
157*8a106958SDamjan Jovanovic 
158*8a106958SDamjan Jovanovic     return *this;
159*8a106958SDamjan Jovanovic }
160*8a106958SDamjan Jovanovic 
161*8a106958SDamjan Jovanovic String &
operator =(const char * i_str)162*8a106958SDamjan Jovanovic String::operator=( const char * i_str )
163*8a106958SDamjan Jovanovic {
164*8a106958SDamjan Jovanovic     const S_Data *
165*8a106958SDamjan Jovanovic         pTemp = new S_Data(i_str);
166*8a106958SDamjan Jovanovic     pd->Release();
167*8a106958SDamjan Jovanovic     pd = pTemp;
168*8a106958SDamjan Jovanovic 
169*8a106958SDamjan Jovanovic     return *this;
170*8a106958SDamjan Jovanovic }
171*8a106958SDamjan Jovanovic 
172*8a106958SDamjan Jovanovic void
swap(self & i_rStr)173*8a106958SDamjan Jovanovic String::swap( self & i_rStr )
174*8a106958SDamjan Jovanovic {
175*8a106958SDamjan Jovanovic     const S_Data * pTemp = pd;
176*8a106958SDamjan Jovanovic     pd = i_rStr.pd;
177*8a106958SDamjan Jovanovic     i_rStr.pd = pTemp;
178*8a106958SDamjan Jovanovic }
179*8a106958SDamjan Jovanovic 
180*8a106958SDamjan Jovanovic void
assign(const self & i_rStr,position_type i_nStartPosition,size_type i_nLength)181*8a106958SDamjan Jovanovic String::assign( const self &        i_rStr,
182*8a106958SDamjan Jovanovic                 position_type       i_nStartPosition,
183*8a106958SDamjan Jovanovic                 size_type           i_nLength )
184*8a106958SDamjan Jovanovic {
185*8a106958SDamjan Jovanovic     const S_Data *
186*8a106958SDamjan Jovanovic         pTemp = new S_Data( str_from_StringOffset(i_rStr, i_nStartPosition),
187*8a106958SDamjan Jovanovic                             i_nLength );
188*8a106958SDamjan Jovanovic     pd->Release();
189*8a106958SDamjan Jovanovic     pd = pTemp;
190*8a106958SDamjan Jovanovic }
191*8a106958SDamjan Jovanovic 
192*8a106958SDamjan Jovanovic void
assign(const char * i_str)193*8a106958SDamjan Jovanovic String::assign( const char *        i_str )
194*8a106958SDamjan Jovanovic {
195*8a106958SDamjan Jovanovic     const S_Data *
196*8a106958SDamjan Jovanovic         pTemp = new S_Data( i_str );
197*8a106958SDamjan Jovanovic     pd->Release();
198*8a106958SDamjan Jovanovic     pd = pTemp;
199*8a106958SDamjan Jovanovic }
200*8a106958SDamjan Jovanovic 
201*8a106958SDamjan Jovanovic void
assign(const char * i_str,size_type i_nLength)202*8a106958SDamjan Jovanovic String::assign( const char *        i_str,
203*8a106958SDamjan Jovanovic                 size_type           i_nLength )
204*8a106958SDamjan Jovanovic {
205*8a106958SDamjan Jovanovic     const S_Data *
206*8a106958SDamjan Jovanovic         pTemp = new S_Data( i_str, i_nLength );
207*8a106958SDamjan Jovanovic     pd->Release();
208*8a106958SDamjan Jovanovic     pd = pTemp;
209*8a106958SDamjan Jovanovic }
210*8a106958SDamjan Jovanovic 
211*8a106958SDamjan Jovanovic void
assign(const_iterator i_itBegin,const_iterator i_itEnd)212*8a106958SDamjan Jovanovic String::assign( const_iterator      i_itBegin,
213*8a106958SDamjan Jovanovic                 const_iterator      i_itEnd )
214*8a106958SDamjan Jovanovic {
215*8a106958SDamjan Jovanovic     const S_Data *
216*8a106958SDamjan Jovanovic         pTemp = new S_Data( i_itBegin,
217*8a106958SDamjan Jovanovic                             size_type(i_itEnd - i_itBegin) );
218*8a106958SDamjan Jovanovic     pd->Release();
219*8a106958SDamjan Jovanovic     pd = pTemp;
220*8a106958SDamjan Jovanovic }
221*8a106958SDamjan Jovanovic 
222*8a106958SDamjan Jovanovic 
223*8a106958SDamjan Jovanovic int
compare(const self & i_rStr) const224*8a106958SDamjan Jovanovic String::compare( const self & i_rStr ) const
225*8a106958SDamjan Jovanovic {
226*8a106958SDamjan Jovanovic     return strcmp( c_str(), i_rStr.c_str() );
227*8a106958SDamjan Jovanovic }
228*8a106958SDamjan Jovanovic 
229*8a106958SDamjan Jovanovic int
compare(const CharOrder_Table & i_rOrder,const self & i_rStr) const230*8a106958SDamjan Jovanovic String::compare( const CharOrder_Table & i_rOrder,
231*8a106958SDamjan Jovanovic                  const self &            i_rStr ) const
232*8a106958SDamjan Jovanovic {
233*8a106958SDamjan Jovanovic     return csv::compare( i_rOrder, c_str(), i_rStr.c_str() );
234*8a106958SDamjan Jovanovic }
235*8a106958SDamjan Jovanovic 
236*8a106958SDamjan Jovanovic String
substr(position_type i_nStartPosition,size_type i_nLength) const237*8a106958SDamjan Jovanovic String::substr( position_type       i_nStartPosition,
238*8a106958SDamjan Jovanovic                 size_type           i_nLength ) const
239*8a106958SDamjan Jovanovic {
240*8a106958SDamjan Jovanovic     size_type nSize = size();
241*8a106958SDamjan Jovanovic 
242*8a106958SDamjan Jovanovic     if ( i_nStartPosition < nSize )
243*8a106958SDamjan Jovanovic     {
244*8a106958SDamjan Jovanovic         if ( i_nLength == str::maxsize
245*8a106958SDamjan Jovanovic              OR i_nLength >= nSize - i_nStartPosition )
246*8a106958SDamjan Jovanovic             return String( c_str() + i_nStartPosition );
247*8a106958SDamjan Jovanovic         else
248*8a106958SDamjan Jovanovic             return String( c_str() + i_nStartPosition,
249*8a106958SDamjan Jovanovic                                  i_nLength );
250*8a106958SDamjan Jovanovic     }
251*8a106958SDamjan Jovanovic 
252*8a106958SDamjan Jovanovic     return Null_();
253*8a106958SDamjan Jovanovic }
254*8a106958SDamjan Jovanovic 
255*8a106958SDamjan Jovanovic String::position_type
find(const char * i_strToSearch,position_type i_nSearchStartPosition) const256*8a106958SDamjan Jovanovic String::find( const char *        i_strToSearch,
257*8a106958SDamjan Jovanovic               position_type       i_nSearchStartPosition ) const
258*8a106958SDamjan Jovanovic {
259*8a106958SDamjan Jovanovic     csv_assert(i_strToSearch != 0);
260*8a106958SDamjan Jovanovic 
261*8a106958SDamjan Jovanovic     if ( i_nSearchStartPosition < length()
262*8a106958SDamjan Jovanovic          AND
263*8a106958SDamjan Jovanovic          *i_strToSearch != '\0' )
264*8a106958SDamjan Jovanovic     {
265*8a106958SDamjan Jovanovic         const char * p = strstr(c_str() + i_nSearchStartPosition, i_strToSearch);
266*8a106958SDamjan Jovanovic         if (p != 0)
267*8a106958SDamjan Jovanovic             return static_cast<position_type>(p - c_str());
268*8a106958SDamjan Jovanovic     }
269*8a106958SDamjan Jovanovic     return str::position(str::npos);
270*8a106958SDamjan Jovanovic }
271*8a106958SDamjan Jovanovic 
272*8a106958SDamjan Jovanovic String::position_type
find(char i_charToSearch,position_type i_nSearchStartPosition) const273*8a106958SDamjan Jovanovic String::find( char                i_charToSearch,
274*8a106958SDamjan Jovanovic               position_type       i_nSearchStartPosition ) const
275*8a106958SDamjan Jovanovic {
276*8a106958SDamjan Jovanovic     if (i_nSearchStartPosition <= length())
277*8a106958SDamjan Jovanovic     {
278*8a106958SDamjan Jovanovic         const char * p = strchr(c_str() + i_nSearchStartPosition, i_charToSearch);
279*8a106958SDamjan Jovanovic         if (p != 0)
280*8a106958SDamjan Jovanovic             return static_cast<position_type>(p - c_str());
281*8a106958SDamjan Jovanovic     }
282*8a106958SDamjan Jovanovic     return str::position(str::npos);
283*8a106958SDamjan Jovanovic }
284*8a106958SDamjan Jovanovic 
285*8a106958SDamjan Jovanovic const String &
Null_()286*8a106958SDamjan Jovanovic String::Null_()
287*8a106958SDamjan Jovanovic {
288*8a106958SDamjan Jovanovic     // Must not use the default constructor! Because that one calls
289*8a106958SDamjan Jovanovic     //   this function, which would create a circular dependency.
290*8a106958SDamjan Jovanovic     static const String aNull_("");
291*8a106958SDamjan Jovanovic     return aNull_;
292*8a106958SDamjan Jovanovic }
293*8a106958SDamjan Jovanovic 
294*8a106958SDamjan Jovanovic const char &
Nulch_()295*8a106958SDamjan Jovanovic String::Nulch_()
296*8a106958SDamjan Jovanovic {
297*8a106958SDamjan Jovanovic     static const char cNull_ = '\0';
298*8a106958SDamjan Jovanovic     return cNull_;
299*8a106958SDamjan Jovanovic }
300*8a106958SDamjan Jovanovic 
301*8a106958SDamjan Jovanovic 
302*8a106958SDamjan Jovanovic int
compare(const String & i_s1,csv::str::position i_nStartPosition1,const char * i_s2,csv::str::size i_nLength)303*8a106958SDamjan Jovanovic compare( const String &      i_s1,
304*8a106958SDamjan Jovanovic          csv::str::position        i_nStartPosition1,
305*8a106958SDamjan Jovanovic          const char *              i_s2,
306*8a106958SDamjan Jovanovic          csv::str::size            i_nLength )
307*8a106958SDamjan Jovanovic {
308*8a106958SDamjan Jovanovic     const char * pS1 = str_from_StringOffset( i_s1, i_nStartPosition1 );
309*8a106958SDamjan Jovanovic 
310*8a106958SDamjan Jovanovic     if ( i_nLength != csv::str::maxsize )
311*8a106958SDamjan Jovanovic         return strncmp( pS1,
312*8a106958SDamjan Jovanovic                         i_s2,
313*8a106958SDamjan Jovanovic                         i_nLength );
314*8a106958SDamjan Jovanovic     else
315*8a106958SDamjan Jovanovic         return strcmp( pS1,
316*8a106958SDamjan Jovanovic                        i_s2 );
317*8a106958SDamjan Jovanovic }
318*8a106958SDamjan Jovanovic 
319*8a106958SDamjan Jovanovic int
compare(const char * i_s1,const String & i_s2,csv::str::position i_nStartPosition2,csv::str::size i_nLength)320*8a106958SDamjan Jovanovic compare( const char *              i_s1,
321*8a106958SDamjan Jovanovic          const String &      i_s2,
322*8a106958SDamjan Jovanovic          csv::str::position        i_nStartPosition2,
323*8a106958SDamjan Jovanovic          csv::str::size            i_nLength )
324*8a106958SDamjan Jovanovic {
325*8a106958SDamjan Jovanovic     const char * pS2 = str_from_StringOffset( i_s2, i_nStartPosition2 );
326*8a106958SDamjan Jovanovic 
327*8a106958SDamjan Jovanovic     if ( i_nLength != csv::str::maxsize )
328*8a106958SDamjan Jovanovic         return strncmp( i_s1,
329*8a106958SDamjan Jovanovic                         pS2,
330*8a106958SDamjan Jovanovic                         i_nLength );
331*8a106958SDamjan Jovanovic     else
332*8a106958SDamjan Jovanovic         return strcmp( i_s1,
333*8a106958SDamjan Jovanovic                        pS2 );
334*8a106958SDamjan Jovanovic }
335*8a106958SDamjan Jovanovic 
336*8a106958SDamjan Jovanovic int
compare(const CharOrder_Table & i_rOrder,const char * i_s1,const char * i_s2)337*8a106958SDamjan Jovanovic compare( const CharOrder_Table &            i_rOrder,
338*8a106958SDamjan Jovanovic          const char *                       i_s1,
339*8a106958SDamjan Jovanovic          const char *                       i_s2 )
340*8a106958SDamjan Jovanovic {
341*8a106958SDamjan Jovanovic     const char * it1 = i_s1;
342*8a106958SDamjan Jovanovic     const char * it2 = i_s2;
343*8a106958SDamjan Jovanovic     for ( ; i_rOrder(*it1) == i_rOrder(*it2) AND *it1 != '\0'; ++it1, ++it2 )
344*8a106958SDamjan Jovanovic     {}
345*8a106958SDamjan Jovanovic     return int( i_rOrder(*it1) - i_rOrder(*it2) );
346*8a106958SDamjan Jovanovic }
347*8a106958SDamjan Jovanovic 
348*8a106958SDamjan Jovanovic int
compare(const CharOrder_Table & i_rOrder,const String & i_s1,csv::str::position i_nStartPosition1,const char * i_s2,csv::str::size i_nLength)349*8a106958SDamjan Jovanovic compare( const CharOrder_Table &   i_rOrder,
350*8a106958SDamjan Jovanovic          const String &      i_s1,
351*8a106958SDamjan Jovanovic          csv::str::position        i_nStartPosition1,
352*8a106958SDamjan Jovanovic          const char *              i_s2,
353*8a106958SDamjan Jovanovic          csv::str::size            i_nLength )
354*8a106958SDamjan Jovanovic {
355*8a106958SDamjan Jovanovic     const char * pS1 = str_from_StringOffset( i_s1, i_nStartPosition1 );
356*8a106958SDamjan Jovanovic 
357*8a106958SDamjan Jovanovic     if ( i_nLength != csv::str::maxsize )
358*8a106958SDamjan Jovanovic         return compare( i_rOrder,
359*8a106958SDamjan Jovanovic                         pS1,
360*8a106958SDamjan Jovanovic                         i_s2,
361*8a106958SDamjan Jovanovic                         i_nLength );
362*8a106958SDamjan Jovanovic     else
363*8a106958SDamjan Jovanovic         return compare( i_rOrder,
364*8a106958SDamjan Jovanovic                         pS1,
365*8a106958SDamjan Jovanovic                         i_s2 );
366*8a106958SDamjan Jovanovic }
367*8a106958SDamjan Jovanovic 
368*8a106958SDamjan Jovanovic int
compare(const CharOrder_Table & i_rOrder,const char * i_s1,const String & i_s2,csv::str::position i_nStartPosition2,csv::str::size i_nLength)369*8a106958SDamjan Jovanovic compare( const CharOrder_Table &   i_rOrder,
370*8a106958SDamjan Jovanovic          const char *              i_s1,
371*8a106958SDamjan Jovanovic          const String &            i_s2,
372*8a106958SDamjan Jovanovic          csv::str::position        i_nStartPosition2,
373*8a106958SDamjan Jovanovic          csv::str::size                 i_nLength )
374*8a106958SDamjan Jovanovic {
375*8a106958SDamjan Jovanovic     const char * pS2 = str_from_StringOffset( i_s2, i_nStartPosition2 );
376*8a106958SDamjan Jovanovic 
377*8a106958SDamjan Jovanovic     if ( i_nLength != csv::str::maxsize )
378*8a106958SDamjan Jovanovic         return compare( i_rOrder,
379*8a106958SDamjan Jovanovic                         i_s1,
380*8a106958SDamjan Jovanovic                         pS2,
381*8a106958SDamjan Jovanovic                         i_nLength );
382*8a106958SDamjan Jovanovic     else
383*8a106958SDamjan Jovanovic         return compare( i_rOrder,
384*8a106958SDamjan Jovanovic                         i_s1,
385*8a106958SDamjan Jovanovic                         pS2 );
386*8a106958SDamjan Jovanovic }
387*8a106958SDamjan Jovanovic 
388*8a106958SDamjan Jovanovic int
compare(const CharOrder_Table & i_rOrder,const char * i_s1,const char * i_s2,csv::str::size i_nLength)389*8a106958SDamjan Jovanovic compare( const CharOrder_Table &            i_rOrder,
390*8a106958SDamjan Jovanovic          const char *                       i_s1,
391*8a106958SDamjan Jovanovic          const char *                       i_s2,
392*8a106958SDamjan Jovanovic          csv::str::size                     i_nLength )
393*8a106958SDamjan Jovanovic {
394*8a106958SDamjan Jovanovic     const char * sEnd = i_s1 + i_nLength;
395*8a106958SDamjan Jovanovic 
396*8a106958SDamjan Jovanovic     const char * it1 = i_s1;
397*8a106958SDamjan Jovanovic     const char * it2 = i_s2;
398*8a106958SDamjan Jovanovic     for ( ; i_rOrder(*it1) == i_rOrder(*it2) AND *it1 != '\0' AND it1 != sEnd; ++it1, ++it2 )
399*8a106958SDamjan Jovanovic     {}
400*8a106958SDamjan Jovanovic 
401*8a106958SDamjan Jovanovic     if ( it1 != sEnd )
402*8a106958SDamjan Jovanovic         return int( i_rOrder(*it1) - i_rOrder(*it2) );
403*8a106958SDamjan Jovanovic     else
404*8a106958SDamjan Jovanovic         return 0;
405*8a106958SDamjan Jovanovic }
406*8a106958SDamjan Jovanovic 
407*8a106958SDamjan Jovanovic 
408*8a106958SDamjan Jovanovic 
409*8a106958SDamjan Jovanovic 
410*8a106958SDamjan Jovanovic }   // namespace csv
411