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

📄 profileevaluator.cpp

📁 QT 开发环境里面一个很重要的文件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                ok = false;                break;            }            QRegExp regx(args[1]);            const QStringList &l = values(args.first());            if(args.count() == 2) {                for(int i = 0; i < l.size(); ++i) {                    const QString val = l[i];                    if(regx.exactMatch(val) || val == args[1]) {                        cond = true;                        break;                    }                }            } else {                const QStringList mutuals = args[2].split('|');                for(int i = l.size()-1; i >= 0; i--) {                    const QString val = l[i];                    for(int mut = 0; mut < mutuals.count(); mut++) {                        if(val == mutuals[mut].trimmed()) {                            cond = (regx.exactMatch(val) || val == args[1]);                            break;                        }                    }                }            }            break; }        case CF_COUNT: {            if(args.count() != 2 && args.count() != 3) {                logMessage(QString::fromAscii("count(var, count) requires at least two arguments.\n"), MT_DebugLevel1);                ok = false;                break;            }            if(args.count() == 3) {                QString comp = args[2];                if(comp == ">" || comp == "greaterThan") {                    cond = values(args.first()).count() > args[1].toInt();                } else if(comp == ">=") {                    cond = values(args.first()).count() >= args[1].toInt();                } else if(comp == "<" || comp == "lessThan") {                    cond = values(args.first()).count() < args[1].toInt();                } else if(comp == "<=") {                    cond = values(args.first()).count() <= args[1].toInt();                } else if(comp == "equals" || comp == "isEqual" || comp == "=" || comp == "==") {                    cond = values(args.first()).count() == args[1].toInt();                } else {                    ok = false;                    logMessage(QString::fromAscii("unexpected modifier to count(%2)\n").arg(                        comp), MT_DebugLevel1);                }                break;            }            cond = values(args.first()).count() == args[1].toInt();            break; }        case CF_INCLUDE: {            QString parseInto;            if(args.count() == 2) {                parseInto = args[1];            } else if(args.count() != 1) {                logMessage(QString::fromAscii("include(file) requires one argument.\n"), MT_DebugLevel1);                ok = false;                break;            }            ok = evaluateFile(args.first(), &ok);            break; }        case CF_LOAD: {            QString parseInto;            bool ignore_error = false;            if(args.count() == 2) {                QString sarg = args[1];                ignore_error = (sarg.toLower() == "true" || sarg.toInt());            } else if(args.count() != 1) {                logMessage(QString::fromAscii("load(feature) requires one argument.\n"), MT_DebugLevel1);                ok = false;                break;            }            ok = evaluateFeatureFile( args.first(), &cond);            break; }        case CF_MESSAGE: {            if(args.count() != 1) {                logMessage(QString::fromAscii("%2(message) requires one argument.\n").arg(                    QString(function)), MT_DebugLevel1);                ok = false;                break;            }            QString msg = args.first();            bool isError = (function == "error");            logMessage(QString::fromAscii("%2\n").arg(msg), isError ? MT_ProError : MT_ProMessage);            break; }        case CF_SYSTEM: {            if(args.count() != 1) {                logMessage(QString::fromAscii("system(exec) requires one argument.\n"), MT_DebugLevel1);                ok = false;                break;            }            ok = system(args.first().toLatin1().constData()) == 0;            break; }        case CF_ISEMPTY: {            if(args.count() != 1) {                logMessage(QString::fromAscii("isEmpty(var) requires one argument.\n"), MT_DebugLevel1);                ok = false;                break;            }            QStringList sl = values(args.first());            if (sl.count() == 0) {                cond = true;            }else if (sl.count() > 0) {                QString var = sl.first();                cond = (var.isEmpty());            }            break; }        case CF_EXISTS: {            if(args.count() != 1) {                logMessage(QString::fromAscii("exists(file) requires one argument.\n"), MT_DebugLevel1);                ok = false;                break;            }            QString file = args.first();            file = QDir::cleanPath(file);            if (QFile::exists(file)) {                cond = true;                break;            }            //regular expression I guess            QString dirstr = getcwd();            int slsh = file.lastIndexOf(Option::dir_sep);            if(slsh != -1) {                dirstr = file.left(slsh+1);                file = file.right(file.length() - slsh - 1);            }            cond = QDir(dirstr).entryList(QStringList(file)).count();            break; }    }    if (result) *result = cond;    return ok;}bool ProFileEvaluator::contains(const QString &variableName) const{    return m_valuemap.contains(variableName.toAscii());}QStringList ProFileEvaluator::values(const QString &variableName) const{    if (variableName == QLatin1String("PWD")) {        return QStringList(getcwd());    }    return m_valuemap.value(variableName.toAscii());}bool ProFileEvaluator::evaluateFile(const QString &fileName, bool *result){    bool ok = true;    QString fn = fileName;    QFileInfo fi(fn);    if (fi.exists()) {        logMessage(QString::fromAscii("Reading %2\n").arg(fileName), MT_DebugLevel3);        ProFile *pro = queryProFile(fi.absoluteFilePath());        if (pro) {            m_profileStack.push_back(pro);            ok &= currentProFile() ? pro->Accept(this) : false;            if (ok) {                if (m_profileStack.count() > 0) {                    ProFile *pro = m_profileStack.pop();                    releaseProFile(pro);                }            }        }        if (result) *result = true;    }else{        if (result) *result = false;    }/*    if (ok && readFeatures) {        QStringList configs = values("CONFIG");        QSet<QString> processed;        for (QStringList::iterator it = configs.begin(); it != configs.end(); ++it) {            QString fn = *it;            if (!processed.contains(fn)) {                processed.insert(fn);                evaluateFeatureFile(fn, 0);            }        }    } */    return ok;}bool ProFileEvaluator::evaluateFeatureFile(const QString &fileName, bool *result){    QString fn;    QStringList feature_paths = qmake_feature_paths();    for(QStringList::ConstIterator it = feature_paths.begin(); it != feature_paths.end(); ++it) {        QString fname = *it + QLatin1Char('/') + fileName;        if (QFileInfo(fname).exists()) {            fn = fname;            break;        }        fname += QLatin1String(".prf");        if (QFileInfo(fname).exists()) {            fn = fname;            break;        }    }    return fn.isEmpty() ? false : evaluateFile(fn, result);}ProFileEvaluator::TemplateType ProFileEvaluator::templateType(){    QStringList templ = m_valuemap.value("TEMPLATE");    if (templ.count() >= 1) {        QByteArray t = templ.last().toAscii().toLower();        if (t == "app") return TT_Application;        if (t == "lib") return TT_Library;        if (t == "subdirs") return TT_Subdirs;    }    return TT_Unknown;}/* * Lookup of files are done in this order: *  1. look in pwd *  2. look in vpaths *  3. expand wild card files relative from the profiles folder **/QStringList ProFileEvaluator::absFileNames(const QString &variableName){    QStringList vpaths = values(QLatin1String("VPATH"))        + values(QLatin1String("QMAKE_ABSOLUTE_SOURCE_PATH"))        + values(QLatin1String("DEPENDPATH"))        + values(QLatin1String("VPATH_SOURCES"));    QStringList sources_out;    QStringList sources = values(variableName);    QFileInfo fi(m_origfile);    QDir dir(fi.absoluteDir());    for (int i = 0; i < sources.count(); ++i) {        QString fn = sources[i];        QString absName = QDir::cleanPath(dir.absoluteFilePath(sources[i]));        QFileInfo fi(absName);        bool found = fi.exists();        // Search in all vpaths        for(QStringList::Iterator vpath_it = vpaths.begin(); vpath_it != vpaths.end() && !found; ++vpath_it) {            QDir vpath(*vpath_it);            fi.setFile(*vpath_it + QDir::separator() + fn);            if (fi.exists()) {                absName = fi.absoluteFilePath();                found = true;                break;            }        }        if (found) {            sources_out+=fi.canonicalFilePath();        } else {            QString val = fn;            QString dir, regex = val, real_dir;            if(regex.lastIndexOf(QLatin1Char('/')) != -1) {                dir = regex.left(regex.lastIndexOf(QLatin1Char('/')) + 1);                real_dir = dir;                regex = regex.right(regex.length() - dir.length());            }            if(real_dir.isEmpty() || QFileInfo(real_dir).exists()) {                QStringList files = QDir(real_dir).entryList(QStringList(regex));                if(files.isEmpty()) {                    logMessage(MT_DebugLevel2, "%s:%d Failure to find %s",                              __FILE__, __LINE__,                              val.toLatin1().constData());                } else {                    QString a;                    for(int i = (int)files.count()-1; i >= 0; i--) {                        if(files[i] == "." || files[i] == "..")                            continue;                        a = dir + files[i];                        sources_out+=a;                    }                }            } else {                logMessage(MT_DebugLevel2, "%s:%d Cannot match %s%c%s, as %s does not exist.",                          __FILE__, __LINE__, real_dir.toLatin1().constData(),                          '/',                          regex.toLatin1().constData(), real_dir.toLatin1().constData());            }        }    }    return sources_out;}ProFile *ProFileEvaluator::queryProFile(const QString &filename){    ProReader pr;    pr.setEnableBackSlashFixing(false);    ProFile *pro = pr.read(filename);    if (!pro) {        LogMessage msg;        msg.m_msg = QLatin1String("parse failure.");        msg.m_filename = filename;        msg.m_linenumber = pr.currentLine();        msg.m_type = MT_Error;        logMessage(msg);    }    return pro;}void ProFileEvaluator::releaseProFile(ProFile *pro){    delete pro;}QString ProFileEvaluator::propertyValue(const QString &val) const{    return getPropertyValue(val);}void ProFileEvaluator::logMessage(const ProFileEvaluator::LogMessage &msg){    QByteArray locstr = QString("%1(%2):").arg(msg.m_filename).arg(msg.m_linenumber).toAscii();    QByteArray text = msg.m_msg.toAscii();    switch (msg.m_type) {        case MT_DebugLevel3:            fprintf(stderr, "%s profileevaluator information:    %s", locstr.data(), text.data());            break;        case MT_DebugLevel2:            fprintf(stderr, "%s profileevaluator warning:        %s", locstr.data(), text.data());            break;        case MT_DebugLevel1:            fprintf(stderr, "%s profileevaluator critical error: %s", locstr.data(), text.data());            break;        case MT_ProMessage:            fprintf(stderr, "%s Project MESSAGE: %s", locstr.data(), text.data());            break;        case MT_ProError:            fprintf(stderr, "%s Project ERROR: %s", locstr.data(), text.data());            break;        case MT_Error:            fprintf(stderr, "%s ERROR: %s", locstr.data(), text.data());            break;    }}void ProFileEvaluator::logMessage(const QString &message, MessageType mt){    LogMessage msg;    msg.m_msg = message;    msg.m_type = mt;        ProFile *pro = currentProFile();    if (pro) {        msg.m_filename = pro->fileName();        msg.m_linenumber = m_lineNo;    } else {        msg.m_filename = "Not a file";        msg.m_linenumber = 0;    }    logMessage(msg);}void ProFileEvaluator::logMessage(MessageType mt, const char *msg, ...){#define MAX_MESSAGE_LENGTH 1024    char buf[MAX_MESSAGE_LENGTH];    va_list ap;    va_start(ap, msg); // use variable arg list    qvsnprintf(buf, MAX_MESSAGE_LENGTH - 1, msg, ap);    va_end(ap);    buf[MAX_MESSAGE_LENGTH - 1] = '\0';    logMessage(QString::fromAscii(buf), mt);}

⌨️ 快捷键说明

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