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