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