📄 contain.cxx
字号:
PStringStream::PStringStream(const char * cstr)
: PString(cstr),
iostream(new PStringStream::Buffer(*this, 0))
{
}
#ifdef _MSC_VER
#pragma warning(default:4355)
#endif
PStringStream::~PStringStream()
{
delete (PStringStream::Buffer *)rdbuf();
#ifndef _WIN32
init(NULL);
#endif
}
PString & PStringStream::MakeEmpty()
{
*theArray = '\0';
flush();
return *this;
}
void PStringStream::AssignContents(const PContainer & cont)
{
PString::AssignContents(cont);
flush();
}
///////////////////////////////////////////////////////////////////////////////
PStringArray::PStringArray(PINDEX count, char const * const * strarr, PBoolean caseless)
{
if (count == 0)
return;
if (PAssertNULL(strarr) == NULL)
return;
if (count == P_MAX_INDEX) {
count = 0;
while (strarr[count] != NULL)
count++;
}
SetSize(count);
for (PINDEX i = 0; i < count; i++) {
PString * newString;
if (caseless)
newString = new PCaselessString(strarr[i]);
else
newString = new PString(strarr[i]);
SetAt(i, newString);
}
}
PStringArray::PStringArray(const PString & str)
{
SetSize(1);
(*theArray)[0] = new PString(str);
}
PStringArray::PStringArray(const PStringList & list)
{
SetSize(list.GetSize());
PINDEX count = 0;
for (PStringList::const_iterator i = list.begin(); i != list.end(); i++)
(*theArray)[count++] = new PString(*i);
}
PStringArray::PStringArray(const PSortedStringList & list)
{
SetSize(list.GetSize());
for (PINDEX i = 0; i < list.GetSize(); i++)
(*theArray)[i] = new PString(list[i]);
}
void PStringArray::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
AppendString(str);
}
}
PString PStringArray::operator[](PINDEX index) const
{
PASSERTINDEX(index);
if (index < GetSize() && (*theArray)[index] != NULL)
return *(PString *)(*theArray)[index];
return PString::Empty();
}
PString & PStringArray::operator[](PINDEX index)
{
PASSERTINDEX(index);
PAssert(SetMinSize(index+1), POutOfMemory);
if ((*theArray)[index] == NULL)
(*theArray)[index] = new PString;
return *(PString *)(*theArray)[index];
}
static void strcpy_with_increment(char * & strPtr, const PString & str)
{
PINDEX len = str.GetLength()+1;
memcpy(strPtr, (const char *)str, len);
strPtr += len;
}
char ** PStringArray::ToCharArray(PCharArray * storage) const
{
PINDEX i;
PINDEX mySize = GetSize();
PINDEX storageSize = (mySize+1)*sizeof(char *);
for (i = 0; i < mySize; i++)
storageSize += (*this)[i].GetLength()+1;
char ** storagePtr;
if (storage != NULL)
storagePtr = (char **)storage->GetPointer(storageSize);
else
storagePtr = (char **)malloc(storageSize);
if (storagePtr == NULL)
return NULL;
char * strPtr = (char *)&storagePtr[mySize+1];
for (i = 0; i < mySize; i++) {
storagePtr[i] = strPtr;
strcpy_with_increment(strPtr, (*this)[i]);
}
storagePtr[i] = NULL;
return storagePtr;
}
///////////////////////////////////////////////////////////////////////////////
PStringList::PStringList(PINDEX count, char const * const * strarr, PBoolean caseless)
{
if (count == 0)
return;
if (PAssertNULL(strarr) == NULL)
return;
for (PINDEX i = 0; i < count; i++) {
PString * newString;
if (caseless)
newString = new PCaselessString(strarr[i]);
else
newString = new PString(strarr[i]);
Append(newString);
}
}
PStringList::PStringList(const PString & str)
{
AppendString(str);
}
PStringList::PStringList(const PStringArray & array)
{
for (PINDEX i = 0; i < array.GetSize(); i++)
AppendString(array[i]);
}
PStringList::PStringList(const PSortedStringList & list)
{
for (PINDEX i = 0; i < list.GetSize(); i++)
AppendString(list[i]);
}
PStringList & PStringList::operator += (const PStringList & v)
{
for (PStringList::const_iterator i = v.begin(); i != v.end(); i++)
AppendString(*i);
return *this;
}
void PStringList::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
AppendString(str);
}
}
///////////////////////////////////////////////////////////////////////////////
PSortedStringList::PSortedStringList(PINDEX count,
char const * const * strarr,
PBoolean caseless)
{
if (count == 0)
return;
if (PAssertNULL(strarr) == NULL)
return;
for (PINDEX i = 0; i < count; i++) {
PString * newString;
if (caseless)
newString = new PCaselessString(strarr[i]);
else
newString = new PString(strarr[i]);
Append(newString);
}
}
PSortedStringList::PSortedStringList(const PString & str)
{
AppendString(str);
}
PSortedStringList::PSortedStringList(const PStringArray & array)
{
for (PINDEX i = 0; i < array.GetSize(); i++)
AppendString(array[i]);
}
PSortedStringList::PSortedStringList(const PStringList & list)
{
for (PStringList::const_iterator i = list.begin(); i != list.end(); i++)
AppendString(*i);
}
void PSortedStringList::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
AppendString(str);
}
}
PINDEX PSortedStringList::GetNextStringsIndex(const PString & str) const
{
PINDEX len = str.GetLength();
Element * lastElement;
PINDEX lastIndex = InternalStringSelect(str, len, info->root, lastElement);
if (lastIndex != 0) {
Element * prev;
while ((prev = info->Predecessor(lastElement)) != &info->nil &&
((PString *)prev->data)->NumCompare(str, len) >= EqualTo) {
lastElement = prev;
lastIndex--;
}
}
return lastIndex;
}
PINDEX PSortedStringList::InternalStringSelect(const char * str,
PINDEX len,
Element * thisElement,
Element * & lastElement) const
{
if (thisElement == &info->nil)
return 0;
switch (((PString *)thisElement->data)->NumCompare(str, len)) {
case PObject::LessThan :
{
PINDEX index = InternalStringSelect(str, len, thisElement->right, lastElement);
return thisElement->left->subTreeSize + index + 1;
}
case PObject::GreaterThan :
return InternalStringSelect(str, len, thisElement->left, lastElement);
default :
lastElement = thisElement;
return thisElement->left->subTreeSize;
}
}
///////////////////////////////////////////////////////////////////////////////
PStringSet::PStringSet(PINDEX count, char const * const * strarr, PBoolean caseless)
{
if (count == 0)
return;
if (PAssertNULL(strarr) == NULL)
return;
for (PINDEX i = 0; i < count; i++) {
if (caseless)
Include(PCaselessString(strarr[i]));
else
Include(PString(strarr[i]));
}
}
PStringSet::PStringSet(const PString & str)
{
Include(str);
}
void PStringSet::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
Include(str);
}
}
///////////////////////////////////////////////////////////////////////////////
POrdinalToString::POrdinalToString(PINDEX count, const Initialiser * init)
{
while (count-- > 0) {
SetAt(init->key, init->value);
init++;
}
}
void POrdinalToString::ReadFrom(istream & strm)
{
while (strm.good()) {
POrdinalKey key;
char equal;
PString str;
strm >> key >> ws >> equal >> str;
if (equal != '=')
SetAt(key, PString::Empty());
else
SetAt(key, str.Mid(equal+1));
}
}
///////////////////////////////////////////////////////////////////////////////
PStringToOrdinal::PStringToOrdinal(PINDEX count,
const Initialiser * init,
PBoolean caseless)
{
while (count-- > 0) {
if (caseless)
SetAt(PCaselessString(init->key), init->value);
else
SetAt(init->key, init->value);
init++;
}
}
void PStringToOrdinal::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
PINDEX equal = str.FindLast('=');
if (equal == P_MAX_INDEX)
SetAt(str, 0);
else
SetAt(str.Left(equal), str.Mid(equal+1).AsInteger());
}
}
///////////////////////////////////////////////////////////////////////////////
PStringToString::PStringToString(PINDEX count,
const Initialiser * init,
PBoolean caselessKeys,
PBoolean caselessValues)
{
while (count-- > 0) {
if (caselessValues)
if (caselessKeys)
SetAt(PCaselessString(init->key), PCaselessString(init->value));
else
SetAt(init->key, PCaselessString(init->value));
else
if (caselessKeys)
SetAt(PCaselessString(init->key), init->value);
else
SetAt(init->key, init->value);
init++;
}
}
void PStringToString::ReadFrom(istream & strm)
{
while (strm.good()) {
PString str;
strm >> str;
PINDEX equal = str.Find('=');
if (equal == P_MAX_INDEX)
SetAt(str, PString::Empty());
else
SetAt(str.Left(equal), str.Mid(equal+1));
}
}
char ** PStringToString::ToCharArray(bool withEqualSign, PCharArray * storage) const
{
PINDEX i;
PINDEX mySize = GetSize();
PINDEX numPointers = mySize*(withEqualSign ? 1 : 2) + 1;
PINDEX storageSize = numPointers*sizeof(char *);
for (i = 0; i < mySize; i++)
storageSize += GetKeyAt(i).GetLength()+1 + GetDataAt(i).GetLength()+1;
char ** storagePtr;
if (storage != NULL)
storagePtr = (char **)storage->GetPointer(storageSize);
else
storagePtr = (char **)malloc(storageSize);
if (storagePtr == NULL)
return NULL;
char * strPtr = (char *)&storagePtr[numPointers];
PINDEX strIndex = 0;
for (i = 0; i < mySize; i++) {
storagePtr[strIndex++] = strPtr;
if (withEqualSign)
strcpy_with_increment(strPtr, GetKeyAt(i) + '=' + GetDataAt(i));
else {
strcpy_with_increment(strPtr, GetKeyAt(i));
storagePtr[strIndex++] = strPtr;
strcpy_with_increment(strPtr, GetDataAt(i));
}
}
storagePtr[strIndex] = NULL;
return storagePtr;
}
///////////////////////////////////////////////////////////////////////////////
PRegularExpression::PRegularExpression()
{
lastError = NotCompiled;
expression = NULL;
flagsSaved = IgnoreCase;
}
PRegularExpression::PRegularExpression(const PString & pattern, int flags)
{
expression = NULL;
Compile(pattern, flags);
}
PRegularExpression::PRegularExpression(const char * pattern, int flags)
{
expression = NULL;
Compile(pattern, flags);
}
PRegularExpression::PRegularExpression(const PRegularExpression & from)
{
expression = NULL;
patternSaved = from.patternSaved;
flagsSaved = from.flagsSaved;
Compile(patternSaved, flagsSaved);
}
PRegularExpression & PRegularExpression::operator =(const PRegularExpression & from)
{
expression = NULL;
patternSaved = from.patternSaved;
flagsSaved = from.flagsSaved;
Compile(patternSaved, flagsSaved);
return *this;
}
PRegularExpression::~PRegularExpression()
{
if (expression != NULL) {
regfree(regexpression);
delete regexpression;
}
}
PRegularExpression::ErrorCodes PRegularExpression::GetErrorCode() const
{
return lastError;
}
PString PRegularExpression::GetErrorText() const
{
PString str;
regerror(lastError, regexpression, str.GetPointer(256), 256);
return str;
}
PBoolean PRegularExpression::Compile(const PString & pattern, int flags)
{
return Compile((const char *)pattern, flags);
}
PBoolean PRegularExpression::Compile(const char * pattern, int flags)
{
patternSaved = pattern;
flagsSaved = flags;
if (expression != NULL) {
regfree(regexpression);
delete regexpression;
expression = NULL;
}
if (pattern == NULL || *pattern == '\0')
lastError = BadPattern;
else {
expression = new regex_t;
lastError = (ErrorCodes)regcomp(regexpression, pattern, flags);
}
return lastError == NoError;
}
PBoolean PRegularExpression::Execute(const PString & str, PINDEX & start, int flags) const
{
PINDEX dummy;
return Execute((const char *)str, start, dummy, flags);
}
PBoolean PRegularExpression::Execute(const PString & str, PINDEX & start, PINDEX & len, int flags) const
{
return Execute((const char *)str, start, len, flags);
}
PBoolean PRegularExpression::Execute(const char * cstr, PINDEX & start, int flags) const
{
PINDEX dummy;
return Execute(cstr, start, dummy, flags);
}
PBoolean PRegularExpression::Execute(const char * cstr, PINDEX & start, PINDEX & len, int flags) const
{
if (expression == NULL) {
lastError = NotCompiled;
return PFalse;
}
if (lastError != NoError && lastError != NoMatch)
return PFalse;
regmatch_t match;
lastError = (ErrorCodes)regexec(regexpression, cstr, 1, &match, flags);
if (lastError != NoError)
return PFalse;
start = match.rm_so;
len = match.rm_eo - start;
return PTrue;
}
PBoolean PRegularExpression::Execute(const PString & str, PIntArray & starts, int flags) const
{
PIntArray dummy;
return Execute((const char *)str, starts, dummy, flags);
}
PBoolean PRegularExpression::Execute(const PString & str,
PIntArray & starts,
PIntArray & ends,
int flags) const
{
return Execute((const char *)str, starts, ends, flags);
}
PBoolean PRegularExpression::Execute(const char * cstr, PIntArray & starts, int flags) const
{
PIntArray dummy;
return Execute(cstr, starts, dummy, flags);
}
PBoolean PRegularExpression::Execute(const char * cstr,
PIntArray & starts,
PIntArray & ends,
int flags) const
{
if (expression == NULL) {
lastError = NotCompiled;
return PFalse;
}
regmatch_t single_match;
regmatch_t * matches = &single_match;
PINDEX count = starts.GetSize();
if (count > 1)
matches = new regmatch_t[count];
else
count = 1;
lastError = (ErrorCodes)regexec(regexpression, cstr, count, matches, flags);
if (lastError == NoError) {
starts.SetMinSize(count);
ends.SetMinSize(count);
for (PINDEX i = 0; i < count; i++) {
starts[i] = matches[i].rm_so;
ends[i] = matches[i].rm_eo;
}
}
if (matches != &single_match)
delete [] matches;
return lastError == NoError;
}
PString PRegularExpression::EscapeString(const PString & str)
{
PString translated;
PINDEX lastPos = 0;
PINDEX nextPos;
while ((nextPos = str.FindOneOf("\\^$+?*.[]()|{}", lastPos+1)) != P_MAX_INDEX) {
translated += str(lastPos, nextPos-1) + "\\";
lastPos = nextPos;
}
if (lastPos == 0)
return str;
return translated + str.Mid(lastPos);
}
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -