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

📄 profileevaluator.cpp

📁 QT 开发环境里面一个很重要的文件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                       (unicode < '0' || unicode > '9'))                        break;                    var.append(QChar(unicode));                    if(++i == str_len)                        break;                    unicode = (str_data+i)->unicode();                }                if(var_type == VAR && unicode == LPAREN) {                    var_type = FUNCTION;                    int depth = 0;                    while(1) {                        if(++i == str_len)                            break;                        unicode = (str_data+i)->unicode();                        if(unicode == LPAREN) {                            depth++;                        } else if(unicode == RPAREN) {                            if(!depth)                                break;                            --depth;                        }                        args.append(QChar(unicode));                    }                    if(i < str_len-1)                        unicode = (str_data+(++i))->unicode();                    else                        unicode = 0;                }                if(term) {                    if(unicode != term) {                        logMessage("Missing " + QString(term) + " terminator [found " + QString(unicode) + "]", MT_DebugLevel1);                        if(ok)                            *ok = false;                        return QString();                    }                    unicode = 0;                } else if(i > str_len-1) {                    unicode = 0;                }                QString replacement;                if(var_type == ENVIRON) {                    replacement = QString::fromLocal8Bit(qgetenv(var.toLatin1().constData()));                } else if(var_type == PROPERTY) {                    replacement = propertyValue(var);                    //if(prop)                    //    replacement = QStringList(prop->value(var));                } else if(var_type == FUNCTION) {                    replacement = evaluateExpandFunction( var.toAscii(), args );                } else if(var_type == VAR) {                    replacement = values(var).join(" ");                }                if(!(replaced++) && start_var)                    current = str.left(start_var);                if(!replacement.isEmpty()) {                    current.append(replacement);                }                logMessage(MT_DebugLevel2, "Project Parser [var replace]: %s -> %s",                          str.toLatin1().constData(), var.toLatin1().constData(),                          replacement.toLatin1().constData());            } else {                if(replaced)                    current.append("$");            }        }        if(replaced && unicode)            current.append(QChar(unicode));    }    if(!replaced)        ret = str;    else if(!current.isEmpty())        ret.append(current);    return ret;}bool ProFileEvaluator::isActiveConfig(const QByteArray &config, bool regex){    //magic types for easy flipping    if(config == "true")        return true;    else if(config == "false")        return false;    //mkspecs    if((Option::target_mode == Option::TARG_MACX_MODE || Option::target_mode == Option::TARG_QNX6_MODE ||        Option::target_mode == Option::TARG_UNIX_MODE) && config == "unix")        return true;    else if(Option::target_mode == Option::TARG_MACX_MODE && config == "macx")        return true;    else if(Option::target_mode == Option::TARG_QNX6_MODE && config == "qnx6")        return true;    else if(Option::target_mode == Option::TARG_MAC9_MODE && config == "mac9")        return true;    else if((Option::target_mode == Option::TARG_MAC9_MODE || Option::target_mode == Option::TARG_MACX_MODE) &&            config == "mac")        return true;    else if(Option::target_mode == Option::TARG_WIN_MODE && config == "win32")        return true;    QRegExp re(config, Qt::CaseSensitive, QRegExp::Wildcard);    QString spec = Option::qmakespec;    if((regex && re.exactMatch(spec)) || (!regex && spec == config))        return true;    return false;}QString ProFileEvaluator::evaluateExpandFunction(const QByteArray &func, const QString &arguments){    const char field_sep = ' ';    QStringList args = split_arg_list(arguments);    for (int i = 0; i < args.count(); ++i) {        args[i] = expandVariableReferences(args[i]);    }    enum ExpandFunc { E_MEMBER=1, E_FIRST, E_LAST, E_CAT, E_FROMFILE, E_EVAL, E_LIST,                      E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION,                      E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND,                      E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE,                      E_REPLACE };    static QMap<QByteArray, int> *expands = 0;    if(!expands) {        expands = new QMap<QByteArray, int>;        expands->insert("member", E_MEMBER);                //v (implemented)        expands->insert("first", E_FIRST);                  //v        expands->insert("last", E_LAST);                    //v        expands->insert("cat", E_CAT);        expands->insert("fromfile", E_FROMFILE);        expands->insert("eval", E_EVAL);        expands->insert("list", E_LIST);        expands->insert("sprintf", E_SPRINTF);        expands->insert("join", E_JOIN);                    //v        expands->insert("split", E_SPLIT);                  //v        expands->insert("basename", E_BASENAME);            //v        expands->insert("dirname", E_DIRNAME);              //v        expands->insert("section", E_SECTION);        expands->insert("find", E_FIND);        expands->insert("system", E_SYSTEM);                //v        expands->insert("unique", E_UNIQUE);        expands->insert("quote", E_QUOTE);        expands->insert("escape_expand", E_ESCAPE_EXPAND);        expands->insert("upper", E_UPPER);        expands->insert("lower", E_LOWER);        expands->insert("re_escape", E_RE_ESCAPE);        expands->insert("files", E_FILES);        expands->insert("prompt", E_PROMPT);        expands->insert("replace", E_REPLACE);    }    ExpandFunc func_t = (ExpandFunc)expands->value(func.toLower());    QString ret;    switch(func_t) {        case E_BASENAME:        case E_DIRNAME:        case E_SECTION: {            bool regexp = false;            QString sep, var;            int beg=0, end=-1;            if(func_t == E_SECTION) {                if(args.count() != 3 && args.count() != 4) {                    logMessage(QString::fromAscii("%2(var) section(var, sep, begin, end) requires three arguments.\n").arg(                        QString(func)));                } else {                    var = args[0];                    sep = args[1];                    beg = args[2].toInt();                    if(args.count() == 4)                        end = args[3].toInt();                }            } else {                if(args.count() != 1) {                    logMessage(QString::fromAscii("%2(var) requires one argument.\n").arg(                        QString(func)));                } else {                    var = args[0];                    regexp = true;                    sep = "[\\\\/]";                    if(func_t == E_DIRNAME)                        end = -2;                    else                        beg = -1;                }            }            if(!var.isNull()) {                const QStringList l = values(var);                for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {                    QString separator = sep;                    if(!ret.isEmpty())                        ret += QLatin1Char(field_sep);                    if(regexp)                        ret += (*it).section(QRegExp(separator), beg, end);                    else                        ret += (*it).section(separator, beg, end);                }            }            break; }        case E_JOIN: {            if(args.count() < 1 || args.count() > 4) {                logMessage(QString::fromAscii("join(var, glue, before, after) requires four arguments.\n"));            } else {                QString glue, before, after;                if(args.count() >= 2)                    glue = args[1];                if(args.count() >= 3)                    before = args[2];                if(args.count() == 4)                    after = args[3];                const QStringList &var = values(args.first());                if(!var.isEmpty())                    ret = before + var.join(glue) + after;            }            break; }        case E_SPLIT: {            if(args.count() < 2 || args.count() > 3) {                logMessage(QString::fromAscii("split(var, sep, join) requires three arguments\n"));            } else {                QString sep = args[1], join = QString(field_sep);                if(args.count() == 3)                    join = args[2];                QStringList var = values(args.first());                for(QStringList::ConstIterator vit = var.begin(); vit != var.end(); ++vit) {                    QStringList lst = (*vit).split(sep);                    for(QStringList::ConstIterator spltit = lst.begin(); spltit != lst.end(); ++spltit) {                        if(!ret.isEmpty())                            ret += join;                        ret += (*spltit);                    }                }            }            break; }        case E_MEMBER: {            if(args.count() < 1 || args.count() > 3) {                logMessage(QString::fromAscii("member(var, start, end) requires three arguments.\n"));            } else {                bool ok = true;                const QStringList var = values(args.first());                int start = 0, end = 0;                if(args.count() >= 2) {                    QString start_str = args[1];                    start = start_str.toInt(&ok);                    if(!ok) {                        if(args.count() == 2) {                            int dotdot = start_str.indexOf("..");                            if(dotdot != -1) {                                start = start_str.left(dotdot).toInt(&ok);                                if(ok)                                    end = start_str.mid(dotdot+2).toInt(&ok);                            }                        }                        if(!ok)                            logMessage(QString::fromAscii("member() argument 2 (start) '%2' invalid.\n").arg(                                                        start_str), MT_DebugLevel1 );                    } else {                        end = start;                        if(args.count() == 3)                            end = args[2].toInt(&ok);                        if(!ok)                            logMessage(QString::fromAscii("member() argument 3 (end) '%2' invalid.\n").arg(                            args[2]), MT_DebugLevel1 );                    }                }                if(ok) {                    if(start < 0)                        start += var.count();                    if(end < 0)                        end += var.count();                    if(start < 0 || start >= var.count() || end < 0 || end >= var.count()) {                        //nothing                    } else if(start < end) {                        for(int i = start; i <= end && (int)var.count() >= i; i++) {                            if(!ret.isEmpty())                                ret += field_sep;                            ret += var[i];                        }                    } else {                        for(int i = start; i >= end && (int)var.count() >= i && i >= 0; i--) {                            if(!ret.isEmpty())                                ret += field_sep;                            ret += var[i];                        }                    }                }            }            break; }        case E_FIRST:        case E_LAST: {            if(args.count() != 1) {                logMessage(QString::fromAscii("%2(var) requires one argument.\n").arg(                                            QString(func)));            } else {                const QStringList var = values(args.first());                if(!var.isEmpty()) {                    if(func_t == E_FIRST)                        ret = var[0];                    else                        ret = var[var.size()-1];                }            }            break; }        case E_SYSTEM: {            if (m_condition) {                if(args.count() < 1 || args.count() > 2) {                    logMessage(QString::fromAscii("system(execut) requires one or two arguments.\n"));                } else {                    char buff[256];                    FILE *proc = QT_POPEN(args[0].toLatin1(), "r");                    bool singleLine = true;                    if(args.count() > 1)                        singleLine = (args[1].toLower() == "true");                    while(proc && !feof(proc)) {                        int read_in = int(fread(buff, 1, 255, proc));                        if(!read_in)                            break;                        for(int i = 0; i < read_in; i++) {                            if((singleLine && buff[i] == '\n') || buff[i] == '\t')                                buff[i] = ' ';                        }                        buff[read_in] = '\0';                        ret += buff;                    }                }            }            break; }        case 0: {            logMessage(MT_DebugLevel2, "'%s' is not a function\n", func.data());            break; }        default: {            logMessage(MT_DebugLevel2, "Function '%s' is not implemented\n", func.data());            break; }    }    return ret;}bool ProFileEvaluator::evaluateConditionalFunction(const QByteArray &function, const QString &arguments, bool *result){    QStringList args = split_arg_list(arguments);    for (int i = 0; i < args.count(); ++i) {        args[i] = expandVariableReferences(args[i]);    }    enum ConditionFunc { CF_CONFIG = 1, CF_CONTAINS, CF_COUNT, CF_EXISTS, CF_INCLUDE,        CF_LOAD, CF_ISEMPTY, CF_SYSTEM, CF_MESSAGE};    static QMap<QByteArray, int> *functions = 0;    if(!functions) {        functions = new QMap<QByteArray, int>;        functions->insert("load", CF_LOAD);         //v        functions->insert("include", CF_INCLUDE);   //v        functions->insert("message", CF_MESSAGE);   //v        functions->insert("warning", CF_MESSAGE);   //v        functions->insert("error", CF_MESSAGE);     //v    }    bool cond = false;    bool ok = true;    ConditionFunc func_t = (ConditionFunc)functions->value(function);    switch (func_t) {        case CF_CONFIG: {            if(args.count() < 1 || args.count() > 2) {                logMessage(QString::fromAscii("CONFIG(config) requires one or two arguments.\n"), MT_DebugLevel1);                ok = false;                break;            }            if(args.count() == 1) {                //cond = isActiveConfig(args.first());                break;            }            const QStringList mutuals = args[1].split('|');            const QStringList &configs = m_valuemap.value("CONFIG");            for(int i = configs.size() - 1 && ok; i >= 0; i--) {                for(int mut = 0; mut < mutuals.count(); mut++) {                    if(configs[i] == mutuals[mut].trimmed()) {                        cond = (configs[i] == args[0]);                        break;                    }                }            }            break; }        case CF_CONTAINS: {            if(args.count() < 2 || args.count() > 3) {                logMessage(QString::fromAscii("contains(var, val) requires at least two arguments.\n"), MT_DebugLevel1);

⌨️ 快捷键说明

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