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