📄 contain.cxx
字号:
PString::Tokenise(const char * separators, BOOL onePerSeparator) const{ PStringArray tokens; if (separators == NULL || IsEmpty()) // No tokens return tokens; PINDEX token = 0; PINDEX p1 = 0; PINDEX p2 = FindOneOf(separators); if (p2 == 0) { if (onePerSeparator) { // first character is a token separator tokens[token] = Empty(); token++; // make first string in array empty p1 = 1; p2 = FindOneOf(separators, 1); } else { do { p1 = p2 + 1; } while ((p2 = FindOneOf(separators, p1)) == p1); } } while (p2 != P_MAX_INDEX) { if (p2 > p1) tokens[token] = operator()(p1, p2-1); else tokens[token] = Empty(); token++; // Get next separator. If not one token per separator then continue // around loop to skip over all the consecutive separators. do { p1 = p2 + 1; } while ((p2 = FindOneOf(separators, p1)) == p1 && !onePerSeparator); } tokens[token] = operator()(p1, P_MAX_INDEX); return tokens;}PStringArray PString::Lines() const{ PStringArray lines; if (IsEmpty()) return lines; PINDEX line = 0; PINDEX p1 = 0; PINDEX p2; while ((p2 = FindOneOf("\r\n", p1)) != P_MAX_INDEX) { lines[line++] = operator()(p1, p2-1); p1 = p2 + 1; if (theArray[p2] == '\r' && theArray[p1] == '\n') // CR LF pair p1++; } if (p1 < GetLength()) lines[line] = operator()(p1, P_MAX_INDEX); return lines;}PStringArray & PStringArray::operator += (const PStringArray & v){ PINDEX i; for (i = 0; i < v.GetSize(); i++) AppendString(v[i]); return *this;}PString PString::LeftTrim() const{ const char * lpos = theArray; while (isspace(*lpos & 0xff)) lpos++; return PString(lpos);}PString PString::RightTrim() const{ char * rpos = theArray+GetLength()-1; if (isspace(*rpos & 0xff)) return *this; while (isspace(*rpos & 0xff)) { if (rpos == theArray) return Empty(); rpos--; } // make Apple & Tornado gnu compiler happy PString retval(theArray, rpos - theArray + 1); return retval;}PString PString::Trim() const{ const char * lpos = theArray; while (isspace(*lpos & 0xff)) lpos++; if (*lpos == '\0') return Empty(); const char * rpos = theArray+GetLength()-1; if (!isspace(*rpos & 0xff)) return PString(lpos); while (isspace(*rpos & 0xff)) rpos--; return PString(lpos, rpos - lpos + 1);}PString PString::ToLower() const{ PString newStr(theArray); for (char *cpos = newStr.theArray; *cpos != '\0'; cpos++) { if (isupper(*cpos & 0xff)) *cpos = (char)tolower(*cpos & 0xff); } return newStr;}PString PString::ToUpper() const{ PString newStr(theArray); for (char *cpos = newStr.theArray; *cpos != '\0'; cpos++) { if (islower(*cpos & 0xff)) *cpos = (char)toupper(*cpos & 0xff); } return newStr;}long PString::AsInteger(unsigned base) const{ PAssert(base >= 2 && base <= 36, PInvalidParameter); char * dummy; return strtol(theArray, &dummy, base);}DWORD PString::AsUnsigned(unsigned base) const{ PAssert(base >= 2 && base <= 36, PInvalidParameter); char * dummy; return strtoul(theArray, &dummy, base);}double PString::AsReal() const{#ifndef __HAS_NO_FLOAT char * dummy; return strtod(theArray, &dummy);#else return 0.0;#endif}PWORDArray PString::AsUCS2() const{#ifdef P_HAS_G_CONVERT gsize g_len = 0; gchar * g_ucs2 = g_convert(theArray, GetSize()-1, "UCS-2", "UTF-8", 0, &g_len, 0); if (g_ucs2 == NULL) return PWORDArray(); PWORDArray ucs2((const WORD *)g_ucs2, (PINDEX)g_len); g_free(g_ucs2) return ucs2;#else PWORDArray ucs2(GetSize()); // Always bigger than required PINDEX count = 0; PINDEX i = 0; PINDEX length = GetSize()-1; while (i < length) { int c = theArray[i]; if ((c&0x80) == 0) ucs2[count++] = (BYTE)theArray[i++]; else if ((c&0xe0) == 0xc0) { if (i < length-1) ucs2[count++] = (WORD)(((theArray[i ]&0x1f)<<6)| (theArray[i+1]&0x3f)); i += 2; } else if ((c&0xf0) == 0xe0) { if (i < length-2) ucs2[count++] = (WORD)(((theArray[i ]&0x0f)<<12)| ((theArray[i+1]&0x3f)<< 6)| (theArray[i+2]&0x3f)); i += 3; } else { if ((c&0xf8) == 0xf0) i += 4; else if ((c&0xfc) == 0xf8) i += 5; else i += 6; if (i <= length) ucs2[count++] = 0xffff; } } ucs2.SetSize(count); return ucs2;#endif}void PString::InternalFromUCS2(const WORD * ptr, PINDEX len){ if (ptr == NULL || len <= 0) { *this = Empty(); return; }#ifdef P_HAS_G_CONVERT gsize g_len = 0; gchar * g_utf8 = g_convert(ptr, len, "UTF-8", "UCS-2", 0, &g_len, 0); if (g_utf8 == NULL) { *this = Empty(); return; } SetSize(&g_len); memcpy(theArray, g_char, g_len); g_free(g_utf8);#else PINDEX i; PINDEX count = 1; for (i = 0; i < len; i++) { if (ptr[i] < 0x80) count++; else if (ptr[i] < 0x800) count += 2; else count += 3; } SetSize(count); count = 0; for (i = 0; i < len; i++) { unsigned v = *ptr++; if (v < 0x80) theArray[count++] = (char)v; else if (v < 0x800) { theArray[count++] = (char)(0xc0+(v>>6)); theArray[count++] = (char)(0x80+(v&0x3f)); } else { theArray[count++] = (char)(0xd0+(v>>12)); theArray[count++] = (char)(0x80+((v>>6)&0x3f)); theArray[count++] = (char)(0x80+(v&0x3f)); } }#endif}PBYTEArray PString::ToPascal() const{ PINDEX len = GetLength(); PAssert(len < 256, "Cannot convert to PASCAL string"); BYTE buf[256]; buf[0] = (BYTE)len; memcpy(&buf[1], theArray, len); 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 & 0xff)) str += *p; else { PINDEX i; for (i = 0; i < PARRAYSIZE(PStringEscapeValue); i++) { if (*p == PStringEscapeValue[i]) { str += PString('\\') + (char)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);}#if defined(__GNUC__) || defined(__SUNPRO_CC)#define _vsnprintf vsnprintf#endifPString & PString::vsprintf(const char * fmt, va_list arg){ PINDEX len = theArray != NULL ? GetLength() : 0;#ifdef P_VXWORKS // The library provided with tornado 2.0 does not have the implementation // for vsnprintf // as workaround, just use a array size of 2000 PAssert(SetSize(2000), POutOfMemory); ::vsprintf(theArray+len, fmt, arg);#else PINDEX size = 0; do { size += 1000; PAssert(SetSize(size), POutOfMemory); } while (_vsnprintf(theArray+len, size-len, fmt, arg) == -1);#endif // P_VXWORKS 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{ if (offset < 0) return LessThan; int c1 = toupper(theArray[offset] & 0xff); int c2 = toupper(c & 0xff); if (c1 < c2) return LessThan; if (c1 > c2) return GreaterThan; return EqualTo;}PObject::Comparison PCaselessString::InternalCompare( PINDEX offset, PINDEX length, const char * cstr) const{ if (offset < 0 || length < 0) return LessThan; if (cstr == NULL) return IsEmpty() ? EqualTo : LessThan; while (length-- > 0 && (theArray[offset] != '\0' || *cstr != '\0')) { Comparison c = PCaselessString::InternalCompare(offset++, *cstr++); if (c != EqualTo) return c; } return EqualTo;}///////////////////////////////////////////////////////////////////////////////PStringStream::Buffer::Buffer(PStringStream & str, PINDEX size) : string(str), fixedBufferSize(size != 0){ string.SetMinSize(size > 0 ? size : 256); sync();}int PStringStream::Buffer::overflow(int c){ if (pptr() >= epptr()) { if (fixedBufferSize) return EOF; 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;}#if __USE_STL__streambuf::pos_type PStringStream::Buffer::seekoff(off_type off, ios_base::seekdir dir, ios_base::openmode mode)#elsestreampos PStringStream::Buffer::seekoff(streamoff off, 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 = newgptr = eback(); else if (off >= 0) newpptr = newgptr = egptr(); else newpptr = newgptr = egptr()+off; break; default: PAssertAlways2(string.GetClass(), PInvalidParameter); newgptr = gptr(); newpptr = pptr(); } if ((mode&ios::in) != 0) setg(eback(), newgptr, egptr()); if ((mode&ios::out) != 0) setp(newpptr, epptr()); return 0;}#if __USE_STL__streampos PStringStream::Buffer::seekpos(pos_type pos, ios_base::openmode mode){ return seekoff(pos, ios_base::beg, mode);}#endif#ifdef _MSC_VER#pragma warning(disable:4355)#end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -