📄 kwqstring.cpp
字号:
guint lc = g_unichar_tolower(c.unicode()); while (n--) { count += g_unichar_tolower(uc->unicode()) == lc; uc++; } } } return count;}int QString::contains(char ch) const{ return contains(QChar(ch), true);}int QString::contains(const char *str, bool caseSensitive) const{ if (!str) return 0; int len = strlen(str); char c = *str; KWQStringData *data = *dataHandle; int n = data->_length; n -= len - 1; if (n <= 0) return 0; int count = 0; if (data->_isAsciiValid) { const char *p = data->_ascii; if (caseSensitive) { do { count += *p == c && memcmp(p + 1, str + 1, len - 1) == 0; p++; } while (--n); } else { guint lc = g_unichar_tolower(c); do { count += g_unichar_tolower(*p) == lc && equalCaseInsensitive(p + 1, str + 1, len - 1); p++; } while (--n); } } else { ASSERT(data->_isUnicodeValid); const QChar *p = data->_unicode; if (caseSensitive) { do { count += *p == c && equal(p + 1, str + 1, len - 1); p++; } while (--n); } else { guint lc = g_unichar_tolower(c); do { count += g_unichar_tolower(p->unicode()) == lc && equalCaseInsensitive(p + 1, str + 1, len - 1); p++; } while (--n); } } return count;}int QString::contains(const QString &str, bool caseSensitive) const{ if (str.isEmpty()) return 0; const QChar *strP = str.unicode(); int len = str.dataHandle[0]->_length; QChar c = *strP; const QChar *p = unicode(); int n = dataHandle[0]->_length; n -= len - 1; if (n <= 0) return 0; int count = 0; if (caseSensitive) { int byteCount = len * sizeof(QChar); do { count += *p == c && memcmp(p, strP, byteCount) == 0; ++p; } while (--n); } else { do { count += p->lower() == c && equalCaseInsensitive(p, strP, len) == 0; ++p; } while (--n); } return count;}bool QString::isAllASCII() const{ KWQStringData *data = *dataHandle; int n = data->_length; if (data->_isAsciiValid) { const char *p = data->_ascii; while (n--) { unsigned char c = *p++; if (c > 0x7F) { return false; } } } else { ASSERT(data->_isUnicodeValid); const QChar *p = data->_unicode; while (n--) { if ((*p++).unicode() > 0x7F) { return false; } } } return true;}bool QString::isAllLatin1() const{ KWQStringData *data = *dataHandle; if (data->_isAsciiValid) { return true; } ASSERT(data->_isUnicodeValid); int n = data->_length; const QChar *p = data->_unicode; while (n--) { if ((*p++).unicode() > 0xFF) { return false; } } return true;}bool QString::hasFastLatin1() const{ KWQStringData *data = *dataHandle; return data->_isAsciiValid;}void QString::copyLatin1(char *buffer, uint position, uint maxLength) const{ KWQStringData *data = *dataHandle; int length = data->_length; if (position > static_cast<uint>(length)) length = 0; else length -= position; if (static_cast<uint>(length) > maxLength) length = static_cast<int>(maxLength); buffer[length] = 0; if (data->_isAsciiValid) { memcpy(buffer, data->_ascii + position, length); return; } ASSERT(data->_isUnicodeValid); const QChar *uc = data->_unicode + position; while (length--) *buffer++ = *uc++;}short QString::toShort(bool *ok, int base) const{ long v = toLong( ok, base ); if ( ok && *ok && (v < -32768 || v > 32767) ) { *ok = FALSE; v = 0; } return (short)v;}ushort QString::toUShort(bool *ok, int base) const{ ulong v = toULong( ok, base ); if ( ok && *ok && (v > 65535) ) { *ok = FALSE; v = 0; } return (ushort)v;}int QString::toInt(bool *ok, int base) const{ return (int)toLong( ok, base );}uint QString::toUInt(bool *ok, int base) const{ return (uint)toULong( ok, base );}long QString::toLong(bool *ok, int base) const{ const QChar *p = unicode(); long val=0; int l = dataHandle[0]->_length; const long max_mult = LONG_MAX / base; bool is_ok = FALSE; int neg = 0; if ( !p ) goto bye; while ( l && p->isSpace() ) // skip leading space l--,p++; if ( l && *p == '-' ) { l--; p++; neg = 1; } else if ( *p == '+' ) { l--; p++; } // NOTE: toULong() code is similar if ( !l || !ok_in_base(*p,base) ) goto bye; while ( l && ok_in_base(*p,base) ) { l--; int dv; int c = p->unicode(); if ( g_unichar_isdigit(c) ) { dv = c - '0'; } else { if ( c >= 'a' ) dv = c - 'a' + 10; else dv = c - 'A' + 10; } if ( val > max_mult || (val == max_mult && dv > (LONG_MAX % base)+neg) ) goto bye; val = base*val + dv; p++; } if ( neg ) val = -val; while ( l && p->isSpace() ) // skip trailing space l--,p++; if ( !l ) is_ok = TRUE;bye: if ( ok ) *ok = is_ok; return is_ok ? val : 0;}ulong QString::toULong(bool *ok, int base) const{ const QChar *p = unicode(); ulong val=0; int l = dataHandle[0]->_length; const ulong max_mult = ULONG_MAX / base; bool is_ok = FALSE; if ( !p ) goto bye; while ( l && p->isSpace() ) // skip leading space l--,p++; if ( *p == '+' ) l--,p++; // NOTE: toLong() code is similar if ( !l || !ok_in_base(*p,base) ) goto bye; while ( l && ok_in_base(*p,base) ) { l--; uint dv; int c = p->unicode(); if ( g_unichar_isdigit(c) ) { dv = c - '0'; } else { if ( c >= 'a' ) dv = c - 'a' + 10; else dv = c - 'A' + 10; } if ( val > max_mult || (val == max_mult && dv > (ULONG_MAX % base)) ) goto bye; val = base*val + dv; p++; } while ( l && p->isSpace() ) // skip trailing space l--,p++; if ( !l ) is_ok = TRUE;bye: if ( ok ) *ok = is_ok; return is_ok ? val : 0;}double QString::toDouble(bool *ok) const{ if (isEmpty()) { if (ok) *ok = false; return 0; } const char *s = latin1(); char *end; double val = kjs_strtod(s, &end); if (ok) *ok = end == NULL || *end == '\0'; return val;}bool QString::findArg(int& pos, int& len) const{ char lowest=0; for (uint i = 0; i< dataHandle[0]->_length; i++) { if ( at(i) == '%' && i + 1 < dataHandle[0]->_length ) { char dig = at(i+1); if ( dig >= '0' && dig <= '9' ) { if ( !lowest || dig < lowest ) { lowest = dig; pos = i; len = 2; } } } } return lowest != 0;}QString QString::arg(const QString &a, int fieldwidth) const{ int pos, len; QString r = *this; if ( !findArg( pos, len ) ) { qWarning( "QString::arg(): Argument missing: %s, %s", latin1(), a.latin1() ); // Make sure the text at least appears SOMEWHERE r += ' '; pos = r.dataHandle[0]->_length; len = 0; } r.replace( pos, len, a ); if ( fieldwidth < 0 ) { QString s; while ( (uint)-fieldwidth > a.dataHandle[0]->_length ) { s += ' '; fieldwidth++; } r.insert( pos + a.dataHandle[0]->_length, s ); } else if ( fieldwidth ) { QString s; while ( (uint)fieldwidth > a.dataHandle[0]->_length ) { s += ' '; fieldwidth--; } r.insert( pos, s ); } return r;}QString QString::arg(short replacement, int width) const{ return arg(number((int)replacement), width);}QString QString::arg(ushort replacement, int width) const{ return arg(number((uint)replacement), width);}QString QString::arg(int replacement, int width) const{ return arg(number(replacement), width);}QString QString::arg(uint replacement, int width) const{ return arg(number(replacement), width);}QString QString::arg(long replacement, int width) const{ return arg(number(replacement), width);}QString QString::arg(ulong replacement, int width) const{ return arg(number(replacement), width);}QString QString::arg(double replacement, int width) const{ return arg(number(replacement), width);}QString QString::left(uint len) const{ return mid(0, len); }QString QString::right(uint len) const{ return mid(length() - len, len); }QString QString::mid(uint start, uint len) const{ if( dataHandle && *dataHandle) { KWQStringData &data = **dataHandle; if (data._length == 0) return QString(); // clip length if( len > data._length - start ) len = data._length - start; if ( index == 0 && len == data._length ) return *this; ASSERT( start+len<=data._length ); // range check // ascii case if( data._isAsciiValid && data._ascii ) return QString( &(data._ascii[start]) , len); // unicode case else if( data._isUnicodeValid && data._unicode ) return QString( &(data._unicode[start]), len ); } // degenerate case return QString();}QString QString::copy() const{ // does not need to be a deep copy return QString(*this);}QString QString::lower() const{ QString s(*this); KWQStringData *d = *s.dataHandle; int l = d->_length; if (l) { bool detached = false; if (d->_isAsciiValid) { char *p = d->_ascii; while (l--) { char c = *p; // FIXME: Doesn't work for 0x80-0xFF. if (c >= 'A' && c <= 'Z') { if (!detached) { s.detach(); d = *s.dataHandle; p = d->_ascii + d->_length - l - 1; detached = true; } *p = c + ('a' - 'A'); } p++; } } else { ASSERT(d->_isUnicodeValid); QChar *p = d->_unicode; while (l--) { QChar c = *p; // FIXME: Doesn't work for 0x80-0xFF. if (IS_ASCII_QCHAR(c)) { if (c >= 'A' && c <= 'Z') { if (!detached) { s.detach(); d = *s.dataHandle; p = d->_unicode + d->_length - l - 1; detached = true; } *p = c + ('a' - 'A'); } } else { QChar clower = c.lower(); if (clower != c) { if (!detached) { s.detach(); d = *s.dataHandle; p = d->_unicode + d->_length - l - 1; detached = true; } *p = clower; } } p++; } } } return s;}QString QString::stripWhiteSpace() const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -