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