📄 contain.cxx
字号:
PBYTEArray PString::ToPascal() const{ PINDEX len = GetLength(); PAssert(len < 256, "Cannot convert to PASCAL string"); BYTE buf[256]; buf[0] = (BYTE)len;#ifdef PHAS_UNICODE WORD * ptr = (WORD *)theArray; while (len > 0) { buf[len] = (BYTE)(*ptr < 256 ? *ptr : 255); len--; }#else memcpy(&buf[1], theArray, len);#endif return PBYTEArray(buf, len+1);}PString PString::ToLiteral() const{ PString str('"'); for (char * p = theArray; *p != '\0'; p++) { if (*p == '"') str += "\\\""; else if (isprint(*p)) str += *p; else { PINDEX i; for (i = 0; i < PARRAYSIZE(PStringEscapeValue); i++) { if (*p == PStringEscapeValue[i]) { str += PString('\\') + PStringEscapeCode[i]; break; } } if (i >= PARRAYSIZE(PStringEscapeValue)) str.sprintf("\\%03o", *p & 0xff); } } return str + '"';}PString & PString::sprintf(const char * fmt, ...){ va_list args; va_start(args, fmt); return vsprintf(fmt, args);}PString & PString::vsprintf(const char * fmt, va_list arg){ char * p = GetPointer(1000); ::vsprintf(p+strlen(p), fmt, arg); PAssert(strlen(theArray) < 1000, "Single sprintf() too large"); PAssert(MakeMinimumSize(), POutOfMemory); return *this;}PString psprintf(const char * fmt, ...){ PString str; va_list args; va_start(args, fmt); return str.vsprintf(fmt, args);}PString pvsprintf(const char * fmt, va_list arg){ PString str; return str.vsprintf(fmt, arg);}///////////////////////////////////////////////////////////////////////////////PObject * PCaselessString::Clone() const{ return new PCaselessString(*this);}PObject::Comparison PCaselessString::InternalCompare(PINDEX offset, char c) const{ int c1 = toupper(theArray[offset]); int c2 = toupper(c); if (c1 < c2) return LessThan; if (c1 > c2) return GreaterThan; return EqualTo;}PObject::Comparison PCaselessString::InternalCompare( PINDEX offset, PINDEX length, const char * cstr) const{ 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(){ string->MakeMinimumSize(); char * base = string->GetPointer(); char * end = base + string->GetLength(); setg(base, base, end); setp(end, end); 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::operator=(const char * cstr){ PString::operator=(cstr); flush(); return *this;}PStringStream & PStringStream::operator=(const PString & str){ PString::operator=(str); flush(); return *this;}PStringStream::~PStringStream(){ delete (PStringStream::Buffer *)rdbuf(); init(NULL);}///////////////////////////////////////////////////////////////////////////////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); }}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); }}///////////////////////////////////////////////////////////////////////////////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); }}///////////////////////////////////////////////////////////////////////////////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 + -