📄 contain.cxx
字号:
PINDEX len = str[0] | (str[1] << 8);
PAssert(SetSize(len+1), POutOfMemory);
PSTRING_COPY(theArray, str+2, len);
}
break;
case Literal :
PAssert(SetSize(strlen(str)+1), POutOfMemory);
TranslateEscapes(str, theArray);
PAssert(MakeMinimumSize(), POutOfMemory);
break;
case Printf : {
va_list args;
va_start(args, str);
vsprintf(str, args);
break;
}
default :
PAssertAlways(PInvalidParameter);
}
}
template <class T> char * p_unsigned2string(T value, T base, char * str)
{
if (value >= base)
str = p_unsigned2string<T>(value/base, base, str);
value %= base;
if (value < 10)
*str = (char)(value + '0');
else
*str = (char)(value + 'A'-10);
return str+1;
}
template <class T> char * p_signed2string(T value, T base, char * str)
{
if (value >= 0)
return p_unsigned2string<T>(value, base, str);
*str = '-';
return p_unsigned2string<T>(-value, base, str+1);
}
PString::PString(short n)
: PCharArray(sizeof(short)*3+1)
{
p_signed2string<int>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(unsigned short n)
: PCharArray(sizeof(unsigned short)*3+1)
{
p_unsigned2string<unsigned int>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(int n)
: PCharArray(sizeof(int)*3+1)
{
p_signed2string<int>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(unsigned int n)
: PCharArray(sizeof(unsigned int)*3+1)
{
p_unsigned2string<unsigned int>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(long n)
: PCharArray(sizeof(long)*3+1)
{
p_signed2string<long>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(unsigned long n)
: PCharArray(sizeof(unsigned long)*3+1)
{
p_unsigned2string<unsigned long>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(PInt64 n)
: PCharArray(sizeof(PInt64)*3+1)
{
p_signed2string<PInt64>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(PUInt64 n)
: PCharArray(sizeof(PUInt64)*3+1)
{
p_unsigned2string<PUInt64>(n, 10, theArray);
MakeMinimumSize();
}
PString::PString(ConversionType type, long value, unsigned base)
: PCharArray(sizeof(long)*3+1)
{
PAssert(base >= 2 && base <= 36, PInvalidParameter);
switch (type) {
case Signed :
p_signed2string<long>(value, base, theArray);
break;
case Unsigned :
p_unsigned2string<unsigned long>(value, base, theArray);
break;
default :
PAssertAlways(PInvalidParameter);
}
MakeMinimumSize();
}
PString::PString(ConversionType type, double value, unsigned places)
{
switch (type) {
case Decimal :
sprintf("%0.*f", (int)places, value);
break;
case Exponent :
sprintf("%0.*e", (int)places, value);
break;
default :
PAssertAlways(PInvalidParameter);
}
}
PString & PString::operator=(short n)
{
SetMinSize(sizeof(short)*3+1);
p_signed2string<int>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(unsigned short n)
{
SetMinSize(sizeof(unsigned short)*3+1);
p_unsigned2string<unsigned int>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(int n)
{
SetMinSize(sizeof(int)*3+1);
p_signed2string<int>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(unsigned int n)
{
SetMinSize(sizeof(unsigned int)*3+1);
p_unsigned2string<unsigned int>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(long n)
{
SetMinSize(sizeof(long)*3+1);
p_signed2string<long>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(unsigned long n)
{
SetMinSize(sizeof(unsigned long)*3+1);
p_unsigned2string<unsigned long>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(PInt64 n)
{
SetMinSize(sizeof(PInt64)*3+1);
p_signed2string<PInt64>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PString & PString::operator=(PUInt64 n)
{
SetMinSize(sizeof(PUInt64)*3+1);
p_unsigned2string<PUInt64>(n, 10, theArray);
MakeMinimumSize();
return *this;
}
PObject * PString::Clone() const
{
return new PString(*this);
}
void PString::PrintOn(ostream &strm) const
{
strm << theArray;
}
void PString::ReadFrom(istream &strm)
{
SetMinSize(100);
char * ptr = theArray;
PINDEX len = 0;
int c;
while ((c = strm.get()) != EOF && c != '\n') {
*ptr++ = (char)c;
len++;
if (len >= GetSize()) {
SetSize(len + 100);
ptr = theArray + len;
}
}
*ptr = '\0';
if ((len > 0) && (ptr[-1] == '\r'))
ptr[-1] = '\0';
PAssert(MakeMinimumSize(), POutOfMemory);
}
PObject::Comparison PString::Compare(const PObject & obj) const
{
PAssert(obj.IsDescendant(PString::Class()), PInvalidCast);
return InternalCompare(0, P_MAX_INDEX, ((const PString &)obj).theArray);
}
PINDEX PString::HashFunction() const
{
// Hash function from "Data Structures and Algorithm Analysis in C++" by
// Mark Allen Weiss, with limit of only executing over first 8 characters to
// increase speed when dealing with large strings.
PINDEX i = 0;
PINDEX hash = 0;
while (i < 8 && theArray[i] != 0)
hash = (hash << 5) ^ tolower(theArray[i++]) ^ hash;
return PABSINDEX(hash)%127;
}
BOOL PString::IsEmpty() const
{
#ifdef PHAS_UNICODE
return *(WORD*)theArray == '\0';
#else
return *theArray == '\0';
#endif
}
BOOL PString::SetSize(PINDEX newSize)
{
return PAbstractArray::SetSize(newSize);
#if 0
if (IsUnique())
return PAbstractArray::SetSize(newSize);
PINDEX newsizebytes = elementSize*newSize;
PINDEX oldsizebytes = elementSize*GetSize();
char * newArray;
if (newsizebytes == 0)
newArray = NULL;
else {
if ((newArray = (char *)malloc(newsizebytes)) == NULL)
return FALSE;
if (theArray != NULL)
memcpy(newArray, theArray, PMIN(oldsizebytes, newsizebytes));
}
reference->count--;
reference = new Reference(newSize);
if (newsizebytes > oldsizebytes)
memset(newArray+oldsizebytes, 0, newsizebytes-oldsizebytes);
theArray = newArray;
return TRUE;
#endif
}
BOOL PString::MakeUnique()
{
if (IsUnique())
return TRUE;
SetSize(GetSize());
return FALSE;
}
#ifdef PHAS_UNICODE
PINDEX PString::GetLength() const
{
for (len = 0; len < GetSize(); len++)
if (((WORD *)theArray)[len] == 0)
break;
return len;
}
#endif
PString PString::operator+(const char * cstr) const
{
PINDEX olen = GetLength();
PINDEX alen = strlen(PAssertNULL(cstr))+1;
PString str;
str.SetSize(olen+alen);
PSTRING_MOVE(str.theArray, 0, theArray, 0, olen);
PSTRING_COPY(str.theArray+olen, cstr, alen);
return str;
}
PString PString::operator+(char c) const
{
PINDEX olen = GetLength();
PString str;
str.SetSize(olen+2);
PSTRING_MOVE(str.theArray, 0, theArray, 0, olen);
str.theArray[olen] = c;
return str;
}
PString & PString::operator+=(const char * cstr)
{
PINDEX olen = GetLength();
PINDEX alen = strlen(PAssertNULL(cstr))+1;
SetSize(olen+alen);
PSTRING_COPY(theArray+olen, cstr, alen);
return *this;
}
PString & PString::operator+=(char ch)
{
PINDEX olen = GetLength();
SetSize(olen+2);
theArray[olen] = ch;
return *this;
}
PString PString::operator&(const char * cstr) const
{
PINDEX alen = strlen(PAssertNULL(cstr))+1;
if (alen == 1)
return *this;
PINDEX olen = GetLength();
PString str;
PINDEX space = olen > 0 && theArray[olen-1]!=' ' && *cstr!=' ' ? 1 : 0;
str.SetSize(olen+alen+space);
PSTRING_MOVE(str.theArray, 0, theArray, 0, olen);
if (space != 0)
str.theArray[olen] = ' ';
PSTRING_COPY(str.theArray+olen+space, cstr, alen);
return str;
}
PString PString::operator&(char c) const
{
PINDEX olen = GetLength();
PString str;
PINDEX space = olen > 0 && theArray[olen-1] != ' ' && c != ' ' ? 1 : 0;
str.SetSize(olen+2+space);
PSTRING_MOVE(str.theArray, 0, theArray, 0, olen);
if (space != 0)
str.theArray[olen] = ' ';
str.theArray[olen+space] = c;
return str;
}
PString & PString::operator&=(const char * cstr)
{
PINDEX alen = strlen(PAssertNULL(cstr))+1;
if (alen == 1)
return *this;
PINDEX olen = GetLength();
PINDEX space = olen > 0 && theArray[olen-1]!=' ' && *cstr!=' ' ? 1 : 0;
SetSize(olen+alen+space);
if (space != 0)
theArray[olen] = ' ';
PSTRING_COPY(theArray+olen+space, cstr, alen);
return *this;
}
PString & PString::operator&=(char ch)
{
PINDEX olen = GetLength();
PINDEX space = olen > 0 && theArray[olen-1] != ' ' && ch != ' ' ? 1 : 0;
SetSize(olen+2+space);
if (space != 0)
theArray[olen] = ' ';
theArray[olen+space] = ch;
return *this;
}
void PString::Delete(PINDEX start, PINDEX len)
{
MakeUnique();
register PINDEX slen = GetLength();
if (start > slen)
return;
if (len > slen - start)
SetAt(start, '\0');
else
PSTRING_MOVE(theArray, start, theArray, start+len, slen-start-len+1);
MakeMinimumSize();
}
PString PString::operator()(PINDEX start, PINDEX end) const
{
if (end < start)
return PString();
register PINDEX len = GetLength();
if (start > len)
return PString();
if (end >= len) {
if (start == 0)
return *this;
end = len-1;
}
len = end - start + 1;
return PString(theArray+start, len);
}
PString PString::Left(PINDEX len) const
{
if (len == 0)
return PString();
if (len >= GetLength())
return *this;
return PString(theArray, len);
}
PString PString::Right(PINDEX len) const
{
if (len == 0)
return PString();
PINDEX srclen = GetLength();
if (len >= srclen)
return *this;
return PString(theArray+srclen-len, len);
}
PString PString::Mid(PINDEX start, PINDEX len) const
{
if (len == 0)
return PString();
if (start+len < start) // Beware of wraparound
return operator()(start, P_MAX_INDEX);
else
return operator()(start, start+len-1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -