Files
mir_server/Gateway/srvlib/include/ansi_string.hpp

266 lines
5.7 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#ifndef _LIB_ANSISTRING_H_
#define _LIB_ANSISTRING_H_
/******************************************************************
*
*
* $ UCS2<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> $
*
* - <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> -
*
* ʵ<EFBFBD><EFBFBD>UCS<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UCS2<EFBFBD>ַ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
*****************************************************************/
#include <stdlib.h>
#include <string.h>
namespace string
{
class AnsiString
{
public:
typedef char CharType;
typedef char* RawStrType;
private:
char* m_sStr;
private:
static const char* EMPTY_STR;
protected:
/*
realloc <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ̳д˺<EFBFBD><EFBFBD><EFBFBD>
ptr: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŵ<EFBFBD>ָ<EFBFBD><EFBFBD>
newsize: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ͷ<EFBFBD>ptrָ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ptr<EFBFBD><EFBFBD>newsize<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ptr<EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
*/
virtual void* alloc(void* ptr, size_t newsize)
{
if ( newsize == 0 )
{
if ( ptr ) free( ptr );
return NULL;
}
return realloc( ptr, newsize );
}
/*
setData <EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data: ָ<EFBFBD><EFBFBD>ԭʼ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
*/
inline void setData(const char* data)
{
if ( data )
{
size_t size = strlen(data) + 1;
size *= sizeof(*data);
m_sStr = (char*)alloc( m_sStr, size );
memcpy( m_sStr, data, size );
}
else m_sStr = (char*)alloc( m_sStr, 0 );
}
/*
catData <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data: ָ<EFBFBD><EFBFBD>ԭʼ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>
*/
inline void catData(const char* data)
{
if ( data )
{
size_t cat_size = strlen(data);
size_t cur_size = length();
m_sStr = (char*)alloc( m_sStr, (cat_size + cur_size + 1) * sizeof(*data) );
memcpy( &m_sStr[cur_size], data, (cat_size + 1) * sizeof(*data) );
}
}
public:
/*
?<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
AnsiString()
{
m_sStr = NULL;
}
AnsiString(const char* data)
{
m_sStr = NULL;
setData( data );
}
AnsiString(const AnsiString &str)
{
m_sStr = NULL;
setData( str.m_sStr );
}
virtual ~AnsiString()
{
setData( NULL );
}
public:
/* <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ(const char*)<29><>
ע<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ΪNULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>""<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD>
*/
inline operator const char*() const
{
return m_sStr ? m_sStr : EMPTY_STR;
}
/* <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ(const char*)<29><>
ע<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ΪNULL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>""<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD>
*/
inline operator char*()
{
return m_sStr ? m_sStr : NULL;
}
/* <09><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(const char*)<29><><EFBFBD>͵<EFBFBD>ֵ */
inline void operator = (const char* data)
{
if ( data != m_sStr )
{
setData( data );
}
}
/* <09><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>͵<EFBFBD>ֵ */
inline void operator = (const AnsiString& str)
{
if ( &str != this )
{
setData( str.m_sStr );
}
}
/* <09><>(const char*)<29><><EFBFBD>͵<EFBFBD><CDB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline void operator += (const char* data)
{
if ( data != m_sStr )
{
catData( data );
}
else
{
AnsiString wstr(m_sStr);
catData(wstr.m_sStr);
}
}
/* <09><><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline void operator += (const AnsiString& str)
{
if ( &str != this )
{
catData( str.m_sStr );
}
else
{
AnsiString wstr(m_sStr);
catData(wstr.m_sStr);
}
}
/* <09><>(const char*)<29><><EFBFBD>ͽ<EFBFBD><CDBD>мӷ<D0BC><D3B7><EFBFBD><EFBFBD><EFBFBD><E3B2A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>CAnsiString<6E><67> */
inline const AnsiString operator + (const char* data)
{
AnsiString str( m_sStr );
str.catData( data );
return str;
}
/* <09><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>мӷ<D0BC><D3B7><EFBFBD><EFBFBD><EFBFBD><E3B2A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>CAnsiString<6E><67> */
inline const AnsiString operator + (const AnsiString& str)
{
AnsiString _str( m_sStr );
_str.catData( str.m_sStr );
return _str;
}
/* <20>ж<EFBFBD><D0B6><EFBFBD>(const char*)<29><><EFBFBD>͵<EFBFBD><CDB5>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>е<EFBFBD><D0B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ССд<D0A1><D0B4> */
inline bool operator == (const char* data) const
{
return compare( data ) == 0;
}
/* <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ССд<D0A1><D0B4> */
inline bool operator == (const AnsiString& str) const
{
return compare( str.m_sStr ) == 0;
}
/* <20>ж<EFBFBD><D0B6><EFBFBD>(const char*)<29><><EFBFBD>͵<EFBFBD><CDB5>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>е<EFBFBD><D0B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ССд<D0A1><D0B4> */
inline bool operator != (const char* data) const
{
return compare( data ) != 0;
}
/* <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ССд<D0A1><D0B4> */
inline bool operator != (const AnsiString& str) const
{
return compare( str.m_sStr ) != 0;
}
/* <09>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ǿ<EFBFBD> */
inline bool operator ! () const
{
return !m_sStr || !m_sStr[0];
}
public:
/* ȡ<><C8A1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8> */
inline const char* rawStr() const
{
return m_sStr;
}
/* ȡ<><C8A1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8> */
inline char* rawStr()
{
return m_sStr;
}
/* ȡ<><C8A1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
inline size_t length() const
{
return m_sStr ? strlen(m_sStr) : 0;
}
/* <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>) */
inline void setLength(const size_t len)
{
if ( len > 0 )
{
m_sStr = (char*)alloc( m_sStr, sizeof(m_sStr[0]) * (len + 1) );
if ( m_sStr ) m_sStr[len] = 0;
}
else m_sStr = (char*)alloc( m_sStr, 0 );
}
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ա<EFBFBD> */
inline int compare(const char* data) const
{
if ( !m_sStr || !m_sStr[0] )
{
if ( !data || !data[0] )
return 0;
else return 1;
}
return strcmp( m_sStr, data );
}
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жԱ<D0B6> */
inline int compare(const AnsiString& str) const
{
if ( !m_sStr || !m_sStr[0] )
{
if ( !str.m_sStr || !str.m_sStr[0] )
return 0;
else return 1;
}
return strcmp( m_sStr, str.m_sStr );
}
/* <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> */
inline bool isEmpty() const
{
return !m_sStr || !m_sStr[0];
}
/* ת<><D7AA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪUCS-2LE<4C><45>ʽ<EFBFBD><CABD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>sOutput<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ұ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>sOutput<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sOutput<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>null<EFBFBD><EFBFBD>sOutput<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>ı
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>sOutput<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD>򷵻<EFBFBD><EFBFBD>µ<EFBFBD>CWideString<EFBFBD><EFBFBD><EFBFBD>󣬴<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٺ<EFBFBD><EFBFBD>ʵ<EFBFBD>ʱ<EFBFBD><EFBFBD>delete<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
ת<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL
*/
//WideString* toWStr(WideString* sOutput = NULL) const;
/* <20><>ʽ<EFBFBD><CABD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> */
size_t format(const char* fmt, ...);
size_t format_args(const char* fmt, va_list _Args);
};
};
#endif