📄 kwqstring.cpp
字号:
{
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 ( 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 ( 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;
#if KHTML_NO_SCRIPTING
double val = strtod(s, &end);
#else
#if NOKIA_CHANGES
double val = strtod(s, &end);
#else
double val = kjs_strtod(s, &end);
#endif
#endif
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
{
if ( isEmpty() ) // nothing to do
return *this;
if ( !at(0).isSpace() && !at(dataHandle[0]->_length-1).isSpace() )
return *this;
int start = 0;
int end = dataHandle[0]->_length - 1;
QString result = fromLatin1("");
while ( start<=end && at(start).isSpace() ) // skip white space from start
start++;
if ( start > end ) { // only white space
return result;
}
while ( end && at(end).isSpace() ) // skip white space from end
end--;
int l = end - start + 1;
if (dataHandle[0]->_isAsciiValid){
result.setLength( l );
if ( l )
memcpy( (char *)result.dataHandle[0]->ascii(), &ascii()[start], l );
}
else if (dataHandle[0]->_isUnicodeValid){
result.setLength( l );
if ( l )
memcpy(result.forceUnicode(), &unicode()[start], sizeof(QChar)*l );
}
else
FATAL("invalid character cache",0);
return result;
}
QString QString::simplifyWhiteSpace() const
{
if ( isEmpty() ) // nothing to do
return *this;
QString result;
if (dataHandle[0]->_isAsciiValid){
result.setLength( dataHandle[0]->_length );
const char *from = ascii();
const char *fromend = from + dataHandle[0]->_length;
int outc=0;
char *to = (char *)result.ascii();
while ( TRUE ) {
while ( from!=fromend && QChar(*from).isSpace() )
from++;
while ( from!=fromend && !QChar(*from).isSpace() )
to[outc++] = *from++;
if ( from!=fromend )
to[outc++] = ' ';
else
break;
}
if ( outc > 0 && to[outc-1] == ' ' )
outc--;
result.truncate( outc );
}
else if (dataHandle[0]->_isUnicodeValid){
result.setLength( dataHandle[0]->_length );
const QChar *from = unicode();
const QChar *fromend = from + dataHandle[0]->_length;
int outc=0;
QChar *to = result.forceUnicode();
while ( TRUE ) {
while ( from!=fromend && from->isSpace() )
from++;
while ( from!=fromend && !from->isSpace() )
to[outc++] = *from++;
if ( from!=fromend )
to[outc++] = ' ';
else
break;
}
if ( outc > 0 && to[outc-1] == ' ' )
outc--;
result.truncate( outc );
}
else
FATAL("invalid character cache",+);
return result;
}
void QString::deref()
{
dataHandle[0]->deref();
}
QString &QString::setUnicode(const QChar *uni, uint len)
{
detachAndDiscardCharacters();
// Free our handle if it isn't the shared null handle, and if no-one else is using it.
bool needToFreeHandle = dataHandle != shared_null_handle && dataHandle[0]->refCount == 1;
if (len == 0) {
deref();
if (needToFreeHandle)
freeHandle(dataHandle);
dataHandle = makeSharedNullHandle();
dataHandle[0]->ref();
} else if (len > dataHandle[0]->_maxUnicode || dataHandle[0]->refCount != 1 || !dataHandle[0]->_isUnicodeValid) {
deref();
if (needToFreeHandle)
freeHandle(dataHandle);
dataHandle = allocateHandle();
*dataHandle = new KWQStringData(uni, len);
dataHandle[0]->_isHeapAllocated = 1;
} else {
if ( uni )
memcpy( (void *)unicode(), uni, sizeof(QChar)*len );
dataHandle[0]->_length = len;
dataHandle[0]->_isAsciiValid = 0;
}
return *this;
}
QString &QString::setLatin1(const char *str, int len)
{
if ( str == 0 )
return setUnicode(0,0);
if ( len < 0 )
len = strlen(str);
detachAndDiscardCharacters();
// Free our handle if it isn't the shared null handle, and if no-one else is using it.
bool needToFreeHandle = dataHandle != shared_null_handle && dataHandle[0]->refCount == 1;
if (len+1 > (int)dataHandle[0]->_maxAscii || dataHandle[0]->refCount != 1 || !dataHandle[0]->_isAsciiValid) {
deref();
if (needToFreeHandle)
freeHandle(dataHandle);
dataHandle = allocateHandle();
*dataHandle = new KWQStringData(str,len);
dataHandle[0]->_isHeapAllocated = 1;
} else {
strcpy( (char *)ascii(), str );
dataHandle[0]->_length = len;
dataHandle[0]->_isUnicodeValid = 0;
}
return *this;
}
QString &QString::setNum(short n)
{
return sprintf("%d", n);
}
QString &QString::setNum(ushort n)
{
return sprintf("%u", n);
}
QString &QString::setNum(int n)
{
return sprintf("%d", n);
}
QString &QString::setNum(uint n)
{
return sprintf("%u", n);
}
QString &QString::setNum(long n)
{
return sprintf("%ld", n);
}
QString &QString::setNum(ulong n)
{
return sprintf("%lu", n);
}
QString &QString::setNum(double n)
{
return sprintf("%.6lg", n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -