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