fastdo  0.5.12
strings.hpp
浏览该文件的文档.
1 #ifndef __STRINGS_HPP__
2 #define __STRINGS_HPP__
3 
4 #include <stdarg.h>
5 
6 namespace winux
7 {
8 
17 WINUX_FUNC_DECL(int) StrSplit( String const & str, String const & delimList, StringArray * arr, bool alwaysRetOneElem = false );
18 
27 WINUX_FUNC_DECL(int) StrSplit2( String const & str, String const & delim, StringArray * arr, bool alwaysRetOneElem = false );
28 
30 WINUX_FUNC_DECL(String) StrJoin( String const & delim, StringArray const & arr );
32 WINUX_FUNC_DECL(String) StrInsert( String const & str, int start, int end, String const & insert );
34 WINUX_FUNC_DECL(String &) StrMakeReplace( String * str, String const & findText, String const & replaceText, String::size_type offset = 0 );
35 
40 WINUX_FUNC_DECL(String) StrTrim( String const & str );
41 
44 WINUX_FUNC_DECL(String) StrUpper( String const & str );
47 WINUX_FUNC_DECL(String) StrLower( String const & str );
48 
50 WINUX_FUNC_DECL(AnsiString) AddSlashesA( AnsiString const & str, AnsiString const & charlist );
51 inline AnsiString AddCSlashesA( AnsiString const & str ) { return AddSlashesA( str, "\n\r\t\v\a\\\'\"" ); }
52 
53 WINUX_FUNC_DECL(UnicodeString) AddSlashesW( UnicodeString const & str, UnicodeString const & charlist );
54 inline UnicodeString AddCSlashesW( UnicodeString const & str ) { return AddSlashesW( str, L"\n\r\t\v\a\\\'\"" ); }
55 
56 #if defined(_UNICODE) || defined(UNICODE)
57  #define AddSlashes AddSlashesW
58  #define AddCSlashes AddCSlashesW
59 #else
60  #define AddSlashes AddSlashesA
61  #define AddCSlashes AddCSlashesA
62 #endif
63 
65 WINUX_FUNC_DECL(AnsiString) StripSlashes( AnsiString const & str, AnsiString const & charlist );
66 inline AnsiString StripCSlashes( AnsiString const & str ) { return StripSlashes( str, "\n\r\t\v\a\\\'\"" ); }
67 
69 WINUX_FUNC_DECL(String) AddQuotes( String const & str, tchar quote = '\"' );
70 
79 WINUX_FUNC_DECL(bool) StrGetLine( String * line, String const & str, int * i, String * nl = NULL );
80 
82 template < typename _ChTy, typename _IndexType >
83 inline static std::vector<_IndexType> _Templ_KmpCalcNext( _ChTy const * substr, int sublen )
84 {
85  std::vector<_IndexType> next( sublen + 1 );
86  int j = 0, k = -1;
87  next[0] = -1;
88  while ( j < sublen )
89  {
90  if ( k == -1 || substr[j] == substr[k] )
91  {
92  j++;
93  k++;
94  if ( substr[j] != substr[k] )
95  next[j] = k;
96  else
97  next[j] = next[k];
98  }
99  else
100  {
101  k = next[k];
102  }
103  }
104  return next;
105 }
106 
108 template < typename _ChTy, typename _IndexType >
109 inline static int _Templ_KmpMatchEx( _ChTy const * str, int len, _ChTy const * substr, int sublen, int pos, std::vector<_IndexType> const & next )
110 {
111  int i, j;
112  i = pos;
113  j = 0;
114  while ( i < len && j < sublen )
115  {
116  if ( j == -1 || str[i] == substr[j] )
117  {
118  i++;
119  j++;
120  }
121  else
122  {
123  j = next[j];
124  }
125  }
126  return j == sublen ? i - sublen : -1;
127 }
128 
130 template < typename _ChTy, typename _IndexType >
131 inline static int _Templ_KmpMatch( _ChTy const * str, int len, _ChTy const * substr, int sublen, int pos )
132 {
133  return _Templ_KmpMatchEx<_ChTy, _IndexType>( str, len, substr, sublen, pos, _Templ_KmpCalcNext( substr, sublen ) );
134 }
135 
137 WINUX_FUNC_DECL(std::vector<int>) KmpCalcNext( char const * substr, int sublen );
139 WINUX_FUNC_DECL(int) KmpMatchEx( char const * str, int len, char const * substr, int sublen, int pos, std::vector<int> const & next );
141 WINUX_FUNC_DECL(int) KmpMatch( char const * str, int len, char const * substr, int sublen, int pos );
142 
143 
146 {
147  String * _str;
148  std::ostringstream * _sout;
149  bool _isAppend;
150 public:
155  OutStringStreamWrapper( String * str, bool isAppend = false );
158  OutStringStreamWrapper & operator = ( OutStringStreamWrapper & other );
159 
160  template < typename _AnyType >
161  std::ostream & operator << ( _AnyType t )
162  {
163  assert( _sout != NULL );
164  return *_sout << t;
165  }
166 };
167 
170 {
171 public:
172  typedef std::vector<short> KmpNextValueArray;
173 
174  struct MatchState
175  {
176  int j;
177  int markpos;
178  };
179 
180  typedef std::vector<MatchState> MatchStates;
181 
182  struct MatchResult
183  {
184  int pos;
185  int item;
186  };
188  typedef String (* ReplaceFuncType)( MultiMatch const * matchObj, int item, void * extra );
189 
191  MultiMatch( String matches[], uint m, String replaces[], uint n );
193  MultiMatch( String matches[], uint count, ReplaceFuncType replaceFunc, void * extra = NULL );
195  MultiMatch( StringArray const & matches, StringArray const & replaces );
197  MultiMatch( StringArray const & matches, ReplaceFuncType replaceFunc, void * extra = NULL );
198 
202  MultiMatch();
203  void init( StringArray const & matches, StringArray const & replaces );
204  void init( StringArray const & matches, ReplaceFuncType replaceFunc, void * extra = NULL );
205 
207  int addMatchReplacePair( String const & match, String const & replace );
209  int addMatch( String const & match );
211  ReplaceFuncType setReplaceFunc( ReplaceFuncType newReplaceFunc, void * extra = NULL );
212 
217  MatchResult search( String const & str, int offset = 0 ) const;
219  MatchResult commonSearch( String const & str, int offset = 0 ) const;
220  /* 贪婪模式 */
221  //MatchResult greedSearch( String const & str, int offset = 0 ) const;
225  String replace( String const & str, MatchResult ( MultiMatch:: * fnSearch )( String const & str, int offset ) const = &MultiMatch::search ) const;
226 
227  String const & getMatchItem( int item ) const;
228  String getReplaceItem( int item ) const;
229  void setReplaceItem( int item, String const & replace );
231  void clear();
232 private:
233  std::vector<KmpNextValueArray> _nextVals;
234  StringArray _matchItems;
235  StringArray _replaceItems;
236  ReplaceFuncType _replaceFunc;
237  void * _extra;
238 };
239 
242 {
243  AnsiString _loc;
244  AnsiString _prevLoc;
245  static AnsiString _clsLc;
246 public:
247  static void Set( char const * lc ) { _clsLc = lc; }
248  static char const * Get() { return _clsLc.c_str(); }
249  SetLocale( char const * lc = NULL );
250  ~SetLocale();
252 };
253 
262 
268 
270 WINUX_DLL String FormatExV( uint cch, tchar const * fmt, va_list args );
271 WINUX_DLL String FormatEx( uint cch, tchar const * fmt, ... );
272 WINUX_DLL String Format( tchar const * fmt, ... );
273 
276 {
277  union
278  {
279  char * _psz;
280  wchar_t * _pwsz;
281  };
282  enum { szCharInput, szWCharInput } _type;
283  size_t _count;
284 public:
285  explicit SZInput( char * psz, size_t count ) : _psz(psz), _type(szCharInput), _count(count) { }
286  explicit SZInput( wchar_t * pwsz, size_t count ) : _pwsz(pwsz), _type(szWCharInput), _count(count) { }
287  SZInput & operator = ( char const * pstr );
288  SZInput & operator = ( wchar_t const * pwstr );
289 
290 };
291 
292 #if defined(__GNUC__) || _MSC_VER >= 1600
293 /* VC2010以上支持模板取数组大小 */
294 template < typename _CHAR, uint _N >
295 SZInput SZ( _CHAR (&sz)[_N] )
296 {
297  return SZInput( sz, _N );
298 }
299 
300 #else
301 /* 否则使用宏定义 */
302 #define SZ(sz) SZInput( sz, sizeof(sz) / sizeof(sz[0]) )
303 
304 #endif
305 /* 如果操作对象是缓冲区指针,则使用SZP宏 */
306 #define SZP SZInput
307 
308 // ----------------------------------------------------------------------------------
309 
312 {
313 public:
314  Conv( char const * fromCode, char const * toCode );
315  ~Conv();
316 
323  int convert( char const * srcBuf, size_t srcSize, char * * destBuf );
324 
329  template < typename _RetString, typename _String >
330  _RetString convert( _String const & str )
331  {
332  typename _RetString::pointer buf;
333  size_t outBytes = this->convert( (char *)str.c_str(), (str.length() + 1) * sizeof(typename _String::value_type), (char **)&buf );
334  _RetString s = (typename _RetString::pointer)buf;
335  free(buf);
336  return s;
337  }
338 private:
340 
342 };
343 
345 template < typename _ToString >
346 class ConvTo : public Conv
347 {
348 public:
349  ConvTo( char const * toCode ) : Conv( "", toCode )
350  {
351  }
352 
353  _ToString convert( AnsiString const & str )
354  {
355  return this->Conv::convert<_ToString, AnsiString>(str);
356  }
357 
358  _ToString operator () ( AnsiString const & str )
359  {
360  typename _ToString::value_type * buf;
361  Conv::convert( (char *)str.c_str(), (str.length() + 1) * sizeof(typename AnsiString::value_type), (char **)&buf );
362  _ToString s = buf;
363  free(buf);
364  return s;
365  }
366 };
367 
369 template < typename _FromString >
370 class ConvFrom : public Conv
371 {
372 public:
373  ConvFrom( char const * fromCode ) : Conv( fromCode, "" )
374  {
375  }
376 
377  AnsiString convert( _FromString const & str )
378  {
379  return this->Conv::convert<AnsiString, _FromString>(str);
380  }
381 
382  AnsiString operator () ( _FromString const & str )
383  {
384  AnsiString::value_type * buf;
385  Conv::convert( (char *)str.c_str(), (str.length() + 1) * sizeof(typename _FromString::value_type), (char **)&buf );
386  AnsiString s = buf;
387  free(buf);
388  return s;
389  }
390 
391 };
392 
393 // UTF-8编码转换
398 
399 
400 } // namespace winux
401 
402 #endif // __STRINGS_HPP__
static int _Templ_KmpMatchEx(_ChTy const *str, int len, _ChTy const *substr, int sublen, int pos, std::vector< _IndexType > const &next)
KMP匹配算法 传入已经求好的next进行匹配
Definition: strings.hpp:109
ConvTo(char const *toCode)
Definition: strings.hpp:349
AnsiString AddCSlashesA(AnsiString const &str)
Definition: strings.hpp:51
wchar_t * _pwsz
Definition: strings.hpp:280
UnicodeString AddSlashesW(UnicodeString const &str, UnicodeString const &charlist)
String StrLower(String const &str)
设置locale信息
Definition: strings.hpp:241
LocalString StringToLocal(String const &str)
uint UnicodeMinLength(UnicodeString const &unicode)
返回一个unicode字符串转换为多字节字符串最少需要多少字节(by local CodePage),用于wcstombs ...
#define WINUX_DLL
Definition: utilities.hpp:57
std::basic_string< char > AnsiString
Definition: utilities.hpp:165
String & StrMakeLower(String *str)
使字符串小写
String & StrMakeReplace(String *str, String const &findText, String const &replaceText, String::size_type offset=0)
使字符串全文替换
int markpos
标记,表示进行到这个位置了,该从这个位置开始
Definition: strings.hpp:177
SZInput(char *psz, size_t count)
Definition: strings.hpp:285
int StrSplit(String const &str, String const &delimList, StringArray *arr, bool alwaysRetOneElem=false)
字符串分割
SZInput(wchar_t *pwsz, size_t count)
Definition: strings.hpp:286
int KmpMatchEx(char const *str, int len, char const *substr, int sublen, int pos, std::vector< int > const &next)
KMP字符串匹配算法 传入已经求好的next进行匹配
int item
匹配项的索引
Definition: strings.hpp:185
String & StrMakeUpper(String *str)
使字符串大写
MatchResult search(String const &str, int offset=0) const
搜索任意一项匹配(KMP)
std::vector< int > KmpCalcNext(char const *substr, int sublen)
KMP字符串匹配算法 求子串next值
WINUX_DLL String FormatEx(uint cch, tchar const *fmt,...)
AnsiString convert(_FromString const &str)
Definition: strings.hpp:377
std::ostream & operator<<(std::ostream &o, ConsoleAttrT< _VarType > const &tr)
Definition: console.hpp:134
_ToString convert(AnsiString const &str)
Definition: strings.hpp:353
#define DISABLE_OBJECT_COPY(clsname)
Definition: utilities.hpp:78
AnsiString LocalFromUtf8(AnsiString const &str)
从utf-8转到本地编码
int StrSplit2(String const &str, String const &delim, StringArray *arr, bool alwaysRetOneElem=false)
字符串分割2
std::vector< String > StringArray
Definition: utilities.hpp:171
字符串编码转换
Definition: strings.hpp:311
SZInput SZ(_CHAR(&sz)[_N])
Definition: strings.hpp:295
char tchar
Definition: utilities.hpp:155
int j
下一次从子串开始的位置
Definition: strings.hpp:176
填充based-zero字符串缓冲区包装类
Definition: strings.hpp:275
AnsiString LocalString
Definition: utilities.hpp:166
AnsiString StripSlashes(AnsiString const &str, AnsiString const &charlist)
反斜杠操作
int KmpMatch(char const *str, int len, char const *substr, int sublen, int pos)
KMP字符串匹配算法 匹配
std::vector< MatchState > MatchStates
Definition: strings.hpp:180
static int _Templ_KmpMatch(_ChTy const *str, int len, _ChTy const *substr, int sublen, int pos)
KMP匹配算法 匹配
Definition: strings.hpp:131
指定编码转到本地编码
Definition: strings.hpp:370
String LocalToString(LocalString const &local)
兼容字符串与Unicode,Local字符串相互转换
ConvFrom(char const *fromCode)
Definition: strings.hpp:373
String StrInsert(String const &str, int start, int end, String const &insert)
在指定位置插入字符串
static std::vector< _IndexType > _Templ_KmpCalcNext(_ChTy const *substr, int sublen)
KMP匹配算法 求子串next值
Definition: strings.hpp:83
String StrJoin(String const &delim, StringArray const &arr)
字符串组合连接
AnsiString AddSlashesA(AnsiString const &str, AnsiString const &charlist)
反斜杠操作
unsigned int uint
Definition: utilities.hpp:128
本地编码转到指定编码
Definition: strings.hpp:346
#define WINUX_FUNC_DECL(ret)
Definition: utilities.hpp:61
UnicodeString AddCSlashesW(UnicodeString const &str)
Definition: strings.hpp:54
String AddQuotes(String const &str, tchar quote= '\"' )
double引号
int pos
匹配到的位置
Definition: strings.hpp:184
static void Set(char const *lc)
Definition: strings.hpp:247
static char const * Get()
Definition: strings.hpp:248
uint LocalCharsCount(LocalString const &local)
返回一个本地字符串里有多少个实际的字符(by local CodePage),用于mbstowcs
_RetString convert(_String const &str)
进行编码转换
Definition: strings.hpp:330
std::vector< short > KmpNextValueArray
Definition: strings.hpp:172
WINUX_DLL String FormatExV(uint cch, tchar const *fmt, va_list args)
格式化字符串
WINUX_DLL String Format(tchar const *fmt,...)
UnicodeString LocalToUnicode(LocalString const &local)
本地Ansi转到Unicode
bool StrGetLine(String *line, String const &str, int *i, String *nl=NULL)
获取字符串中的一行,支持unix,windows,mac平台的行分隔方式 line 不包含换行符,i 指示起始位置,并获得处...
UnicodeString StringToUnicode(String const &str)
String StrTrim(String const &str)
祛除字符串首尾出现的空白字符
String UnicodeToString(UnicodeString const &unicode)
AnsiString StripCSlashes(AnsiString const &str)
Definition: strings.hpp:66
用来使得String能够用operator<<来赋值
Definition: strings.hpp:145
KMP多项匹配/替换
Definition: strings.hpp:169
std::basic_string< tchar > String
Definition: utilities.hpp:162
std::basic_string< wchar > UnicodeString
Definition: utilities.hpp:167
LocalString UnicodeToLocal(UnicodeString const &unicode)
Unicode转换到本地Ansi.
int convert(char const *srcBuf, size_t srcSize, char **destBuf)
进行编码转换
String StrUpper(String const &str)
跨平台基础功能库
Definition: archives.hpp:7
AnsiString LocalToUtf8(AnsiString const &str)
从本地编码转到utf-8