#include "semcheck.h" char* iToa( int n ) { char* str = new char[32]; int i = 0; int j,c; do { str[i++] = n % 10 + '0'; } while( (n /= 10) > 0 ); str[i] = '\0'; for( i = 0, j = strlen( str ) - 1; i < j; i++, j-- ) { c = str[i]; str[i] = str[j]; str[j] = c; } return str; } Cd_graph * Cd_graph::BuildSCCGraph() { Cd_graph *SCCGraph = new Cd_graph(); SCCGraph->set_adjacencies(new Adjacency_Nlist()); adjacencies->BuildSCCGraph(SCCGraph); return SCCGraph; } void Adjacency_Nlist::BuildSCCGraph(Cd_graph *SCCGraph) { Adjacency_list_iterator next(*this); Adjacency_ each; while (each = next()) each->BuildSCCGraph(SCCGraph,this); } void Adjacency::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs) { char *SCCName = iToa(scc->get_val()); Vertex *newSource = new Vertex(); newSource->set_vertex_name(new DemIdent(SCCName)); SCCGraph->get_adjacencies()->BuildSCCGraph(newSource,source,NULL,NULL); ns->BuildSCCGraph(SCCGraph,adjs,newSource,source); } void Neighbors::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { } void Neighbors_wc::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { } void Construct_ns::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { Any_vertex_list_iterator next(*this->get_construct_ns()); Any_vertex_ each; while (each = next()) each->BuildSCCGraph(SCCGraph,adjs,ownerSCC,owner); } void Any_vertex::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { } void Opt_labeled_term::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { } void Regular::BuildSCCGraph(Cd_graph *SCCGraph,Adjacency_Nlist*adjs,Vertex * ownerSCC,Vertex*owner) { DemNumber *borrowerSCCN = adjs->Get_SCCNumber(this->get_vertex()->get_vertex()); char *SCCName = iToa(borrowerSCCN->get_val()); Vertex *newSource = new Vertex(); newSource->set_vertex_name(new DemIdent(SCCName)); SCCGraph->BuildSCCGraph(ownerSCC,owner,newSource,this->get_vertex()->get_vertex()); } DemNumber *Adjacency_Nlist::Get_SCCNumber(Vertex *aVertex) { Adjacency_list_iterator next(*this); Adjacency_ each; while (each = next()) if (each->get_source()->g_equal(aVertex)) return each->get_scc(); } void Cd_graph::BuildSCCGraph(Vertex*ownerSCC, Vertex*owner, Vertex*borrowerSCC, Vertex*borrower) { adjacencies->BuildSCCGraph(ownerSCC,owner,borrowerSCC,borrower); } void Adjacency_Nlist::BuildSCCGraph(Vertex*ownerSCC, Vertex*owner, Vertex*borrowerSCC, Vertex*borrower) { Adjacency_list_iterator next(*this); Adjacency_ each; while (each = next()) if (each->get_source()->g_equal(ownerSCC)) break; if (each==NULL) { Adjacency_ new_adj = new Adjacency(); new_adj->set_source(ownerSCC); Construct_ns* cons_n = new Construct_ns(); cons_n->set_construct_ns(new Any_vertex_List()); new_adj->set_ns(cons_n); this->append(new_adj); each = new_adj; } each->BuildSCCGraph(ownerSCC,owner,borrowerSCC,borrower); } void Adjacency::BuildSCCGraph(Vertex*ownerSCC, Vertex*owner, Vertex*borrowerSCC, Vertex*borrower) { if (parameters==NULL) parameters = new Vertex_Comma_list(); if (ownerSCC->g_equal(borrowerSCC)) { parameters->disjointAdd(owner); if (borrowerSCC) parameters->disjointAdd(borrower); } else { parameters->disjointAdd(owner); if (borrowerSCC) ns->BuildSCCGraph(borrowerSCC); } } void Vertex_Comma_list::disjointAdd(Vertex *iVertex) { Vertex_list_iterator next(*this); Vertex_ each; while (each = next()) if (each->g_equal(iVertex)) return; this->append(iVertex); } void Neighbors::BuildSCCGraph(Vertex * borrowerSCC) { } void Neighbors_wc::BuildSCCGraph(Vertex * borrowerSCC) { Any_vertex_list_iterator next(*this->get_construct_ns()); Any_vertex_ each; while (each = next()) { if ((((Regular*)each)->get_vertex()) ->get_vertex()->g_equal(borrowerSCC)) return; } Regular * new_regular = new Regular(); Normal * new_Normal = new Normal(); new_Normal->set_vertex(borrowerSCC); new_regular->set_vertex(new_Normal); this->get_construct_ns()->append(new_regular); }