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/streamstr.hxx> 26*8a106958SDamjan Jovanovic 27*8a106958SDamjan Jovanovic // NOT FULLY DECLARED SERVICES 28*8a106958SDamjan Jovanovic #include <string.h> 29*8a106958SDamjan Jovanovic #include <stdio.h> 30*8a106958SDamjan Jovanovic #include <stdarg.h> // both are needed to satisfy all compilers 31*8a106958SDamjan Jovanovic #include <cstdarg> // std::va_list and friends 32*8a106958SDamjan Jovanovic 33*8a106958SDamjan Jovanovic #include <cosv/comfunc.hxx> 34*8a106958SDamjan Jovanovic #include <cosv/tpl/swelist.hxx> 35*8a106958SDamjan Jovanovic 36*8a106958SDamjan Jovanovic 37*8a106958SDamjan Jovanovic 38*8a106958SDamjan Jovanovic namespace csv 39*8a106958SDamjan Jovanovic { 40*8a106958SDamjan Jovanovic 41*8a106958SDamjan Jovanovic 42*8a106958SDamjan Jovanovic // Maximal sizes of resulting integers in text form: 43*8a106958SDamjan Jovanovic const uintt C_short_max_size = sizeof(short) * 3; 44*8a106958SDamjan Jovanovic const uintt C_int_max_size = sizeof(int) * 3; 45*8a106958SDamjan Jovanovic const uintt C_long_max_size = sizeof(long) * 3; 46*8a106958SDamjan Jovanovic 47*8a106958SDamjan Jovanovic 48*8a106958SDamjan Jovanovic inline void 49*8a106958SDamjan Jovanovic StreamStr::Advance(size_type i_nAddedSize) 50*8a106958SDamjan Jovanovic { pCur += i_nAddedSize; } 51*8a106958SDamjan Jovanovic 52*8a106958SDamjan Jovanovic 53*8a106958SDamjan Jovanovic 54*8a106958SDamjan Jovanovic StreamStr::StreamStr( size_type i_nCapacity ) 55*8a106958SDamjan Jovanovic : bostream(), 56*8a106958SDamjan Jovanovic nCapacity1( i_nCapacity + 1 ), 57*8a106958SDamjan Jovanovic dpData( new char [i_nCapacity + 1] ), 58*8a106958SDamjan Jovanovic pEnd(dpData), 59*8a106958SDamjan Jovanovic pCur(dpData), 60*8a106958SDamjan Jovanovic eMode(str::overwrite) 61*8a106958SDamjan Jovanovic { 62*8a106958SDamjan Jovanovic *pEnd = '\0'; 63*8a106958SDamjan Jovanovic } 64*8a106958SDamjan Jovanovic 65*8a106958SDamjan Jovanovic StreamStr::StreamStr( const char * i_sInitStr, 66*8a106958SDamjan Jovanovic size_type i_nCapacity ) 67*8a106958SDamjan Jovanovic : bostream(), 68*8a106958SDamjan Jovanovic nCapacity1(0), 69*8a106958SDamjan Jovanovic dpData(0), 70*8a106958SDamjan Jovanovic pEnd(0), 71*8a106958SDamjan Jovanovic pCur(0), 72*8a106958SDamjan Jovanovic eMode(str::overwrite) 73*8a106958SDamjan Jovanovic { 74*8a106958SDamjan Jovanovic size_type nLength = strlen(i_sInitStr); 75*8a106958SDamjan Jovanovic nCapacity1 = csv::max(nLength, i_nCapacity) + 1; 76*8a106958SDamjan Jovanovic dpData = new char [nCapacity1]; 77*8a106958SDamjan Jovanovic strcpy(dpData, i_sInitStr); // SAFE STRCPY (#100211# - checked) 78*8a106958SDamjan Jovanovic pCur = dpData + nLength; 79*8a106958SDamjan Jovanovic pEnd = pCur; 80*8a106958SDamjan Jovanovic } 81*8a106958SDamjan Jovanovic 82*8a106958SDamjan Jovanovic StreamStr::StreamStr( size_type i_nGuessedCapacity, 83*8a106958SDamjan Jovanovic const char * str1, 84*8a106958SDamjan Jovanovic const char * str2, 85*8a106958SDamjan Jovanovic ... ) 86*8a106958SDamjan Jovanovic : bostream(), 87*8a106958SDamjan Jovanovic nCapacity1( i_nGuessedCapacity + 1 ), 88*8a106958SDamjan Jovanovic dpData( new char [i_nGuessedCapacity + 1] ), 89*8a106958SDamjan Jovanovic pEnd(dpData), 90*8a106958SDamjan Jovanovic pCur(dpData), 91*8a106958SDamjan Jovanovic eMode(str::overwrite) 92*8a106958SDamjan Jovanovic { 93*8a106958SDamjan Jovanovic *pEnd = '\0'; 94*8a106958SDamjan Jovanovic 95*8a106958SDamjan Jovanovic operator<<(str1); 96*8a106958SDamjan Jovanovic operator<<(str2); 97*8a106958SDamjan Jovanovic 98*8a106958SDamjan Jovanovic ::va_list ap; 99*8a106958SDamjan Jovanovic 100*8a106958SDamjan Jovanovic va_start(ap, str2); 101*8a106958SDamjan Jovanovic for ( const char * strAdd = va_arg(ap,const char*); 102*8a106958SDamjan Jovanovic strAdd != 0; 103*8a106958SDamjan Jovanovic strAdd = va_arg(ap,const char*) ) 104*8a106958SDamjan Jovanovic { 105*8a106958SDamjan Jovanovic size_type nLen = strlen(strAdd); 106*8a106958SDamjan Jovanovic ProvideAddingSize( nLen ); 107*8a106958SDamjan Jovanovic memcpy(pCur, strAdd, nLen); 108*8a106958SDamjan Jovanovic Advance(nLen); 109*8a106958SDamjan Jovanovic } // end for 110*8a106958SDamjan Jovanovic va_end(ap); 111*8a106958SDamjan Jovanovic } 112*8a106958SDamjan Jovanovic 113*8a106958SDamjan Jovanovic StreamStr::StreamStr( const self & i_rOther ) 114*8a106958SDamjan Jovanovic : bostream(), 115*8a106958SDamjan Jovanovic nCapacity1( i_rOther.nCapacity1 ), 116*8a106958SDamjan Jovanovic dpData( new char [i_rOther.nCapacity1] ), 117*8a106958SDamjan Jovanovic pEnd( dpData + strlen(i_rOther.dpData) ), 118*8a106958SDamjan Jovanovic pCur( dpData + i_rOther.tellp() ), 119*8a106958SDamjan Jovanovic eMode(i_rOther.eMode) 120*8a106958SDamjan Jovanovic { 121*8a106958SDamjan Jovanovic strcpy( dpData, i_rOther.dpData ); // SAFE STRCPY (#100211# - checked) 122*8a106958SDamjan Jovanovic } 123*8a106958SDamjan Jovanovic 124*8a106958SDamjan Jovanovic StreamStr::StreamStr(csv::bstream & i_source) 125*8a106958SDamjan Jovanovic : bostream(), 126*8a106958SDamjan Jovanovic nCapacity1(0), 127*8a106958SDamjan Jovanovic dpData(0), 128*8a106958SDamjan Jovanovic pEnd(0), 129*8a106958SDamjan Jovanovic pCur(0), 130*8a106958SDamjan Jovanovic eMode(str::overwrite) 131*8a106958SDamjan Jovanovic { 132*8a106958SDamjan Jovanovic i_source.seek(0, csv::end); 133*8a106958SDamjan Jovanovic nCapacity1 = static_cast<size_type>(i_source.position()) + 1; 134*8a106958SDamjan Jovanovic i_source.seek(0); 135*8a106958SDamjan Jovanovic 136*8a106958SDamjan Jovanovic dpData = new char[nCapacity1]; 137*8a106958SDamjan Jovanovic i_source.read(dpData, nCapacity1 - 1); 138*8a106958SDamjan Jovanovic pCur = dpData + nCapacity1 - 1; 139*8a106958SDamjan Jovanovic pEnd = pCur; 140*8a106958SDamjan Jovanovic *pCur = '\0'; 141*8a106958SDamjan Jovanovic } 142*8a106958SDamjan Jovanovic 143*8a106958SDamjan Jovanovic StreamStr::~StreamStr() 144*8a106958SDamjan Jovanovic { 145*8a106958SDamjan Jovanovic delete [] dpData; 146*8a106958SDamjan Jovanovic } 147*8a106958SDamjan Jovanovic 148*8a106958SDamjan Jovanovic 149*8a106958SDamjan Jovanovic StreamStr & 150*8a106958SDamjan Jovanovic StreamStr::operator=( const self & i_rOther ) 151*8a106958SDamjan Jovanovic { 152*8a106958SDamjan Jovanovic delete [] dpData; 153*8a106958SDamjan Jovanovic 154*8a106958SDamjan Jovanovic nCapacity1 = i_rOther.nCapacity1; 155*8a106958SDamjan Jovanovic dpData = new char [i_rOther.nCapacity1]; 156*8a106958SDamjan Jovanovic pEnd = dpData + strlen(i_rOther.dpData); 157*8a106958SDamjan Jovanovic strcpy( dpData, i_rOther.dpData ); // SAFE STRCPY (#100211# - checked) 158*8a106958SDamjan Jovanovic pCur = dpData + i_rOther.tellp(); 159*8a106958SDamjan Jovanovic eMode = i_rOther.eMode; 160*8a106958SDamjan Jovanovic 161*8a106958SDamjan Jovanovic return *this; 162*8a106958SDamjan Jovanovic } 163*8a106958SDamjan Jovanovic 164*8a106958SDamjan Jovanovic StreamStr & 165*8a106958SDamjan Jovanovic StreamStr::operator<<( const char * i_s ) 166*8a106958SDamjan Jovanovic { 167*8a106958SDamjan Jovanovic size_type nLength = strlen(i_s); 168*8a106958SDamjan Jovanovic 169*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 170*8a106958SDamjan Jovanovic memcpy( pCur, i_s, nLength ); 171*8a106958SDamjan Jovanovic Advance(nLength); 172*8a106958SDamjan Jovanovic 173*8a106958SDamjan Jovanovic return *this; 174*8a106958SDamjan Jovanovic } 175*8a106958SDamjan Jovanovic 176*8a106958SDamjan Jovanovic StreamStr & 177*8a106958SDamjan Jovanovic StreamStr::operator<<( const String & i_s ) 178*8a106958SDamjan Jovanovic { 179*8a106958SDamjan Jovanovic size_type nLength = i_s.length(); 180*8a106958SDamjan Jovanovic 181*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 182*8a106958SDamjan Jovanovic memcpy( pCur, i_s.c_str(), nLength ); 183*8a106958SDamjan Jovanovic Advance(nLength); 184*8a106958SDamjan Jovanovic 185*8a106958SDamjan Jovanovic return *this; 186*8a106958SDamjan Jovanovic } 187*8a106958SDamjan Jovanovic 188*8a106958SDamjan Jovanovic StreamStr & 189*8a106958SDamjan Jovanovic StreamStr::operator<<( char i_c ) 190*8a106958SDamjan Jovanovic { 191*8a106958SDamjan Jovanovic ProvideAddingSize( 1 ); 192*8a106958SDamjan Jovanovic *pCur = i_c; 193*8a106958SDamjan Jovanovic Advance(1); 194*8a106958SDamjan Jovanovic 195*8a106958SDamjan Jovanovic return *this; 196*8a106958SDamjan Jovanovic } 197*8a106958SDamjan Jovanovic 198*8a106958SDamjan Jovanovic StreamStr & 199*8a106958SDamjan Jovanovic StreamStr::operator<<( unsigned char i_c ) 200*8a106958SDamjan Jovanovic { 201*8a106958SDamjan Jovanovic return operator<<( char(i_c) ); 202*8a106958SDamjan Jovanovic } 203*8a106958SDamjan Jovanovic 204*8a106958SDamjan Jovanovic StreamStr & 205*8a106958SDamjan Jovanovic StreamStr::operator<<( signed char i_c ) 206*8a106958SDamjan Jovanovic { 207*8a106958SDamjan Jovanovic return operator<<( char(i_c) ); 208*8a106958SDamjan Jovanovic } 209*8a106958SDamjan Jovanovic 210*8a106958SDamjan Jovanovic StreamStr & 211*8a106958SDamjan Jovanovic StreamStr::operator<<( short i_n ) 212*8a106958SDamjan Jovanovic { 213*8a106958SDamjan Jovanovic char buf[C_short_max_size] = ""; 214*8a106958SDamjan Jovanovic sprintf( buf, "%hi", i_n ); // SAFE SPRINTF (#100211# - checked) 215*8a106958SDamjan Jovanovic 216*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 217*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 218*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 219*8a106958SDamjan Jovanovic Advance( nLength ); 220*8a106958SDamjan Jovanovic 221*8a106958SDamjan Jovanovic return *this; 222*8a106958SDamjan Jovanovic } 223*8a106958SDamjan Jovanovic 224*8a106958SDamjan Jovanovic StreamStr & 225*8a106958SDamjan Jovanovic StreamStr::operator<<( unsigned short i_n ) 226*8a106958SDamjan Jovanovic { 227*8a106958SDamjan Jovanovic char buf[C_short_max_size] = ""; 228*8a106958SDamjan Jovanovic sprintf( buf, "%hu", i_n ); // SAFE SPRINTF (#100211# - checked) 229*8a106958SDamjan Jovanovic 230*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 231*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 232*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 233*8a106958SDamjan Jovanovic Advance( nLength ); 234*8a106958SDamjan Jovanovic 235*8a106958SDamjan Jovanovic return *this; 236*8a106958SDamjan Jovanovic } 237*8a106958SDamjan Jovanovic 238*8a106958SDamjan Jovanovic StreamStr & 239*8a106958SDamjan Jovanovic StreamStr::operator<<( int i_n ) 240*8a106958SDamjan Jovanovic { 241*8a106958SDamjan Jovanovic char buf[C_int_max_size] = ""; 242*8a106958SDamjan Jovanovic sprintf( buf, "%i", i_n ); // SAFE SPRINTF (#100211# - checked) 243*8a106958SDamjan Jovanovic 244*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 245*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 246*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 247*8a106958SDamjan Jovanovic Advance( nLength ); 248*8a106958SDamjan Jovanovic 249*8a106958SDamjan Jovanovic return *this; 250*8a106958SDamjan Jovanovic } 251*8a106958SDamjan Jovanovic 252*8a106958SDamjan Jovanovic StreamStr & 253*8a106958SDamjan Jovanovic StreamStr::operator<<( unsigned int i_n ) 254*8a106958SDamjan Jovanovic { 255*8a106958SDamjan Jovanovic char buf[C_int_max_size] = ""; 256*8a106958SDamjan Jovanovic sprintf( buf, "%u", i_n ); // SAFE SPRINTF (#100211# - checked) 257*8a106958SDamjan Jovanovic 258*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 259*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 260*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 261*8a106958SDamjan Jovanovic Advance( nLength ); 262*8a106958SDamjan Jovanovic 263*8a106958SDamjan Jovanovic return *this; 264*8a106958SDamjan Jovanovic } 265*8a106958SDamjan Jovanovic 266*8a106958SDamjan Jovanovic StreamStr & 267*8a106958SDamjan Jovanovic StreamStr::operator<<( long i_n ) 268*8a106958SDamjan Jovanovic { 269*8a106958SDamjan Jovanovic char buf[C_long_max_size] = ""; 270*8a106958SDamjan Jovanovic sprintf( buf, "%li", i_n ); // SAFE SPRINTF (#100211# - checked) 271*8a106958SDamjan Jovanovic 272*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 273*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 274*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 275*8a106958SDamjan Jovanovic Advance( nLength ); 276*8a106958SDamjan Jovanovic 277*8a106958SDamjan Jovanovic return *this; 278*8a106958SDamjan Jovanovic } 279*8a106958SDamjan Jovanovic 280*8a106958SDamjan Jovanovic StreamStr & 281*8a106958SDamjan Jovanovic StreamStr::operator<<( unsigned long i_n ) 282*8a106958SDamjan Jovanovic { 283*8a106958SDamjan Jovanovic char buf[C_long_max_size] = ""; 284*8a106958SDamjan Jovanovic sprintf( buf, "%lu", i_n ); // SAFE SPRINTF (#100211# - checked) 285*8a106958SDamjan Jovanovic 286*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 287*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 288*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 289*8a106958SDamjan Jovanovic Advance( nLength ); 290*8a106958SDamjan Jovanovic 291*8a106958SDamjan Jovanovic return *this; 292*8a106958SDamjan Jovanovic } 293*8a106958SDamjan Jovanovic 294*8a106958SDamjan Jovanovic StreamStr & 295*8a106958SDamjan Jovanovic StreamStr::operator<<( float i_n ) 296*8a106958SDamjan Jovanovic { 297*8a106958SDamjan Jovanovic const int C_float_max_size = 20; 298*8a106958SDamjan Jovanovic char buf[C_float_max_size] = ""; 299*8a106958SDamjan Jovanovic sprintf( buf, "%.*g", C_float_max_size-8, i_n ); // SAFE SPRINTF (#100211# - checked) 300*8a106958SDamjan Jovanovic 301*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 302*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 303*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 304*8a106958SDamjan Jovanovic Advance( nLength ); 305*8a106958SDamjan Jovanovic 306*8a106958SDamjan Jovanovic return *this; 307*8a106958SDamjan Jovanovic } 308*8a106958SDamjan Jovanovic 309*8a106958SDamjan Jovanovic StreamStr & 310*8a106958SDamjan Jovanovic StreamStr::operator<<( double i_n ) 311*8a106958SDamjan Jovanovic { 312*8a106958SDamjan Jovanovic const int C_double_max_size = 30; 313*8a106958SDamjan Jovanovic char buf[C_double_max_size] = ""; 314*8a106958SDamjan Jovanovic sprintf( buf, "%.*lg", C_double_max_size-8, i_n ); // SAFE SPRINTF (#100211# - checked) 315*8a106958SDamjan Jovanovic 316*8a106958SDamjan Jovanovic size_type nLength = strlen(buf); 317*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 318*8a106958SDamjan Jovanovic memcpy( pCur, buf, nLength ); 319*8a106958SDamjan Jovanovic Advance( nLength ); 320*8a106958SDamjan Jovanovic 321*8a106958SDamjan Jovanovic return *this; 322*8a106958SDamjan Jovanovic } 323*8a106958SDamjan Jovanovic 324*8a106958SDamjan Jovanovic const char & 325*8a106958SDamjan Jovanovic StreamStr::operator[]( position_type i_nPosition ) const 326*8a106958SDamjan Jovanovic { 327*8a106958SDamjan Jovanovic static const char aNull_ = '\0'; 328*8a106958SDamjan Jovanovic 329*8a106958SDamjan Jovanovic if ( position_type(pEnd - dpData) > i_nPosition ) 330*8a106958SDamjan Jovanovic return dpData[i_nPosition]; 331*8a106958SDamjan Jovanovic return aNull_; 332*8a106958SDamjan Jovanovic } 333*8a106958SDamjan Jovanovic 334*8a106958SDamjan Jovanovic char & 335*8a106958SDamjan Jovanovic StreamStr::operator[]( position_type i_nPosition ) 336*8a106958SDamjan Jovanovic { 337*8a106958SDamjan Jovanovic static char aDummy_ = '\0'; 338*8a106958SDamjan Jovanovic 339*8a106958SDamjan Jovanovic if ( position_type(pEnd - dpData) > i_nPosition ) 340*8a106958SDamjan Jovanovic return dpData[i_nPosition]; 341*8a106958SDamjan Jovanovic return aDummy_; 342*8a106958SDamjan Jovanovic } 343*8a106958SDamjan Jovanovic 344*8a106958SDamjan Jovanovic void 345*8a106958SDamjan Jovanovic StreamStr::resize( size_type i_nMinimumCapacity ) 346*8a106958SDamjan Jovanovic { 347*8a106958SDamjan Jovanovic if ( i_nMinimumCapacity <= capacity() ) 348*8a106958SDamjan Jovanovic return; 349*8a106958SDamjan Jovanovic 350*8a106958SDamjan Jovanovic Resize(i_nMinimumCapacity); 351*8a106958SDamjan Jovanovic } 352*8a106958SDamjan Jovanovic 353*8a106958SDamjan Jovanovic void 354*8a106958SDamjan Jovanovic StreamStr::swap( StreamStr & io_swap ) 355*8a106958SDamjan Jovanovic { 356*8a106958SDamjan Jovanovic size_type 357*8a106958SDamjan Jovanovic n = io_swap.nCapacity1; 358*8a106958SDamjan Jovanovic io_swap.nCapacity1 = nCapacity1; 359*8a106958SDamjan Jovanovic nCapacity1 = n; 360*8a106958SDamjan Jovanovic 361*8a106958SDamjan Jovanovic char * 362*8a106958SDamjan Jovanovic p = io_swap.dpData; 363*8a106958SDamjan Jovanovic io_swap.dpData = dpData; 364*8a106958SDamjan Jovanovic dpData = p; 365*8a106958SDamjan Jovanovic 366*8a106958SDamjan Jovanovic p = io_swap.pEnd; 367*8a106958SDamjan Jovanovic io_swap.pEnd = pEnd; 368*8a106958SDamjan Jovanovic pEnd = p; 369*8a106958SDamjan Jovanovic 370*8a106958SDamjan Jovanovic p = io_swap.pCur; 371*8a106958SDamjan Jovanovic io_swap.pCur = pCur; 372*8a106958SDamjan Jovanovic pCur = p; 373*8a106958SDamjan Jovanovic 374*8a106958SDamjan Jovanovic insert_mode 375*8a106958SDamjan Jovanovic m = io_swap.eMode; 376*8a106958SDamjan Jovanovic io_swap.eMode = eMode; 377*8a106958SDamjan Jovanovic eMode = m; 378*8a106958SDamjan Jovanovic } 379*8a106958SDamjan Jovanovic 380*8a106958SDamjan Jovanovic StreamStr & 381*8a106958SDamjan Jovanovic StreamStr::seekp( seek_type i_nCount, 382*8a106958SDamjan Jovanovic seek_dir i_eDirection ) 383*8a106958SDamjan Jovanovic { 384*8a106958SDamjan Jovanovic seek_type nLength = seek_type( length() ); 385*8a106958SDamjan Jovanovic seek_type nNewPos = tellp(); 386*8a106958SDamjan Jovanovic 387*8a106958SDamjan Jovanovic switch ( i_eDirection ) 388*8a106958SDamjan Jovanovic { 389*8a106958SDamjan Jovanovic case ::csv::beg: nNewPos = i_nCount; 390*8a106958SDamjan Jovanovic break; 391*8a106958SDamjan Jovanovic case ::csv::cur: nNewPos += i_nCount; 392*8a106958SDamjan Jovanovic break; 393*8a106958SDamjan Jovanovic case ::csv::end: nNewPos = nLength + i_nCount; 394*8a106958SDamjan Jovanovic break; 395*8a106958SDamjan Jovanovic } 396*8a106958SDamjan Jovanovic 397*8a106958SDamjan Jovanovic if ( in_range<seek_type>(0, nNewPos, nLength + 1) ) 398*8a106958SDamjan Jovanovic { 399*8a106958SDamjan Jovanovic pCur = dpData + nNewPos; 400*8a106958SDamjan Jovanovic if (eMode == str::overwrite) 401*8a106958SDamjan Jovanovic { 402*8a106958SDamjan Jovanovic pEnd = pCur; 403*8a106958SDamjan Jovanovic *pEnd = '\0'; 404*8a106958SDamjan Jovanovic } 405*8a106958SDamjan Jovanovic } 406*8a106958SDamjan Jovanovic 407*8a106958SDamjan Jovanovic return *this; 408*8a106958SDamjan Jovanovic } 409*8a106958SDamjan Jovanovic 410*8a106958SDamjan Jovanovic StreamStr & 411*8a106958SDamjan Jovanovic StreamStr::set_insert_mode( insert_mode i_eMode ) 412*8a106958SDamjan Jovanovic { 413*8a106958SDamjan Jovanovic eMode = i_eMode; 414*8a106958SDamjan Jovanovic return *this; 415*8a106958SDamjan Jovanovic } 416*8a106958SDamjan Jovanovic 417*8a106958SDamjan Jovanovic void 418*8a106958SDamjan Jovanovic StreamStr::push_front( const char * i_str ) 419*8a106958SDamjan Jovanovic { 420*8a106958SDamjan Jovanovic insert_mode eOriginalMode = eMode; 421*8a106958SDamjan Jovanovic char * pOriginalCur = pCur; 422*8a106958SDamjan Jovanovic eMode = str::insert; 423*8a106958SDamjan Jovanovic pCur = dpData; 424*8a106958SDamjan Jovanovic 425*8a106958SDamjan Jovanovic operator<<(i_str); 426*8a106958SDamjan Jovanovic 427*8a106958SDamjan Jovanovic eMode = eOriginalMode; 428*8a106958SDamjan Jovanovic pCur = pOriginalCur + strlen(i_str); 429*8a106958SDamjan Jovanovic } 430*8a106958SDamjan Jovanovic 431*8a106958SDamjan Jovanovic void 432*8a106958SDamjan Jovanovic StreamStr::push_front( char i_c ) 433*8a106958SDamjan Jovanovic { 434*8a106958SDamjan Jovanovic insert_mode eOriginalMode = eMode; 435*8a106958SDamjan Jovanovic char * pOriginalCur = pCur; 436*8a106958SDamjan Jovanovic eMode = str::insert; 437*8a106958SDamjan Jovanovic pCur = dpData; 438*8a106958SDamjan Jovanovic 439*8a106958SDamjan Jovanovic operator<<(i_c); 440*8a106958SDamjan Jovanovic 441*8a106958SDamjan Jovanovic eMode = eOriginalMode; 442*8a106958SDamjan Jovanovic pCur = pOriginalCur + 1; 443*8a106958SDamjan Jovanovic } 444*8a106958SDamjan Jovanovic 445*8a106958SDamjan Jovanovic void 446*8a106958SDamjan Jovanovic StreamStr::push_back( const char * i_str ) 447*8a106958SDamjan Jovanovic { 448*8a106958SDamjan Jovanovic insert_mode eOriginalMode = eMode; 449*8a106958SDamjan Jovanovic eMode = str::overwrite; 450*8a106958SDamjan Jovanovic 451*8a106958SDamjan Jovanovic operator<<(i_str); 452*8a106958SDamjan Jovanovic 453*8a106958SDamjan Jovanovic eMode = eOriginalMode; 454*8a106958SDamjan Jovanovic } 455*8a106958SDamjan Jovanovic 456*8a106958SDamjan Jovanovic void 457*8a106958SDamjan Jovanovic StreamStr::push_back( char i_c ) 458*8a106958SDamjan Jovanovic { 459*8a106958SDamjan Jovanovic insert_mode eOriginalMode = eMode; 460*8a106958SDamjan Jovanovic eMode = str::overwrite; 461*8a106958SDamjan Jovanovic 462*8a106958SDamjan Jovanovic operator<<(i_c); 463*8a106958SDamjan Jovanovic 464*8a106958SDamjan Jovanovic eMode = eOriginalMode; 465*8a106958SDamjan Jovanovic } 466*8a106958SDamjan Jovanovic 467*8a106958SDamjan Jovanovic void 468*8a106958SDamjan Jovanovic StreamStr::pop_front( size_type i_nCount ) 469*8a106958SDamjan Jovanovic { 470*8a106958SDamjan Jovanovic size_type nCount = min(i_nCount, length()); 471*8a106958SDamjan Jovanovic 472*8a106958SDamjan Jovanovic MoveData( dpData + nCount, pEnd, -(seek_type(nCount)) ); 473*8a106958SDamjan Jovanovic 474*8a106958SDamjan Jovanovic pCur -= nCount; 475*8a106958SDamjan Jovanovic pEnd -= nCount; 476*8a106958SDamjan Jovanovic *pEnd = '\0'; 477*8a106958SDamjan Jovanovic } 478*8a106958SDamjan Jovanovic 479*8a106958SDamjan Jovanovic void 480*8a106958SDamjan Jovanovic StreamStr::pop_back( size_type i_nCount ) 481*8a106958SDamjan Jovanovic { 482*8a106958SDamjan Jovanovic size_type nCount = min(i_nCount, length()); 483*8a106958SDamjan Jovanovic pEnd -= nCount; 484*8a106958SDamjan Jovanovic if (pCur > pEnd) 485*8a106958SDamjan Jovanovic pCur = pEnd; 486*8a106958SDamjan Jovanovic *pEnd = '\0'; 487*8a106958SDamjan Jovanovic } 488*8a106958SDamjan Jovanovic 489*8a106958SDamjan Jovanovic StreamStr & 490*8a106958SDamjan Jovanovic StreamStr::operator_join( std::vector<String>::const_iterator i_rBegin, 491*8a106958SDamjan Jovanovic std::vector<String>::const_iterator i_rEnd, 492*8a106958SDamjan Jovanovic const char * i_sLink ) 493*8a106958SDamjan Jovanovic { 494*8a106958SDamjan Jovanovic std::vector<String>::const_iterator it = i_rBegin; 495*8a106958SDamjan Jovanovic if ( it != i_rEnd ) 496*8a106958SDamjan Jovanovic { 497*8a106958SDamjan Jovanovic operator<<(*it); 498*8a106958SDamjan Jovanovic for ( ++it; it != i_rEnd; ++it ) 499*8a106958SDamjan Jovanovic { 500*8a106958SDamjan Jovanovic operator<<(i_sLink); 501*8a106958SDamjan Jovanovic operator<<(*it); 502*8a106958SDamjan Jovanovic } 503*8a106958SDamjan Jovanovic } 504*8a106958SDamjan Jovanovic return *this; 505*8a106958SDamjan Jovanovic } 506*8a106958SDamjan Jovanovic 507*8a106958SDamjan Jovanovic StreamStr & 508*8a106958SDamjan Jovanovic StreamStr::operator_add_substr( const char * i_sText, 509*8a106958SDamjan Jovanovic size_type i_nLength ) 510*8a106958SDamjan Jovanovic { 511*8a106958SDamjan Jovanovic size_type nLength = csv::min<size_type>(i_nLength, strlen(i_sText)); 512*8a106958SDamjan Jovanovic 513*8a106958SDamjan Jovanovic ProvideAddingSize( nLength ); 514*8a106958SDamjan Jovanovic memcpy( pCur, i_sText, nLength ); 515*8a106958SDamjan Jovanovic Advance(nLength); 516*8a106958SDamjan Jovanovic 517*8a106958SDamjan Jovanovic return *this; 518*8a106958SDamjan Jovanovic } 519*8a106958SDamjan Jovanovic 520*8a106958SDamjan Jovanovic StreamStr & 521*8a106958SDamjan Jovanovic StreamStr::operator_add_token( const char * i_sText, 522*8a106958SDamjan Jovanovic char i_cDelimiter ) 523*8a106958SDamjan Jovanovic { 524*8a106958SDamjan Jovanovic const char * pTokenEnd = strchr(i_sText, i_cDelimiter); 525*8a106958SDamjan Jovanovic if (pTokenEnd == 0) 526*8a106958SDamjan Jovanovic operator<<(i_sText); 527*8a106958SDamjan Jovanovic else 528*8a106958SDamjan Jovanovic operator_add_substr(i_sText, pTokenEnd-i_sText); 529*8a106958SDamjan Jovanovic return *this; 530*8a106958SDamjan Jovanovic } 531*8a106958SDamjan Jovanovic 532*8a106958SDamjan Jovanovic StreamStr & 533*8a106958SDamjan Jovanovic StreamStr::operator_read_line( bstream & i_src ) 534*8a106958SDamjan Jovanovic { 535*8a106958SDamjan Jovanovic char c = 0; 536*8a106958SDamjan Jovanovic intt nCount = 0; 537*8a106958SDamjan Jovanovic for ( nCount = i_src.read(&c, 1); 538*8a106958SDamjan Jovanovic nCount == 1 AND c != 13 AND c != 10; 539*8a106958SDamjan Jovanovic nCount = i_src.read(&c, 1) ) 540*8a106958SDamjan Jovanovic { 541*8a106958SDamjan Jovanovic operator<<(c); 542*8a106958SDamjan Jovanovic } 543*8a106958SDamjan Jovanovic 544*8a106958SDamjan Jovanovic bool bEndOfStream = nCount == 0; 545*8a106958SDamjan Jovanovic // Check for line-end: 546*8a106958SDamjan Jovanovic if ( NOT bEndOfStream AND c != 0 ) 547*8a106958SDamjan Jovanovic { 548*8a106958SDamjan Jovanovic char oldc = c; 549*8a106958SDamjan Jovanovic if (i_src.read(&c, 1) == 1) 550*8a106958SDamjan Jovanovic { 551*8a106958SDamjan Jovanovic if ( (c != 13 AND c != 10) OR c == oldc) 552*8a106958SDamjan Jovanovic i_src.seek(-1,::csv::cur); 553*8a106958SDamjan Jovanovic } 554*8a106958SDamjan Jovanovic } 555*8a106958SDamjan Jovanovic return *this; 556*8a106958SDamjan Jovanovic } 557*8a106958SDamjan Jovanovic 558*8a106958SDamjan Jovanovic void 559*8a106958SDamjan Jovanovic StreamStr::strip_front(char i_cToRemove) 560*8a106958SDamjan Jovanovic { 561*8a106958SDamjan Jovanovic const_iterator it = begin(); 562*8a106958SDamjan Jovanovic for ( ; 563*8a106958SDamjan Jovanovic it != end() ? *it == i_cToRemove : false; 564*8a106958SDamjan Jovanovic ++it ) ; 565*8a106958SDamjan Jovanovic pop_front(it - begin()); 566*8a106958SDamjan Jovanovic } 567*8a106958SDamjan Jovanovic 568*8a106958SDamjan Jovanovic void 569*8a106958SDamjan Jovanovic StreamStr::strip_back(char i_cToRemove) 570*8a106958SDamjan Jovanovic { 571*8a106958SDamjan Jovanovic const_iterator it = end(); 572*8a106958SDamjan Jovanovic for ( ; 573*8a106958SDamjan Jovanovic it != begin() ? *(it-1) == i_cToRemove : false; 574*8a106958SDamjan Jovanovic --it ) ; 575*8a106958SDamjan Jovanovic pop_back(end() - it); 576*8a106958SDamjan Jovanovic } 577*8a106958SDamjan Jovanovic 578*8a106958SDamjan Jovanovic void 579*8a106958SDamjan Jovanovic StreamStr::strip_frontback(char i_cToRemove) 580*8a106958SDamjan Jovanovic { 581*8a106958SDamjan Jovanovic strip_front(i_cToRemove); 582*8a106958SDamjan Jovanovic strip_back(i_cToRemove); 583*8a106958SDamjan Jovanovic } 584*8a106958SDamjan Jovanovic 585*8a106958SDamjan Jovanovic void 586*8a106958SDamjan Jovanovic StreamStr::strip_front_whitespace() 587*8a106958SDamjan Jovanovic { 588*8a106958SDamjan Jovanovic const_iterator it = begin(); 589*8a106958SDamjan Jovanovic for ( ; 590*8a106958SDamjan Jovanovic it != end() ? *it < 33 : false; 591*8a106958SDamjan Jovanovic ++it ) ; 592*8a106958SDamjan Jovanovic pop_front(it - begin()); 593*8a106958SDamjan Jovanovic } 594*8a106958SDamjan Jovanovic 595*8a106958SDamjan Jovanovic void 596*8a106958SDamjan Jovanovic StreamStr::strip_back_whitespace() 597*8a106958SDamjan Jovanovic { 598*8a106958SDamjan Jovanovic const_iterator it = end(); 599*8a106958SDamjan Jovanovic for ( ; 600*8a106958SDamjan Jovanovic it != begin() ? *(it-1) < 33 : false; 601*8a106958SDamjan Jovanovic --it ) ; 602*8a106958SDamjan Jovanovic pop_back(end() - it); 603*8a106958SDamjan Jovanovic } 604*8a106958SDamjan Jovanovic 605*8a106958SDamjan Jovanovic void 606*8a106958SDamjan Jovanovic StreamStr::strip_frontback_whitespace() 607*8a106958SDamjan Jovanovic { 608*8a106958SDamjan Jovanovic strip_front_whitespace(); 609*8a106958SDamjan Jovanovic strip_back_whitespace(); 610*8a106958SDamjan Jovanovic } 611*8a106958SDamjan Jovanovic 612*8a106958SDamjan Jovanovic void 613*8a106958SDamjan Jovanovic StreamStr::remove( iterator i_begin, 614*8a106958SDamjan Jovanovic iterator i_end ) 615*8a106958SDamjan Jovanovic { 616*8a106958SDamjan Jovanovic csv_assert(i_begin >= dpData AND i_begin <= pEnd); 617*8a106958SDamjan Jovanovic csv_assert(i_end >= dpData AND i_end <= pEnd); 618*8a106958SDamjan Jovanovic csv_assert(i_end >= i_begin); 619*8a106958SDamjan Jovanovic MoveData(i_end, pEnd, i_begin - i_end); 620*8a106958SDamjan Jovanovic pCur = pEnd; 621*8a106958SDamjan Jovanovic } 622*8a106958SDamjan Jovanovic 623*8a106958SDamjan Jovanovic void 624*8a106958SDamjan Jovanovic StreamStr::replace( position_type i_nStart, 625*8a106958SDamjan Jovanovic size_type i_nSize, 626*8a106958SDamjan Jovanovic Area i_aReplacement ) 627*8a106958SDamjan Jovanovic { 628*8a106958SDamjan Jovanovic if (i_nStart >= length() OR i_nSize < 1) 629*8a106958SDamjan Jovanovic return; 630*8a106958SDamjan Jovanovic 631*8a106958SDamjan Jovanovic insert_mode eOldMode = eMode; 632*8a106958SDamjan Jovanovic eMode = str::insert; 633*8a106958SDamjan Jovanovic pCur = dpData + i_nStart; 634*8a106958SDamjan Jovanovic 635*8a106958SDamjan Jovanovic size_type anz = min( length() - i_nStart, i_nSize ); 636*8a106958SDamjan Jovanovic 637*8a106958SDamjan Jovanovic if ( anz < i_aReplacement.nLength ) 638*8a106958SDamjan Jovanovic { 639*8a106958SDamjan Jovanovic ProvideAddingSize( i_aReplacement.nLength - anz ); 640*8a106958SDamjan Jovanovic } 641*8a106958SDamjan Jovanovic else if ( anz > i_aReplacement.nLength ) 642*8a106958SDamjan Jovanovic { 643*8a106958SDamjan Jovanovic seek_type nMove = seek_type(anz - i_aReplacement.nLength); 644*8a106958SDamjan Jovanovic 645*8a106958SDamjan Jovanovic MoveData( dpData + i_nStart + anz, 646*8a106958SDamjan Jovanovic pEnd, 647*8a106958SDamjan Jovanovic -nMove ); 648*8a106958SDamjan Jovanovic pEnd -= nMove; 649*8a106958SDamjan Jovanovic *pEnd = '\0'; 650*8a106958SDamjan Jovanovic } 651*8a106958SDamjan Jovanovic 652*8a106958SDamjan Jovanovic if (i_aReplacement.nLength > 0) 653*8a106958SDamjan Jovanovic { 654*8a106958SDamjan Jovanovic memcpy( dpData + i_nStart, i_aReplacement.sStr, i_aReplacement.nLength ); 655*8a106958SDamjan Jovanovic Advance(i_aReplacement.nLength); 656*8a106958SDamjan Jovanovic } 657*8a106958SDamjan Jovanovic 658*8a106958SDamjan Jovanovic eMode = eOldMode; 659*8a106958SDamjan Jovanovic pCur = pEnd; 660*8a106958SDamjan Jovanovic } 661*8a106958SDamjan Jovanovic 662*8a106958SDamjan Jovanovic void 663*8a106958SDamjan Jovanovic StreamStr::replace_all( char i_cCarToSearch, 664*8a106958SDamjan Jovanovic char i_cReplacement ) 665*8a106958SDamjan Jovanovic { 666*8a106958SDamjan Jovanovic for ( char * p = dpData; p != pEnd; ++p ) 667*8a106958SDamjan Jovanovic { 668*8a106958SDamjan Jovanovic if (*p == i_cCarToSearch) 669*8a106958SDamjan Jovanovic *p = i_cReplacement; 670*8a106958SDamjan Jovanovic } 671*8a106958SDamjan Jovanovic } 672*8a106958SDamjan Jovanovic 673*8a106958SDamjan Jovanovic void 674*8a106958SDamjan Jovanovic StreamStr::replace_all( Area i_aStrToSearch, 675*8a106958SDamjan Jovanovic Area i_aReplacement ) 676*8a106958SDamjan Jovanovic { 677*8a106958SDamjan Jovanovic position_type p = 0; 678*8a106958SDamjan Jovanovic const char * pSearch = i_aStrToSearch.sStr; 679*8a106958SDamjan Jovanovic size_type nSearch = i_aStrToSearch.nLength; 680*8a106958SDamjan Jovanovic 681*8a106958SDamjan Jovanovic while ( p <= length() - nSearch ) 682*8a106958SDamjan Jovanovic { 683*8a106958SDamjan Jovanovic if ( strncmp(dpData+p, pSearch, nSearch) == 0 ) 684*8a106958SDamjan Jovanovic { 685*8a106958SDamjan Jovanovic replace( p, nSearch, i_aReplacement ); 686*8a106958SDamjan Jovanovic p += i_aReplacement.nLength; 687*8a106958SDamjan Jovanovic } 688*8a106958SDamjan Jovanovic else 689*8a106958SDamjan Jovanovic { 690*8a106958SDamjan Jovanovic ++p; 691*8a106958SDamjan Jovanovic } 692*8a106958SDamjan Jovanovic } // end while 693*8a106958SDamjan Jovanovic } 694*8a106958SDamjan Jovanovic 695*8a106958SDamjan Jovanovic StreamStr & 696*8a106958SDamjan Jovanovic StreamStr::to_lower( position_type i_nStart, 697*8a106958SDamjan Jovanovic size_type i_nLength ) 698*8a106958SDamjan Jovanovic { 699*8a106958SDamjan Jovanovic static char cLower[128] = 700*8a106958SDamjan Jovanovic { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 701*8a106958SDamjan Jovanovic 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 702*8a106958SDamjan Jovanovic 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 703*8a106958SDamjan Jovanovic 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 704*8a106958SDamjan Jovanovic 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, 705*8a106958SDamjan Jovanovic 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95, 706*8a106958SDamjan Jovanovic 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, 707*8a106958SDamjan Jovanovic 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127 }; 708*8a106958SDamjan Jovanovic 709*8a106958SDamjan Jovanovic if ( i_nStart < length() ) 710*8a106958SDamjan Jovanovic { 711*8a106958SDamjan Jovanovic char * pStop = i_nStart + i_nLength < length() 712*8a106958SDamjan Jovanovic ? dpData + i_nStart + i_nLength 713*8a106958SDamjan Jovanovic : pEnd; 714*8a106958SDamjan Jovanovic for ( char * pChange = dpData + i_nStart; 715*8a106958SDamjan Jovanovic pChange != pStop; 716*8a106958SDamjan Jovanovic ++pChange ) 717*8a106958SDamjan Jovanovic { 718*8a106958SDamjan Jovanovic *pChange = (static_cast< unsigned char >(*pChange) & 0x80) == 0 719*8a106958SDamjan Jovanovic ? cLower[ UINT8(*pChange) ] 720*8a106958SDamjan Jovanovic : *pChange; 721*8a106958SDamjan Jovanovic } 722*8a106958SDamjan Jovanovic } 723*8a106958SDamjan Jovanovic return *this; 724*8a106958SDamjan Jovanovic } 725*8a106958SDamjan Jovanovic 726*8a106958SDamjan Jovanovic StreamStr & 727*8a106958SDamjan Jovanovic StreamStr::to_upper( position_type i_nStart, 728*8a106958SDamjan Jovanovic size_type i_nLength ) 729*8a106958SDamjan Jovanovic { 730*8a106958SDamjan Jovanovic static char cUpper[128] = 731*8a106958SDamjan Jovanovic { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 732*8a106958SDamjan Jovanovic 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 733*8a106958SDamjan Jovanovic 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 734*8a106958SDamjan Jovanovic 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 735*8a106958SDamjan Jovanovic 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 736*8a106958SDamjan Jovanovic 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 737*8a106958SDamjan Jovanovic 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 738*8a106958SDamjan Jovanovic 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127 }; 739*8a106958SDamjan Jovanovic 740*8a106958SDamjan Jovanovic if ( i_nStart < length() ) 741*8a106958SDamjan Jovanovic { 742*8a106958SDamjan Jovanovic char * pStop = i_nStart + i_nLength < length() 743*8a106958SDamjan Jovanovic ? dpData + i_nStart + i_nLength 744*8a106958SDamjan Jovanovic : pEnd; 745*8a106958SDamjan Jovanovic for ( char * pChange = dpData + i_nStart; 746*8a106958SDamjan Jovanovic pChange != pStop; 747*8a106958SDamjan Jovanovic ++pChange ) 748*8a106958SDamjan Jovanovic { 749*8a106958SDamjan Jovanovic *pChange = (static_cast< unsigned char >(*pChange) & 0x80) == 0 750*8a106958SDamjan Jovanovic ? cUpper[ UINT8(*pChange) ] 751*8a106958SDamjan Jovanovic : *pChange; 752*8a106958SDamjan Jovanovic } 753*8a106958SDamjan Jovanovic } 754*8a106958SDamjan Jovanovic return *this; 755*8a106958SDamjan Jovanovic } 756*8a106958SDamjan Jovanovic 757*8a106958SDamjan Jovanovic 758*8a106958SDamjan Jovanovic StreamStr::size_type 759*8a106958SDamjan Jovanovic StreamStr::token_count( char i_cSplit ) const 760*8a106958SDamjan Jovanovic { 761*8a106958SDamjan Jovanovic return count_chars(dpData, i_cSplit) + 1; 762*8a106958SDamjan Jovanovic } 763*8a106958SDamjan Jovanovic 764*8a106958SDamjan Jovanovic String 765*8a106958SDamjan Jovanovic StreamStr::token( position_type i_nNr, 766*8a106958SDamjan Jovanovic char i_cSplit ) const 767*8a106958SDamjan Jovanovic { 768*8a106958SDamjan Jovanovic // Find begin: 769*8a106958SDamjan Jovanovic const char * pTokenBegin = dpData; 770*8a106958SDamjan Jovanovic for ( position_type nNr = i_nNr; 771*8a106958SDamjan Jovanovic nNr > 0; 772*8a106958SDamjan Jovanovic --nNr ) 773*8a106958SDamjan Jovanovic { 774*8a106958SDamjan Jovanovic pTokenBegin = strchr(pTokenBegin,i_cSplit); 775*8a106958SDamjan Jovanovic if (pTokenBegin == 0) 776*8a106958SDamjan Jovanovic return String(""); 777*8a106958SDamjan Jovanovic ++pTokenBegin; 778*8a106958SDamjan Jovanovic } 779*8a106958SDamjan Jovanovic 780*8a106958SDamjan Jovanovic // Find end: 781*8a106958SDamjan Jovanovic const char * pTokenEnd = strchr(pTokenBegin, i_cSplit); 782*8a106958SDamjan Jovanovic if (pTokenEnd == 0) 783*8a106958SDamjan Jovanovic pTokenEnd = pEnd; 784*8a106958SDamjan Jovanovic 785*8a106958SDamjan Jovanovic return String(pTokenBegin, size_type(pTokenEnd-pTokenBegin) ); 786*8a106958SDamjan Jovanovic } 787*8a106958SDamjan Jovanovic 788*8a106958SDamjan Jovanovic class StreamStrPool 789*8a106958SDamjan Jovanovic { 790*8a106958SDamjan Jovanovic public: 791*8a106958SDamjan Jovanovic StreamStrPool(); 792*8a106958SDamjan Jovanovic ~StreamStrPool(); 793*8a106958SDamjan Jovanovic private: 794*8a106958SDamjan Jovanovic // Non-copyable 795*8a106958SDamjan Jovanovic StreamStrPool(StreamStrPool &); // not defined 796*8a106958SDamjan Jovanovic void operator =(StreamStrPool &); // not defined 797*8a106958SDamjan Jovanovic 798*8a106958SDamjan Jovanovic // Interface to: 799*8a106958SDamjan Jovanovic friend class StreamStrLock; 800*8a106958SDamjan Jovanovic static StreamStr & AcquireFromPool_( 801*8a106958SDamjan Jovanovic uintt i_nMinimalSize ); 802*8a106958SDamjan Jovanovic static void ReleaseToPool_( 803*8a106958SDamjan Jovanovic DYN StreamStr * let_dpUsedStr ); 804*8a106958SDamjan Jovanovic 805*8a106958SDamjan Jovanovic // DATA 806*8a106958SDamjan Jovanovic SweList< DYN StreamStr* > 807*8a106958SDamjan Jovanovic aPool; 808*8a106958SDamjan Jovanovic }; 809*8a106958SDamjan Jovanovic 810*8a106958SDamjan Jovanovic StreamStrPool::StreamStrPool() 811*8a106958SDamjan Jovanovic { 812*8a106958SDamjan Jovanovic } 813*8a106958SDamjan Jovanovic 814*8a106958SDamjan Jovanovic StreamStrPool::~StreamStrPool() 815*8a106958SDamjan Jovanovic { 816*8a106958SDamjan Jovanovic for ( SweList< DYN StreamStr* >::iterator it = aPool.begin(); 817*8a106958SDamjan Jovanovic it != aPool.end(); 818*8a106958SDamjan Jovanovic ++it ) 819*8a106958SDamjan Jovanovic { 820*8a106958SDamjan Jovanovic delete (*it); 821*8a106958SDamjan Jovanovic } 822*8a106958SDamjan Jovanovic } 823*8a106958SDamjan Jovanovic 824*8a106958SDamjan Jovanovic namespace 825*8a106958SDamjan Jovanovic { 826*8a106958SDamjan Jovanovic static StreamStrPool aPool_; 827*8a106958SDamjan Jovanovic } 828*8a106958SDamjan Jovanovic 829*8a106958SDamjan Jovanovic 830*8a106958SDamjan Jovanovic StreamStr & 831*8a106958SDamjan Jovanovic StreamStrPool::AcquireFromPool_( uintt i_nMinimalSize ) 832*8a106958SDamjan Jovanovic { 833*8a106958SDamjan Jovanovic if ( aPool_.aPool.empty() ) 834*8a106958SDamjan Jovanovic { 835*8a106958SDamjan Jovanovic return *new StreamStr(i_nMinimalSize); 836*8a106958SDamjan Jovanovic } 837*8a106958SDamjan Jovanovic 838*8a106958SDamjan Jovanovic StreamStr & ret = *aPool_.aPool.front(); 839*8a106958SDamjan Jovanovic aPool_.aPool.pop_front(); 840*8a106958SDamjan Jovanovic ret.resize(i_nMinimalSize); 841*8a106958SDamjan Jovanovic ret.seekp(0); 842*8a106958SDamjan Jovanovic ret.set_insert_mode(str::overwrite); 843*8a106958SDamjan Jovanovic return ret; 844*8a106958SDamjan Jovanovic } 845*8a106958SDamjan Jovanovic 846*8a106958SDamjan Jovanovic void 847*8a106958SDamjan Jovanovic StreamStrPool::ReleaseToPool_( DYN StreamStr * let_dpUsedStr ) 848*8a106958SDamjan Jovanovic { 849*8a106958SDamjan Jovanovic aPool_.aPool.push_back( let_dpUsedStr ); 850*8a106958SDamjan Jovanovic } 851*8a106958SDamjan Jovanovic 852*8a106958SDamjan Jovanovic StreamStrLock::StreamStrLock( uintt i_nMinimalSize ) 853*8a106958SDamjan Jovanovic : pStr( &StreamStrPool::AcquireFromPool_(i_nMinimalSize) ) 854*8a106958SDamjan Jovanovic { 855*8a106958SDamjan Jovanovic } 856*8a106958SDamjan Jovanovic 857*8a106958SDamjan Jovanovic StreamStrLock::~StreamStrLock() 858*8a106958SDamjan Jovanovic { 859*8a106958SDamjan Jovanovic StreamStrPool::ReleaseToPool_(pStr); 860*8a106958SDamjan Jovanovic } 861*8a106958SDamjan Jovanovic 862*8a106958SDamjan Jovanovic 863*8a106958SDamjan Jovanovic UINT32 864*8a106958SDamjan Jovanovic StreamStr::do_write( const void * i_pSrc, 865*8a106958SDamjan Jovanovic UINT32 i_nNrofBytes ) 866*8a106958SDamjan Jovanovic { 867*8a106958SDamjan Jovanovic ProvideAddingSize( i_nNrofBytes ); 868*8a106958SDamjan Jovanovic memcpy( pCur, i_pSrc, i_nNrofBytes ); 869*8a106958SDamjan Jovanovic Advance(i_nNrofBytes); 870*8a106958SDamjan Jovanovic 871*8a106958SDamjan Jovanovic return i_nNrofBytes; 872*8a106958SDamjan Jovanovic } 873*8a106958SDamjan Jovanovic 874*8a106958SDamjan Jovanovic void 875*8a106958SDamjan Jovanovic StreamStr::ProvideAddingSize( size_type i_nSize2Add ) 876*8a106958SDamjan Jovanovic { 877*8a106958SDamjan Jovanovic size_type nLength = length(); 878*8a106958SDamjan Jovanovic if ( capacity() - nLength < i_nSize2Add ) 879*8a106958SDamjan Jovanovic Resize( nLength + i_nSize2Add ); 880*8a106958SDamjan Jovanovic 881*8a106958SDamjan Jovanovic pEnd += i_nSize2Add; 882*8a106958SDamjan Jovanovic *pEnd = '\0'; 883*8a106958SDamjan Jovanovic 884*8a106958SDamjan Jovanovic if (eMode == str::insert AND pCur != pEnd) 885*8a106958SDamjan Jovanovic { 886*8a106958SDamjan Jovanovic MoveData( pCur, pCur + i_nSize2Add, seek_type(i_nSize2Add) ); 887*8a106958SDamjan Jovanovic } 888*8a106958SDamjan Jovanovic } 889*8a106958SDamjan Jovanovic 890*8a106958SDamjan Jovanovic void 891*8a106958SDamjan Jovanovic StreamStr::Resize( size_type i_nMinimumCapacity ) 892*8a106958SDamjan Jovanovic { 893*8a106958SDamjan Jovanovic size_type nNewSize = nCapacity1 < 128 894*8a106958SDamjan Jovanovic ? nCapacity1 << 1 895*8a106958SDamjan Jovanovic : (nCapacity1 << 1) - (nCapacity1 >> 1); 896*8a106958SDamjan Jovanovic nCapacity1 = csv::max( nNewSize, size_type(i_nMinimumCapacity + 1) ); 897*8a106958SDamjan Jovanovic 898*8a106958SDamjan Jovanovic char * pNew = new char[nCapacity1]; 899*8a106958SDamjan Jovanovic strcpy ( pNew, dpData ); // SAFE STRCPY (#100211# - checked) 900*8a106958SDamjan Jovanovic pEnd = pNew + (pEnd - dpData); 901*8a106958SDamjan Jovanovic pCur = pNew + (pCur - dpData); 902*8a106958SDamjan Jovanovic 903*8a106958SDamjan Jovanovic delete [] dpData; 904*8a106958SDamjan Jovanovic dpData = pNew; 905*8a106958SDamjan Jovanovic } 906*8a106958SDamjan Jovanovic 907*8a106958SDamjan Jovanovic void 908*8a106958SDamjan Jovanovic StreamStr::MoveData( char * i_pStart, 909*8a106958SDamjan Jovanovic char * i_pEnd, 910*8a106958SDamjan Jovanovic seek_type i_nDiff ) 911*8a106958SDamjan Jovanovic { 912*8a106958SDamjan Jovanovic if (i_nDiff > 0) 913*8a106958SDamjan Jovanovic { 914*8a106958SDamjan Jovanovic register const char * pSrc = i_pEnd; 915*8a106958SDamjan Jovanovic register char * pDest = i_pEnd + i_nDiff; 916*8a106958SDamjan Jovanovic for ( ; pSrc != i_pStart; --pSrc, --pDest ) 917*8a106958SDamjan Jovanovic { 918*8a106958SDamjan Jovanovic *pDest = *pSrc; 919*8a106958SDamjan Jovanovic } 920*8a106958SDamjan Jovanovic *pDest = *pSrc; 921*8a106958SDamjan Jovanovic } 922*8a106958SDamjan Jovanovic else if (i_nDiff < 0) 923*8a106958SDamjan Jovanovic { 924*8a106958SDamjan Jovanovic const char * pSrc = i_pStart; 925*8a106958SDamjan Jovanovic char * pDest = i_pStart + i_nDiff; 926*8a106958SDamjan Jovanovic for ( ; pSrc != i_pEnd; ++pSrc, ++pDest ) 927*8a106958SDamjan Jovanovic { 928*8a106958SDamjan Jovanovic *pDest = *pSrc; 929*8a106958SDamjan Jovanovic } 930*8a106958SDamjan Jovanovic } 931*8a106958SDamjan Jovanovic } 932*8a106958SDamjan Jovanovic 933*8a106958SDamjan Jovanovic // Does nothing, only the name of this function is needed. 934*8a106958SDamjan Jovanovic void 935*8a106958SDamjan Jovanovic c_str() 936*8a106958SDamjan Jovanovic { 937*8a106958SDamjan Jovanovic // Does nothing. 938*8a106958SDamjan Jovanovic } 939*8a106958SDamjan Jovanovic 940*8a106958SDamjan Jovanovic 941*8a106958SDamjan Jovanovic 942*8a106958SDamjan Jovanovic void 943*8a106958SDamjan Jovanovic Split( std::vector<String> & o_list, 944*8a106958SDamjan Jovanovic const char * i_text ) 945*8a106958SDamjan Jovanovic { 946*8a106958SDamjan Jovanovic const char * 947*8a106958SDamjan Jovanovic pCurrentToken = 0; 948*8a106958SDamjan Jovanovic bool 949*8a106958SDamjan Jovanovic white = false; 950*8a106958SDamjan Jovanovic for (const char * p = i_text; *p != '\0'; ++p) 951*8a106958SDamjan Jovanovic { 952*8a106958SDamjan Jovanovic white = UINT8(*p) > 32; 953*8a106958SDamjan Jovanovic if (pCurrentToken != 0) 954*8a106958SDamjan Jovanovic { 955*8a106958SDamjan Jovanovic if (white) 956*8a106958SDamjan Jovanovic { 957*8a106958SDamjan Jovanovic o_list.push_back(String(pCurrentToken, p)); 958*8a106958SDamjan Jovanovic pCurrentToken = 0; 959*8a106958SDamjan Jovanovic } 960*8a106958SDamjan Jovanovic } 961*8a106958SDamjan Jovanovic else 962*8a106958SDamjan Jovanovic { 963*8a106958SDamjan Jovanovic if ( NOT white) 964*8a106958SDamjan Jovanovic pCurrentToken = p; 965*8a106958SDamjan Jovanovic } // endif (bInToken) else 966*8a106958SDamjan Jovanovic } // end for 967*8a106958SDamjan Jovanovic 968*8a106958SDamjan Jovanovic if (pCurrentToken != 0) 969*8a106958SDamjan Jovanovic { 970*8a106958SDamjan Jovanovic o_list.push_back(String(pCurrentToken)); 971*8a106958SDamjan Jovanovic } 972*8a106958SDamjan Jovanovic } 973*8a106958SDamjan Jovanovic 974*8a106958SDamjan Jovanovic 975*8a106958SDamjan Jovanovic 976*8a106958SDamjan Jovanovic 977*8a106958SDamjan Jovanovic } // namespace csv 978