📄 contain.cxx
字号:
{
PAssertNULL(cstr);
while (length-- > 0 && (theArray[offset] != '\0' || *cstr != '\0')) {
Comparison c = PCaselessString::InternalCompare(offset++, *cstr++);
if (c != EqualTo)
return c;
}
return EqualTo;
}
///////////////////////////////////////////////////////////////////////////////
int PStringStream::Buffer::overflow(int c)
{
if (pptr() >= epptr()) {
int gpos = gptr() - eback();
int ppos = pptr() - pbase();
char * newptr = string->GetPointer(string->GetSize() + 32);
setp(newptr, newptr + string->GetSize() - 1);
pbump(ppos);
setg(newptr, newptr + gpos, newptr + ppos);
}
if (c != EOF) {
*pptr() = (char)c;
pbump(1);
}
return 0;
}
int PStringStream::Buffer::underflow()
{
return gptr() >= egptr() ? EOF : *gptr();
}
int PStringStream::Buffer::sync()
{
char * base = string->GetPointer();
PINDEX len = string->GetLength();
setg(base, base, base + len);
setp(base, base + string->GetSize() - 1);
pbump(len);
return 0;
}
streampos PStringStream::Buffer::seekoff(streamoff off,
#ifdef __MWERKS__
ios::seekdir dir, ios::openmode mode)
#else
ios::seek_dir dir, int mode)
#endif
{
int len = string->GetLength();
int gpos = gptr() - eback();
int ppos = pptr() - pbase();
char * newgptr;
char * newpptr;
switch (dir) {
case ios::beg :
if (off < 0)
newpptr = newgptr = eback();
else if (off >= len)
newpptr = newgptr = egptr();
else
newpptr = newgptr = eback()+off;
break;
case ios::cur :
if (off < -ppos)
newpptr = eback();
else if (off >= len-ppos)
newpptr = epptr();
else
newpptr = pptr()+off;
if (off < -gpos)
newgptr = eback();
else if (off >= len-gpos)
newgptr = egptr();
else
newgptr = gptr()+off;
break;
case ios::end :
if (off < -len)
newpptr = newpptr = newgptr = eback();
else if (off >= 0)
newpptr = newgptr = egptr();
else
newpptr = newgptr = egptr()+off;
break;
default:
PAssertAlways(PInvalidParameter);
newgptr = gptr();
newpptr = pptr();
}
if ((mode&ios::in) != 0)
setg(eback(), newgptr, egptr());
if ((mode&ios::out) != 0)
setp(newpptr, epptr());
return 0;
}
PStringStream::PStringStream()
{
init(new PStringStream::Buffer(this));
}
PStringStream::PStringStream(const PString & str)
: PString(str)
{
init(new PStringStream::Buffer(this));
}
PStringStream::PStringStream(const char * cstr)
: PString(cstr)
{
init(new PStringStream::Buffer(this));
}
PStringStream::~PStringStream()
{
delete (PStringStream::Buffer *)rdbuf();
init(NULL);
}
void PStringStream::AssignContents(const PContainer & cont)
{
PString::AssignContents(cont);
flush();
}
///////////////////////////////////////////////////////////////////////////////
PStringArray::PStringArray(PINDEX count, char const * const * strarr, BOOL caseless)
{
if (count == 0)
return;
PAssertNULL(strarr);
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 PStringList & list)
{
SetSize(list.GetSize());
for (PINDEX i = 0; i < list.GetSize(); i++)
(*theArray)[i] = new PString(list[i]);
}
PStringArray::PStringArray(const PSortedStringList & list)
{
SetSize(list.GetSize());
for (PINDEX i = 0; i < list.GetSize(); i++)
(*theArray)[i] = new PString(list[i]);
}
PString & PStringArray::operator[](PINDEX index)
{
PASSERTINDEX(index);
PAssert(SetMinSize(index+1), POutOfMemory);
if ((*theArray)[index] == NULL)
(*theArray)[index] = new PString;
return *(PString *)(*theArray)[index];
}
///////////////////////////////////////////////////////////////////////////////
PStringList::PStringList(PINDEX count, char const * const * strarr, BOOL caseless)
{
if (count == 0)
return;
PAssertNULL(strarr);
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 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]);
}
///////////////////////////////////////////////////////////////////////////////
PSortedStringList::PSortedStringList(PINDEX count,
char const * const * strarr,
BOOL caseless)
{
if (count == 0)
return;
PAssertNULL(strarr);
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 PStringArray & array)
{
for (PINDEX i = 0; i < array.GetSize(); i++)
AppendString(array[i]);
}
PSortedStringList::PSortedStringList(const PStringList & list)
{
for (PINDEX i = 0; i < list.GetSize(); i++)
AppendString(list[i]);
}
///////////////////////////////////////////////////////////////////////////////
PStringSet::PStringSet(PINDEX count, char const * const * strarr, BOOL caseless)
{
if (count == 0)
return;
PAssertNULL(strarr);
for (PINDEX i = 0; i < count; i++) {
if (caseless)
Include(PCaselessString(strarr[i]));
else
Include(PString(strarr[i]));
}
}
///////////////////////////////////////////////////////////////////////////////
POrdinalToString::POrdinalToString(PINDEX count, const Initialiser * init)
{
while (count-- > 0) {
SetAt(init->key, init->value);
init++;
}
}
///////////////////////////////////////////////////////////////////////////////
PStringToOrdinal::PStringToOrdinal(PINDEX count,
const Initialiser * init,
BOOL caseless)
{
while (count-- > 0) {
if (caseless)
SetAt(PCaselessString(init->key), init->value);
else
SetAt(init->key, init->value);
init++;
}
}
///////////////////////////////////////////////////////////////////////////////
PStringToString::PStringToString(PINDEX count,
const Initialiser * init,
BOOL caselessKeys,
BOOL 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++;
}
}
///////////////////////////////////////////////////////////////////////////////
PRegularExpression::PRegularExpression()
{
lastError = NotCompiled;
expression = NULL;
}
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()
{
if (expression != NULL) {
regfree(expression);
delete expression;
}
}
PRegularExpression::ErrorCodes PRegularExpression::GetErrorCode() const
{
return (ErrorCodes)lastError;
}
PString PRegularExpression::GetErrorText() const
{
PString str;
regerror(lastError, expression, str.GetPointer(256), 256);
return str;
}
BOOL PRegularExpression::Compile(const PString & pattern, int flags)
{
return Compile((const char *)pattern, flags);
}
BOOL PRegularExpression::Compile(const char * pattern, int flags)
{
if (expression != NULL) {
regfree(expression);
delete expression;
}
if (pattern == NULL || *pattern == '\0')
return BadPattern;
expression = new regex_t;
lastError = regcomp(expression, pattern, flags);
return lastError == NoError;
}
BOOL PRegularExpression::Execute(const PString & str, PINDEX & start, int flags) const
{
PINDEX dummy;
return Execute((const char *)str, start, dummy, flags);
}
BOOL PRegularExpression::Execute(const PString & str, PINDEX & start, PINDEX & len, int flags) const
{
return Execute((const char *)str, start, len, flags);
}
BOOL PRegularExpression::Execute(const char * cstr, PINDEX & start, int flags) const
{
PINDEX dummy;
return Execute(cstr, start, dummy, flags);
}
BOOL PRegularExpression::Execute(const char * cstr, PINDEX & start, PINDEX & len, int flags) const
{
if (expression == NULL) {
((PRegularExpression*)this)->lastError = NotCompiled;
return FALSE;
}
regmatch_t match;
((PRegularExpression*)this)->lastError = regexec(expression, cstr, 1, &match, flags);
if (lastError != NoError)
return FALSE;
start = match.rm_so;
len = match.rm_eo - start;
return TRUE;
}
BOOL PRegularExpression::Execute(const PString & str, PIntArray & starts, int flags) const
{
PIntArray dummy;
return Execute((const char *)str, starts, dummy, flags);
}
BOOL PRegularExpression::Execute(const PString & str,
PIntArray & starts,
PIntArray & ends,
int flags) const
{
return Execute((const char *)str, starts, ends, flags);
}
BOOL PRegularExpression::Execute(const char * cstr, PIntArray & starts, int flags) const
{
PIntArray dummy;
return Execute(cstr, starts, dummy, flags);
}
BOOL PRegularExpression::Execute(const char * cstr,
PIntArray & starts,
PIntArray & ends,
int flags) const
{
if (expression == NULL) {
((PRegularExpression*)this)->lastError = NotCompiled;
return FALSE;
}
regmatch_t single_match;
regmatch_t * matches = &single_match;
PINDEX count = starts.GetSize();
if (count > 1)
matches = new regmatch_t[count];
else
count = 1;
((PRegularExpression*)this)->lastError = regexec(expression, 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 + -