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; }
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; }
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; }
// 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; }
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; }