/* Evaluates all conditions needed for an action and returns true or false */ int evaluateAction(int currentAction,tKey* key, tObject* kid,tRoom* room) { int i=statesActionList[currentAction].conditionId; int result; while ((result=evaluateCondition(i,key,kid,room))==STATES_CONDRESULT_TRUE) i++; if (result==STATES_CONDRESULT_FALSE) return 0; return 1; /* Only returns true if STATES_CONDRESULT_END is reached */ }
std::set<PnpTransitionClass*> PnpPlanTemplate<PnpPlaceClass, PnpTransitionClass> ::getAllEnabledTransitions() { conditionChecker->clearCache(); std::set<PnpTransitionClass*> r = PetriNet<PnpPlaceClass, PnpTransitionClass>::getAllEnabledTransitions(); for (typename std::set<PnpTransitionClass*>::iterator it = r.begin(); it != r.end(); ) { if ((*it)->guardCondition != "") { bool guardRes = evaluateCondition("("+(*it)->guardCondition+")"); PNP_OUT("Checking guard '"<<(*it)->guardCondition<<"': " <<guardRes); if (!guardRes) r.erase(it++); else ++it; } else ++it; } return r; }
void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) { currentFilenames.push(filename); preprocessed.reserve(preprocessed.size() + symbols.size()); while (hasNext()) { Token token = next(); switch (token) { case PP_INCLUDE: { int lineNum = symbol().lineNum; QByteArray include; bool local = false; if (test(PP_STRING_LITERAL)) { local = lexem().startsWith('\"'); include = unquotedLexem(); } else continue; until(PP_NEWLINE); // #### stringery QFileInfo fi; if (local) fi.setFile(QFileInfo(QString::fromLocal8Bit(filename)).dir(), QString::fromLocal8Bit(include)); for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) { const IncludePath &p = Preprocessor::includes.at(j); if (p.isFrameworkPath) { const int slashPos = include.indexOf('/'); if (slashPos == -1) continue; QByteArray frameworkCandidate = include.left(slashPos); frameworkCandidate.append(".framework/Headers/"); fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate)), QString::fromLocal8Bit(include.mid(slashPos + 1))); } else { fi.setFile(QString::fromLocal8Bit(p.path), QString::fromLocal8Bit(include)); } // try again, maybe there's a file later in the include paths with the same name // (186067) if (fi.isDir()) { fi = QFileInfo(); continue; } } if (!fi.exists() || fi.isDir()) continue; include = fi.canonicalFilePath().toLocal8Bit(); if (Preprocessor::preprocessedIncludes.contains(include)) continue; Preprocessor::preprocessedIncludes.insert(include); QFile file(QString::fromLocal8Bit(include)); if (!file.open(QFile::ReadOnly)) continue; QByteArray input = file.readAll(); file.close(); if (input.isEmpty()) continue; Symbols saveSymbols = symbols; int saveIndex = index; // phase 1: get rid of backslash-newlines input = cleaned(input); // phase 2: tokenize for the preprocessor symbols = tokenize(input); input.clear(); index = 0; // phase 3: preprocess conditions and substitute macros preprocessed += Symbol(0, MOC_INCLUDE_BEGIN, include); preprocess(include, preprocessed); preprocessed += Symbol(lineNum, MOC_INCLUDE_END, include); symbols = saveSymbols; index = saveIndex; continue; } case PP_DEFINE: { next(IDENTIFIER); QByteArray name = lexem(); int start = index; until(PP_NEWLINE); Macro macro; macro.symbols.reserve(index - start - 1); for (int i = start; i < index - 1; ++i) macro.symbols += symbols.at(i); macros.insert(name, macro); continue; } case PP_UNDEF: { next(IDENTIFIER); QByteArray name = lexem(); until(PP_NEWLINE); macros.remove(name); continue; } case PP_IDENTIFIER: { // if (macros.contains(symbol())) // ; } // we _could_ easily substitute macros by the following // four lines, but we choose not to. /* if (macros.contains(sym.lexem())) { preprocessed += substitute(macros, symbols, i); continue; } */ break; case PP_HASH: until(PP_NEWLINE); continue; // skip unknown preprocessor statement case PP_IFDEF: case PP_IFNDEF: case PP_IF: while (!evaluateCondition()) { if (!skipBranch()) break; if (test(PP_ELIF)) { } else { until(PP_NEWLINE); break; } } continue; case PP_ELIF: case PP_ELSE: skipUntilEndif(); // fall through case PP_ENDIF: until(PP_NEWLINE); continue; case SIGNALS: case SLOTS: { Symbol sym = symbol(); if (macros.contains("QT_NO_KEYWORDS")) sym.token = IDENTIFIER; else sym.token = (token == SIGNALS ? Q_SIGNALS_TOKEN : Q_SLOTS_TOKEN); preprocessed += sym; } continue; default: break; } preprocessed += symbol(); } currentFilenames.pop(); }
void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) { currentFilenames.push(filename); preprocessed.reserve(preprocessed.size() + symbols.size()); while (hasNext()) { Token token = next(); switch (token) { case PP_INCLUDE: { int lineNum = symbol().lineNum; QByteArray include; bool local = false; if (test(PP_STRING_LITERAL)) { local = lexem().startsWith('\"'); include = unquotedLexem(); } else continue; until(PP_NEWLINE); // #### stringery QFileInfo fi; if (local) fi.setFile(QFileInfo(QString::fromLocal8Bit(filename.constData())).dir(), QString::fromLocal8Bit(include.constData())); for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) { const IncludePath &p = Preprocessor::includes.at(j); if (p.isFrameworkPath) { const int slashPos = include.indexOf('/'); if (slashPos == -1) continue; QByteArray frameworkCandidate = include.left(slashPos); frameworkCandidate.append(".framework/Headers/"); fi.setFile(QString::fromLocal8Bit(QByteArray(p.path + '/' + frameworkCandidate).constData()), QString::fromLocal8Bit(include.mid(slashPos + 1).constData())); } else { fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData())); } // try again, maybe there's a file later in the include paths with the same name // (186067) if (fi.isDir()) { fi = QFileInfo(); continue; } } if (!fi.exists() || fi.isDir()) continue; include = fi.canonicalFilePath().toLocal8Bit(); if (Preprocessor::preprocessedIncludes.contains(include)) continue; Preprocessor::preprocessedIncludes.insert(include); QFile file(QString::fromLocal8Bit(include.constData())); if (!file.open(QFile::ReadOnly)) continue; QByteArray input = file.readAll(); file.close(); if (input.isEmpty()) continue; Symbols saveSymbols = symbols; int saveIndex = index; // phase 1: get rid of backslash-newlines input = cleaned(input); // phase 2: tokenize for the preprocessor symbols = tokenize(input); input.clear(); index = 0; // phase 3: preprocess conditions and substitute macros preprocessed += Symbol(0, MOC_INCLUDE_BEGIN, include); preprocess(include, preprocessed); preprocessed += Symbol(lineNum, MOC_INCLUDE_END, include); symbols = saveSymbols; index = saveIndex; continue; } case PP_DEFINE: { next(IDENTIFIER); QByteArray name = lexem(); Macro macro; macro.isVariadic = false; Token t = next(); if (t == LPAREN) { // we have a function macro macro.isFunction = true; parseDefineArguments(¯o); } else if (t == PP_WHITESPACE) { macro.isFunction = false; } else { error("Moc: internal error"); } int start = index; until(PP_NEWLINE); macro.symbols.reserve(index - start - 1); // remove whitespace where there shouldn't be any: // Before and after the macro, after a # and around ## Token lastToken = HASH; // skip shitespace at the beginning for (int i = start; i < index - 1; ++i) { Token token = symbols.at(i).token; if (token == PP_WHITESPACE || token == WHITESPACE) { if (lastToken == PP_HASH || lastToken == HASH || lastToken == PP_HASHHASH || lastToken == PP_WHITESPACE || lastToken == WHITESPACE) continue; } else if (token == PP_HASHHASH) { if (!macro.symbols.isEmpty() && (lastToken == PP_WHITESPACE || lastToken == WHITESPACE)) macro.symbols.pop_back(); } macro.symbols.append(symbols.at(i)); lastToken = token; } // remove trailing whitespace while (!macro.symbols.isEmpty() && (macro.symbols.last().token == PP_WHITESPACE || macro.symbols.last().token == WHITESPACE)) macro.symbols.pop_back(); if (!macro.symbols.isEmpty()) { if (macro.symbols.first().token == PP_HASHHASH || macro.symbols.last().token == PP_HASHHASH) { error("'##' cannot appear at either end of a macro expansion"); } if (macro.symbols.last().token == HASH || macro.symbols.last().token == PP_HASH) { error("'#' is not followed by a macro parameter"); } } macros.insert(name, macro); continue; } case PP_UNDEF: { next(IDENTIFIER); QByteArray name = lexem(); until(PP_NEWLINE); macros.remove(name); continue; } case PP_IDENTIFIER: { // substitute macros preprocessed += macroExpand(this, symbols, index, symbol().lineNum, true); continue; } case PP_HASH: until(PP_NEWLINE); continue; // skip unknown preprocessor statement case PP_IFDEF: case PP_IFNDEF: case PP_IF: while (!evaluateCondition()) { if (!skipBranch()) break; if (test(PP_ELIF)) { } else { until(PP_NEWLINE); break; } } continue; case PP_ELIF: case PP_ELSE: skipUntilEndif(); // fall through case PP_ENDIF: until(PP_NEWLINE); continue; case PP_NEWLINE: continue; case SIGNALS: case SLOTS: { Symbol sym = symbol(); if (macros.contains("QT_NO_KEYWORDS")) sym.token = IDENTIFIER; else sym.token = (token == SIGNALS ? Q_SIGNALS_TOKEN : Q_SLOTS_TOKEN); preprocessed += sym; } continue; default: break; } preprocessed += symbol(); } currentFilenames.pop(); }
bool CMakeCondition::condition(const QStringList &expression) const { bool ret = evaluateCondition(expression.constBegin(), expression.constEnd()-1); // kDebug(9042) << "condition" << expression << "=>" << ret; return ret; }
bool CMakeCondition::evaluateCondition(QStringList::const_iterator itBegin, QStringList::const_iterator itEnd) const { if(itBegin==itEnd) { return isTrue(*itBegin); } bool last = false, done=false; last = isTrue(*(prevOperator(itEnd, itBegin)+1)); while(!done && itBegin!=itEnd) { QStringList::const_iterator it2; it2 = prevOperator(itEnd, itBegin); done=(itBegin==it2); conditionToken c = typeName(*it2); // qDebug() << "operator" << *it2 << done; QString cmd; switch(c) { case NOT: last = !last; itEnd=it2; break; case COMMAND: #ifdef Q_OS_WIN cmd = CMakeProjectVisitor::findFile(*(it2+1), CMakeProjectVisitor::envVarDirectories("Path"), QStringList(), CMakeProjectVisitor::Executable); #else cmd = CMakeProjectVisitor::findFile(*(it2+1), CMakeProjectVisitor::envVarDirectories("PATH"), QStringList(), CMakeProjectVisitor::Executable); #endif last = !cmd.isEmpty(); itEnd=it2-1; break; case EXISTS: { QString v=*(it2+1); // kDebug(9042) << "EXISTS" << v << *it2; if(v.isEmpty()) kDebug(9042) << "error: no"; else { last=false; QFileInfo f(v); if(f.exists()) { last=true; } } itEnd=it2; } break; case IS_DIRECTORY: { QFileInfo f(*(it2+1)); last = f.isDir(); itEnd=it2; } break; case DEFINED: last=m_vars->contains(*(it2+1)); itEnd=it2; break; case AND: return evaluateCondition(itBegin, it2-1) && last; case OR: return evaluateCondition(itBegin, it2-1) || last; case MATCHES: { QRegExp rx(*(it2+1)); if(m_vars->contains(*(it2-1))) rx.indexIn(m_vars->value(*(it2-1)).join("")); else rx.indexIn(*(it2-1)); last=rx.matchedLength()>0; itEnd=it2-1; } break; case LESS: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); int a=strA.toInt(), b=strB.toInt(); last= (a<b); itEnd=it2-1; } break; case GREATER: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); int a=strA.toInt(), b=strB.toInt(); last= (a>b); itEnd=it2-1; } break; case EQUAL: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); int a=strA.toInt(), b=strB.toInt(); last= (a==b); itEnd=it2-1; } break; case STRLESS: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); last= (strA<strB); itEnd=it2-1; } break; case STRGREATER: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); last= (strA>strB); itEnd=it2-1; } break; case STREQUAL: { QString strA=*(it2-1); QString strB=*(it2+1); if(m_vars->contains(strA)) strA=m_vars->value(strA).join(";"); last= (strA==strB); itEnd=it2-1; } break; case IS_NEWER_THAN: { QFileInfo pathA(*(it2-1)); QFileInfo pathB(*(it2+1)); // kDebug(9042) << "newer" << strA << strB; last= (pathA.lastModified()>pathB.lastModified()); itEnd=it2-1; } /*default: kDebug(9042) << "no operator:" << *it2; break;*/ } } return last; }