示例#1
0
文件: list.c 项目: odeke-em/scrooge
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;
}
示例#2
0
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;
};
示例#3
0
文件: list.c 项目: odeke-em/scrooge
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;
}
示例#4
0
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;
}
示例#5
0
  // 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;

  }