1 #ifndef __STRINGS_HPP__ 2 #define __STRINGS_HPP__ 56 #if defined(_UNICODE) || defined(UNICODE) 57 #define AddSlashes AddSlashesW 58 #define AddCSlashes AddCSlashesW 60 #define AddSlashes AddSlashesA 61 #define AddCSlashes AddCSlashesA 82 template <
typename _ChTy,
typename _IndexType >
85 std::vector<_IndexType> next( sublen + 1 );
90 if ( k == -1 || substr[j] == substr[k] )
94 if ( substr[j] != substr[k] )
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 )
114 while ( i < len && j < sublen )
116 if ( j == -1 || str[i] == substr[j] )
126 return j == sublen ? i - sublen : -1;
130 template <
typename _ChTy,
typename _IndexType >
131 inline static int _Templ_KmpMatch( _ChTy
const * str,
int len, _ChTy
const * substr,
int sublen,
int pos )
133 return _Templ_KmpMatchEx<_ChTy, _IndexType>( str, len, substr, sublen, pos,
_Templ_KmpCalcNext( substr, sublen ) );
139 WINUX_FUNC_DECL(
int)
KmpMatchEx(
char const * str,
int len,
char const * substr,
int sublen,
int pos, std::vector<int>
const & next );
148 std::ostringstream * _sout;
160 template <
typename _AnyType >
163 assert( _sout != NULL );
204 void init(
StringArray const & matches, ReplaceFuncType replaceFunc,
void * extra = NULL );
207 int addMatchReplacePair(
String const & match,
String const & replace );
209 int addMatch(
String const & match );
211 ReplaceFuncType setReplaceFunc( ReplaceFuncType newReplaceFunc,
void * extra = NULL );
227 String const & getMatchItem(
int item )
const;
228 String getReplaceItem(
int item )
const;
229 void setReplaceItem(
int item,
String const & replace );
233 std::vector<KmpNextValueArray> _nextVals;
236 ReplaceFuncType _replaceFunc;
247 static void Set(
char const * lc ) { _clsLc = lc; }
248 static char const *
Get() {
return _clsLc.c_str(); }
282 enum { szCharInput, szWCharInput } _type;
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 );
292 #if defined(__GNUC__) || _MSC_VER >= 1600 294 template <
typename _CHAR, u
int _N >
302 #define SZ(sz) SZInput( sz, sizeof(sz) / sizeof(sz[0]) ) 314 Conv(
char const * fromCode,
char const * toCode );
323 int convert(
char const * srcBuf,
size_t srcSize,
char * * destBuf );
329 template <
typename _RetString,
typename _String >
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;
345 template <
typename _ToString >
355 return this->Conv::convert<_ToString, AnsiString>(str);
360 typename _ToString::value_type * buf;
361 Conv::convert( (
char *)str.c_str(), (str.length() + 1) *
sizeof(
typename AnsiString::value_type), (
char **)&buf );
369 template <
typename _FromString >
379 return this->Conv::convert<AnsiString, _FromString>(str);
384 AnsiString::value_type * buf;
385 Conv::convert( (
char *)str.c_str(), (str.length() + 1) *
sizeof(
typename _FromString::value_type), (
char **)&buf );
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进行匹配
ConvTo(char const *toCode)
AnsiString AddCSlashesA(AnsiString const &str)
UnicodeString AddSlashesW(UnicodeString const &str, UnicodeString const &charlist)
String StrLower(String const &str)
LocalString StringToLocal(String const &str)
uint UnicodeMinLength(UnicodeString const &unicode)
返回一个unicode字符串转换为多字节字符串最少需要多少字节(by local CodePage),用于wcstombs ...
std::basic_string< char > AnsiString
String & StrMakeLower(String *str)
使字符串小写
String & StrMakeReplace(String *str, String const &findText, String const &replaceText, String::size_type offset=0)
使字符串全文替换
int markpos
标记,表示进行到这个位置了,该从这个位置开始
int StrSplit(String const &str, String const &delimList, StringArray *arr, bool alwaysRetOneElem=false)
字符串分割
int KmpMatchEx(char const *str, int len, char const *substr, int sublen, int pos, std::vector< int > const &next)
KMP字符串匹配算法 传入已经求好的next进行匹配
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)
std::ostream & operator<<(std::ostream &o, ConsoleAttrT< _VarType > const &tr)
_ToString convert(AnsiString const &str)
#define DISABLE_OBJECT_COPY(clsname)
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
SZInput SZ(_CHAR(&sz)[_N])
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
static int _Templ_KmpMatch(_ChTy const *str, int len, _ChTy const *substr, int sublen, int pos)
KMP匹配算法 匹配
String LocalToString(LocalString const &local)
兼容字符串与Unicode,Local字符串相互转换
ConvFrom(char const *fromCode)
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值
String StrJoin(String const &delim, StringArray const &arr)
字符串组合连接
AnsiString AddSlashesA(AnsiString const &str, AnsiString const &charlist)
反斜杠操作
#define WINUX_FUNC_DECL(ret)
UnicodeString AddCSlashesW(UnicodeString const &str)
String AddQuotes(String const &str, tchar quote= '\"' )
double引号
static void Set(char const *lc)
static char const * Get()
uint LocalCharsCount(LocalString const &local)
返回一个本地字符串里有多少个实际的字符(by local CodePage),用于mbstowcs
_RetString convert(_String const &str)
进行编码转换
std::vector< short > KmpNextValueArray
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)
用来使得String能够用operator<<来赋值
std::basic_string< tchar > String
std::basic_string< wchar > UnicodeString
LocalString UnicodeToLocal(UnicodeString const &unicode)
Unicode转换到本地Ansi.
int convert(char const *srcBuf, size_t srcSize, char **destBuf)
进行编码转换
String StrUpper(String const &str)
AnsiString LocalToUtf8(AnsiString const &str)
从本地编码转到utf-8