⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contain.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 5 页
字号:
        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 + -