コード例 #1
0
CDGNode *getTopPath(CDGNode * node, Stack * changedNodes, Stack * changedBranches) {
  CDGNode *pathNode = newBlankNode();
  CDGNode *temp = pathNode;
  int branch;
  while (node) {
    if (0 != getScore(node)) {
      stackPush(changedNodes, &node);
      branch = getOutcome(node);
      stackPush(changedBranches, &branch);
      if (isLeaf(node)) {
	setScore(node, 0);
      } else {
	setNextNode(temp, copyToPathNode(newBlankNode(), node));
	temp = getNextNode(temp);
	if (getOutcome(node)) {
	  setBranchInfo(getID(node), 1, getBranchInfo(getID(node), 0));
	  setTrueNodeSet(temp, getTopPath(getTrueNodeSet(node), changedNodes, changedBranches));
	} else {
	  setBranchInfo(getID(node), getBranchInfo(getID(node), 1), 1);
	  setFalseNodeSet(temp, getTopPath(getFalseNodeSet(node), changedNodes, changedBranches));
	}
      }
    }
    node = getNextNode(node);
  }
  if (temp == pathNode) {
    deleteNode(pathNode);
    pathNode = NULL;
  } else {
    temp = pathNode;
    pathNode = getNextNode(pathNode);
    deleteNode(temp);
  }
  return pathNode;
}
コード例 #2
0
CDGNode *addDummyNodes(CDGNode * node) {
  while (node) {
    if (!isLeaf(node)) {
      if (NULL == getTrueNodeSet(node)) {
	addTrueNode(node, newBlankNode());
      } else if (NULL == getFalseNodeSet(node)) {
	addFalseNode(node, newBlankNode());
      }
    }
    addDummyNodes(getTrueNodeSet(node));
    addDummyNodes(getFalseNodeSet(node));
    node = getNextNode(node);
  }
  return node;
}
コード例 #3
0
CDGNode *pathToList(CDGNode * head) {
  assert(NULL != head);
  Stack *nodeStack = stackNew(sizeof(CDGNode *));
  CDGNode *node;
  CDGNode *list = NULL;
  postOrder(head, nodeStack);
  while (!stackIsEmpty(nodeStack)) {
    stackPop(nodeStack, &node);
    list = setNextNode(copyToPathNode(newBlankNode(), node), list);
  }
  return list;
}
コード例 #4
0
ファイル: cdgWrapper.c プロジェクト: swapnilsm/CDG
// branch variable tell on which branch of parent the node is to be attached
void addtoCDGnode(int id, int pid, int branch) {
    CDGNode* node = newBlankNode();
    setID(node, id);
    if ( 0 == id ) {
        root = node;
    } else {
        if (branch) {
            addTrueNode(nodes[pid], node);
        } else {
            addFalseNode(nodes[pid], node);
        }
    }
    nodes[id] = node;
}
コード例 #5
0
CDGNode *buildFeasiblePath(CDGNode * node, CDGNode * list) {
  while (node && 0 == nodeExists(list, getID(node))) {
    node = getNextNode(node);
  }

  if (NULL == node)
    return NULL;

  CDGNode *out = NULL;
  out = copyToPathNode(newBlankNode(), node);
  setTrueNodeSet(out, buildFeasiblePath(getTrueNodeSet(node), list));
  setFalseNodeSet(out, buildFeasiblePath(getFalseNodeSet(node), list));
  setNextNode(out, buildFeasiblePath(getNextNode(node), list));

  return out;
}