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

📄 qscriptecmastring.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    if (! (rx_exec.isValid() && rx_exec.isFunction()))        return context->throwError(QScriptContext::TypeError,                                   QLatin1String("String.prototype.match"));    QScriptValueImplList args;    args << context->thisObject();    QScriptValueImpl global = pattern.property(QLatin1String("global"));    if (! (global.isValid() && global.toBoolean()))        return (rx_exec.call(pattern, args));    QScript::Array result;    QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex"));    QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0"));    pattern.setProperty(lastIndexId, QScriptValueImpl(eng, 0));    int n = 0;    while (true) {        qsreal lastIndex = pattern.property(lastIndexId).toNumber();        QScriptValueImpl r = rx_exec.call(pattern, args);        if (r.isNull())            break;        qsreal newLastIndex = pattern.property(lastIndexId).toNumber();        if (newLastIndex == lastIndex)            pattern.setProperty(lastIndexId, QScriptValueImpl(eng, lastIndex + 1));        result.assign(n++, r.property(zeroId));    }    return (eng->newArray(result));}QScriptValueImpl String::method_replace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString input = context->thisObject().toString();    QScriptValueImpl searchValue = context->argument(0);    QScriptValueImpl replaceValue = context->argument(1);    QString output;    if (searchValue.classInfo() == eng->regexpConstructor->classInfo()) {        // searchValue is a RegExp        QScriptValueImpl rx_exec = searchValue.property(QLatin1String("exec"), QScriptValue::ResolvePrototype);        if (!rx_exec.isFunction())            return context->throwError(QScriptContext::TypeError,                                       QLatin1String("String.prototype.replace"));        QVector<QScriptValueImpl> occurrences;        QScriptValueImpl global = searchValue.property(QLatin1String("global"));        QScriptValueImplList args;        args << QScriptValueImpl(eng, input);        if (!global.toBoolean()) {            QScriptValueImpl r = rx_exec.call(searchValue, args);            if (!r.isNull())                occurrences.append(r);        } else {            QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex"));            searchValue.setProperty(lastIndexId, QScriptValueImpl(eng, 0));            while (true) {                qsreal lastIndex = searchValue.property(lastIndexId).toNumber();                QScriptValueImpl r = rx_exec.call(searchValue, args);                if (r.isNull())                    break;                qsreal newLastIndex = searchValue.property(lastIndexId).toNumber();                if (newLastIndex == lastIndex)                    searchValue.setProperty(lastIndexId, QScriptValueImpl(eng, lastIndex + 1));                occurrences.append(r);            }        }        int pos = 0;        if (replaceValue.isFunction()) {            QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index"));            QScriptNameIdImpl *lengthId = eng->nameId(QLatin1String("length"));            for (int i = 0; i < occurrences.count(); ++i) {                QScriptValueImpl needle = occurrences.at(i);                int index = int (needle.property(indexId).toInteger());                uint length = eng->toUint32(needle.property(lengthId).toNumber());                output += input.mid(pos, index - pos);                args.clear();                args << QScriptValueImpl(eng, index);                args << QScriptValueImpl(eng, input);                for (uint j = 0; j < length; ++j)                    args << needle.property(QScriptValueImpl(eng, j).toString());                QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args);                output += ret.toString();                pos = index + args[0].toString().length();            }        } else {            // use string representation of replaceValue            const QString replaceString = replaceValue.toString();            const QLatin1Char dollar = QLatin1Char('$');            QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index"));            QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0"));            for (int i = 0; i < occurrences.count(); ++i) {                QScriptValueImpl needle = occurrences.at(i);                int index = int (needle.property(indexId).toInteger());                output += input.mid(pos, index - pos);                int j = 0;                while (j < replaceString.length()) {                    const QChar c = replaceString.at(j++);                    if ((c == dollar) && (j < replaceString.length())) {                        const QChar nc = replaceString.at(j);                        if (nc == dollar) {                            ++j;                        } else if (nc == QLatin1Char('`')) {                            ++j;                            output += input.left(index);                            continue;                        } else if (nc == QLatin1Char('\'')) {                            ++j;                            output += input.mid(index + needle.property(zeroId).toString().length());                            continue;                        } else if (nc.isDigit()) {                            ++j;                            int cap = nc.toLatin1() - '0';                            if ((j < replaceString.length()) && replaceString.at(j).isDigit()) {                                cap = cap * 10;                                cap = replaceString.at(j++).toLatin1() - '0';                            }                            output += needle.property(QScriptValueImpl(eng, cap).toString()).toString();                            continue;                        }                    }                    output += c;                }                pos = index + needle.property(zeroId).toString().length();            }            output += input.mid(pos);        }    } else {        // use string representation of searchValue        const QString searchString = searchValue.toString();        int pos = 0;        if (replaceValue.isFunction()) {            QScriptValueImplList args;            args << QScriptValueImpl(eng, searchString);            args << eng->undefinedValue(); // dummy            args << QScriptValueImpl(eng, input);            int index = input.indexOf(searchString, pos);            while (index != -1) {                output += input.mid(pos, index - pos);                args[1] = QScriptValueImpl(eng, index);                QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args);                output += ret.toString();                pos = index + searchString.length();                index = input.indexOf(searchString, pos);            }            output += input.mid(pos);        } else {            // use string representation of replaceValue            const QString replaceString = replaceValue.toString();            const QLatin1Char dollar = QLatin1Char('$');            int index = input.indexOf(searchString, pos);            while (index != -1) {                output += input.mid(pos, index - pos);                int j = 0;                while (j < replaceString.length()) {                    const QChar c = replaceString.at(j++);                    if ((c == dollar) && (j < replaceString.length())) {                        const QChar nc = replaceString.at(j);                        if (nc == dollar) {                            ++j;                        } else if (nc == QLatin1Char('`')) {                            output += input.left(index);                            ++j;                            continue;                        } else if (nc == QLatin1Char('\'')) {                            output += input.mid(index + searchString.length());                            ++j;                            continue;                        }                    }                    output += c;                }                pos = index + searchString.length();                index = input.indexOf(searchString, pos);            }            output += input.mid(pos);        }    }    return QScriptValueImpl(eng, output);}QScriptValueImpl String::method_search(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QScriptValueImpl pattern = context->argument(0);    Ecma::RegExp::Instance *rx_data = 0;    if (0 == (rx_data = eng->regexpConstructor->get(pattern))) {        eng->regexpConstructor->newRegExp(&pattern, context->argument(0).toString(), QString());        rx_data = eng->regexpConstructor->get(pattern);    }    QString value = context->thisObject().toString();#ifndef QT_NO_REGEXP    return (QScriptValueImpl(eng, value.indexOf(rx_data->value)));#else    return eng->nullValue();#endif}QScriptValueImpl String::method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString text = context->thisObject().toString();    int length = text.length();    int start = int (context->argument(0).toInteger());    int end = context->argument(1).isUndefined()              ? length : int (context->argument(1).toInteger());    if (start < 0)        start = qMax(length + start, 0);    else        start = qMin(start, length);    if (end < 0)        end = qMax(length + end, 0);    else        end = qMin(end, length);    int count = qMax(0, end - start);    return (QScriptValueImpl(eng, text.mid(start, count)));}QScriptValueImpl String::method_split(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QScriptValueImpl l = context->argument(1);    quint32 lim = l.isUndefined() ? UINT_MAX : QScriptEnginePrivate::toUint32(l.toNumber());    if (lim == 0)        return eng->newArray();    QString S = context->thisObject().toString();    QScriptValueImpl separator = context->argument(0);    QScript::Array A;    // the argumentCount() check is for compatibility with spidermonkey;    // it is not according to ECMA-262    if (separator.isUndefined() && (context->argumentCount() == 0)) {        A.assign(0, QScriptValueImpl(eng, S));    } else {        QStringList matches;#ifndef QT_NO_REGEXP        if (Ecma::RegExp::Instance *rx = eng->regexpConstructor->get(separator)) {            matches = S.split(rx->value, rx->value.pattern().isEmpty()                              ? QString::SkipEmptyParts : QString::KeepEmptyParts);        } else#endif // QT_NO_REGEXP        {            QString sep = separator.toString();            matches = S.split(sep, sep.isEmpty()                              ? QString::SkipEmptyParts : QString::KeepEmptyParts);        }        uint count = qMin(lim, uint(matches.count()));        for (uint i = 0; i < count; ++i)            A.assign(i, QScriptValueImpl(eng, matches.at(i)));    }    return eng->newArray(A);}QScriptValueImpl String::method_substring(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString value = context->thisObject().toString();    int length = value.length();    qsreal start = 0;    qsreal end = length;    if (context->argumentCount() > 0)        start = context->argument(0).toInteger();    if (context->argumentCount() > 1)        end = context->argument(1).toInteger();    if (qIsNaN(start) || start < 0)        start = 0;    if (qIsNaN(end) || end < 0)        end = 0;    if (start > length)        start = length;    if (end > length)        end = length;    if (start > end) {        qsreal was = start;        start = end;        end = was;    }    qint32 x = QScriptEnginePrivate::toInt32(start);    qint32 y = QScriptEnginePrivate::toInt32(end - start);    return (QScriptValueImpl(eng, value.mid(x, y)));}QScriptValueImpl String::method_toLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString value = context->thisObject().toString();    return (QScriptValueImpl(eng, value.toLower()));}QScriptValueImpl String::method_toLocaleLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){    return method_toLowerCase(context, eng, classInfo); // ### check me}QScriptValueImpl String::method_toUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString value = context->thisObject().toString();    return (QScriptValueImpl(eng, value.toUpper()));}QScriptValueImpl String::method_toLocaleUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo){    return method_toUpperCase(context, eng, classInfo); // ### check me}QScriptValueImpl String::method_fromCharCode(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *){    QString str;    for (int i = 0; i < context->argumentCount(); ++i) {        QChar c(context->argument(i).toUInt16());        str += c;    }    return (QScriptValueImpl(eng, str));}} } // namespace QScript::Ecma#endif // QT_NO_SCRIPT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -