23 #ifndef __STRINGUTILS__ 24 #define __STRINGUTILS__ 26 #include "IPMUnknown.h" 28 #include "WideString.h" 29 #include "EscapeTable.h" 33 #include <boost/range/iterator_range.hpp> 55 void FormatPositionalArgs(
WideString& formatString, ArgArray
const& args);
62 void ReplaceStringParameters(
74 void ConvertWideStringToUTF8 (
const WideString & str, std::string & returnval );
77 typedef boost::iterator_range<const unsigned char*> UTF8CharRange;
81 inline UTF8CharRange MakeUTF8CharRange(
const std::string& str)
83 const unsigned char* b((
const unsigned char*)(str.c_str()));
84 const unsigned char* e(b + str.size());
85 return UTF8CharRange(b, e);
95 inline UTF8CharRange MakeUTF8CharRange(
const char* utf8Buffer,
size_t length)
97 const unsigned char* b((
const unsigned char*)utf8Buffer);
98 const unsigned char* e(b + length);
99 return UTF8CharRange(b, e);
113 UTF8CharRange ConvertUTF8RangeToWideString (
const UTF8CharRange& utf8Range,
WideString & returnval) ;
117 inline UTF8CharRange ConvertUTF8ToWideString (
const std::string& str,
WideString & returnval)
119 return ConvertUTF8RangeToWideString(::StringUtils::MakeUTF8CharRange(str), returnval);
126 inline bool operator()(
char c)
const 129 return (c > 0x1F && c < 0x7F);
137 template<
class Container>
139 :
public std::iterator<std::output_iterator_tag, void, void, void, void>
149 if ((fContainer.capacity() - fContainer.size()) < 2)
155 fContainer.push_back(val);
183 void grow_capacity(
void)
186 if (fContainer.capacity())
189 newSize = fContainer.capacity() + (fContainer.capacity() >> 1);
191 fContainer.reserve(++newSize);
194 Container& fContainer;
202 template<
class Container>
218 template <
typename InputIt,
typename OutputIt,
typename CharType,
typename EscapeType>
219 OutputIt Escape( InputIt srcBeg, InputIt srcEnd, OutputIt destBeg,
222 typedef typename EscapeTable<CharType, EscapeType>::EscapeMap MapType;
223 typedef typename EscapeTable<CharType, EscapeType>::EscapeMapKey MapKeyType;
224 typedef typename EscapeTable<CharType, EscapeType>::EscapeMapValue MapValueType;
226 MapType
const& searchMap = mappingTable.GetEscapeMap();
227 ASSERT( !searchMap.empty() );
229 for ( ; srcBeg != srcEnd; ++srcBeg )
231 MapKeyType key(*srcBeg);
232 typename MapType::const_iterator i = searchMap.find( key );
233 if ( i != searchMap.end() )
235 destBeg = std::copy( i->second.begin(), i->second.end(), destBeg );
239 *destBeg++ = *srcBeg;
259 template <
typename InputIt,
typename OutputIt,
typename CharType,
typename EscapeType>
260 OutputIt Unescape( InputIt srcBeg, InputIt srcEnd, OutputIt destBeg,
263 typedef typename EscapeTable<CharType, EscapeType>::UnescapeMap MapType;
264 typedef typename EscapeTable<CharType, EscapeType>::UnescapeMapKey MapKeyType;
267 if ( pFoundInvalidEscape )
269 *pFoundInvalidEscape = kFalse;
272 MapType
const& searchMap = mappingTable.GetUnescapeMap();
273 ASSERT( !searchMap.empty() );
275 MapKeyType
const& escapeString = searchMap.begin()->first;
277 typename MapKeyType::value_type escapeChar = escapeString[0];
278 size_t escapeLen = escapeString.size();
280 while ( srcBeg != srcEnd )
283 if ( *srcBeg == escapeChar )
286 if ( escapeLen <= (
size_t)std::distance(srcBeg, srcEnd) )
290 std::copy(srcBeg, srcBeg + (int32)escapeLen, std::back_inserter(key) );
291 typename MapType::const_iterator i = searchMap.find( key );
292 if ( i != searchMap.end() )
295 *destBeg++ = i->second;
296 std::advance(srcBeg, escapeLen);
304 if ( pFoundInvalidEscape )
306 *pFoundInvalidEscape = kTrue;
311 *destBeg++ = *srcBeg++;
347 extern CharArray
const kIgnoredCharsFilterArray;
350 extern CharArray
const kSpecialControlCharsFilterArray;
353 extern CharArray
const kWhitespaceCharsFilterArray;
356 extern CharArray
const kSpecialWhitespaceCharsFilterArray;
359 extern CharArray
const kProxyCharsFilterArray;
362 extern CharArray
const kCalcTextIllegalCharsFilterArray;
367 kStripLeadingChars = 0,
371 kStripLeadingAndTrailingChars,
380 void StripBeginEndChars(
WideString& text, CharArray
const& charArray, ::StringUtils::StripType stripType);
388 template<
class PR>
void StripBeginEndChars(
WideString& text, PR filter, ::StringUtils::StripType stripType)
391 if (stripType == ::StringUtils::kStripLeadingAndTrailingChars || stripType == ::StringUtils::kStripLeadingChars)
394 for (; newBegin != text.end(); ++newBegin)
396 if (!filter(*newBegin))
403 if (stripType == ::StringUtils::kStripLeadingAndTrailingChars || stripType == ::StringUtils::kStripTrailingChars)
406 for (; rNewBegin != text.rend(); ++rNewBegin)
413 text.
erase(rNewBegin.base(), text.end());
423 void FilterString(
WideString& text, CharArray
const& charArray);
432 template<
class PR>
void FilterString(
WideString& text, PR filter)
434 WideString::iterator_raw newEnd = std::remove_if(text.
begin_raw(), text.end_raw(), filter);
435 if ( newEnd != text.end_raw() )
439 int32 len = text.end_raw() - newEnd;
440 text.remove_raw(pos, len);
473 UTF16TextChar* ConvertInt32ToUTF16(int32 i, UTF16TextChar* wBuffBegin, UTF16TextChar* wBuffEnd);
483 UTF16TextChar* ConvertInt64ToUTF16(int64 i, UTF16TextChar* wBuffBegin, UTF16TextChar* wBuffEnd);
493 UTF16TextChar* ConvertUInt32ToUTF16(uint32 i, UTF16TextChar* wBuffBegin, UTF16TextChar* wBuffEnd);
503 UTF16TextChar* ConvertUInt64ToUTF16(uint64 i, UTF16TextChar* wBuffBegin, UTF16TextChar* wBuffEnd);
517 void WriteStdString(
IPMStream *s, std::string writeString);
527 void TokenizeByWhitespace(
const WideString& ws, std::vector<WideString>& tokens);
533 void NormalizeDigits(
PMString *stringToNormalize);