bool KviKvsTreeNodeSpecialCommandSwitch::execute(KviKvsRunTimeContext * c) { KviKvsVariant v; if(!m_pExpression->evaluateReadOnly(c,&v))return false; KviKvsSwitchList swl; if(m_pSwitches) { if(!(m_pSwitches->evaluate(c,&swl)))return false; } bool bUsePassThrough = swl.find('p',"--passthrough"); bool bPassThrough = false; for(KviKvsTreeNodeSpecialCommandSwitchLabel * l = m_pLabels->first();l;l = m_pLabels->next()) { if(!l->execute(c,&v, &bPassThrough)) { if(c->error())return false; // break ? if(c->breakPending()) { c->handleBreak(); return true; } return false; } if(!bUsePassThrough) bPassThrough = false; } return true; }
bool KviKvsTreeNodeSpecialCommandDefpopup::execute(KviKvsRunTimeContext * c) { KviKvsVariant v; if(!m_pPopupName->evaluateReadOnly(c,&v))return false; QString szName; v.asString(szName); KviKvsSwitchList swl; if(m_pSwitches) { if(!(m_pSwitches->evaluate(c,&swl)))return false; } KviKvsPopupMenu * pPopup = KviKvsPopupManager::instance()->lookup(szName); bool bWasAlreadyThere; if(!pPopup) { if(m_pMainPopup->isEmpty())return true; // we wanted to remove it anyway: exit silently // we want to create it pPopup = new KviKvsPopupMenu(szName); KviKvsPopupManager::instance()->add(szName,pPopup); bWasAlreadyThere = false; } else { bWasAlreadyThere = true; if(pPopup->isHardLocked()) { c->error(__tr2qs_ctx("The popup '%s' is actually locked: 'self-modifications' are not allowed","kvs"),&szName); return false; } if(m_pMainPopup->isEmpty()) { // we want to remove it KviKvsPopupManager::instance()->remove(szName); return true; } // we want to (re)create it if(!swl.find('m',"--merge"))pPopup->doClear(); } if(!m_pMainPopup->fill(c,pPopup)) { if(!bWasAlreadyThere)KviKvsPopupManager::instance()->remove(szName); return false; } KviKvsPopupManager::instance()->emitRefresh(szName); return true; }
bool KviKvsTreeNodeSpecialCommandForeach::execute(KviKvsRunTimeContext * c) { KviKvsVariantList l; l.setAutoDelete(true); if(!m_pIterationData->evaluate(c,&l)) return false; KviKvsSwitchList swl; if(m_pSwitches) { if(!(m_pSwitches->evaluate(c,&swl))) return false; } bool bIncludeEmptyScalars = swl.find('a',"all") != 0; for(KviKvsVariant * pArg = l.first(); pArg; pArg = l.next()) { switch(pArg->type()) { case KviKvsVariantData::Array: { unsigned int uCnt = pArg->array()->size(); unsigned int idx = 0; while(idx < uCnt) { // we evaluate this each time (as it may actually be killed at each iteration) // FIXME: maybe some kind of reference counting or a observer pattern might be a bit more efficient here // (but might be far less efficient everywhere else...) KviKvsRWEvaluationResult * v = m_pIterationVariable->evaluateReadWrite(c); if(!v) return false; KviKvsVariant * pOne = pArg->array()->at(idx); if(pOne) { if(bIncludeEmptyScalars || (!pOne->isEmpty())) { v->result()->copyFrom(*pOne); } else { delete v; // we're done with it for this iteration idx++; continue; } } else { if(bIncludeEmptyScalars) { v->result()->setNothing(); } else { delete v; // we're done with it for this iteration idx++; continue; } } delete v; // we're done with it for this iteration if(!m_pLoop->execute(c)) { if(c->error()) return false; // break allowed! if(c->breakPending()) { c->handleBreak(); return true; } if(c->continuePending()) { c->handleContinue(); idx++; continue; } return false; // propagate the false return value } idx++; } } break; case KviKvsVariantData::Hash: { KviKvsHashIterator it(*(pArg->hash()->dict())); while(KviKvsVariant * pOne = it.current()) { // we evaluate this each time (as it may actually be killed at each iteration) // FIXME: maybe some kind of reference counting or a observer pattern might be a bit more efficient here // (but might be far less efficient everywhere else...) KviKvsRWEvaluationResult * v = m_pIterationVariable->evaluateReadWrite(c); if(!v) return false; if(bIncludeEmptyScalars || (!pOne->isEmpty())) { v->result()->copyFrom(*pOne); } else { delete v; // we're done with it for this iteration ++it; continue; } delete v; // we're done with it for this iteration if(!m_pLoop->execute(c)) { if(c->error()) return false; // break allowed! if(c->breakPending()) { c->handleBreak(); return true; } if(c->continuePending()) { c->handleContinue(); ++it; continue; } return false; // propagate the false return value } ++it; } } break; default: if(bIncludeEmptyScalars || (!pArg->isEqualToNothing())) { // we evaluate this each time (as it may actually be killed at each iteration) // FIXME: maybe some kind of reference counting or a observer pattern might be a bit more efficient here // (but might be far less efficient everywhere else...) KviKvsRWEvaluationResult * v = m_pIterationVariable->evaluateReadWrite(c); if(!v) return false; v->result()->copyFrom(*pArg); delete v; // we're done with it for this iteration if(!m_pLoop->execute(c)) { if(c->error()) return false; // break allowed! if(c->breakPending()) { c->handleBreak(); return true; } if(c->continuePending()) { c->handleContinue(); continue; } return false; // propagate the false return value } } break; } } return true; }