int ACodeNode::compare(const ACodeNode* x, const ACodeNode* y) { if (x->begLine() == y->begLine()) { bool endLinesEqual = (x->endLine() == y->endLine()); if (endLinesEqual) { // We have two ACodeNode's with identical line intervals... // Use lexicographic comparison for procedures if (x->type() == ANode::TyProc && y->type() == ANode::TyProc) { Proc *px = (Proc*)x, *py = (Proc*)y; int cmp1 = px->name().compare(py->name()); if (cmp1 != 0) { return cmp1; } int cmp2 = px->linkName().compare(py->linkName()); if (cmp2 != 0) { return cmp2; } } // Use VMAInterval sets otherwise. bool x_lt_y = (x->vmaSet() < y->vmaSet()); bool y_lt_x = (y->vmaSet() < x->vmaSet()); bool vmaSetsEqual = (!x_lt_y && !y_lt_x); if (vmaSetsEqual) { // Try ranking a leaf node before a non-leaf node if ( !(x->isLeaf() && y->isLeaf())) { if (x->isLeaf()) { return -1; } // x < y else if (y->isLeaf()) { return 1; } // x > y } // Give up! return 0; } else if (x_lt_y) { return -1; } else if (y_lt_x) { return 1; } else { DIAG_Die(DIAG_Unimplemented); } } else { return SrcFile::compare(x->endLine(), y->endLine()); } } else { return SrcFile::compare(x->begLine(), y->begLine()); } }
Proc* File::findProc(const char* name, const char* linkname) const { Proc* found = NULL; ProcMap::const_iterator it = m_procMap->find(name); if (it != m_procMap->end()) { if (linkname && linkname[0] != '\0') { for ( ; (it != m_procMap->end() && strcmp(it->first.c_str(), name) == 0); ++it) { Proc* p = it->second; if (strcmp(p->linkName().c_str(), linkname) == 0) { return p; // found = p } } } else { found = it->second; } } return found; }