List *removeElem(List *l, void *query, Comparator matchFunc) { if (l != NULL && matchFunc != NULL) { Node *prev = NULL, *cur = l->head, *end = l->tail; while (cur != NULL) { if (matchFunc(cur->data, query) == Equal) break; prev = cur; cur = cur->next; if (cur == end) break; } if (cur != NULL) { if (prev != NULL) { prev->next = cur->next; } else { l->head = prev = cur->next; } if (cur->data != NULL) free(cur->data); free(cur); cur = NULL; --l->size; } } return l; }
bool TypeChecker::typecheckFuncTerm(const func_term * ft) { if(!isTyped) return true; func_decl_list::const_iterator fd = std::find_if(thea->the_domain->functions->begin(),thea->the_domain->functions->end(), matchFunc(ft->getFunction())); if(fd==thea->the_domain->functions->end()) return false; var_symbol_list::const_iterator arg = (*fd)->getArgs()->begin(); const var_symbol_list::const_iterator argEnd = (*fd)->getArgs()->end(); parameter_symbol_list::const_iterator i = ft->getArgs()->begin(); const parameter_symbol_list::const_iterator e = ft->getArgs()->end(); int idx = 1; for(; i != e && arg != argEnd;++i,++arg,++idx) { if(!subType(*i,*arg)) { if(Verbose) { *report << "Type problem with function term ("; *report << ft->getFunction()->getName(); parameter_symbol_list::const_iterator it = ft->getArgs()->begin(); parameter_symbol_list::const_iterator et = ft->getArgs()->end(); for(;it != et;++it) { *report << " " << (*it)->getName(); } *report << ") - parameter " << idx << " is incorrectly typed\n"; } return false; }; }; if (arg != argEnd) { if(Verbose) { *report << "Problem with function term ("; *report << ft->getFunction()->getName(); parameter_symbol_list::const_iterator it = ft->getArgs()->begin(); parameter_symbol_list::const_iterator et = ft->getArgs()->end(); for(;it != et;++it) { *report << " " << (*it)->getName(); } *report << ") - too few parameters\n"; } } if (i != e) { if(Verbose) { *report << "Problem with function term ("; *report << ft->getFunction()->getName(); parameter_symbol_list::const_iterator it = ft->getArgs()->begin(); parameter_symbol_list::const_iterator et = ft->getArgs()->end(); for(;it != et;++it) { *report << " " << (*it)->getName(); } *report << ") - too many parameters\n"; } } return true; };
Node *find(List *l, void *query, Comparator matchFunc) { Node *result = NULL; if (l != NULL && matchFunc != NULL) { Node *it = l->head, *end = l->tail; do { if (it == NULL) break; if (matchFunc(it->data, query) == Equal) { result = it; break; } it = it->next; } while (it != end); } return result; }
rpmRC runFileTriggers(rpmts ts, rpmte te, rpmsenseFlags sense, rpmscriptTriggerModes tm, int priorityClass) { int nerrors = 0, i; rpmdbIndexIterator ii; const void *key; char *pfx; size_t keylen; Header trigH; int (*matchFunc)(rpmts, rpmte, const char*, rpmsenseFlags sense); rpmTagVal priorityTag; rpmtriggers triggers = rpmtriggersCreate(10); /* Decide if we match triggers against files in te or in whole ts */ if (tm == RPMSCRIPT_FILETRIGGER) { matchFunc = matchFilesInPkg; priorityTag = RPMTAG_FILETRIGGERPRIORITIES; } else { matchFunc = matchFilesInTran; priorityTag = RPMTAG_TRANSFILETRIGGERPRIORITIES; } ii = rpmdbIndexIteratorInit(rpmtsGetRdb(ts), triggerDsTag(tm)); /* Loop over all file triggers in rpmdb */ while ((rpmdbIndexIteratorNext(ii, &key, &keylen)) == 0) { pfx = xmalloc(keylen + 1); memcpy(pfx, key, keylen); pfx[keylen] = '\0'; /* Check if file trigger is fired by any file in ts/te */ if (matchFunc(ts, te, pfx, sense)) { for (i = 0; i < rpmdbIndexIteratorNumPkgs(ii); i++) { struct rpmtd_s priorities; unsigned int priority; unsigned int offset = rpmdbIndexIteratorPkgOffset(ii, i); unsigned int tix = rpmdbIndexIteratorTagNum(ii, i); /* * Don't handle transaction triggers installed in current * transaction to avoid executing the same script two times. * These triggers are handled in runImmedFileTriggers(). */ if (tm == RPMSCRIPT_TRANSFILETRIGGER && (packageHashHasEntry(ts->members->removedPackages, offset) || packageHashHasEntry(ts->members->installedPackages, offset))) continue; /* Get priority of trigger from header */ trigH = rpmdbGetHeaderAt(rpmtsGetRdb(ts), offset); headerGet(trigH, priorityTag, &priorities, HEADERGET_MINMEM); rpmtdSetIndex(&priorities, tix); priority = *rpmtdGetUint32(&priorities); headerFree(trigH); /* Store file trigger in array */ rpmtriggersAdd(triggers, offset, tix, priority); } } free(pfx); } rpmdbIndexIteratorFree(ii); /* Sort triggers by priority, offset, trigger index */ rpmtriggersSortAndUniq(triggers); if (rpmChrootIn() != 0) { rpmtriggersFree(triggers); return RPMRC_FAIL; } /* Handle stored triggers */ for (i = 0; i < triggers->count; i++) { if (priorityClass == 1) { if (triggers->triggerInfo[i].priority < TRIGGER_PRIORITY_BOUND) continue; } else if (priorityClass == 2) { if (triggers->triggerInfo[i].priority >= TRIGGER_PRIORITY_BOUND) continue; } trigH = rpmdbGetHeaderAt(rpmtsGetRdb(ts), triggers->triggerInfo[i].hdrNum); if (tm == RPMSCRIPT_FILETRIGGER) nerrors += runHandleTriggersInPkg(ts, te, trigH, sense, tm, 0, triggers->triggerInfo[i].tix); else nerrors += runHandleTriggersInPkg(ts, te, trigH, sense, tm, 1, triggers->triggerInfo[i].tix); headerFree(trigH); } rpmtriggersFree(triggers); /* XXX an error here would require a full abort */ (void) rpmChrootOut(); return (nerrors == 0) ? RPMRC_OK : RPMRC_FAIL; }
// Visits a node returns total weight double Visit(const DependencyGraph::Node* dependencyNode, GroupedDependencyGraph::Node* refByNode, unsigned int times) { unsigned int fileHandle = dependencyNode->GetData().fileHandle; FileToNodeMap::iterator it = m_FileMap.find(fileHandle); GroupedDependencyGraph::Node* groupNode = NULL; if (it != m_FileMap.end()) { groupNode = m_GroupedGraph.GetHead()->GetChildren().GetNode(it->second); m_GroupedGraph.GetHead()->GetChildren().GetLink(it->second).count += times; } else { NodeWeight weight; weight.fileHandle = fileHandle; weight.myWeight = GetFileWeight(fileHandle); weight.myTotalWeight = 0.0; weight.totalWeight = 0.0; groupNode = m_GroupedGraph.CreateNode(weight); LinkWeight linkData; linkData.count = 1; unsigned int nodeId = m_GroupedGraph.GetHead()->GetChildren().AddLink(groupNode, linkData); m_FileMap.insert( FileToMapEntry(fileHandle, nodeId) ); } unsigned int refById; FindNodeByFileHandle matchFunc(refByNode->GetData().fileHandle); if (groupNode->GetRefBy().FindNode(&matchFunc, refById)) { groupNode->GetRefBy().GetLink(refById).count += times; } else { NodeWeight nodeDescr; nodeDescr.fileHandle = refByNode->GetData().fileHandle; nodeDescr.myTotalWeight = 0; nodeDescr.totalWeight = 0; GroupedDependencyGraph::Node* newNode = m_GroupedGraph.CreateNode(nodeDescr); LinkWeight linkData; linkData.count = times; groupNode->GetRefBy().AddLink(newNode, linkData); } double totalWeight = 0.0; for(unsigned int i=0; i < dependencyNode->GetChildren().GetCount(); i++) { const DependencyGraph::Node* child = dependencyNode->GetChildren().GetNode(i); double w = Visit(child, groupNode, dependencyNode->GetChildren().GetLink(i).count); unsigned int linkId; FindNodeByFileHandle matchFunc(child->GetData().fileHandle); if (groupNode->GetChildren().FindNode(&matchFunc, linkId)) { GroupedDependencyGraph::Node* groupDependency = groupNode->GetChildren().GetNode(linkId); groupDependency->GetData().myTotalWeight += GetFileWeight(child->GetData().fileHandle); groupDependency->GetData().totalWeight += w; groupNode->GetChildren().GetLink(linkId).count += 1; } else { NodeWeight nodeDescr; nodeDescr.fileHandle = child->GetData().fileHandle; nodeDescr.myTotalWeight = GetFileWeight(child->GetData().fileHandle); nodeDescr.totalWeight = w; GroupedDependencyGraph::Node* newNode = m_GroupedGraph.CreateNode(nodeDescr); LinkWeight linkData; linkData.count = 1; groupNode->GetChildren().AddLink(newNode, linkData); } totalWeight += w; } double fileWeight = GetFileWeight(fileHandle); groupNode->GetData().myTotalWeight += fileWeight; totalWeight += fileWeight; groupNode->GetData().totalWeight += totalWeight; return totalWeight; }