18a106958SDamjan Jovanovic /**************************************************************
28a106958SDamjan Jovanovic *
38a106958SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one
48a106958SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file
58a106958SDamjan Jovanovic * distributed with this work for additional information
68a106958SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file
78a106958SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the
88a106958SDamjan Jovanovic * "License"); you may not use this file except in compliance
98a106958SDamjan Jovanovic * with the License. You may obtain a copy of the License at
108a106958SDamjan Jovanovic *
118a106958SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0
128a106958SDamjan Jovanovic *
138a106958SDamjan Jovanovic * Unless required by applicable law or agreed to in writing,
148a106958SDamjan Jovanovic * software distributed under the License is distributed on an
158a106958SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
168a106958SDamjan Jovanovic * KIND, either express or implied. See the License for the
178a106958SDamjan Jovanovic * specific language governing permissions and limitations
188a106958SDamjan Jovanovic * under the License.
198a106958SDamjan Jovanovic *
208a106958SDamjan Jovanovic *************************************************************/
218a106958SDamjan Jovanovic
228a106958SDamjan Jovanovic
238a106958SDamjan Jovanovic
248a106958SDamjan Jovanovic #ifndef CSV_STREAMSTR_HXX
258a106958SDamjan Jovanovic #define CSV_STREAMSTR_HXX
268a106958SDamjan Jovanovic
278a106958SDamjan Jovanovic // BASE CLASSES
288a106958SDamjan Jovanovic #include <cosv/bstream.hxx>
298a106958SDamjan Jovanovic // USED SERVICES
308a106958SDamjan Jovanovic #include <cosv/str_types.hxx>
318a106958SDamjan Jovanovic #include <string.h>
328a106958SDamjan Jovanovic
338a106958SDamjan Jovanovic
348a106958SDamjan Jovanovic
358a106958SDamjan Jovanovic
368a106958SDamjan Jovanovic namespace csv
378a106958SDamjan Jovanovic {
388a106958SDamjan Jovanovic class String;
398a106958SDamjan Jovanovic
408a106958SDamjan Jovanovic
418a106958SDamjan Jovanovic void c_str(); // Dummy needed for StreamStr::operator<<(StreamStr::F_CSTR);
428a106958SDamjan Jovanovic
438a106958SDamjan Jovanovic
448a106958SDamjan Jovanovic /** A string buffer class for all kinds of string manipulation.
458a106958SDamjan Jovanovic */
468a106958SDamjan Jovanovic class StreamStr : public bostream
478a106958SDamjan Jovanovic {
488a106958SDamjan Jovanovic public:
498a106958SDamjan Jovanovic typedef StreamStr self;
508a106958SDamjan Jovanovic
518a106958SDamjan Jovanovic typedef str::size size_type;
528a106958SDamjan Jovanovic typedef str::position position_type;
538a106958SDamjan Jovanovic typedef intt seek_type;
548a106958SDamjan Jovanovic typedef str::insert_mode insert_mode;
558a106958SDamjan Jovanovic
568a106958SDamjan Jovanovic typedef const char * const_iterator;
578a106958SDamjan Jovanovic typedef char * iterator;
588a106958SDamjan Jovanovic
598a106958SDamjan Jovanovic typedef void (*F_CSTR)();
608a106958SDamjan Jovanovic
618a106958SDamjan Jovanovic
628a106958SDamjan Jovanovic /** Represents an area within a string.
638a106958SDamjan Jovanovic */
648a106958SDamjan Jovanovic struct Area
658a106958SDamjan Jovanovic {
668a106958SDamjan Jovanovic typedef str::size size_type;
678a106958SDamjan Jovanovic
Areacsv::StreamStr::Area688a106958SDamjan Jovanovic Area(
698a106958SDamjan Jovanovic const char * i_str = "",
708a106958SDamjan Jovanovic size_type i_nLength = str::maxsize )
718a106958SDamjan Jovanovic : sStr(i_str),
728a106958SDamjan Jovanovic nLength( i_nLength == str::maxsize
738a106958SDamjan Jovanovic ? strlen(i_str)
748a106958SDamjan Jovanovic : i_nLength ) {}
758a106958SDamjan Jovanovic const char * sStr;
768a106958SDamjan Jovanovic size_type nLength;
778a106958SDamjan Jovanovic };
788a106958SDamjan Jovanovic
798a106958SDamjan Jovanovic // LIFECYCLE
808a106958SDamjan Jovanovic StreamStr(
818a106958SDamjan Jovanovic size_type i_nCapacity );
828a106958SDamjan Jovanovic StreamStr(
838a106958SDamjan Jovanovic const char * i_sInitStr,
848a106958SDamjan Jovanovic size_type i_nCapacity ); /// Only used if > strlen(i_sInitStr).
858a106958SDamjan Jovanovic StreamStr(
868a106958SDamjan Jovanovic size_type i_nGuessedCapacity,
878a106958SDamjan Jovanovic const char * str1, // [!= 0]
888a106958SDamjan Jovanovic const char * str2, // [!= 0]
898a106958SDamjan Jovanovic ... ); // Has to end with NIL .
908a106958SDamjan Jovanovic StreamStr(
918a106958SDamjan Jovanovic csv::bstream & i_source );
928a106958SDamjan Jovanovic /// Copies also insert_mode and current position.
938a106958SDamjan Jovanovic StreamStr(
948a106958SDamjan Jovanovic const self & i_rOther );
958a106958SDamjan Jovanovic ~StreamStr();
968a106958SDamjan Jovanovic
978a106958SDamjan Jovanovic // OPERATORS
988a106958SDamjan Jovanovic /// Copies also insert_mode and current position.
998a106958SDamjan Jovanovic self & operator=(
1008a106958SDamjan Jovanovic const self & i_rOther );
1018a106958SDamjan Jovanovic
1028a106958SDamjan Jovanovic self & operator<<(
1038a106958SDamjan Jovanovic const char * i_s );
1048a106958SDamjan Jovanovic self & operator<<(
1058a106958SDamjan Jovanovic const String & i_s );
1068a106958SDamjan Jovanovic self & operator<<(
1078a106958SDamjan Jovanovic char i_c );
1088a106958SDamjan Jovanovic self & operator<<(
1098a106958SDamjan Jovanovic unsigned char i_c );
1108a106958SDamjan Jovanovic self & operator<<(
1118a106958SDamjan Jovanovic signed char i_c );
1128a106958SDamjan Jovanovic
1138a106958SDamjan Jovanovic self & operator<<(
1148a106958SDamjan Jovanovic short i_n );
1158a106958SDamjan Jovanovic self & operator<<(
1168a106958SDamjan Jovanovic unsigned short i_n );
1178a106958SDamjan Jovanovic self & operator<<(
1188a106958SDamjan Jovanovic int i_n );
1198a106958SDamjan Jovanovic self & operator<<(
1208a106958SDamjan Jovanovic unsigned int i_n );
1218a106958SDamjan Jovanovic self & operator<<(
1228a106958SDamjan Jovanovic long i_n );
1238a106958SDamjan Jovanovic self & operator<<(
1248a106958SDamjan Jovanovic unsigned long i_n );
1258a106958SDamjan Jovanovic
1268a106958SDamjan Jovanovic self & operator<<(
1278a106958SDamjan Jovanovic float i_n );
1288a106958SDamjan Jovanovic self & operator<<(
1298a106958SDamjan Jovanovic double i_n );
1308a106958SDamjan Jovanovic
1318a106958SDamjan Jovanovic /** This operator is used to finish a sequence of streaming
132*7f6a93c8SJohn Bampton operators by returning the c-string of the complete string.
1338a106958SDamjan Jovanovic
1348a106958SDamjan Jovanovic @return The same as ->c_str().
1358a106958SDamjan Jovanovic
1368a106958SDamjan Jovanovic @example
1378a106958SDamjan Jovanovic csv::StreamStr s(100);
1388a106958SDamjan Jovanovic const char *
1398a106958SDamjan Jovanovic fullname = s << qualifier() << "::" << name() << csv::c_str;
1408a106958SDamjan Jovanovic */
1418a106958SDamjan Jovanovic const char * operator<<(
1428a106958SDamjan Jovanovic F_CSTR i_f );
1438a106958SDamjan Jovanovic
1448a106958SDamjan Jovanovic const char & operator[](
1458a106958SDamjan Jovanovic position_type i_nPosition ) const;
1468a106958SDamjan Jovanovic char & operator[](
1478a106958SDamjan Jovanovic position_type i_nPosition );
1488a106958SDamjan Jovanovic
1498a106958SDamjan Jovanovic // OPERATIONS
1508a106958SDamjan Jovanovic void resize(
1518a106958SDamjan Jovanovic size_type i_nMinimumCapacity );
1528a106958SDamjan Jovanovic
1538a106958SDamjan Jovanovic void clear();
1548a106958SDamjan Jovanovic void swap(
1558a106958SDamjan Jovanovic StreamStr & io_swap );
1568a106958SDamjan Jovanovic
1578a106958SDamjan Jovanovic /** Sets start point for the next operator<<() call.
1588a106958SDamjan Jovanovic if the intended position is not reachable, nothing happens.
1598a106958SDamjan Jovanovic */
1608a106958SDamjan Jovanovic self & seekp(
1618a106958SDamjan Jovanovic seek_type i_nCount,
1628a106958SDamjan Jovanovic seek_dir i_eDirection = ::csv::beg );
reset()1638a106958SDamjan Jovanovic self & reset() { return seekp(0); }
1648a106958SDamjan Jovanovic /** Sets the insertion mode of all and only the operator<<() calls.
1658a106958SDamjan Jovanovic
1668a106958SDamjan Jovanovic Default is str::overwrite:
1678a106958SDamjan Jovanovic str::overwrite: seekp() always sets the cur end of the string.
1688a106958SDamjan Jovanovic operator<<() calls push the end of the string forward.
1698a106958SDamjan Jovanovic str::insert: seekp() only sets the insertion point.
1708a106958SDamjan Jovanovic operator<<() calls insert their text at the tellp()
1718a106958SDamjan Jovanovic position and keep the rest of the string. tellp() is
1728a106958SDamjan Jovanovic then after the inserted text, on the beginning of the
1738a106958SDamjan Jovanovic rest of the string.
1748a106958SDamjan Jovanovic */
1758a106958SDamjan Jovanovic self & set_insert_mode(
1768a106958SDamjan Jovanovic insert_mode i_eMode );
1778a106958SDamjan Jovanovic
1788a106958SDamjan Jovanovic void push_front(
1798a106958SDamjan Jovanovic const char * i_str );
1808a106958SDamjan Jovanovic void push_front(
1818a106958SDamjan Jovanovic char i_c );
1828a106958SDamjan Jovanovic void push_back(
1838a106958SDamjan Jovanovic const char * i_str );
1848a106958SDamjan Jovanovic void push_back(
1858a106958SDamjan Jovanovic char i_c );
1868a106958SDamjan Jovanovic void pop_front(
1878a106958SDamjan Jovanovic size_type i_nCount );
1888a106958SDamjan Jovanovic void pop_back(
1898a106958SDamjan Jovanovic size_type i_nCount );
1908a106958SDamjan Jovanovic
1918a106958SDamjan Jovanovic /// Works like operator<<(). Does the same as Perl's join().
1928a106958SDamjan Jovanovic self & operator_join(
1938a106958SDamjan Jovanovic std::vector<String>::const_iterator
1948a106958SDamjan Jovanovic i_rBegin,
1958a106958SDamjan Jovanovic std::vector<String>::const_iterator
1968a106958SDamjan Jovanovic i_rEnd,
1978a106958SDamjan Jovanovic const char * i_sLink );
1988a106958SDamjan Jovanovic /// Works like operator<<()
1998a106958SDamjan Jovanovic self & operator_add_substr(
2008a106958SDamjan Jovanovic const char * i_sText,
2018a106958SDamjan Jovanovic size_type i_nLength );
2028a106958SDamjan Jovanovic /// Works like operator<<()
2038a106958SDamjan Jovanovic self & operator_add_token(
2048a106958SDamjan Jovanovic const char * i_sText,
2058a106958SDamjan Jovanovic char i_cDelimiter );
2068a106958SDamjan Jovanovic /// Works like operator<<()
2078a106958SDamjan Jovanovic self & operator_read_line(
2088a106958SDamjan Jovanovic bstream & i_src );
2098a106958SDamjan Jovanovic
2108a106958SDamjan Jovanovic void strip_front(
2118a106958SDamjan Jovanovic char i_cToRemove );
2128a106958SDamjan Jovanovic void strip_back(
2138a106958SDamjan Jovanovic char i_cToRemove );
2148a106958SDamjan Jovanovic void strip_frontback(
2158a106958SDamjan Jovanovic char i_cToRemove );
2168a106958SDamjan Jovanovic void strip_front_whitespace(); /// removes space, tab and crlf.
2178a106958SDamjan Jovanovic void strip_back_whitespace();
2188a106958SDamjan Jovanovic void strip_frontback_whitespace();
2198a106958SDamjan Jovanovic
2208a106958SDamjan Jovanovic /** @precond i_begin is valid
2218a106958SDamjan Jovanovic @precond i_end is valid
2228a106958SDamjan Jovanovic @precond i_end >= i_begin
2238a106958SDamjan Jovanovic */
2248a106958SDamjan Jovanovic void remove(
2258a106958SDamjan Jovanovic iterator i_begin,
2268a106958SDamjan Jovanovic iterator i_end );
2278a106958SDamjan Jovanovic void replace(
2288a106958SDamjan Jovanovic position_type i_nStart,
2298a106958SDamjan Jovanovic size_type i_nSize,
2308a106958SDamjan Jovanovic Area i_aReplacement );
2318a106958SDamjan Jovanovic
2328a106958SDamjan Jovanovic void replace_all(
2338a106958SDamjan Jovanovic char i_cCarToSearch,
2348a106958SDamjan Jovanovic char i_cReplacement );
2358a106958SDamjan Jovanovic void replace_all(
2368a106958SDamjan Jovanovic Area i_aStrToSearch,
2378a106958SDamjan Jovanovic Area i_aReplacement );
2388a106958SDamjan Jovanovic
2398a106958SDamjan Jovanovic StreamStr & to_lower(
2408a106958SDamjan Jovanovic position_type i_nStart = 0,
2418a106958SDamjan Jovanovic size_type i_nLength = str::maxsize );
2428a106958SDamjan Jovanovic StreamStr & to_upper(
2438a106958SDamjan Jovanovic position_type i_nStart = 0,
2448a106958SDamjan Jovanovic size_type i_nLength = str::maxsize );
2458a106958SDamjan Jovanovic
2468a106958SDamjan Jovanovic // INQUIRY
2478a106958SDamjan Jovanovic const char * c_str() const;
2488a106958SDamjan Jovanovic const char * data() const;
2498a106958SDamjan Jovanovic
2508a106958SDamjan Jovanovic bool empty() const;
2518a106958SDamjan Jovanovic size_type size() const;
2528a106958SDamjan Jovanovic size_type length() const;
2538a106958SDamjan Jovanovic
2548a106958SDamjan Jovanovic size_type capacity() const;
2558a106958SDamjan Jovanovic
2568a106958SDamjan Jovanovic position_type tellp() const;
2578a106958SDamjan Jovanovic
2588a106958SDamjan Jovanovic const_iterator begin() const;
2598a106958SDamjan Jovanovic const_iterator cur() const;
2608a106958SDamjan Jovanovic const_iterator end() const;
2618a106958SDamjan Jovanovic
2628a106958SDamjan Jovanovic size_type token_count(
2638a106958SDamjan Jovanovic char i_cSplit ) const;
2648a106958SDamjan Jovanovic String token(
2658a106958SDamjan Jovanovic position_type i_nNr, /// Starting with 0.
2668a106958SDamjan Jovanovic char i_cSpli ) const;
2678a106958SDamjan Jovanovic
2688a106958SDamjan Jovanovic // ACCESS
2698a106958SDamjan Jovanovic iterator begin();
2708a106958SDamjan Jovanovic iterator cur();
2718a106958SDamjan Jovanovic iterator end();
2728a106958SDamjan Jovanovic
2738a106958SDamjan Jovanovic private:
2748a106958SDamjan Jovanovic // Interface bostream
2758a106958SDamjan Jovanovic virtual UINT32 do_write(
2768a106958SDamjan Jovanovic const void * i_pSrc,
2778a106958SDamjan Jovanovic UINT32 i_nNrofBytes);
2788a106958SDamjan Jovanovic // Locals
2798a106958SDamjan Jovanovic void ProvideAddingSize(
2808a106958SDamjan Jovanovic size_type i_nSize2Add );
2818a106958SDamjan Jovanovic /// Resizes with the factor 2.0 (under 128), 1.5 or until i_nMinimumCapacity, whatever is bigger.
2828a106958SDamjan Jovanovic void Resize(
2838a106958SDamjan Jovanovic size_type i_nMinimumCapacity = 0 );
2848a106958SDamjan Jovanovic void Advance(
2858a106958SDamjan Jovanovic size_type i_nAddedSize );
2868a106958SDamjan Jovanovic void MoveData(
2878a106958SDamjan Jovanovic char * i_pStart,
2888a106958SDamjan Jovanovic char * i_pEnd,
2898a106958SDamjan Jovanovic seek_type i_nDiff );
2908a106958SDamjan Jovanovic // DATA
2918a106958SDamjan Jovanovic size_type nCapacity1; /// Capacity of characters to contain + 1 for terminating 0.
2928a106958SDamjan Jovanovic DYN char * dpData;
2938a106958SDamjan Jovanovic char * pEnd;
2948a106958SDamjan Jovanovic char * pCur;
2958a106958SDamjan Jovanovic insert_mode eMode;
2968a106958SDamjan Jovanovic };
2978a106958SDamjan Jovanovic
2988a106958SDamjan Jovanovic
2998a106958SDamjan Jovanovic
3008a106958SDamjan Jovanovic class StreamStrLock
3018a106958SDamjan Jovanovic {
3028a106958SDamjan Jovanovic public:
3038a106958SDamjan Jovanovic StreamStrLock(
3048a106958SDamjan Jovanovic uintt i_nMinimalSize );
3058a106958SDamjan Jovanovic ~StreamStrLock();
3068a106958SDamjan Jovanovic
operator ()()3078a106958SDamjan Jovanovic StreamStr & operator()() { return *pStr; }
3088a106958SDamjan Jovanovic
3098a106958SDamjan Jovanovic private:
3108a106958SDamjan Jovanovic StreamStr * pStr;
3118a106958SDamjan Jovanovic };
3128a106958SDamjan Jovanovic
3138a106958SDamjan Jovanovic /** Splits a string into tokens by whitespace.
3148a106958SDamjan Jovanovic
3158a106958SDamjan Jovanovic The tokens are added to the end of o_list.
3168a106958SDamjan Jovanovic */
3178a106958SDamjan Jovanovic void Split(
3188a106958SDamjan Jovanovic std::vector<String> &
3198a106958SDamjan Jovanovic o_list,
3208a106958SDamjan Jovanovic const char * i_text );
3218a106958SDamjan Jovanovic inline void Join(
3228a106958SDamjan Jovanovic StreamStr & o_text,
3238a106958SDamjan Jovanovic std::vector<String> &
3248a106958SDamjan Jovanovic i_list,
3258a106958SDamjan Jovanovic const char * i_sLink = " ");
3268a106958SDamjan Jovanovic
3278a106958SDamjan Jovanovic // IMPLEMENTATION
3288a106958SDamjan Jovanovic
3298a106958SDamjan Jovanovic inline const char *
operator <<(F_CSTR)3308a106958SDamjan Jovanovic StreamStr::operator<<( F_CSTR )
3318a106958SDamjan Jovanovic { return dpData; }
3328a106958SDamjan Jovanovic inline void
clear()3338a106958SDamjan Jovanovic StreamStr::clear()
3348a106958SDamjan Jovanovic { pEnd = pCur = dpData; *pEnd = '\0'; }
3358a106958SDamjan Jovanovic inline const char *
c_str() const3368a106958SDamjan Jovanovic StreamStr::c_str() const
3378a106958SDamjan Jovanovic { return dpData; }
3388a106958SDamjan Jovanovic inline const char *
data() const3398a106958SDamjan Jovanovic StreamStr::data() const
3408a106958SDamjan Jovanovic { return dpData; }
3418a106958SDamjan Jovanovic inline bool
empty() const3428a106958SDamjan Jovanovic StreamStr::empty() const
3438a106958SDamjan Jovanovic { return dpData == pEnd; }
3448a106958SDamjan Jovanovic inline StreamStr::size_type
size() const3458a106958SDamjan Jovanovic StreamStr::size() const
3468a106958SDamjan Jovanovic { return pEnd - dpData; }
3478a106958SDamjan Jovanovic inline StreamStr::size_type
length() const3488a106958SDamjan Jovanovic StreamStr::length() const
3498a106958SDamjan Jovanovic { return size(); }
3508a106958SDamjan Jovanovic inline StreamStr::size_type
capacity() const3518a106958SDamjan Jovanovic StreamStr::capacity() const
3528a106958SDamjan Jovanovic { return nCapacity1-1; }
3538a106958SDamjan Jovanovic inline StreamStr::position_type
tellp() const3548a106958SDamjan Jovanovic StreamStr::tellp() const
3558a106958SDamjan Jovanovic { return size_type(pCur-dpData); }
3568a106958SDamjan Jovanovic inline StreamStr::const_iterator
begin() const3578a106958SDamjan Jovanovic StreamStr::begin() const
3588a106958SDamjan Jovanovic { return dpData; }
3598a106958SDamjan Jovanovic inline StreamStr::const_iterator
cur() const3608a106958SDamjan Jovanovic StreamStr::cur() const
3618a106958SDamjan Jovanovic { return pCur; }
3628a106958SDamjan Jovanovic inline StreamStr::const_iterator
end() const3638a106958SDamjan Jovanovic StreamStr::end() const
3648a106958SDamjan Jovanovic { return pEnd; }
3658a106958SDamjan Jovanovic inline StreamStr::iterator
begin()3668a106958SDamjan Jovanovic StreamStr::begin()
3678a106958SDamjan Jovanovic { return dpData; }
3688a106958SDamjan Jovanovic inline StreamStr::iterator
cur()3698a106958SDamjan Jovanovic StreamStr::cur()
3708a106958SDamjan Jovanovic { return pCur; }
3718a106958SDamjan Jovanovic inline StreamStr::iterator
end()3728a106958SDamjan Jovanovic StreamStr::end()
3738a106958SDamjan Jovanovic { return pEnd; }
3748a106958SDamjan Jovanovic
3758a106958SDamjan Jovanovic inline void
Join(StreamStr & o_text,std::vector<String> & i_list,const char * i_sLink)3768a106958SDamjan Jovanovic Join( StreamStr & o_text,
3778a106958SDamjan Jovanovic std::vector<String> & i_list,
3788a106958SDamjan Jovanovic const char * i_sLink )
3798a106958SDamjan Jovanovic {
3808a106958SDamjan Jovanovic o_text.operator_join(i_list.begin(),i_list.end(),i_sLink);
3818a106958SDamjan Jovanovic }
3828a106958SDamjan Jovanovic
3838a106958SDamjan Jovanovic
3848a106958SDamjan Jovanovic
3858a106958SDamjan Jovanovic
3868a106958SDamjan Jovanovic } // namespace csv
3878a106958SDamjan Jovanovic #endif
388