xref: /AOO42X/main/autodoc/source/cosv/strings/streamstr.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
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