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 * 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 * 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:: 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:: 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:: 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:: 82*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:: 94*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 109*8a106958SDamjan Jovanovic String::String() 110*8a106958SDamjan Jovanovic : pd( String::Null_().pd->Acquire() ) 111*8a106958SDamjan Jovanovic { 112*8a106958SDamjan Jovanovic } 113*8a106958SDamjan Jovanovic 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 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 */ 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 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 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 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 & 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 & 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 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 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 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 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 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 224*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 230*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 237*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 256*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 273*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 & 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 & 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 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 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 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 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 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 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