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