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