📄 profileevaluator.cpp
字号:
(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 + -