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
Advance(size_type i_nAddedSize)49*11c03c6dSDamjan Jovanovic StreamStr::Advance(size_type i_nAddedSize)
50*11c03c6dSDamjan Jovanovic { pCur += i_nAddedSize; }
51*11c03c6dSDamjan Jovanovic
52*11c03c6dSDamjan Jovanovic
53*11c03c6dSDamjan Jovanovic
StreamStr(size_type i_nCapacity)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
StreamStr(const char * i_sInitStr,size_type i_nCapacity)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
StreamStr(size_type i_nGuessedCapacity,const char * str1,const char * str2,...)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
StreamStr(const self & i_rOther)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
StreamStr(csv::bstream & i_source)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
~StreamStr()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 &
operator =(const self & i_rOther)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 &
operator <<(const char * i_s)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 &
operator <<(const String & i_s)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 &
operator <<(char i_c)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 &
operator <<(unsigned char i_c)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 &
operator <<(signed char i_c)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 &
operator <<(short i_n)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 &
operator <<(unsigned short i_n)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 &
operator <<(int i_n)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 &
operator <<(unsigned int i_n)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 &
operator <<(long i_n)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 &
operator <<(unsigned long i_n)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 &
operator <<(float i_n)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 &
operator <<(double i_n)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 &
operator [](position_type i_nPosition) const325*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 &
operator [](position_type i_nPosition)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
resize(size_type i_nMinimumCapacity)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
swap(StreamStr & io_swap)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 &
seekp(seek_type i_nCount,seek_dir i_eDirection)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 &
set_insert_mode(insert_mode i_eMode)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
push_front(const char * i_str)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
push_front(char i_c)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
push_back(const char * i_str)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
push_back(char i_c)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
pop_front(size_type i_nCount)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
pop_back(size_type i_nCount)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 &
operator_join(std::vector<String>::const_iterator i_rBegin,std::vector<String>::const_iterator i_rEnd,const char * i_sLink)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 &
operator_add_substr(const char * i_sText,size_type i_nLength)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 &
operator_add_token(const char * i_sText,char i_cDelimiter)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 &
operator_read_line(bstream & i_src)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
strip_front(char i_cToRemove)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
strip_back(char i_cToRemove)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
strip_frontback(char i_cToRemove)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
strip_front_whitespace()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
strip_back_whitespace()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
strip_frontback_whitespace()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
remove(iterator i_begin,iterator i_end)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
replace(position_type i_nStart,size_type i_nSize,Area i_aReplacement)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
replace_all(char i_cCarToSearch,char i_cReplacement)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
replace_all(Area i_aStrToSearch,Area i_aReplacement)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 &
to_lower(position_type i_nStart,size_type i_nLength)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 &
to_upper(position_type i_nStart,size_type i_nLength)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
token_count(char i_cSplit) const759*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
token(position_type i_nNr,char i_cSplit) const765*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
StreamStrPool()810*11c03c6dSDamjan Jovanovic StreamStrPool::StreamStrPool()
811*11c03c6dSDamjan Jovanovic {
812*11c03c6dSDamjan Jovanovic }
813*11c03c6dSDamjan Jovanovic
~StreamStrPool()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 &
AcquireFromPool_(uintt i_nMinimalSize)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
ReleaseToPool_(DYN StreamStr * let_dpUsedStr)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
StreamStrLock(uintt i_nMinimalSize)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
~StreamStrLock()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
do_write(const void * i_pSrc,UINT32 i_nNrofBytes)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
ProvideAddingSize(size_type i_nSize2Add)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
Resize(size_type i_nMinimumCapacity)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
MoveData(char * i_pStart,char * i_pEnd,seek_type i_nDiff)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
c_str()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
Split(std::vector<String> & o_list,const char * i_text)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