diff --git a/src/rinterface.c b/src/rinterface.c index f74588cd392..f602cc76c42 100644 --- a/src/rinterface.c +++ b/src/rinterface.c @@ -39,19 +39,20 @@ SEXP R_igraph_empty(SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_empty(&c_graph, c_n, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_empty(&c_graph, c_n, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -68,20 +69,21 @@ SEXP R_igraph_add_edges(SEXP graph, SEXP edges) { SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); Rz_SEXP_to_vector_int_copy(edges, &c_edges); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_add_edges(&c_graph, &c_edges, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_add_edges(&c_graph, &c_edges, 0)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -100,19 +102,20 @@ SEXP R_igraph_empty_attrs(SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_empty_attrs(&c_graph, c_n, c_directed, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_empty_attrs(&c_graph, c_n, c_directed, 0)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -129,18 +132,19 @@ SEXP R_igraph_add_vertices(SEXP graph, SEXP nv) { SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_INT(nv); c_nv = (igraph_integer_t) REAL(nv)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_add_vertices(&c_graph, c_nv, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_add_vertices(&c_graph, c_nv, 0)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -157,16 +161,17 @@ SEXP R_igraph_copy(SEXP from) { SEXP to; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(from, &c_from); /* Call igraph */ - IGRAPH_R_CHECK(igraph_copy(&c_to, &c_from)); + IGRAPH_LOCAL_R_CHECK(igraph_copy(&c_to, &c_from)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_to); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_to); PROTECT(to=Ry_igraph_to_SEXP(&c_to)); IGRAPH_I_DESTROY(&c_to); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = to; UNPROTECT(1); @@ -182,18 +187,19 @@ SEXP R_igraph_delete_edges(SEXP graph, SEXP edges) { igraph_es_t c_edges; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); igraph_vector_int_t c_edges_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(edges, &c_graph, &c_edges, &c_edges_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(edges, &c_graph, &c_edges, &c_edges_data)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_delete_edges(&c_graph, c_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_delete_edges(&c_graph, c_edges)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edges_data); igraph_es_destroy(&c_edges); r_result = graph; @@ -211,18 +217,19 @@ SEXP R_igraph_delete_vertices(SEXP graph, SEXP vertices) { igraph_vs_t c_vertices; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); igraph_vector_int_t c_vertices_data; Rz_SEXP_to_igraph_vs(vertices, &c_graph, &c_vertices, &c_vertices_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_delete_vertices(&c_graph, c_vertices)); + IGRAPH_LOCAL_R_CHECK(igraph_delete_vertices(&c_graph, c_vertices)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertices_data); igraph_vs_destroy(&c_vertices); r_result = graph; @@ -244,32 +251,33 @@ SEXP R_igraph_delete_vertices_idx(SEXP graph, SEXP vertices) { SEXP invidx; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); igraph_vector_int_t c_vertices_data; Rz_SEXP_to_igraph_vs(vertices, &c_graph, &c_vertices, &c_vertices_data); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_idx, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_idx); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_invidx, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_invidx); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_idx, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_idx); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_invidx, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_invidx); /* Call igraph */ - IGRAPH_R_CHECK(igraph_delete_vertices_idx(&c_graph, c_vertices, &c_idx, &c_invidx)); + IGRAPH_LOCAL_R_CHECK(igraph_delete_vertices_idx(&c_graph, c_vertices, &c_idx, &c_invidx)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertices_data); igraph_vs_destroy(&c_vertices); PROTECT(idx=Ry_igraph_vector_int_to_SEXP(&c_idx)); igraph_vector_int_destroy(&c_idx); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(invidx=Ry_igraph_vector_int_to_SEXP(&c_invidx)); igraph_vector_int_destroy(&c_invidx); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, idx); SET_VECTOR_ELT(r_result, 2, invidx); @@ -291,6 +299,7 @@ SEXP R_igraph_vcount(SEXP graph) { igraph_t c_graph; igraph_integer_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ @@ -313,6 +322,7 @@ SEXP R_igraph_ecount(SEXP graph) { igraph_t c_graph; igraph_integer_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ @@ -339,19 +349,20 @@ SEXP R_igraph_neighbors(SEXP graph, SEXP vid, SEXP mode) { SEXP neis; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_neis, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_neis); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_neis, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_neis); c_vid = (igraph_integer_t) REAL(vid)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_neighbors(&c_graph, &c_neis, c_vid, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_neighbors(&c_graph, &c_neis, c_vid, c_mode)); /* Convert output */ PROTECT(neis=Ry_igraph_vector_int_to_SEXPp1(&c_neis)); igraph_vector_int_destroy(&c_neis); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = neis; UNPROTECT(1); @@ -366,6 +377,7 @@ SEXP R_igraph_is_directed(SEXP graph) { igraph_t c_graph; igraph_bool_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ @@ -393,22 +405,23 @@ SEXP R_igraph_degree(SEXP graph, SEXP vids, SEXP mode, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_degree(&c_graph, &c_res, c_vids, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_degree(&c_graph, &c_res, c_vids, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXP(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -430,6 +443,7 @@ SEXP R_igraph_edge(SEXP graph, SEXP eid) { SEXP to; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(eid); @@ -437,7 +451,7 @@ SEXP R_igraph_edge(SEXP graph, SEXP eid) { c_from=0; c_to=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge(&c_graph, c_eid, &c_from, &c_to)); + IGRAPH_LOCAL_R_CHECK(igraph_edge(&c_graph, c_eid, &c_from, &c_to)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -468,21 +482,22 @@ SEXP R_igraph_edges(SEXP graph, SEXP eids) { SEXP edges; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_eids_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_edges(&c_graph, c_eids, &c_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_edges(&c_graph, c_eids, &c_edges)); /* Convert output */ igraph_vector_int_destroy(&c_eids_data); igraph_es_destroy(&c_eids); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = edges; UNPROTECT(1); @@ -503,6 +518,7 @@ SEXP R_igraph_get_eid(SEXP graph, SEXP from, SEXP to, SEXP directed, SEXP error) SEXP eid; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_eid = -1; @@ -513,7 +529,7 @@ SEXP R_igraph_get_eid(SEXP graph, SEXP from, SEXP to, SEXP directed, SEXP error) IGRAPH_R_CHECK_BOOL(error); c_error = LOGICAL(error)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_eid(&c_graph, &c_eid, c_from, c_to, c_directed, c_error)); + IGRAPH_LOCAL_R_CHECK(igraph_get_eid(&c_graph, &c_eid, c_from, c_to, c_directed, c_error)); /* Convert output */ PROTECT(eid = NEW_INTEGER(1)); @@ -537,25 +553,26 @@ SEXP R_igraph_get_eids(SEXP graph, SEXP pairs, SEXP directed, SEXP error) { SEXP eids; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_eids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_eids); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_eids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_eids); Rz_SEXP_to_vector_int_copy(pairs, &c_pairs); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_pairs); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_pairs); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(error); c_error = LOGICAL(error)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_eids(&c_graph, &c_eids, &c_pairs, c_directed, c_error)); + IGRAPH_LOCAL_R_CHECK(igraph_get_eids(&c_graph, &c_eids, &c_pairs, c_directed, c_error)); /* Convert output */ PROTECT(eids=Ry_igraph_vector_int_to_SEXPp1(&c_eids)); igraph_vector_int_destroy(&c_eids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_pairs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = eids; UNPROTECT(1); @@ -575,21 +592,22 @@ SEXP R_igraph_get_all_eids_between(SEXP graph, SEXP from, SEXP to, SEXP directed SEXP eids; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_eids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_eids); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_eids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_eids); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_all_eids_between(&c_graph, &c_eids, c_from, c_to, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_get_all_eids_between(&c_graph, &c_eids, c_from, c_to, c_directed)); /* Convert output */ PROTECT(eids=Ry_igraph_vector_int_to_SEXPp1(&c_eids)); igraph_vector_int_destroy(&c_eids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = eids; UNPROTECT(1); @@ -608,19 +626,20 @@ SEXP R_igraph_incident(SEXP graph, SEXP vid, SEXP mode) { SEXP eids; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_eids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_eids); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_eids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_eids); c_vid = (igraph_integer_t) REAL(vid)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_incident(&c_graph, &c_eids, c_vid, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_incident(&c_graph, &c_eids, c_vid, c_mode)); /* Convert output */ PROTECT(eids=Ry_igraph_vector_int_to_SEXPp1(&c_eids)); igraph_vector_int_destroy(&c_eids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = eids; UNPROTECT(1); @@ -638,11 +657,12 @@ SEXP R_igraph_is_same_graph(SEXP graph1, SEXP graph2) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_same_graph(&c_graph1, &c_graph2, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_same_graph(&c_graph1, &c_graph2, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -665,23 +685,24 @@ SEXP R_igraph_create(SEXP edges, SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edges, &c_edges)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edges, &c_edges)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_create(&c_graph, &c_edges, c_n, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_create(&c_graph, &c_edges, c_n, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -700,18 +721,19 @@ SEXP R_igraph_adjacency(SEXP adjmatrix, SEXP mode, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(adjmatrix, &c_adjmatrix); c_mode = (igraph_adjacency_t) Rf_asInteger(mode); c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_adjacency(&c_graph, &c_adjmatrix, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_adjacency(&c_graph, &c_adjmatrix, c_mode, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -730,21 +752,22 @@ SEXP R_igraph_sparse_adjacency(SEXP adjmatrix, SEXP mode, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_sparsemat(adjmatrix, &c_adjmatrix); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_adjmatrix); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_adjmatrix); c_mode = (igraph_adjacency_t) Rf_asInteger(mode); c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sparse_adjacency(&c_graph, &c_adjmatrix, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_sparse_adjacency(&c_graph, &c_adjmatrix, c_mode, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_sparsemat_destroy(&c_adjmatrix); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -765,29 +788,30 @@ SEXP R_igraph_sparse_weighted_adjacency(SEXP adjmatrix, SEXP mode, SEXP loops) { SEXP weights; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_sparsemat(adjmatrix, &c_adjmatrix); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_adjmatrix); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_adjmatrix); c_mode = (igraph_adjacency_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_init(&c_weights, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_weights); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_weights, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_weights); weights=R_GlobalEnv; /* hack to have a non-NULL value */ c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sparse_weighted_adjacency(&c_graph, &c_adjmatrix, c_mode, &c_weights, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_sparse_weighted_adjacency(&c_graph, &c_adjmatrix, c_mode, &c_weights, c_loops)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_sparsemat_destroy(&c_adjmatrix); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(weights=Ry_igraph_0orvector_to_SEXP(&c_weights)); igraph_vector_destroy(&c_weights); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, weights); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -813,26 +837,27 @@ SEXP R_igraph_weighted_adjacency(SEXP adjmatrix, SEXP mode, SEXP loops) { SEXP weights; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(adjmatrix, &c_adjmatrix); c_mode = (igraph_adjacency_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_init(&c_weights, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_weights); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_weights, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_weights); weights=R_GlobalEnv; /* hack to have a non-NULL value */ c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_weighted_adjacency(&c_graph, &c_adjmatrix, c_mode, &c_weights, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_weighted_adjacency(&c_graph, &c_adjmatrix, c_mode, &c_weights, c_loops)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(weights=Ry_igraph_0orvector_to_SEXP(&c_weights)); igraph_vector_destroy(&c_weights); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, weights); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -856,6 +881,7 @@ SEXP R_igraph_star(SEXP n, SEXP mode, SEXP center) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -863,13 +889,13 @@ SEXP R_igraph_star(SEXP n, SEXP mode, SEXP center) { IGRAPH_R_CHECK_INT(center); c_center = (igraph_integer_t) REAL(center)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_star(&c_graph, c_n, c_mode, c_center)); + IGRAPH_LOCAL_R_CHECK(igraph_star(&c_graph, c_n, c_mode, c_center)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -888,6 +914,7 @@ SEXP R_igraph_wheel(SEXP n, SEXP mode, SEXP center) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -895,13 +922,13 @@ SEXP R_igraph_wheel(SEXP n, SEXP mode, SEXP center) { IGRAPH_R_CHECK_INT(center); c_center = (igraph_integer_t) REAL(center)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_wheel(&c_graph, c_n, c_mode, c_center)); + IGRAPH_LOCAL_R_CHECK(igraph_wheel(&c_graph, c_n, c_mode, c_center)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -919,19 +946,20 @@ SEXP R_igraph_hypercube(SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hypercube(&c_graph, c_n, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_hypercube(&c_graph, c_n, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -952,9 +980,10 @@ SEXP R_igraph_square_lattice(SEXP dimvector, SEXP nei, SEXP directed, SEXP mutua SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(dimvector, &c_dimvector)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dimvector); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(dimvector, &c_dimvector)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_dimvector); IGRAPH_R_CHECK_INT(nei); c_nei = (igraph_integer_t) REAL(nei)[0]; IGRAPH_R_CHECK_BOOL(directed); @@ -965,15 +994,15 @@ SEXP R_igraph_square_lattice(SEXP dimvector, SEXP nei, SEXP directed, SEXP mutua Rz_SEXP_to_vector_bool(periodic, &c_periodic); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_square_lattice(&c_graph, &c_dimvector, c_nei, c_directed, c_mutual, (Rf_isNull(periodic) ? 0 : &c_periodic))); + IGRAPH_LOCAL_R_CHECK(igraph_square_lattice(&c_graph, &c_dimvector, c_nei, c_directed, c_mutual, (Rf_isNull(periodic) ? 0 : &c_periodic))); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_dimvector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -992,23 +1021,24 @@ SEXP R_igraph_triangular_lattice(SEXP dimvector, SEXP directed, SEXP mutual) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(dimvector, &c_dimvector)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dimvector); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(dimvector, &c_dimvector)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_dimvector); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(mutual); c_mutual = LOGICAL(mutual)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_triangular_lattice(&c_graph, &c_dimvector, c_directed, c_mutual)); + IGRAPH_LOCAL_R_CHECK(igraph_triangular_lattice(&c_graph, &c_dimvector, c_directed, c_mutual)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_dimvector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1028,6 +1058,7 @@ SEXP R_igraph_ring(SEXP n, SEXP directed, SEXP mutual, SEXP circular) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1038,13 +1069,13 @@ SEXP R_igraph_ring(SEXP n, SEXP directed, SEXP mutual, SEXP circular) { IGRAPH_R_CHECK_BOOL(circular); c_circular = LOGICAL(circular)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_ring(&c_graph, c_n, c_directed, c_mutual, c_circular)); + IGRAPH_LOCAL_R_CHECK(igraph_ring(&c_graph, c_n, c_directed, c_mutual, c_circular)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1063,6 +1094,7 @@ SEXP R_igraph_path_graph(SEXP n, SEXP directed, SEXP mutual) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1071,13 +1103,13 @@ SEXP R_igraph_path_graph(SEXP n, SEXP directed, SEXP mutual) { IGRAPH_R_CHECK_BOOL(mutual); c_mutual = LOGICAL(mutual)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_path_graph(&c_graph, c_n, c_directed, c_mutual)); + IGRAPH_LOCAL_R_CHECK(igraph_path_graph(&c_graph, c_n, c_directed, c_mutual)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1096,6 +1128,7 @@ SEXP R_igraph_cycle_graph(SEXP n, SEXP directed, SEXP mutual) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1104,13 +1137,13 @@ SEXP R_igraph_cycle_graph(SEXP n, SEXP directed, SEXP mutual) { IGRAPH_R_CHECK_BOOL(mutual); c_mutual = LOGICAL(mutual)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_cycle_graph(&c_graph, c_n, c_directed, c_mutual)); + IGRAPH_LOCAL_R_CHECK(igraph_cycle_graph(&c_graph, c_n, c_directed, c_mutual)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1129,6 +1162,7 @@ SEXP R_igraph_kary_tree(SEXP n, SEXP children, SEXP type) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1136,13 +1170,13 @@ SEXP R_igraph_kary_tree(SEXP n, SEXP children, SEXP type) { c_children = (igraph_integer_t) REAL(children)[0]; c_type = (igraph_tree_mode_t) Rf_asInteger(type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_kary_tree(&c_graph, c_n, c_children, c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_kary_tree(&c_graph, c_n, c_children, c_type)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1160,20 +1194,21 @@ SEXP R_igraph_symmetric_tree(SEXP branches, SEXP type) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(branches, &c_branches)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_branches); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(branches, &c_branches)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_branches); c_type = (igraph_tree_mode_t) Rf_asInteger(type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_symmetric_tree(&c_graph, &c_branches, c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_symmetric_tree(&c_graph, &c_branches, c_type)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_branches); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1192,6 +1227,7 @@ SEXP R_igraph_regular_tree(SEXP h, SEXP k, SEXP type) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(h); c_h = (igraph_integer_t) REAL(h)[0]; @@ -1199,13 +1235,13 @@ SEXP R_igraph_regular_tree(SEXP h, SEXP k, SEXP type) { c_k = (igraph_integer_t) REAL(k)[0]; c_type = (igraph_tree_mode_t) Rf_asInteger(type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_regular_tree(&c_graph, c_h, c_k, c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_regular_tree(&c_graph, c_h, c_k, c_type)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1224,6 +1260,7 @@ SEXP R_igraph_full(SEXP n, SEXP directed, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1232,13 +1269,13 @@ SEXP R_igraph_full(SEXP n, SEXP directed, SEXP loops) { IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_full(&c_graph, c_n, c_directed, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_full(&c_graph, c_n, c_directed, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1256,19 +1293,20 @@ SEXP R_igraph_full_citation(SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_full_citation(&c_graph, c_n, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_full_citation(&c_graph, c_n, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1285,17 +1323,18 @@ SEXP R_igraph_atlas(SEXP number) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(number); c_number = (igraph_integer_t) REAL(number)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_atlas(&c_graph, c_number)); + IGRAPH_LOCAL_R_CHECK(igraph_atlas(&c_graph, c_number)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1314,23 +1353,24 @@ SEXP R_igraph_extended_chordal_ring(SEXP nodes, SEXP W, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; Rz_SEXP_to_matrix_int(W, &c_W); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_W); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_W); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_extended_chordal_ring(&c_graph, c_nodes, &c_W, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_extended_chordal_ring(&c_graph, c_nodes, &c_W, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_matrix_int_destroy(&c_W); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1347,19 +1387,20 @@ SEXP R_igraph_connect_neighborhood(SEXP graph, SEXP order, SEXP mode) { igraph_neimode_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_INT(order); c_order = (igraph_integer_t) REAL(order)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_connect_neighborhood(&c_graph, c_order, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_connect_neighborhood(&c_graph, c_order, c_mode)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1378,6 +1419,7 @@ SEXP R_igraph_graph_power(SEXP graph, SEXP order, SEXP directed) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(order); @@ -1385,13 +1427,13 @@ SEXP R_igraph_graph_power(SEXP graph, SEXP order, SEXP directed) { IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_graph_power(&c_graph, &c_res, c_order, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_graph_power(&c_graph, &c_res, c_order, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -1408,16 +1450,17 @@ SEXP R_igraph_linegraph(SEXP graph) { SEXP linegraph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_linegraph(&c_graph, &c_linegraph)); + IGRAPH_LOCAL_R_CHECK(igraph_linegraph(&c_graph, &c_linegraph)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_linegraph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_linegraph); PROTECT(linegraph=Ry_igraph_to_SEXP(&c_linegraph)); IGRAPH_I_DESTROY(&c_linegraph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = linegraph; UNPROTECT(1); @@ -1435,19 +1478,20 @@ SEXP R_igraph_de_bruijn(SEXP m, SEXP n) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_de_bruijn(&c_graph, c_m, c_n)); + IGRAPH_LOCAL_R_CHECK(igraph_de_bruijn(&c_graph, c_m, c_n)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1465,19 +1509,20 @@ SEXP R_igraph_kautz(SEXP m, SEXP n) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_kautz(&c_graph, c_m, c_n)); + IGRAPH_LOCAL_R_CHECK(igraph_kautz(&c_graph, c_m, c_n)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1494,16 +1539,17 @@ SEXP R_igraph_famous(SEXP name) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_name = Rf_translateCharUTF8(STRING_ELT(name, 0)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_famous(&c_graph, c_name)); + IGRAPH_LOCAL_R_CHECK(igraph_famous(&c_graph, c_name)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1522,23 +1568,24 @@ SEXP R_igraph_lcf_vector(SEXP n, SEXP shifts, SEXP repeats) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(shifts, &c_shifts)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_shifts); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(shifts, &c_shifts)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_shifts); IGRAPH_R_CHECK_INT(repeats); c_repeats = (igraph_integer_t) REAL(repeats)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_lcf_vector(&c_graph, c_n, &c_shifts, c_repeats)); + IGRAPH_LOCAL_R_CHECK(igraph_lcf_vector(&c_graph, c_n, &c_shifts, c_repeats)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_shifts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1555,17 +1602,18 @@ SEXP R_igraph_mycielski_graph(SEXP k) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_mycielski_graph(&c_graph, c_k)); + IGRAPH_LOCAL_R_CHECK(igraph_mycielski_graph(&c_graph, c_k)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1584,19 +1632,20 @@ SEXP R_igraph_adjlist(SEXP adjlist, SEXP mode, SEXP duplicate) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_adjlist(adjlist, &c_adjlist)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_adjlist(adjlist, &c_adjlist)); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(duplicate); c_duplicate = LOGICAL(duplicate)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_adjlist(&c_graph, &c_adjlist, c_mode, c_duplicate)); + IGRAPH_LOCAL_R_CHECK(igraph_adjlist(&c_graph, &c_adjlist, c_mode, c_duplicate)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_adjlist_destroy(&c_adjlist); r_result = graph; @@ -1619,9 +1668,10 @@ SEXP R_igraph_full_bipartite(SEXP n1, SEXP n2, SEXP directed, SEXP mode) { SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_types); IGRAPH_R_CHECK_INT(n1); c_n1 = (igraph_integer_t) REAL(n1)[0]; IGRAPH_R_CHECK_INT(n2); @@ -1630,18 +1680,18 @@ SEXP R_igraph_full_bipartite(SEXP n1, SEXP n2, SEXP directed, SEXP mode) { c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_full_bipartite(&c_graph, &c_types, c_n1, c_n2, c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_full_bipartite(&c_graph, &c_types, c_n1, c_n2, c_directed, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_bool_to_SEXP(&c_types)); igraph_vector_bool_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -1667,29 +1717,30 @@ SEXP R_igraph_full_multipartite(SEXP n, SEXP directed, SEXP mode) { SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_int_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(n, &c_n)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_n); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(n, &c_n)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_n); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_full_multipartite(&c_graph, &c_types, &c_n, c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_full_multipartite(&c_graph, &c_types, &c_n, c_directed, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_int_to_SEXPp1(&c_types)); igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_n); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -1714,30 +1765,31 @@ SEXP R_igraph_realize_degree_sequence(SEXP out_deg, SEXP in_deg, SEXP allowed_ed SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_out_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_out_deg); if (!Rf_isNull(in_deg)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } c_allowed_edge_types = (igraph_edge_type_sw_t) Rf_asInteger(allowed_edge_types); c_method = (igraph_realize_degseq_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_realize_degree_sequence(&c_graph, &c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_allowed_edge_types, c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_realize_degree_sequence(&c_graph, &c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_allowed_edge_types, c_method)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_out_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_in_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1757,25 +1809,26 @@ SEXP R_igraph_realize_bipartite_degree_sequence(SEXP degrees1, SEXP degrees2, SE SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees1, &c_degrees1)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_degrees1); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees2, &c_degrees2)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_degrees2); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees1, &c_degrees1)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_degrees1); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees2, &c_degrees2)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_degrees2); c_allowed_edge_types = (igraph_edge_type_sw_t) Rf_asInteger(allowed_edge_types); c_method = (igraph_realize_degseq_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_realize_bipartite_degree_sequence(&c_graph, &c_degrees1, &c_degrees2, c_allowed_edge_types, c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_realize_bipartite_degree_sequence(&c_graph, &c_degrees1, &c_degrees2, c_allowed_edge_types, c_method)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_degrees1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_degrees2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1794,23 +1847,24 @@ SEXP R_igraph_circulant(SEXP n, SEXP shifts, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(shifts, &c_shifts)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_shifts); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(shifts, &c_shifts)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_shifts); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_circulant(&c_graph, c_n, &c_shifts, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_circulant(&c_graph, c_n, &c_shifts, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_shifts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1828,19 +1882,20 @@ SEXP R_igraph_generalized_petersen(SEXP n, SEXP k) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_generalized_petersen(&c_graph, c_n, c_k)); + IGRAPH_LOCAL_R_CHECK(igraph_generalized_petersen(&c_graph, c_n, c_k)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1860,26 +1915,27 @@ SEXP R_igraph_turan(SEXP n, SEXP r) { SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_int_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; IGRAPH_R_CHECK_INT(r); c_r = (igraph_integer_t) REAL(r)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_turan(&c_graph, &c_types, c_n, c_r)); + IGRAPH_LOCAL_R_CHECK(igraph_turan(&c_graph, &c_types, c_n, c_r)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_int_to_SEXPp1(&c_types)); igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -1904,24 +1960,25 @@ SEXP R_igraph_weighted_sparsemat(SEXP A, SEXP directed, SEXP attr, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_sparsemat(A, &c_A); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_A); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_A); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; c_attr = Rf_translateCharUTF8(STRING_ELT(attr, 0)); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_weighted_sparsemat(&c_graph, &c_A, c_directed, c_attr, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_weighted_sparsemat(&c_graph, &c_A, c_directed, c_attr, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_sparsemat_destroy(&c_A); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1946,6 +2003,7 @@ SEXP R_igraph_barabasi_game(SEXP n, SEXP power, SEXP m, SEXP outseq, SEXP outpre SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -1954,11 +2012,11 @@ SEXP R_igraph_barabasi_game(SEXP n, SEXP power, SEXP m, SEXP outseq, SEXP outpre IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; if (!Rf_isNull(outseq)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } IGRAPH_R_CHECK_BOOL(outpref); c_outpref = LOGICAL(outpref)[0]; @@ -1971,15 +2029,15 @@ SEXP R_igraph_barabasi_game(SEXP n, SEXP power, SEXP m, SEXP outseq, SEXP outpre Rz_SEXP_to_igraph(start_from, &c_start_from); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_barabasi_game(&c_graph, c_n, c_power, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_A, c_directed, c_algo, (Rf_isNull(start_from) ? 0 : &c_start_from))); + IGRAPH_LOCAL_R_CHECK(igraph_barabasi_game(&c_graph, c_n, c_power, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_A, c_directed, c_algo, (Rf_isNull(start_from) ? 0 : &c_start_from))); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_outseq); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -1999,6 +2057,7 @@ SEXP R_igraph_erdos_renyi_game_gnp(SEXP n, SEXP p, SEXP directed, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -2009,13 +2068,13 @@ SEXP R_igraph_erdos_renyi_game_gnp(SEXP n, SEXP p, SEXP directed, SEXP loops) { IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_erdos_renyi_game_gnp(&c_graph, c_n, c_p, c_directed, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_erdos_renyi_game_gnp(&c_graph, c_n, c_p, c_directed, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2035,6 +2094,7 @@ SEXP R_igraph_erdos_renyi_game_gnm(SEXP n, SEXP m, SEXP directed, SEXP loops) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -2045,13 +2105,13 @@ SEXP R_igraph_erdos_renyi_game_gnm(SEXP n, SEXP m, SEXP directed, SEXP loops) { IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_erdos_renyi_game_gnm(&c_graph, c_n, c_m, c_directed, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_erdos_renyi_game_gnm(&c_graph, c_n, c_m, c_directed, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2070,29 +2130,30 @@ SEXP R_igraph_degree_sequence_game(SEXP out_deg, SEXP in_deg, SEXP method) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_out_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_out_deg); if (!Rf_isNull(in_deg)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } c_method = (igraph_degseq_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_degree_sequence_game(&c_graph, &c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_degree_sequence_game(&c_graph, &c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_method)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_out_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_in_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2112,6 +2173,7 @@ SEXP R_igraph_growing_random_game(SEXP n, SEXP m, SEXP directed, SEXP citation) SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -2122,13 +2184,13 @@ SEXP R_igraph_growing_random_game(SEXP n, SEXP m, SEXP directed, SEXP citation) IGRAPH_R_CHECK_BOOL(citation); c_citation = LOGICAL(citation)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_growing_random_game(&c_graph, c_n, c_m, c_directed, c_citation)); + IGRAPH_LOCAL_R_CHECK(igraph_growing_random_game(&c_graph, c_n, c_m, c_directed, c_citation)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2156,17 +2218,18 @@ SEXP R_igraph_barabasi_aging_game(SEXP nodes, SEXP m, SEXP outseq, SEXP outpref, SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; if (!Rf_isNull(outseq)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } IGRAPH_R_CHECK_BOOL(outpref); c_outpref = LOGICAL(outpref)[0]; @@ -2187,15 +2250,15 @@ SEXP R_igraph_barabasi_aging_game(SEXP nodes, SEXP m, SEXP outseq, SEXP outpref, IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_barabasi_aging_game(&c_graph, c_nodes, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_pa_exp, c_aging_exp, c_aging_bin, c_zero_deg_appeal, c_zero_age_appeal, c_deg_coef, c_age_coef, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_barabasi_aging_game(&c_graph, c_nodes, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_pa_exp, c_aging_exp, c_aging_bin, c_zero_deg_appeal, c_zero_age_appeal, c_deg_coef, c_age_coef, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_outseq); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2219,6 +2282,7 @@ SEXP R_igraph_recent_degree_game(SEXP n, SEXP power, SEXP window, SEXP m, SEXP o SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -2229,11 +2293,11 @@ SEXP R_igraph_recent_degree_game(SEXP n, SEXP power, SEXP window, SEXP m, SEXP o IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; if (!Rf_isNull(outseq)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } IGRAPH_R_CHECK_BOOL(outpref); c_outpref = LOGICAL(outpref)[0]; @@ -2242,15 +2306,15 @@ SEXP R_igraph_recent_degree_game(SEXP n, SEXP power, SEXP window, SEXP m, SEXP o IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_recent_degree_game(&c_graph, c_n, c_power, c_window, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_zero_appeal, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_recent_degree_game(&c_graph, c_n, c_power, c_window, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_zero_appeal, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_outseq); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2276,17 +2340,18 @@ SEXP R_igraph_recent_degree_aging_game(SEXP nodes, SEXP m, SEXP outseq, SEXP out SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; IGRAPH_R_CHECK_INT(m); c_m = (igraph_integer_t) REAL(m)[0]; if (!Rf_isNull(outseq)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(outseq, &c_outseq)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_outseq); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_outseq, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_outseq); } IGRAPH_R_CHECK_BOOL(outpref); c_outpref = LOGICAL(outpref)[0]; @@ -2303,15 +2368,15 @@ SEXP R_igraph_recent_degree_aging_game(SEXP nodes, SEXP m, SEXP outseq, SEXP out IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_recent_degree_aging_game(&c_graph, c_nodes, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_pa_exp, c_aging_exp, c_aging_bin, c_window, c_zero_appeal, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_recent_degree_aging_game(&c_graph, c_nodes, c_m, (Rf_isNull(outseq) ? 0 : &c_outseq), c_outpref, c_pa_exp, c_aging_exp, c_aging_bin, c_window, c_zero_appeal, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_outseq); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2335,6 +2400,7 @@ SEXP R_igraph_callaway_traits_game(SEXP nodes, SEXP types, SEXP edges_per_step, SEXP node_type_vec; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2346,21 +2412,21 @@ SEXP R_igraph_callaway_traits_game(SEXP nodes, SEXP types, SEXP edges_per_step, Rz_SEXP_to_matrix(pref_matrix, &c_pref_matrix); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); /* Call igraph */ - IGRAPH_R_CHECK(igraph_callaway_traits_game(&c_graph, c_nodes, c_types, c_edges_per_step, &c_type_dist, &c_pref_matrix, c_directed, &c_node_type_vec)); + IGRAPH_LOCAL_R_CHECK(igraph_callaway_traits_game(&c_graph, c_nodes, c_types, c_edges_per_step, &c_type_dist, &c_pref_matrix, c_directed, &c_node_type_vec)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(node_type_vec=Ry_igraph_vector_int_to_SEXP(&c_node_type_vec)); igraph_vector_int_destroy(&c_node_type_vec); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, node_type_vec); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -2389,6 +2455,7 @@ SEXP R_igraph_establishment_game(SEXP nodes, SEXP types, SEXP k, SEXP type_dist, SEXP node_type_vec; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2400,21 +2467,21 @@ SEXP R_igraph_establishment_game(SEXP nodes, SEXP types, SEXP k, SEXP type_dist, Rz_SEXP_to_matrix(pref_matrix, &c_pref_matrix); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); /* Call igraph */ - IGRAPH_R_CHECK(igraph_establishment_game(&c_graph, c_nodes, c_types, c_k, &c_type_dist, &c_pref_matrix, c_directed, &c_node_type_vec)); + IGRAPH_LOCAL_R_CHECK(igraph_establishment_game(&c_graph, c_nodes, c_types, c_k, &c_type_dist, &c_pref_matrix, c_directed, &c_node_type_vec)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(node_type_vec=Ry_igraph_vector_int_to_SEXP(&c_node_type_vec)); igraph_vector_int_destroy(&c_node_type_vec); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, node_type_vec); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -2442,6 +2509,7 @@ SEXP R_igraph_grg_game(SEXP nodes, SEXP radius, SEXP torus) { SEXP y; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2449,26 +2517,26 @@ SEXP R_igraph_grg_game(SEXP nodes, SEXP radius, SEXP torus) { c_radius = REAL(radius)[0]; IGRAPH_R_CHECK_BOOL(torus); c_torus = LOGICAL(torus)[0]; - IGRAPH_R_CHECK(igraph_vector_init(&c_x, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_x); - IGRAPH_R_CHECK(igraph_vector_init(&c_y, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_y); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_x, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_x); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_y, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_y); /* Call igraph */ - IGRAPH_R_CHECK(igraph_grg_game(&c_graph, c_nodes, c_radius, c_torus, &c_x, &c_y)); + IGRAPH_LOCAL_R_CHECK(igraph_grg_game(&c_graph, c_nodes, c_radius, c_torus, &c_x, &c_y)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(x=Ry_igraph_vector_to_SEXP(&c_x)); igraph_vector_destroy(&c_x); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(y=Ry_igraph_vector_to_SEXP(&c_y)); igraph_vector_destroy(&c_y); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, x); SET_VECTOR_ELT(r_result, 2, y); @@ -2500,6 +2568,7 @@ SEXP R_igraph_preference_game(SEXP nodes, SEXP types, SEXP type_dist, SEXP fixed SEXP node_type_vec; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2509,25 +2578,25 @@ SEXP R_igraph_preference_game(SEXP nodes, SEXP types, SEXP type_dist, SEXP fixed IGRAPH_R_CHECK_BOOL(fixed_sizes); c_fixed_sizes = LOGICAL(fixed_sizes)[0]; Rz_SEXP_to_matrix(pref_matrix, &c_pref_matrix); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_node_type_vec, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_node_type_vec); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_preference_game(&c_graph, c_nodes, c_types, &c_type_dist, c_fixed_sizes, &c_pref_matrix, &c_node_type_vec, c_directed, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_preference_game(&c_graph, c_nodes, c_types, &c_type_dist, c_fixed_sizes, &c_pref_matrix, &c_node_type_vec, c_directed, c_loops)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(node_type_vec=Ry_igraph_vector_int_to_SEXP(&c_node_type_vec)); igraph_vector_int_destroy(&c_node_type_vec); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, node_type_vec); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -2558,6 +2627,7 @@ SEXP R_igraph_asymmetric_preference_game(SEXP nodes, SEXP out_types, SEXP in_typ SEXP node_type_in_vec; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2567,28 +2637,28 @@ SEXP R_igraph_asymmetric_preference_game(SEXP nodes, SEXP out_types, SEXP in_typ c_in_types = (igraph_integer_t) REAL(in_types)[0]; Rz_SEXP_to_matrix(type_dist_matrix, &c_type_dist_matrix); Rz_SEXP_to_matrix(pref_matrix, &c_pref_matrix); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_node_type_out_vec, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_node_type_out_vec); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_node_type_in_vec, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_node_type_in_vec); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_node_type_out_vec, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_node_type_out_vec); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_node_type_in_vec, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_node_type_in_vec); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_asymmetric_preference_game(&c_graph, c_nodes, c_out_types, c_in_types, &c_type_dist_matrix, &c_pref_matrix, &c_node_type_out_vec, &c_node_type_in_vec, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_asymmetric_preference_game(&c_graph, c_nodes, c_out_types, c_in_types, &c_type_dist_matrix, &c_pref_matrix, &c_node_type_out_vec, &c_node_type_in_vec, c_loops)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(node_type_out_vec=Ry_igraph_vector_int_to_SEXP(&c_node_type_out_vec)); igraph_vector_int_destroy(&c_node_type_out_vec); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(node_type_in_vec=Ry_igraph_vector_int_to_SEXP(&c_node_type_in_vec)); igraph_vector_int_destroy(&c_node_type_in_vec); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, node_type_out_vec); SET_VECTOR_ELT(r_result, 2, node_type_in_vec); @@ -2613,9 +2683,10 @@ SEXP R_igraph_rewire_edges(SEXP graph, SEXP prob, SEXP loops, SEXP multiple) { igraph_bool_t c_multiple; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_REAL(prob); c_prob = REAL(prob)[0]; IGRAPH_R_CHECK_BOOL(loops); @@ -2623,12 +2694,12 @@ SEXP R_igraph_rewire_edges(SEXP graph, SEXP prob, SEXP loops, SEXP multiple) { IGRAPH_R_CHECK_BOOL(multiple); c_multiple = LOGICAL(multiple)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_rewire_edges(&c_graph, c_prob, c_loops, c_multiple)); + IGRAPH_LOCAL_R_CHECK(igraph_rewire_edges(&c_graph, c_prob, c_loops, c_multiple)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2646,21 +2717,22 @@ SEXP R_igraph_rewire_directed_edges(SEXP graph, SEXP prob, SEXP loops, SEXP mode igraph_neimode_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_REAL(prob); c_prob = REAL(prob)[0]; IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_rewire_directed_edges(&c_graph, c_prob, c_loops, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_rewire_directed_edges(&c_graph, c_prob, c_loops, c_mode)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2682,6 +2754,7 @@ SEXP R_igraph_watts_strogatz_game(SEXP dim, SEXP size, SEXP nei, SEXP p, SEXP lo SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(dim); c_dim = (igraph_integer_t) REAL(dim)[0]; @@ -2696,13 +2769,13 @@ SEXP R_igraph_watts_strogatz_game(SEXP dim, SEXP size, SEXP nei, SEXP p, SEXP lo IGRAPH_R_CHECK_BOOL(multiple); c_multiple = LOGICAL(multiple)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_watts_strogatz_game(&c_graph, c_dim, c_size, c_nei, c_p, c_loops, c_multiple)); + IGRAPH_LOCAL_R_CHECK(igraph_watts_strogatz_game(&c_graph, c_dim, c_size, c_nei, c_p, c_loops, c_multiple)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2723,6 +2796,7 @@ SEXP R_igraph_lastcit_game(SEXP nodes, SEXP edges_per_node, SEXP agebins, SEXP p SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2734,13 +2808,13 @@ SEXP R_igraph_lastcit_game(SEXP nodes, SEXP edges_per_node, SEXP agebins, SEXP p IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_lastcit_game(&c_graph, c_nodes, c_edges_per_node, c_agebins, &c_preference, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_lastcit_game(&c_graph, c_nodes, c_edges_per_node, c_agebins, &c_preference, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2761,26 +2835,27 @@ SEXP R_igraph_cited_type_game(SEXP nodes, SEXP types, SEXP pref, SEXP edges_per_ SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; Rz_SEXP_to_vector_int_copy(types, &c_types); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); Rz_SEXP_to_vector(pref, &c_pref); IGRAPH_R_CHECK_INT(edges_per_step); c_edges_per_step = (igraph_integer_t) REAL(edges_per_step)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_cited_type_game(&c_graph, c_nodes, &c_types, &c_pref, c_edges_per_step, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_cited_type_game(&c_graph, c_nodes, &c_types, &c_pref, c_edges_per_step, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2801,26 +2876,27 @@ SEXP R_igraph_citing_cited_type_game(SEXP nodes, SEXP types, SEXP pref, SEXP edg SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; Rz_SEXP_to_vector_int_copy(types, &c_types); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); Rz_SEXP_to_matrix(pref, &c_pref); IGRAPH_R_CHECK_INT(edges_per_step); c_edges_per_step = (igraph_integer_t) REAL(edges_per_step)[0]; IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_citing_cited_type_game(&c_graph, c_nodes, &c_types, &c_pref, c_edges_per_step, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_citing_cited_type_game(&c_graph, c_nodes, &c_types, &c_pref, c_edges_per_step, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2841,6 +2917,7 @@ SEXP R_igraph_forest_fire_game(SEXP nodes, SEXP fw_prob, SEXP bw_factor, SEXP am SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; @@ -2853,13 +2930,13 @@ SEXP R_igraph_forest_fire_game(SEXP nodes, SEXP fw_prob, SEXP bw_factor, SEXP am IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_forest_fire_game(&c_graph, c_nodes, c_fw_prob, c_bw_factor, c_ambs, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_forest_fire_game(&c_graph, c_nodes, c_fw_prob, c_bw_factor, c_ambs, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2879,6 +2956,7 @@ SEXP R_igraph_simple_interconnected_islands_game(SEXP islands_n, SEXP islands_si SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(islands_n); c_islands_n = (igraph_integer_t) REAL(islands_n)[0]; @@ -2889,13 +2967,13 @@ SEXP R_igraph_simple_interconnected_islands_game(SEXP islands_n, SEXP islands_si IGRAPH_R_CHECK_INT(n_inter); c_n_inter = (igraph_integer_t) REAL(n_inter)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_simple_interconnected_islands_game(&c_graph, c_islands_n, c_islands_size, c_islands_pin, c_n_inter)); + IGRAPH_LOCAL_R_CHECK(igraph_simple_interconnected_islands_game(&c_graph, c_islands_n, c_islands_size, c_islands_pin, c_n_inter)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2915,6 +2993,7 @@ SEXP R_igraph_chung_lu_game(SEXP out_weights, SEXP in_weights, SEXP loops, SEXP SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector(out_weights, &c_out_weights); if (!Rf_isNull(in_weights)) { @@ -2924,13 +3003,13 @@ SEXP R_igraph_chung_lu_game(SEXP out_weights, SEXP in_weights, SEXP loops, SEXP c_loops = LOGICAL(loops)[0]; c_variant = (igraph_chung_lu_t) Rf_asInteger(variant); /* Call igraph */ - IGRAPH_R_CHECK(igraph_chung_lu_game(&c_graph, &c_out_weights, (Rf_isNull(in_weights) ? 0 : &c_in_weights), c_loops, c_variant)); + IGRAPH_LOCAL_R_CHECK(igraph_chung_lu_game(&c_graph, &c_out_weights, (Rf_isNull(in_weights) ? 0 : &c_in_weights), c_loops, c_variant)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2951,6 +3030,7 @@ SEXP R_igraph_static_fitness_game(SEXP no_of_edges, SEXP fitness_out, SEXP fitne SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(no_of_edges); c_no_of_edges = (igraph_integer_t) REAL(no_of_edges)[0]; @@ -2963,13 +3043,13 @@ SEXP R_igraph_static_fitness_game(SEXP no_of_edges, SEXP fitness_out, SEXP fitne IGRAPH_R_CHECK_BOOL(multiple); c_multiple = LOGICAL(multiple)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_static_fitness_game(&c_graph, c_no_of_edges, &c_fitness_out, (Rf_isNull(fitness_in) ? 0 : &c_fitness_in), c_loops, c_multiple)); + IGRAPH_LOCAL_R_CHECK(igraph_static_fitness_game(&c_graph, c_no_of_edges, &c_fitness_out, (Rf_isNull(fitness_in) ? 0 : &c_fitness_in), c_loops, c_multiple)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -2992,6 +3072,7 @@ SEXP R_igraph_static_power_law_game(SEXP no_of_nodes, SEXP no_of_edges, SEXP exp SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(no_of_nodes); c_no_of_nodes = (igraph_integer_t) REAL(no_of_nodes)[0]; @@ -3008,13 +3089,13 @@ SEXP R_igraph_static_power_law_game(SEXP no_of_nodes, SEXP no_of_edges, SEXP exp IGRAPH_R_CHECK_BOOL(finite_size_correction); c_finite_size_correction = LOGICAL(finite_size_correction)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_static_power_law_game(&c_graph, c_no_of_nodes, c_no_of_edges, c_exponent_out, c_exponent_in, c_loops, c_multiple, c_finite_size_correction)); + IGRAPH_LOCAL_R_CHECK(igraph_static_power_law_game(&c_graph, c_no_of_nodes, c_no_of_edges, c_exponent_out, c_exponent_in, c_loops, c_multiple, c_finite_size_correction)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3034,6 +3115,7 @@ SEXP R_igraph_k_regular_game(SEXP no_of_nodes, SEXP k, SEXP directed, SEXP multi SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(no_of_nodes); c_no_of_nodes = (igraph_integer_t) REAL(no_of_nodes)[0]; @@ -3044,13 +3126,13 @@ SEXP R_igraph_k_regular_game(SEXP no_of_nodes, SEXP k, SEXP directed, SEXP multi IGRAPH_R_CHECK_BOOL(multiple); c_multiple = LOGICAL(multiple)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_k_regular_game(&c_graph, c_no_of_nodes, c_k, c_directed, c_multiple)); + IGRAPH_LOCAL_R_CHECK(igraph_k_regular_game(&c_graph, c_no_of_nodes, c_k, c_directed, c_multiple)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3071,26 +3153,27 @@ SEXP R_igraph_sbm_game(SEXP n, SEXP pref_matrix, SEXP block_sizes, SEXP directed SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; Rz_SEXP_to_matrix(pref_matrix, &c_pref_matrix); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(block_sizes, &c_block_sizes)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_block_sizes); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(block_sizes, &c_block_sizes)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_block_sizes); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_sbm_game(&c_graph, c_n, &c_pref_matrix, &c_block_sizes, c_directed, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_sbm_game(&c_graph, c_n, &c_pref_matrix, &c_block_sizes, c_directed, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_block_sizes); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3111,6 +3194,7 @@ SEXP R_igraph_hsbm_game(SEXP n, SEXP m, SEXP rho, SEXP C, SEXP p) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -3121,13 +3205,13 @@ SEXP R_igraph_hsbm_game(SEXP n, SEXP m, SEXP rho, SEXP C, SEXP p) { IGRAPH_R_CHECK_REAL(p); c_p = REAL(p)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hsbm_game(&c_graph, c_n, c_m, &c_rho, &c_C, c_p)); + IGRAPH_LOCAL_R_CHECK(igraph_hsbm_game(&c_graph, c_n, c_m, &c_rho, &c_C, c_p)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3148,25 +3232,26 @@ SEXP R_igraph_hsbm_list_game(SEXP n, SEXP mlist, SEXP rholist, SEXP Clist, SEXP SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(mlist, &c_mlist)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_mlist); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(mlist, &c_mlist)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_mlist); Ry_igraph_SEXP_to_vector_list(rholist, &c_rholist); Ry_igraph_SEXP_to_matrixlist(Clist, &c_Clist); IGRAPH_R_CHECK_REAL(p); c_p = REAL(p)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hsbm_list_game(&c_graph, c_n, &c_mlist, &c_rholist, &c_Clist, c_p)); + IGRAPH_LOCAL_R_CHECK(igraph_hsbm_list_game(&c_graph, c_n, &c_mlist, &c_rholist, &c_Clist, c_p)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_mlist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3186,6 +3271,7 @@ SEXP R_igraph_correlated_game(SEXP old_graph, SEXP corr, SEXP p, SEXP permutatio SEXP new_graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(old_graph, &c_old_graph); IGRAPH_R_CHECK_REAL(corr); @@ -3194,21 +3280,21 @@ SEXP R_igraph_correlated_game(SEXP old_graph, SEXP corr, SEXP p, SEXP permutatio c_p = REAL(p)[0]; if (!Rf_isNull(permutation)) { Rz_SEXP_to_vector_int_copy(permutation, &c_permutation); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_permutation); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_permutation); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_permutation, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_permutation); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_permutation, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_permutation); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_correlated_game(&c_old_graph, &c_new_graph, c_corr, c_p, (Rf_isNull(permutation) ? 0 : &c_permutation))); + IGRAPH_LOCAL_R_CHECK(igraph_correlated_game(&c_old_graph, &c_new_graph, c_corr, c_p, (Rf_isNull(permutation) ? 0 : &c_permutation))); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_new_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_new_graph); PROTECT(new_graph=Ry_igraph_to_SEXP(&c_new_graph)); IGRAPH_I_DESTROY(&c_new_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_permutation); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = new_graph; UNPROTECT(1); @@ -3231,6 +3317,7 @@ SEXP R_igraph_correlated_pair_game(SEXP n, SEXP corr, SEXP p, SEXP directed, SEX SEXP graph2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -3242,27 +3329,27 @@ SEXP R_igraph_correlated_pair_game(SEXP n, SEXP corr, SEXP p, SEXP directed, SEX c_directed = LOGICAL(directed)[0]; if (!Rf_isNull(permutation)) { Rz_SEXP_to_vector_int_copy(permutation, &c_permutation); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_permutation); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_permutation); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_permutation, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_permutation); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_permutation, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_permutation); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_correlated_pair_game(&c_graph1, &c_graph2, c_n, c_corr, c_p, c_directed, (Rf_isNull(permutation) ? 0 : &c_permutation))); + IGRAPH_LOCAL_R_CHECK(igraph_correlated_pair_game(&c_graph1, &c_graph2, c_n, c_corr, c_p, c_directed, (Rf_isNull(permutation) ? 0 : &c_permutation))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph1); PROTECT(graph1=Ry_igraph_to_SEXP(&c_graph1)); IGRAPH_I_DESTROY(&c_graph1); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_graph2); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph2); PROTECT(graph2=Ry_igraph_to_SEXP(&c_graph2)); IGRAPH_I_DESTROY(&c_graph2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_permutation); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph1); SET_VECTOR_ELT(r_result, 1, graph2); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph1")); @@ -3285,18 +3372,19 @@ SEXP R_igraph_dot_product_game(SEXP vecs, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(vecs, &c_vecs); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_dot_product_game(&c_graph, &c_vecs, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_dot_product_game(&c_graph, &c_vecs, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -3316,6 +3404,7 @@ SEXP R_igraph_sample_sphere_surface(SEXP dim, SEXP n, SEXP radius, SEXP positive SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(dim); c_dim = (igraph_integer_t) REAL(dim)[0]; @@ -3325,15 +3414,15 @@ SEXP R_igraph_sample_sphere_surface(SEXP dim, SEXP n, SEXP radius, SEXP positive c_radius = REAL(radius)[0]; IGRAPH_R_CHECK_BOOL(positive); c_positive = LOGICAL(positive)[0]; - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sample_sphere_surface(c_dim, c_n, c_radius, c_positive, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_sample_sphere_surface(c_dim, c_n, c_radius, c_positive, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -3353,6 +3442,7 @@ SEXP R_igraph_sample_sphere_volume(SEXP dim, SEXP n, SEXP radius, SEXP positive) SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(dim); c_dim = (igraph_integer_t) REAL(dim)[0]; @@ -3362,15 +3452,15 @@ SEXP R_igraph_sample_sphere_volume(SEXP dim, SEXP n, SEXP radius, SEXP positive) c_radius = REAL(radius)[0]; IGRAPH_R_CHECK_BOOL(positive); c_positive = LOGICAL(positive)[0]; - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sample_sphere_volume(c_dim, c_n, c_radius, c_positive, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_sample_sphere_volume(c_dim, c_n, c_radius, c_positive, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -3388,19 +3478,20 @@ SEXP R_igraph_sample_dirichlet(SEXP n, SEXP alpha) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; Rz_SEXP_to_vector(alpha, &c_alpha); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sample_dirichlet(c_n, &c_alpha, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_sample_dirichlet(c_n, &c_alpha, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -3419,12 +3510,13 @@ SEXP R_igraph_are_adjacent(SEXP graph, SEXP v1, SEXP v2) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_v1 = (igraph_integer_t) REAL(v1)[0]; c_v2 = (igraph_integer_t) REAL(v2)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_are_adjacent(&c_graph, c_v1, c_v2, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_are_adjacent(&c_graph, c_v1, c_v2, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -3447,12 +3539,13 @@ SEXP R_igraph_are_connected(SEXP graph, SEXP v1, SEXP v2) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_v1 = (igraph_integer_t) REAL(v1)[0]; c_v2 = (igraph_integer_t) REAL(v2)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_are_connected(&c_graph, c_v1, c_v2, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_are_connected(&c_graph, c_v1, c_v2, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -3483,20 +3576,21 @@ SEXP R_igraph_diameter(SEXP graph, SEXP directed, SEXP unconnected) { SEXP edge_path; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_from=0; c_to=0; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_path); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_path, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_path); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_path); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_path, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_path); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(unconnected); c_unconnected = LOGICAL(unconnected)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_diameter(&c_graph, &c_res, &c_from, &c_to, &c_vertex_path, &c_edge_path, c_directed, c_unconnected)); + IGRAPH_LOCAL_R_CHECK(igraph_diameter(&c_graph, &c_res, &c_from, &c_to, &c_vertex_path, &c_edge_path, c_directed, c_unconnected)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); @@ -3509,10 +3603,10 @@ SEXP R_igraph_diameter(SEXP graph, SEXP directed, SEXP unconnected) { REAL(to)[0]=(double) c_to; PROTECT(vertex_path=Ry_igraph_vector_int_to_SEXP(&c_vertex_path)); igraph_vector_int_destroy(&c_vertex_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_path=Ry_igraph_vector_int_to_SEXP(&c_edge_path)); igraph_vector_int_destroy(&c_edge_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, from); SET_VECTOR_ELT(r_result, 2, to); @@ -3551,6 +3645,7 @@ SEXP R_igraph_diameter_dijkstra(SEXP graph, SEXP weights, SEXP directed, SEXP un SEXP edge_path; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -3558,16 +3653,16 @@ SEXP R_igraph_diameter_dijkstra(SEXP graph, SEXP weights, SEXP directed, SEXP un } c_from=0; c_to=0; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_path); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_path, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_path); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_path); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_path, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_path); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(unconnected); c_unconnected = LOGICAL(unconnected)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_diameter_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, &c_from, &c_to, &c_vertex_path, &c_edge_path, c_directed, c_unconnected)); + IGRAPH_LOCAL_R_CHECK(igraph_diameter_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, &c_from, &c_to, &c_vertex_path, &c_edge_path, c_directed, c_unconnected)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); @@ -3580,10 +3675,10 @@ SEXP R_igraph_diameter_dijkstra(SEXP graph, SEXP weights, SEXP directed, SEXP un REAL(to)[0]=(double) c_to; PROTECT(vertex_path=Ry_igraph_vector_int_to_SEXP(&c_vertex_path)); igraph_vector_int_destroy(&c_vertex_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_path=Ry_igraph_vector_int_to_SEXP(&c_edge_path)); igraph_vector_int_destroy(&c_edge_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, from); SET_VECTOR_ELT(r_result, 2, to); @@ -3619,12 +3714,13 @@ SEXP R_igraph_closeness(SEXP graph, SEXP vids, SEXP mode, SEXP weights, SEXP nor SEXP all_reachable; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_reachable_count, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_reachable_count); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_reachable_count, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_reachable_count); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -3634,17 +3730,17 @@ SEXP R_igraph_closeness(SEXP graph, SEXP vids, SEXP mode, SEXP weights, SEXP nor IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_closeness(&c_graph, &c_res, &c_reachable_count, &c_all_reachable, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_closeness(&c_graph, &c_res, &c_reachable_count, &c_all_reachable, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(reachable_count=Ry_igraph_vector_int_to_SEXP(&c_reachable_count)); igraph_vector_int_destroy(&c_reachable_count); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(all_reachable=NEW_LOGICAL(1)); LOGICAL(all_reachable)[0]=c_all_reachable; igraph_vector_int_destroy(&c_vids_data); @@ -3681,12 +3777,13 @@ SEXP R_igraph_closeness_cutoff(SEXP graph, SEXP vids, SEXP mode, SEXP weights, S SEXP all_reachable; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_reachable_count, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_reachable_count); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_reachable_count, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_reachable_count); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -3698,17 +3795,17 @@ SEXP R_igraph_closeness_cutoff(SEXP graph, SEXP vids, SEXP mode, SEXP weights, S IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_closeness_cutoff(&c_graph, &c_res, &c_reachable_count, &c_all_reachable, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized, c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_closeness_cutoff(&c_graph, &c_res, &c_reachable_count, &c_all_reachable, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized, c_cutoff)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(reachable_count=Ry_igraph_vector_int_to_SEXP(&c_reachable_count)); igraph_vector_int_destroy(&c_reachable_count); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(all_reachable=NEW_LOGICAL(1)); LOGICAL(all_reachable)[0]=c_all_reachable; igraph_vector_int_destroy(&c_vids_data); @@ -3739,22 +3836,23 @@ SEXP R_igraph_distances(SEXP graph, SEXP from, SEXP to, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances(&c_graph, &c_res, c_from, c_to, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_distances(&c_graph, &c_res, c_from, c_to, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -3779,10 +3877,11 @@ SEXP R_igraph_distances_cutoff(SEXP graph, SEXP from, SEXP to, SEXP mode, SEXP c SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -3791,12 +3890,12 @@ SEXP R_igraph_distances_cutoff(SEXP graph, SEXP from, SEXP to, SEXP mode, SEXP c IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_cutoff(&c_graph, &c_res, c_from, c_to, c_mode, c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_distances_cutoff(&c_graph, &c_res, c_from, c_to, c_mode, c_cutoff)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -3822,27 +3921,28 @@ SEXP R_igraph_get_shortest_path(SEXP graph, SEXP from, SEXP to, SEXP mode) { SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_path(&c_graph, &c_vertices, &c_edges, c_from, c_to, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_path(&c_graph, &c_vertices, &c_edges, c_from, c_to, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -3870,12 +3970,13 @@ SEXP R_igraph_get_shortest_path_bellman_ford(SEXP graph, SEXP from, SEXP to, SEX SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; if (!Rf_isNull(weights)) { @@ -3883,17 +3984,17 @@ SEXP R_igraph_get_shortest_path_bellman_ford(SEXP graph, SEXP from, SEXP to, SEX } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_path_bellman_ford(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_path_bellman_ford(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -3921,12 +4022,13 @@ SEXP R_igraph_get_shortest_path_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP we SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; if (!Rf_isNull(weights)) { @@ -3934,17 +4036,17 @@ SEXP R_igraph_get_shortest_path_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP we } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_path_dijkstra(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_path_dijkstra(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -3974,12 +4076,13 @@ SEXP R_igraph_get_shortest_path_astar(SEXP graph, SEXP from, SEXP to, SEXP weigh SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; if (!Rf_isNull(weights)) { @@ -3987,17 +4090,17 @@ SEXP R_igraph_get_shortest_path_astar(SEXP graph, SEXP from, SEXP to, SEXP weigh } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_path_astar(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_path_astar(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, 0, 0)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -4028,40 +4131,41 @@ SEXP R_igraph_get_shortest_paths(SEXP graph, SEXP from, SEXP to, SEXP mode) { SEXP inbound_edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_paths(&c_graph, &c_vertices, &c_edges, c_from, c_to, c_mode, &c_parents, &c_inbound_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_paths(&c_graph, &c_vertices, &c_edges, c_from, c_to, c_mode, &c_parents, &c_inbound_edges)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(inbound_edges=Ry_igraph_vector_int_to_SEXP(&c_inbound_edges)); igraph_vector_int_destroy(&c_inbound_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_VECTOR_ELT(r_result, 2, parents); @@ -4094,33 +4198,34 @@ SEXP R_igraph_get_all_shortest_paths(SEXP graph, SEXP from, SEXP to, SEXP mode) SEXP nrgeo; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_nrgeo, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_nrgeo); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_nrgeo, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_nrgeo); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_all_shortest_paths(&c_graph, &c_vertices, &c_edges, &c_nrgeo, c_from, c_to, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_all_shortest_paths(&c_graph, &c_vertices, &c_edges, &c_nrgeo, c_from, c_to, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(nrgeo=Ry_igraph_vector_int_to_SEXP(&c_nrgeo)); igraph_vector_int_destroy(&c_nrgeo); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); SET_VECTOR_ELT(r_result, 0, vertices); @@ -4150,10 +4255,11 @@ SEXP R_igraph_distances_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP weights, S SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4163,12 +4269,12 @@ SEXP R_igraph_distances_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP weights, S } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_dijkstra(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_distances_dijkstra(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4194,10 +4300,11 @@ SEXP R_igraph_distances_dijkstra_cutoff(SEXP graph, SEXP from, SEXP to, SEXP wei SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4209,12 +4316,12 @@ SEXP R_igraph_distances_dijkstra_cutoff(SEXP graph, SEXP from, SEXP to, SEXP wei IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_dijkstra_cutoff(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_distances_dijkstra_cutoff(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_cutoff)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4245,12 +4352,13 @@ SEXP R_igraph_get_shortest_paths_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP w SEXP inbound_edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); @@ -4258,30 +4366,30 @@ SEXP R_igraph_get_shortest_paths_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP w Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_paths_dijkstra(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, &c_parents, &c_inbound_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_paths_dijkstra(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, &c_parents, &c_inbound_edges)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(inbound_edges=Ry_igraph_vector_int_to_SEXP(&c_inbound_edges)); igraph_vector_int_destroy(&c_inbound_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_VECTOR_ELT(r_result, 2, parents); @@ -4317,12 +4425,13 @@ SEXP R_igraph_get_shortest_paths_bellman_ford(SEXP graph, SEXP from, SEXP to, SE SEXP inbound_edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); @@ -4330,30 +4439,30 @@ SEXP R_igraph_get_shortest_paths_bellman_ford(SEXP graph, SEXP from, SEXP to, SE Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_shortest_paths_bellman_ford(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, &c_parents, &c_inbound_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_get_shortest_paths_bellman_ford(&c_graph, &c_vertices, &c_edges, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, &c_parents, &c_inbound_edges)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(inbound_edges=Ry_igraph_vector_int_to_SEXP(&c_inbound_edges)); igraph_vector_int_destroy(&c_inbound_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_VECTOR_ELT(r_result, 2, parents); @@ -4387,14 +4496,15 @@ SEXP R_igraph_get_all_shortest_paths_dijkstra(SEXP graph, SEXP from, SEXP to, SE SEXP nrgeo; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_nrgeo, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_nrgeo); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_nrgeo, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_nrgeo); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); @@ -4403,20 +4513,20 @@ SEXP R_igraph_get_all_shortest_paths_dijkstra(SEXP graph, SEXP from, SEXP to, SE } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_all_shortest_paths_dijkstra(&c_graph, &c_vertices, &c_edges, &c_nrgeo, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_all_shortest_paths_dijkstra(&c_graph, &c_vertices, &c_edges, &c_nrgeo, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(nrgeo=Ry_igraph_vector_int_to_SEXP(&c_nrgeo)); igraph_vector_int_destroy(&c_nrgeo); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); SET_VECTOR_ELT(r_result, 0, vertices); @@ -4446,10 +4556,11 @@ SEXP R_igraph_distances_bellman_ford(SEXP graph, SEXP from, SEXP to, SEXP weight SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4459,12 +4570,12 @@ SEXP R_igraph_distances_bellman_ford(SEXP graph, SEXP from, SEXP to, SEXP weight } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_bellman_ford(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_distances_bellman_ford(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4488,10 +4599,11 @@ SEXP R_igraph_distances_johnson(SEXP graph, SEXP from, SEXP to, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4500,12 +4612,12 @@ SEXP R_igraph_distances_johnson(SEXP graph, SEXP from, SEXP to, SEXP weights) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_johnson(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_distances_johnson(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4531,10 +4643,11 @@ SEXP R_igraph_distances_floyd_warshall(SEXP graph, SEXP from, SEXP to, SEXP weig SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4545,12 +4658,12 @@ SEXP R_igraph_distances_floyd_warshall(SEXP graph, SEXP from, SEXP to, SEXP weig c_mode = (igraph_neimode_t) Rf_asInteger(mode); c_method = (igraph_floyd_warshall_algorithm_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_distances_floyd_warshall(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_distances_floyd_warshall(&c_graph, &c_res, c_from, c_to, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_method)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4577,33 +4690,34 @@ SEXP R_igraph_voronoi(SEXP graph, SEXP generators, SEXP weights, SEXP mode, SEXP SEXP distances; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_init(&c_distances, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_distances); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_distances, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_distances); Rz_SEXP_to_vector_int_copy(generators, &c_generators); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_generators); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_generators); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); c_tiebreaker = (igraph_voronoi_tiebreaker_t) Rf_asInteger(tiebreaker); /* Call igraph */ - IGRAPH_R_CHECK(igraph_voronoi(&c_graph, &c_membership, &c_distances, &c_generators, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_tiebreaker)); + IGRAPH_LOCAL_R_CHECK(igraph_voronoi(&c_graph, &c_membership, &c_distances, &c_generators, (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_tiebreaker)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(distances=Ry_igraph_vector_to_SEXP(&c_distances)); igraph_vector_destroy(&c_distances); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_generators); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, membership); SET_VECTOR_ELT(r_result, 1, distances); SET_STRING_ELT(r_names, 0, Rf_mkChar("membership")); @@ -4629,10 +4743,11 @@ SEXP R_igraph_get_all_simple_paths(SEXP graph, SEXP from, SEXP to, SEXP cutoff, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); @@ -4640,12 +4755,12 @@ SEXP R_igraph_get_all_simple_paths(SEXP graph, SEXP from, SEXP to, SEXP cutoff, c_cutoff = (igraph_integer_t) REAL(cutoff)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_all_simple_paths(&c_graph, &c_res, c_from, c_to, c_cutoff, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_all_simple_paths(&c_graph, &c_res, c_from, c_to, c_cutoff, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); r_result = res; @@ -4671,32 +4786,33 @@ SEXP R_igraph_get_k_shortest_paths(SEXP graph, SEXP weights, SEXP k, SEXP from, SEXP edge_paths; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertex_paths, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertex_paths); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edge_paths, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edge_paths); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertex_paths, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertex_paths); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edge_paths, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edge_paths); IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_k_shortest_paths(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_vertex_paths, &c_edge_paths, c_k, c_from, c_to, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_k_shortest_paths(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_vertex_paths, &c_edge_paths, c_k, c_from, c_to, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertex_paths=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertex_paths)); igraph_vector_int_list_destroy(&c_vertex_paths); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_paths=Ry_igraph_vector_int_list_to_SEXPp1(&c_edge_paths)); igraph_vector_int_list_destroy(&c_edge_paths); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertex_paths); SET_VECTOR_ELT(r_result, 1, edge_paths); SET_STRING_ELT(r_names, 0, Rf_mkChar("vpaths")); @@ -4724,28 +4840,29 @@ SEXP R_igraph_get_widest_path(SEXP graph, SEXP from, SEXP to, SEXP weights, SEXP SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; c_to = (igraph_integer_t) REAL(to)[0]; Rz_SEXP_to_vector(weights, &c_weights); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_widest_path(&c_graph, &c_vertices, &c_edges, c_from, c_to, &c_weights, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_get_widest_path(&c_graph, &c_vertices, &c_edges, c_from, c_to, &c_weights, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -4777,41 +4894,42 @@ SEXP R_igraph_get_widest_paths(SEXP graph, SEXP from, SEXP to, SEXP weights, SEX SEXP inbound_edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); c_from = (igraph_integer_t) REAL(from)[0]; igraph_vector_int_t c_to_data; Rz_SEXP_to_igraph_vs(to, &c_graph, &c_to, &c_to_data); Rz_SEXP_to_vector(weights, &c_weights); c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_inbound_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_inbound_edges); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_widest_paths(&c_graph, &c_vertices, &c_edges, c_from, c_to, &c_weights, c_mode, &c_parents, &c_inbound_edges)); + IGRAPH_LOCAL_R_CHECK(igraph_get_widest_paths(&c_graph, &c_vertices, &c_edges, c_from, c_to, &c_weights, c_mode, &c_parents, &c_inbound_edges)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_data); igraph_vs_destroy(&c_to); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(inbound_edges=Ry_igraph_vector_int_to_SEXP(&c_inbound_edges)); igraph_vector_int_destroy(&c_inbound_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_VECTOR_ELT(r_result, 2, parents); @@ -4841,10 +4959,11 @@ SEXP R_igraph_widest_path_widths_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP w SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4852,12 +4971,12 @@ SEXP R_igraph_widest_path_widths_dijkstra(SEXP graph, SEXP from, SEXP to, SEXP w Rz_SEXP_to_vector(weights, &c_weights); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_widest_path_widths_dijkstra(&c_graph, &c_res, c_from, c_to, &c_weights, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_widest_path_widths_dijkstra(&c_graph, &c_res, c_from, c_to, &c_weights, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4882,10 +5001,11 @@ SEXP R_igraph_widest_path_widths_floyd_warshall(SEXP graph, SEXP from, SEXP to, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_from_data; Rz_SEXP_to_igraph_vs(from, &c_graph, &c_from, &c_from_data); igraph_vector_int_t c_to_data; @@ -4893,12 +5013,12 @@ SEXP R_igraph_widest_path_widths_floyd_warshall(SEXP graph, SEXP from, SEXP to, Rz_SEXP_to_vector(weights, &c_weights); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_widest_path_widths_floyd_warshall(&c_graph, &c_res, c_from, c_to, &c_weights, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_widest_path_widths_floyd_warshall(&c_graph, &c_res, c_from, c_to, &c_weights, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_data); igraph_vs_destroy(&c_from); igraph_vector_int_destroy(&c_to_data); @@ -4921,22 +5041,23 @@ SEXP R_igraph_spanner(SEXP graph, SEXP stretch, SEXP weights) { SEXP spanner; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_spanner, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_spanner); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_spanner, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_spanner); IGRAPH_R_CHECK_REAL(stretch); c_stretch = REAL(stretch)[0]; if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_spanner(&c_graph, &c_spanner, c_stretch, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_spanner(&c_graph, &c_spanner, c_stretch, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(spanner=Ry_igraph_vector_int_to_SEXPp1(&c_spanner)); igraph_vector_int_destroy(&c_spanner); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = spanner; UNPROTECT(1); @@ -4955,19 +5076,20 @@ SEXP R_igraph_subcomponent(SEXP graph, SEXP vid, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); c_vid = (igraph_integer_t) REAL(vid)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_subcomponent(&c_graph, &c_res, c_vid, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_subcomponent(&c_graph, &c_res, c_vid, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -4987,10 +5109,11 @@ SEXP R_igraph_betweenness(SEXP graph, SEXP vids, SEXP directed, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -4999,12 +5122,12 @@ SEXP R_igraph_betweenness(SEXP graph, SEXP vids, SEXP directed, SEXP weights) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_betweenness(&c_graph, &c_res, c_vids, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_betweenness(&c_graph, &c_res, c_vids, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5027,10 +5150,11 @@ SEXP R_igraph_betweenness_cutoff(SEXP graph, SEXP vids, SEXP directed, SEXP weig SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -5041,12 +5165,12 @@ SEXP R_igraph_betweenness_cutoff(SEXP graph, SEXP vids, SEXP directed, SEXP weig IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_betweenness_cutoff(&c_graph, &c_res, c_vids, c_directed, (Rf_isNull(weights) ? 0 : &c_weights), c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_betweenness_cutoff(&c_graph, &c_res, c_vids, c_directed, (Rf_isNull(weights) ? 0 : &c_weights), c_cutoff)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5070,10 +5194,11 @@ SEXP R_igraph_betweenness_subset(SEXP graph, SEXP vids, SEXP directed, SEXP sour SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -5086,12 +5211,12 @@ SEXP R_igraph_betweenness_subset(SEXP graph, SEXP vids, SEXP directed, SEXP sour Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_betweenness_subset(&c_graph, &c_res, c_vids, c_directed, c_sources, c_targets, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_betweenness_subset(&c_graph, &c_res, c_vids, c_directed, c_sources, c_targets, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); igraph_vector_int_destroy(&c_sources_data); @@ -5116,22 +5241,23 @@ SEXP R_igraph_edge_betweenness(SEXP graph, SEXP directed, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge_betweenness(&c_graph, &c_res, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_edge_betweenness(&c_graph, &c_res, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -5151,10 +5277,11 @@ SEXP R_igraph_edge_betweenness_cutoff(SEXP graph, SEXP directed, SEXP weights, S SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; if (!Rf_isNull(weights)) { @@ -5163,12 +5290,12 @@ SEXP R_igraph_edge_betweenness_cutoff(SEXP graph, SEXP directed, SEXP weights, S IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge_betweenness_cutoff(&c_graph, &c_res, c_directed, (Rf_isNull(weights) ? 0 : &c_weights), c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_edge_betweenness_cutoff(&c_graph, &c_res, c_directed, (Rf_isNull(weights) ? 0 : &c_weights), c_cutoff)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -5190,12 +5317,13 @@ SEXP R_igraph_edge_betweenness_subset(SEXP graph, SEXP eids, SEXP directed, SEXP SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_eids_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; igraph_vector_int_t c_sources_data; @@ -5206,12 +5334,12 @@ SEXP R_igraph_edge_betweenness_subset(SEXP graph, SEXP eids, SEXP directed, SEXP Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge_betweenness_subset(&c_graph, &c_res, c_eids, c_directed, c_sources, c_targets, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_edge_betweenness_subset(&c_graph, &c_res, c_eids, c_directed, c_sources, c_targets, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_eids_data); igraph_es_destroy(&c_eids); igraph_vector_int_destroy(&c_sources_data); @@ -5238,10 +5366,11 @@ SEXP R_igraph_harmonic_centrality(SEXP graph, SEXP vids, SEXP mode, SEXP weights SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -5251,12 +5380,12 @@ SEXP R_igraph_harmonic_centrality(SEXP graph, SEXP vids, SEXP mode, SEXP weights IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_harmonic_centrality(&c_graph, &c_res, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_harmonic_centrality(&c_graph, &c_res, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5280,10 +5409,11 @@ SEXP R_igraph_harmonic_centrality_cutoff(SEXP graph, SEXP vids, SEXP mode, SEXP SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -5295,12 +5425,12 @@ SEXP R_igraph_harmonic_centrality_cutoff(SEXP graph, SEXP vids, SEXP mode, SEXP IGRAPH_R_CHECK_REAL(cutoff); c_cutoff = REAL(cutoff)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_harmonic_centrality_cutoff(&c_graph, &c_res, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized, c_cutoff)); + IGRAPH_LOCAL_R_CHECK(igraph_harmonic_centrality_cutoff(&c_graph, &c_res, c_vids, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), c_normalized, c_cutoff)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5328,11 +5458,12 @@ SEXP R_igraph_pagerank(SEXP graph, SEXP algo, SEXP vids, SEXP directed, SEXP dam SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_algo = (igraph_pagerank_algo_t) Rf_asInteger(algo); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -5349,14 +5480,14 @@ SEXP R_igraph_pagerank(SEXP graph, SEXP algo, SEXP vids, SEXP directed, SEXP dam } } /* Call igraph */ - IGRAPH_R_CHECK(igraph_pagerank(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, (Rf_isNull(weights) ? 0 : &c_weights), c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_pagerank(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, (Rf_isNull(weights) ? 0 : &c_weights), c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; igraph_vector_int_destroy(&c_vids_data); @@ -5399,11 +5530,12 @@ SEXP R_igraph_personalized_pagerank(SEXP graph, SEXP algo, SEXP vids, SEXP direc SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_algo = (igraph_pagerank_algo_t) Rf_asInteger(algo); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -5423,14 +5555,14 @@ SEXP R_igraph_personalized_pagerank(SEXP graph, SEXP algo, SEXP vids, SEXP direc } } /* Call igraph */ - IGRAPH_R_CHECK(igraph_personalized_pagerank(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, (Rf_isNull(personalized) ? 0 : &c_personalized), (Rf_isNull(weights) ? 0 : &c_weights), c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_personalized_pagerank(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, (Rf_isNull(personalized) ? 0 : &c_personalized), (Rf_isNull(weights) ? 0 : &c_weights), c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; igraph_vector_int_destroy(&c_vids_data); @@ -5473,11 +5605,12 @@ SEXP R_igraph_personalized_pagerank_vs(SEXP graph, SEXP algo, SEXP vids, SEXP di SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_algo = (igraph_pagerank_algo_t) Rf_asInteger(algo); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_BOOL(directed); @@ -5496,14 +5629,14 @@ SEXP R_igraph_personalized_pagerank_vs(SEXP graph, SEXP algo, SEXP vids, SEXP di } } /* Call igraph */ - IGRAPH_R_CHECK(igraph_personalized_pagerank_vs(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, c_reset_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_personalized_pagerank_vs(&c_graph, c_algo, &c_vector, &c_value, c_vids, c_directed, c_damping, c_reset_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; igraph_vector_int_destroy(&c_vids_data); @@ -5538,19 +5671,20 @@ SEXP R_igraph_rewire(SEXP rewire, SEXP n, SEXP mode) { igraph_rewiring_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(rewire, &c_rewire); - IGRAPH_FINALLY(igraph_destroy, &c_rewire); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_rewire); IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; c_mode = (igraph_rewiring_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_rewire(&c_rewire, c_n, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_rewire(&c_rewire, c_n, c_mode)); /* Convert output */ PROTECT(rewire=Ry_igraph_to_SEXP(&c_rewire)); IGRAPH_I_DESTROY(&c_rewire); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = rewire; UNPROTECT(1); @@ -5569,19 +5703,20 @@ SEXP R_igraph_induced_subgraph(SEXP graph, SEXP vids, SEXP impl) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_impl = (igraph_subgraph_implementation_t) Rf_asInteger(impl); /* Call igraph */ - IGRAPH_R_CHECK(igraph_induced_subgraph(&c_graph, &c_res, c_vids, c_impl)); + IGRAPH_LOCAL_R_CHECK(igraph_induced_subgraph(&c_graph, &c_res, c_vids, c_impl)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5602,20 +5737,21 @@ SEXP R_igraph_subgraph_from_edges(SEXP graph, SEXP eids, SEXP delete_vertices) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_eids_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); IGRAPH_R_CHECK_BOOL(delete_vertices); c_delete_vertices = LOGICAL(delete_vertices)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_subgraph_from_edges(&c_graph, &c_res, c_eids, c_delete_vertices)); + IGRAPH_LOCAL_R_CHECK(igraph_subgraph_from_edges(&c_graph, &c_res, c_eids, c_delete_vertices)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_eids_data); igraph_es_destroy(&c_eids); r_result = res; @@ -5633,18 +5769,19 @@ SEXP R_igraph_reverse_edges(SEXP graph, SEXP eids) { igraph_es_t c_eids; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); igraph_vector_int_t c_eids_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_reverse_edges(&c_graph, c_eids)); + IGRAPH_LOCAL_R_CHECK(igraph_reverse_edges(&c_graph, c_eids)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_eids_data); igraph_es_destroy(&c_eids); r_result = graph; @@ -5667,6 +5804,7 @@ SEXP R_igraph_average_path_length(SEXP graph, SEXP directed, SEXP unconn) { SEXP unconn_pairs; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(directed); @@ -5674,7 +5812,7 @@ SEXP R_igraph_average_path_length(SEXP graph, SEXP directed, SEXP unconn) { IGRAPH_R_CHECK_BOOL(unconn); c_unconn = LOGICAL(unconn)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_average_path_length(&c_graph, &c_res, &c_unconn_pairs, c_directed, c_unconn)); + IGRAPH_LOCAL_R_CHECK(igraph_average_path_length(&c_graph, &c_res, &c_unconn_pairs, c_directed, c_unconn)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -5709,6 +5847,7 @@ SEXP R_igraph_average_path_length_dijkstra(SEXP graph, SEXP weights, SEXP direct SEXP unconn_pairs; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -5719,7 +5858,7 @@ SEXP R_igraph_average_path_length_dijkstra(SEXP graph, SEXP weights, SEXP direct IGRAPH_R_CHECK_BOOL(unconn); c_unconn = LOGICAL(unconn)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_average_path_length_dijkstra(&c_graph, &c_res, &c_unconn_pairs, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_unconn)); + IGRAPH_LOCAL_R_CHECK(igraph_average_path_length_dijkstra(&c_graph, &c_res, &c_unconn_pairs, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_unconn)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -5752,21 +5891,22 @@ SEXP R_igraph_path_length_hist(SEXP graph, SEXP directed) { SEXP unconnected; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_path_length_hist(&c_graph, &c_res, &c_unconnected, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_path_length_hist(&c_graph, &c_res, &c_unconnected, c_directed)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(unconnected=NEW_NUMERIC(1)); REAL(unconnected)[0]=c_unconnected; SET_VECTOR_ELT(r_result, 0, res); @@ -5791,24 +5931,25 @@ SEXP R_igraph_simplify(SEXP graph, SEXP remove_multiple, SEXP remove_loops, SEXP igraph_attribute_combination_t c_edge_attr_comb; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_BOOL(remove_multiple); c_remove_multiple = LOGICAL(remove_multiple)[0]; IGRAPH_R_CHECK_BOOL(remove_loops); c_remove_loops = LOGICAL(remove_loops)[0]; Rz_SEXP_to_attr_comb(edge_attr_comb, &c_edge_attr_comb); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, &c_edge_attr_comb); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, &c_edge_attr_comb); /* Call igraph */ - IGRAPH_R_CHECK(igraph_simplify(&c_graph, c_remove_multiple, c_remove_loops, &c_edge_attr_comb)); + IGRAPH_LOCAL_R_CHECK(igraph_simplify(&c_graph, c_remove_multiple, c_remove_loops, &c_edge_attr_comb)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_attribute_combination_destroy(&c_edge_attr_comb); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -5826,11 +5967,12 @@ SEXP R_igraph_transitivity_undirected(SEXP graph, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_transitivity_mode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitivity_undirected(&c_graph, &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_transitivity_undirected(&c_graph, &c_res, c_mode)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -5853,20 +5995,21 @@ SEXP R_igraph_transitivity_local_undirected(SEXP graph, SEXP vids, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_transitivity_mode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitivity_local_undirected(&c_graph, &c_res, c_vids, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_transitivity_local_undirected(&c_graph, &c_res, c_vids, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5886,11 +6029,12 @@ SEXP R_igraph_transitivity_avglocal_undirected(SEXP graph, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_transitivity_mode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitivity_avglocal_undirected(&c_graph, &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_transitivity_avglocal_undirected(&c_graph, &c_res, c_mode)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -5914,10 +6058,11 @@ SEXP R_igraph_transitivity_barrat(SEXP graph, SEXP vids, SEXP weights, SEXP mode SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); if (!Rf_isNull(weights)) { @@ -5925,12 +6070,12 @@ SEXP R_igraph_transitivity_barrat(SEXP graph, SEXP vids, SEXP weights, SEXP mode } c_mode = (igraph_transitivity_mode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitivity_barrat(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_transitivity_barrat(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -5953,12 +6098,13 @@ SEXP R_igraph_ecc(SEXP graph, SEXP eids, SEXP k, SEXP offset, SEXP normalize) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_eids_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(eids, &c_graph, &c_eids, &c_eids_data)); IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; IGRAPH_R_CHECK_BOOL(offset); @@ -5966,12 +6112,12 @@ SEXP R_igraph_ecc(SEXP graph, SEXP eids, SEXP k, SEXP offset, SEXP normalize) { IGRAPH_R_CHECK_BOOL(normalize); c_normalize = LOGICAL(normalize)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_ecc(&c_graph, &c_res, c_eids, c_k, c_offset, c_normalize)); + IGRAPH_LOCAL_R_CHECK(igraph_ecc(&c_graph, &c_res, c_eids, c_k, c_offset, c_normalize)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_eids_data); igraph_es_destroy(&c_eids); r_result = res; @@ -5992,13 +6138,14 @@ SEXP R_igraph_reciprocity(SEXP graph, SEXP ignore_loops, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(ignore_loops); c_ignore_loops = LOGICAL(ignore_loops)[0]; c_mode = (igraph_reciprocity_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_reciprocity(&c_graph, &c_res, c_ignore_loops, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_reciprocity(&c_graph, &c_res, c_ignore_loops, c_mode)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -6021,22 +6168,23 @@ SEXP R_igraph_constraint(SEXP graph, SEXP vids, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_constraint(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_constraint(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -6058,6 +6206,7 @@ SEXP R_igraph_maxdegree(SEXP graph, SEXP vids, SEXP mode, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; @@ -6067,7 +6216,7 @@ SEXP R_igraph_maxdegree(SEXP graph, SEXP vids, SEXP mode, SEXP loops) { IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maxdegree(&c_graph, &c_res, c_vids, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_maxdegree(&c_graph, &c_res, c_vids, c_mode, c_loops)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -6091,12 +6240,13 @@ SEXP R_igraph_density(SEXP graph, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_density(&c_graph, &c_res, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_density(&c_graph, &c_res, c_loops)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -6118,12 +6268,13 @@ SEXP R_igraph_mean_degree(SEXP graph, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_mean_degree(&c_graph, &c_res, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_mean_degree(&c_graph, &c_res, c_loops)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -6148,10 +6299,11 @@ SEXP R_igraph_neighborhood_size(SEXP graph, SEXP vids, SEXP order, SEXP mode, SE SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_INT(order); @@ -6160,12 +6312,12 @@ SEXP R_igraph_neighborhood_size(SEXP graph, SEXP vids, SEXP order, SEXP mode, SE IGRAPH_R_CHECK_INT(mindist); c_mindist = (igraph_integer_t) REAL(mindist)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_neighborhood_size(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); + IGRAPH_LOCAL_R_CHECK(igraph_neighborhood_size(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXP(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -6188,10 +6340,11 @@ SEXP R_igraph_neighborhood(SEXP graph, SEXP vids, SEXP order, SEXP mode, SEXP mi SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_INT(order); @@ -6200,12 +6353,12 @@ SEXP R_igraph_neighborhood(SEXP graph, SEXP vids, SEXP order, SEXP mode, SEXP mi IGRAPH_R_CHECK_INT(mindist); c_mindist = (igraph_integer_t) REAL(mindist)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_neighborhood(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); + IGRAPH_LOCAL_R_CHECK(igraph_neighborhood(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -6228,10 +6381,11 @@ SEXP R_igraph_neighborhood_graphs(SEXP graph, SEXP vids, SEXP order, SEXP mode, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_graph_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_graph_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_graph_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_graph_list_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); IGRAPH_R_CHECK_INT(order); @@ -6240,12 +6394,12 @@ SEXP R_igraph_neighborhood_graphs(SEXP graph, SEXP vids, SEXP order, SEXP mode, IGRAPH_R_CHECK_INT(mindist); c_mindist = (igraph_integer_t) REAL(mindist)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_neighborhood_graphs(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); + IGRAPH_LOCAL_R_CHECK(igraph_neighborhood_graphs(&c_graph, &c_res, c_vids, c_order, c_mode, c_mindist)); /* Convert output */ PROTECT(res=Ry_igraph_graphlist_to_SEXP(&c_res)); IGRAPH_FREE(c_res.stor_begin); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -6265,18 +6419,19 @@ SEXP R_igraph_topological_sorting(SEXP graph, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_topological_sorting(&c_graph, &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_topological_sorting(&c_graph, &c_res, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -6295,21 +6450,22 @@ SEXP R_igraph_feedback_arc_set(SEXP graph, SEXP weights, SEXP algo) { SEXP result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_result, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_result); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_result, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_result); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_algo = (igraph_fas_algorithm_t) Rf_asInteger(algo); /* Call igraph */ - IGRAPH_R_CHECK(igraph_feedback_arc_set(&c_graph, &c_result, (Rf_isNull(weights) ? 0 : &c_weights), c_algo)); + IGRAPH_LOCAL_R_CHECK(igraph_feedback_arc_set(&c_graph, &c_result, (Rf_isNull(weights) ? 0 : &c_weights), c_algo)); /* Convert output */ PROTECT(result=Ry_igraph_vector_int_to_SEXPp1(&c_result)); igraph_vector_int_destroy(&c_result); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = result; UNPROTECT(1); @@ -6328,21 +6484,22 @@ SEXP R_igraph_feedback_vertex_set(SEXP graph, SEXP weights, SEXP algo) { SEXP result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_result, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_result); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_result, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_result); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_algo = (igraph_fvs_algorithm_t) Rf_asInteger(algo); /* Call igraph */ - IGRAPH_R_CHECK(igraph_feedback_vertex_set(&c_graph, &c_result, (Rf_isNull(weights) ? 0 : &c_weights), c_algo)); + IGRAPH_LOCAL_R_CHECK(igraph_feedback_vertex_set(&c_graph, &c_result, (Rf_isNull(weights) ? 0 : &c_weights), c_algo)); /* Convert output */ PROTECT(result=Ry_igraph_vector_int_to_SEXPp1(&c_result)); igraph_vector_int_destroy(&c_result); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = result; UNPROTECT(1); @@ -6360,19 +6517,20 @@ SEXP R_igraph_is_loop(SEXP graph, SEXP es) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_loop(&c_graph, &c_res, c_es)); + IGRAPH_LOCAL_R_CHECK(igraph_is_loop(&c_graph, &c_res, c_es)); /* Convert output */ PROTECT(res=Ry_igraph_vector_bool_to_SEXP(&c_res)); igraph_vector_bool_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -6391,10 +6549,11 @@ SEXP R_igraph_is_dag(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_dag(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_dag(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6415,10 +6574,11 @@ SEXP R_igraph_is_acyclic(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_acyclic(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_acyclic(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6439,10 +6599,11 @@ SEXP R_igraph_is_simple(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_simple(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_simple(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6464,19 +6625,20 @@ SEXP R_igraph_is_multiple(SEXP graph, SEXP es) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_multiple(&c_graph, &c_res, c_es)); + IGRAPH_LOCAL_R_CHECK(igraph_is_multiple(&c_graph, &c_res, c_es)); /* Convert output */ PROTECT(res=Ry_igraph_vector_bool_to_SEXP(&c_res)); igraph_vector_bool_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -6495,10 +6657,11 @@ SEXP R_igraph_has_loop(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_has_loop(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_has_loop(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6519,10 +6682,11 @@ SEXP R_igraph_has_multiple(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_has_multiple(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_has_multiple(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6543,11 +6707,12 @@ SEXP R_igraph_count_loops(SEXP graph) { SEXP loop_count; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_loop_count=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_loops(&c_graph, &c_loop_count)); + IGRAPH_LOCAL_R_CHECK(igraph_count_loops(&c_graph, &c_loop_count)); /* Convert output */ PROTECT(loop_count=NEW_NUMERIC(1)); @@ -6569,19 +6734,20 @@ SEXP R_igraph_count_multiple(SEXP graph, SEXP es) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_multiple(&c_graph, &c_res, c_es)); + IGRAPH_LOCAL_R_CHECK(igraph_count_multiple(&c_graph, &c_res, c_es)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXP(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -6602,12 +6768,13 @@ SEXP R_igraph_girth(SEXP graph) { SEXP circle; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_circle, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_circle); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_circle, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_circle); /* Call igraph */ - IGRAPH_R_CHECK(igraph_girth(&c_graph, &c_girth, &c_circle)); + IGRAPH_LOCAL_R_CHECK(igraph_girth(&c_graph, &c_girth, &c_circle)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -6616,7 +6783,7 @@ SEXP R_igraph_girth(SEXP graph) { REAL(girth)[0]=c_girth; PROTECT(circle=Ry_igraph_vector_int_to_SEXPp1(&c_circle)); igraph_vector_int_destroy(&c_circle); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, girth); SET_VECTOR_ELT(r_result, 1, circle); SET_STRING_ELT(r_names, 0, Rf_mkChar("girth")); @@ -6638,10 +6805,11 @@ SEXP R_igraph_is_perfect(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_perfect(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_perfect(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -6662,20 +6830,21 @@ SEXP R_igraph_add_edge(SEXP graph, SEXP from, SEXP to) { igraph_integer_t c_to; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); IGRAPH_R_CHECK_INT(from); c_from = (igraph_integer_t) REAL(from)[0]; IGRAPH_R_CHECK_INT(to); c_to = (igraph_integer_t) REAL(to)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_add_edge(&c_graph, c_from, c_to)); + IGRAPH_LOCAL_R_CHECK(igraph_add_edge(&c_graph, c_from, c_to)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -6698,10 +6867,11 @@ SEXP R_igraph_eigenvector_centrality(SEXP graph, SEXP directed, SEXP scale, SEXP SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(scale); @@ -6711,14 +6881,14 @@ SEXP R_igraph_eigenvector_centrality(SEXP graph, SEXP directed, SEXP scale, SEXP } Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eigenvector_centrality(&c_graph, &c_vector, &c_value, c_directed, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_eigenvector_centrality(&c_graph, &c_vector, &c_value, c_directed, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); @@ -6750,10 +6920,11 @@ SEXP R_igraph_hub_score(SEXP graph, SEXP scale, SEXP weights, SEXP options) { SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); IGRAPH_R_CHECK_BOOL(scale); c_scale = LOGICAL(scale)[0]; if (!Rf_isNull(weights)) { @@ -6761,14 +6932,14 @@ SEXP R_igraph_hub_score(SEXP graph, SEXP scale, SEXP weights, SEXP options) { } Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_hub_score(&c_graph, &c_vector, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_hub_score(&c_graph, &c_vector, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); @@ -6800,10 +6971,11 @@ SEXP R_igraph_authority_score(SEXP graph, SEXP scale, SEXP weights, SEXP options SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); IGRAPH_R_CHECK_BOOL(scale); c_scale = LOGICAL(scale)[0]; if (!Rf_isNull(weights)) { @@ -6811,14 +6983,14 @@ SEXP R_igraph_authority_score(SEXP graph, SEXP scale, SEXP weights, SEXP options } Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_authority_score(&c_graph, &c_vector, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_authority_score(&c_graph, &c_vector, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); @@ -6852,12 +7024,13 @@ SEXP R_igraph_hub_and_authority_scores(SEXP graph, SEXP scale, SEXP weights, SEX SEXP value; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_hub, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_hub); - IGRAPH_R_CHECK(igraph_vector_init(&c_authority, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_authority); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_hub, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_hub); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_authority, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_authority); IGRAPH_R_CHECK_BOOL(scale); c_scale = LOGICAL(scale)[0]; if (!Rf_isNull(weights)) { @@ -6865,17 +7038,17 @@ SEXP R_igraph_hub_and_authority_scores(SEXP graph, SEXP scale, SEXP weights, SEX } Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_hub_and_authority_scores(&c_graph, &c_hub, &c_authority, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_hub_and_authority_scores(&c_graph, &c_hub, &c_authority, &c_value, c_scale, (Rf_isNull(weights) ? 0 : &c_weights), &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(hub=Ry_igraph_vector_to_SEXP(&c_hub)); igraph_vector_destroy(&c_hub); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(authority=Ry_igraph_vector_to_SEXP(&c_authority)); igraph_vector_destroy(&c_authority); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); @@ -6908,28 +7081,29 @@ SEXP R_igraph_unfold_tree(SEXP graph, SEXP mode, SEXP roots) { SEXP vertex_index; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(roots, &c_roots)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_index, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_index); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(roots, &c_roots)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_index, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_index); /* Call igraph */ - IGRAPH_R_CHECK(igraph_unfold_tree(&c_graph, &c_tree, c_mode, &c_roots, &c_vertex_index)); + IGRAPH_LOCAL_R_CHECK(igraph_unfold_tree(&c_graph, &c_tree, c_mode, &c_roots, &c_vertex_index)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_tree); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_tree); PROTECT(tree=Ry_igraph_to_SEXP(&c_tree)); IGRAPH_I_DESTROY(&c_tree); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_index=Ry_igraph_vector_int_to_SEXPp1(&c_vertex_index)); igraph_vector_int_destroy(&c_vertex_index); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, tree); SET_VECTOR_ELT(r_result, 1, vertex_index); SET_STRING_ELT(r_names, 0, Rf_mkChar("tree")); @@ -6953,21 +7127,22 @@ SEXP R_igraph_is_mutual(SEXP graph, SEXP es, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_mutual(&c_graph, &c_res, c_es, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_is_mutual(&c_graph, &c_res, c_es, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_bool_to_SEXP(&c_res)); igraph_vector_bool_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -6987,12 +7162,13 @@ SEXP R_igraph_has_mutual(SEXP graph, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_has_mutual(&c_graph, &c_res, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_has_mutual(&c_graph, &c_res, c_loops)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -7015,24 +7191,25 @@ SEXP R_igraph_maximum_cardinality_search(SEXP graph) { SEXP alpham1; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_alpha, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpha); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_alpham1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpham1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_alpha, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpha); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_alpham1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpham1); /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximum_cardinality_search(&c_graph, &c_alpha, &c_alpham1)); + IGRAPH_LOCAL_R_CHECK(igraph_maximum_cardinality_search(&c_graph, &c_alpha, &c_alpham1)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(alpha=Ry_igraph_vector_int_to_SEXPp1(&c_alpha)); igraph_vector_int_destroy(&c_alpha); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(alpham1=Ry_igraph_vector_int_to_SEXPp1(&c_alpham1)); igraph_vector_int_destroy(&c_alpham1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, alpha); SET_VECTOR_ELT(r_result, 1, alpham1); SET_STRING_ELT(r_names, 0, Rf_mkChar("alpha")); @@ -7060,43 +7237,44 @@ SEXP R_igraph_is_chordal(SEXP graph, SEXP alpha, SEXP alpham1) { SEXP newgraph; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(alpha)) { Rz_SEXP_to_vector_int_copy(alpha, &c_alpha); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpha); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpha); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_alpha, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpha); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_alpha, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpha); } if (!Rf_isNull(alpham1)) { Rz_SEXP_to_vector_int_copy(alpham1, &c_alpham1); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpham1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpham1); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_alpham1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_alpham1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_alpham1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_alpham1); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_fillin, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_fillin); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_fillin, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_fillin); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_chordal(&c_graph, (Rf_isNull(alpha) ? 0 : &c_alpha), (Rf_isNull(alpham1) ? 0 : &c_alpham1), &c_chordal, &c_fillin, &c_newgraph)); + IGRAPH_LOCAL_R_CHECK(igraph_is_chordal(&c_graph, (Rf_isNull(alpha) ? 0 : &c_alpha), (Rf_isNull(alpham1) ? 0 : &c_alpham1), &c_chordal, &c_fillin, &c_newgraph)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); igraph_vector_int_destroy(&c_alpha); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_alpham1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(chordal=NEW_LOGICAL(1)); LOGICAL(chordal)[0]=c_chordal; PROTECT(fillin=Ry_igraph_vector_int_to_SEXP(&c_fillin)); igraph_vector_int_destroy(&c_fillin); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_newgraph); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_newgraph); PROTECT(newgraph=Ry_igraph_to_SEXP(&c_newgraph)); IGRAPH_I_DESTROY(&c_newgraph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, chordal); SET_VECTOR_ELT(r_result, 1, fillin); SET_VECTOR_ELT(r_result, 2, newgraph); @@ -7126,21 +7304,22 @@ SEXP R_igraph_avg_nearest_neighbor_degree(SEXP graph, SEXP vids, SEXP mode, SEXP SEXP knnk; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); c_neighbor_degree_mode = (igraph_neimode_t) Rf_asInteger(neighbor_degree_mode); - IGRAPH_R_CHECK(igraph_vector_init(&c_knn, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_knn); - IGRAPH_R_CHECK(igraph_vector_init(&c_knnk, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_knnk); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_knn, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_knn); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_knnk, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_knnk); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_avg_nearest_neighbor_degree(&c_graph, c_vids, c_mode, c_neighbor_degree_mode, &c_knn, &c_knnk, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_avg_nearest_neighbor_degree(&c_graph, c_vids, c_mode, c_neighbor_degree_mode, &c_knn, &c_knnk, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -7149,10 +7328,10 @@ SEXP R_igraph_avg_nearest_neighbor_degree(SEXP graph, SEXP vids, SEXP mode, SEXP igraph_vs_destroy(&c_vids); PROTECT(knn=Ry_igraph_vector_to_SEXP(&c_knn)); igraph_vector_destroy(&c_knn); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(knnk=Ry_igraph_vector_to_SEXP(&c_knnk)); igraph_vector_destroy(&c_knnk); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, knn); SET_VECTOR_ELT(r_result, 1, knnk); SET_STRING_ELT(r_names, 0, Rf_mkChar("knn")); @@ -7178,24 +7357,25 @@ SEXP R_igraph_degree_correlation_vector(SEXP graph, SEXP weights, SEXP from_mode SEXP knnk; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_init(&c_knnk, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_knnk); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_knnk, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_knnk); c_from_mode = (igraph_neimode_t) Rf_asInteger(from_mode); c_to_mode = (igraph_neimode_t) Rf_asInteger(to_mode); IGRAPH_R_CHECK_BOOL(directed_neighbors); c_directed_neighbors = LOGICAL(directed_neighbors)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_degree_correlation_vector(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_knnk, c_from_mode, c_to_mode, c_directed_neighbors)); + IGRAPH_LOCAL_R_CHECK(igraph_degree_correlation_vector(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_knnk, c_from_mode, c_to_mode, c_directed_neighbors)); /* Convert output */ PROTECT(knnk=Ry_igraph_vector_to_SEXP(&c_knnk)); igraph_vector_destroy(&c_knnk); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = knnk; UNPROTECT(1); @@ -7217,15 +7397,16 @@ SEXP R_igraph_rich_club_sequence(SEXP graph, SEXP weights, SEXP vertex_order, SE SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); Rz_SEXP_to_vector_int_copy(vertex_order, &c_vertex_order); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_order); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_order); IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; IGRAPH_R_CHECK_BOOL(loops); @@ -7233,14 +7414,14 @@ SEXP R_igraph_rich_club_sequence(SEXP graph, SEXP weights, SEXP vertex_order, SE IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_rich_club_sequence(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, &c_vertex_order, c_normalized, c_loops, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_rich_club_sequence(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, &c_vertex_order, c_normalized, c_loops, c_directed)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -7261,10 +7442,11 @@ SEXP R_igraph_strength(SEXP graph, SEXP vids, SEXP mode, SEXP loops, SEXP weight SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -7274,12 +7456,12 @@ SEXP R_igraph_strength(SEXP graph, SEXP vids, SEXP mode, SEXP loops, SEXP weight Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_strength(&c_graph, &c_res, c_vids, c_mode, c_loops, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_strength(&c_graph, &c_res, c_vids, c_mode, c_loops, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -7298,6 +7480,7 @@ SEXP R_igraph_centralization(SEXP scores, SEXP theoretical_max, SEXP normalized) igraph_bool_t c_normalized; igraph_real_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector(scores, &c_scores); IGRAPH_R_CHECK_REAL(theoretical_max); @@ -7333,24 +7516,25 @@ SEXP R_igraph_centralization_degree(SEXP graph, SEXP mode, SEXP loops, SEXP norm SEXP theoretical_max; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_degree(&c_graph, &c_res, c_mode, c_loops, &c_centralization, &c_theoretical_max, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_degree(&c_graph, &c_res, c_mode, c_loops, &c_centralization, &c_theoretical_max, c_normalized)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(centralization=NEW_NUMERIC(1)); REAL(centralization)[0]=c_centralization; PROTECT(theoretical_max=NEW_NUMERIC(1)); @@ -7381,6 +7565,7 @@ SEXP R_igraph_centralization_degree_tmax(SEXP graph, SEXP nodes, SEXP mode, SEXP SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ if (!Rf_isNull(graph)) { Rz_SEXP_to_igraph(graph, &c_graph); @@ -7391,7 +7576,7 @@ SEXP R_igraph_centralization_degree_tmax(SEXP graph, SEXP nodes, SEXP mode, SEXP IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_degree_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_mode, c_loops, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_degree_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_mode, c_loops, &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7418,23 +7603,24 @@ SEXP R_igraph_centralization_betweenness(SEXP graph, SEXP directed, SEXP normali SEXP theoretical_max; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_betweenness(&c_graph, &c_res, c_directed, &c_centralization, &c_theoretical_max, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_betweenness(&c_graph, &c_res, c_directed, &c_centralization, &c_theoretical_max, c_normalized)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(centralization=NEW_NUMERIC(1)); REAL(centralization)[0]=c_centralization; PROTECT(theoretical_max=NEW_NUMERIC(1)); @@ -7464,6 +7650,7 @@ SEXP R_igraph_centralization_betweenness_tmax(SEXP graph, SEXP nodes, SEXP direc SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ if (!Rf_isNull(graph)) { Rz_SEXP_to_igraph(graph, &c_graph); @@ -7473,7 +7660,7 @@ SEXP R_igraph_centralization_betweenness_tmax(SEXP graph, SEXP nodes, SEXP direc IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_betweenness_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_directed, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_betweenness_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_directed, &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7500,22 +7687,23 @@ SEXP R_igraph_centralization_closeness(SEXP graph, SEXP mode, SEXP normalized) { SEXP theoretical_max; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_closeness(&c_graph, &c_res, c_mode, &c_centralization, &c_theoretical_max, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_closeness(&c_graph, &c_res, c_mode, &c_centralization, &c_theoretical_max, c_normalized)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(centralization=NEW_NUMERIC(1)); REAL(centralization)[0]=c_centralization; PROTECT(theoretical_max=NEW_NUMERIC(1)); @@ -7545,6 +7733,7 @@ SEXP R_igraph_centralization_closeness_tmax(SEXP graph, SEXP nodes, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ if (!Rf_isNull(graph)) { Rz_SEXP_to_igraph(graph, &c_graph); @@ -7553,7 +7742,7 @@ SEXP R_igraph_centralization_closeness_tmax(SEXP graph, SEXP nodes, SEXP mode) { c_nodes = (igraph_integer_t) REAL(nodes)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_closeness_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_mode, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_closeness_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_mode, &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7584,10 +7773,11 @@ SEXP R_igraph_centralization_eigenvector_centrality(SEXP graph, SEXP directed, S SEXP theoretical_max; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_vector, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_vector); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_vector, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_vector); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(scale); @@ -7596,14 +7786,14 @@ SEXP R_igraph_centralization_eigenvector_centrality(SEXP graph, SEXP directed, S IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_eigenvector_centrality(&c_graph, &c_vector, &c_value, c_directed, c_scale, &c_options, &c_centralization, &c_theoretical_max, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_eigenvector_centrality(&c_graph, &c_vector, &c_value, c_directed, c_scale, &c_options, &c_centralization, &c_theoretical_max, c_normalized)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); PROTECT(r_names=NEW_CHARACTER(5)); PROTECT(vector=Ry_igraph_vector_to_SEXP(&c_vector)); igraph_vector_destroy(&c_vector); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(value=NEW_NUMERIC(1)); REAL(value)[0]=c_value; PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); @@ -7641,6 +7831,7 @@ SEXP R_igraph_centralization_eigenvector_centrality_tmax(SEXP graph, SEXP nodes, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ if (!Rf_isNull(graph)) { Rz_SEXP_to_igraph(graph, &c_graph); @@ -7652,7 +7843,7 @@ SEXP R_igraph_centralization_eigenvector_centrality_tmax(SEXP graph, SEXP nodes, IGRAPH_R_CHECK_BOOL(scale); c_scale = LOGICAL(scale)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_centralization_eigenvector_centrality_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_directed, c_scale, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_centralization_eigenvector_centrality_tmax((Rf_isNull(graph) ? 0 : &c_graph), c_nodes, c_directed, c_scale, &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7676,20 +7867,21 @@ SEXP R_igraph_assortativity_nominal(SEXP graph, SEXP types, SEXP directed, SEXP SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_int_copy(types, &c_types); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_assortativity_nominal(&c_graph, &c_types, &c_res, c_directed, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_assortativity_nominal(&c_graph, &c_types, &c_res, c_directed, c_normalized)); /* Convert output */ igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_NUMERIC(1)); REAL(res)[0]=c_res; r_result = res; @@ -7712,6 +7904,7 @@ SEXP R_igraph_assortativity(SEXP graph, SEXP values, SEXP values_in, SEXP direct SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(values, &c_values); @@ -7723,7 +7916,7 @@ SEXP R_igraph_assortativity(SEXP graph, SEXP values, SEXP values_in, SEXP direct IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_assortativity(&c_graph, &c_values, (Rf_isNull(values_in) ? 0 : &c_values_in), &c_res, c_directed, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_assortativity(&c_graph, &c_values, (Rf_isNull(values_in) ? 0 : &c_values_in), &c_res, c_directed, c_normalized)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7745,12 +7938,13 @@ SEXP R_igraph_assortativity_degree(SEXP graph, SEXP directed) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_assortativity_degree(&c_graph, &c_res, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_assortativity_degree(&c_graph, &c_res, c_directed)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -7774,24 +7968,25 @@ SEXP R_igraph_joint_degree_matrix(SEXP graph, SEXP weights, SEXP max_out_degree, SEXP jdm; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_init(&c_jdm, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_jdm); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_jdm, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_jdm); IGRAPH_R_CHECK_INT(max_out_degree); c_max_out_degree = (igraph_integer_t) REAL(max_out_degree)[0]; IGRAPH_R_CHECK_INT(max_in_degree); c_max_in_degree = (igraph_integer_t) REAL(max_in_degree)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_joint_degree_matrix(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_jdm, c_max_out_degree, c_max_in_degree)); + IGRAPH_LOCAL_R_CHECK(igraph_joint_degree_matrix(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_jdm, c_max_out_degree, c_max_in_degree)); /* Convert output */ PROTECT(jdm=Ry_igraph_matrix_to_SEXP(&c_jdm)); igraph_matrix_destroy(&c_jdm); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = jdm; UNPROTECT(1); @@ -7815,13 +8010,14 @@ SEXP R_igraph_joint_degree_distribution(SEXP graph, SEXP weights, SEXP from_mode SEXP p; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_init(&c_p, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_p); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_p, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_p); c_from_mode = (igraph_neimode_t) Rf_asInteger(from_mode); c_to_mode = (igraph_neimode_t) Rf_asInteger(to_mode); IGRAPH_R_CHECK_BOOL(directed_neighbors); @@ -7833,12 +8029,12 @@ SEXP R_igraph_joint_degree_distribution(SEXP graph, SEXP weights, SEXP from_mode IGRAPH_R_CHECK_INT(max_to_degree); c_max_to_degree = (igraph_integer_t) REAL(max_to_degree)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_joint_degree_distribution(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_p, c_from_mode, c_to_mode, c_directed_neighbors, c_normalized, c_max_from_degree, c_max_to_degree)); + IGRAPH_LOCAL_R_CHECK(igraph_joint_degree_distribution(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_p, c_from_mode, c_to_mode, c_directed_neighbors, c_normalized, c_max_from_degree, c_max_to_degree)); /* Convert output */ PROTECT(p=Ry_igraph_matrix_to_SEXP(&c_p)); igraph_matrix_destroy(&c_p); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = p; UNPROTECT(1); @@ -7860,37 +8056,38 @@ SEXP R_igraph_joint_type_distribution(SEXP graph, SEXP weights, SEXP from_types, SEXP p; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_init(&c_p, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_p); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_p, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_p); Rz_SEXP_to_vector_int_copy(from_types, &c_from_types); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_from_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_from_types); if (!Rf_isNull(to_types)) { Rz_SEXP_to_vector_int_copy(to_types, &c_to_types); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_to_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_to_types); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_to_types, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_to_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_to_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_to_types); } IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; IGRAPH_R_CHECK_BOOL(normalized); c_normalized = LOGICAL(normalized)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_joint_type_distribution(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_p, &c_from_types, (Rf_isNull(to_types) ? 0 : &c_to_types), c_directed, c_normalized)); + IGRAPH_LOCAL_R_CHECK(igraph_joint_type_distribution(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_p, &c_from_types, (Rf_isNull(to_types) ? 0 : &c_to_types), c_directed, c_normalized)); /* Convert output */ PROTECT(p=Ry_igraph_matrix_to_SEXP(&c_p)); igraph_matrix_destroy(&c_p); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_from_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_to_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = p; UNPROTECT(1); @@ -7907,24 +8104,25 @@ SEXP R_igraph_contract_vertices(SEXP graph, SEXP mapping, SEXP vertex_attr_comb) igraph_attribute_combination_t c_vertex_attr_comb; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); Rz_SEXP_to_vector_int_copy(mapping, &c_mapping); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_mapping); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_mapping); Rz_SEXP_to_attr_comb(vertex_attr_comb, &c_vertex_attr_comb); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, &c_vertex_attr_comb); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, &c_vertex_attr_comb); /* Call igraph */ - IGRAPH_R_CHECK(igraph_contract_vertices(&c_graph, &c_mapping, &c_vertex_attr_comb)); + IGRAPH_LOCAL_R_CHECK(igraph_contract_vertices(&c_graph, &c_mapping, &c_vertex_attr_comb)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_mapping); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_attribute_combination_destroy(&c_vertex_attr_comb); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -7943,20 +8141,21 @@ SEXP R_igraph_eccentricity(SEXP graph, SEXP vids, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eccentricity(&c_graph, &c_res, c_vids, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_eccentricity(&c_graph, &c_res, c_vids, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -7978,23 +8177,24 @@ SEXP R_igraph_eccentricity_dijkstra(SEXP graph, SEXP weights, SEXP vids, SEXP mo SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eccentricity_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_vids, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_eccentricity_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_vids, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -8014,18 +8214,19 @@ SEXP R_igraph_graph_center(SEXP graph, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_graph_center(&c_graph, &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_graph_center(&c_graph, &c_res, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -8044,21 +8245,22 @@ SEXP R_igraph_graph_center_dijkstra(SEXP graph, SEXP weights, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_graph_center_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_graph_center_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -8076,11 +8278,12 @@ SEXP R_igraph_radius(SEXP graph, SEXP mode) { SEXP radius; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_radius(&c_graph, &c_radius, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_radius(&c_graph, &c_radius, c_mode)); /* Convert output */ PROTECT(radius=NEW_NUMERIC(1)); @@ -8103,6 +8306,7 @@ SEXP R_igraph_radius_dijkstra(SEXP graph, SEXP weights, SEXP mode) { SEXP radius; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -8110,7 +8314,7 @@ SEXP R_igraph_radius_dijkstra(SEXP graph, SEXP weights, SEXP mode) { } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_radius_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_radius, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_radius_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_radius, c_mode)); /* Convert output */ PROTECT(radius=NEW_NUMERIC(1)); @@ -8138,6 +8342,7 @@ SEXP R_igraph_pseudo_diameter(SEXP graph, SEXP start_vid, SEXP directed, SEXP un SEXP to; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_start_vid = (igraph_integer_t) REAL(start_vid)[0]; @@ -8148,7 +8353,7 @@ SEXP R_igraph_pseudo_diameter(SEXP graph, SEXP start_vid, SEXP directed, SEXP un IGRAPH_R_CHECK_BOOL(unconnected); c_unconnected = LOGICAL(unconnected)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_pseudo_diameter(&c_graph, &c_diameter, c_start_vid, &c_from, &c_to, c_directed, c_unconnected)); + IGRAPH_LOCAL_R_CHECK(igraph_pseudo_diameter(&c_graph, &c_diameter, c_start_vid, &c_from, &c_to, c_directed, c_unconnected)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); @@ -8190,6 +8395,7 @@ SEXP R_igraph_pseudo_diameter_dijkstra(SEXP graph, SEXP weights, SEXP start_vid, SEXP to; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -8203,7 +8409,7 @@ SEXP R_igraph_pseudo_diameter_dijkstra(SEXP graph, SEXP weights, SEXP start_vid, IGRAPH_R_CHECK_BOOL(unconnected); c_unconnected = LOGICAL(unconnected)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_pseudo_diameter_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_diameter, c_start_vid, &c_from, &c_to, c_directed, c_unconnected)); + IGRAPH_LOCAL_R_CHECK(igraph_pseudo_diameter_dijkstra(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_diameter, c_start_vid, &c_from, &c_to, c_directed, c_unconnected)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); @@ -8239,22 +8445,23 @@ SEXP R_igraph_diversity(SEXP graph, SEXP weights, SEXP vids) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_diversity(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_vids)); + IGRAPH_LOCAL_R_CHECK(igraph_diversity(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_res, c_vids)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -8280,32 +8487,33 @@ SEXP R_igraph_random_walk(SEXP graph, SEXP weights, SEXP start, SEXP mode, SEXP SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_start = (igraph_integer_t) REAL(start)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; c_stuck = (igraph_random_walk_stuck_t) Rf_asInteger(stuck); /* Call igraph */ - IGRAPH_R_CHECK(igraph_random_walk(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_vertices, &c_edges, c_start, c_mode, c_steps, c_stuck)); + IGRAPH_LOCAL_R_CHECK(igraph_random_walk(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_vertices, &c_edges, c_start, c_mode, c_steps, c_stuck)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -8332,25 +8540,26 @@ SEXP R_igraph_random_edge_walk(SEXP graph, SEXP weights, SEXP start, SEXP mode, SEXP edgewalk; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edgewalk, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edgewalk); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edgewalk, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edgewalk); c_start = (igraph_integer_t) REAL(start)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; c_stuck = (igraph_random_walk_stuck_t) Rf_asInteger(stuck); /* Call igraph */ - IGRAPH_R_CHECK(igraph_random_edge_walk(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_edgewalk, c_start, c_mode, c_steps, c_stuck)); + IGRAPH_LOCAL_R_CHECK(igraph_random_edge_walk(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_edgewalk, c_start, c_mode, c_steps, c_stuck)); /* Convert output */ PROTECT(edgewalk=Ry_igraph_vector_int_to_SEXPp1(&c_edgewalk)); igraph_vector_int_destroy(&c_edgewalk); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = edgewalk; UNPROTECT(1); @@ -8369,6 +8578,7 @@ SEXP R_igraph_global_efficiency(SEXP graph, SEXP weights, SEXP directed) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -8377,7 +8587,7 @@ SEXP R_igraph_global_efficiency(SEXP graph, SEXP weights, SEXP directed) { IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_global_efficiency(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_global_efficiency(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_directed)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -8402,10 +8612,11 @@ SEXP R_igraph_local_efficiency(SEXP graph, SEXP vids, SEXP weights, SEXP directe SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); if (!Rf_isNull(weights)) { @@ -8415,12 +8626,12 @@ SEXP R_igraph_local_efficiency(SEXP graph, SEXP vids, SEXP weights, SEXP directe c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_efficiency(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_efficiency(&c_graph, &c_res, c_vids, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -8442,6 +8653,7 @@ SEXP R_igraph_average_local_efficiency(SEXP graph, SEXP weights, SEXP directed, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -8451,7 +8663,7 @@ SEXP R_igraph_average_local_efficiency(SEXP graph, SEXP weights, SEXP directed, c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_average_local_efficiency(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_average_local_efficiency(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_directed, c_mode)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -8472,16 +8684,17 @@ SEXP R_igraph_transitive_closure_dag(SEXP graph) { SEXP closure; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitive_closure_dag(&c_graph, &c_closure)); + IGRAPH_LOCAL_R_CHECK(igraph_transitive_closure_dag(&c_graph, &c_closure)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_closure); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_closure); PROTECT(closure=Ry_igraph_to_SEXP(&c_closure)); IGRAPH_I_DESTROY(&c_closure); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = closure; UNPROTECT(1); @@ -8498,16 +8711,17 @@ SEXP R_igraph_transitive_closure(SEXP graph) { SEXP closure; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_transitive_closure(&c_graph, &c_closure)); + IGRAPH_LOCAL_R_CHECK(igraph_transitive_closure(&c_graph, &c_closure)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_closure); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_closure); PROTECT(closure=Ry_igraph_to_SEXP(&c_closure)); IGRAPH_I_DESTROY(&c_closure); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = closure; UNPROTECT(1); @@ -8524,17 +8738,18 @@ SEXP R_igraph_trussness(SEXP graph) { SEXP trussness; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_trussness, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_trussness); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_trussness, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_trussness); /* Call igraph */ - IGRAPH_R_CHECK(igraph_trussness(&c_graph, &c_trussness)); + IGRAPH_LOCAL_R_CHECK(igraph_trussness(&c_graph, &c_trussness)); /* Convert output */ PROTECT(trussness=Ry_igraph_vector_int_to_SEXP(&c_trussness)); igraph_vector_int_destroy(&c_trussness); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = trussness; UNPROTECT(1); @@ -8553,20 +8768,21 @@ SEXP R_igraph_is_bigraphical(SEXP degrees1, SEXP degrees2, SEXP allowed_edge_typ SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees1, &c_degrees1)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_degrees1); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees2, &c_degrees2)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_degrees2); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees1, &c_degrees1)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_degrees1); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(degrees2, &c_degrees2)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_degrees2); c_allowed_edge_types = (igraph_edge_type_sw_t) Rf_asInteger(allowed_edge_types); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_bigraphical(&c_degrees1, &c_degrees2, c_allowed_edge_types, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_bigraphical(&c_degrees1, &c_degrees2, c_allowed_edge_types, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_degrees1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_degrees2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -8587,25 +8803,26 @@ SEXP R_igraph_is_graphical(SEXP out_deg, SEXP in_deg, SEXP allowed_edge_types) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_out_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(out_deg, &c_out_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_out_deg); if (!Rf_isNull(in_deg)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(in_deg, &c_in_deg)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_in_deg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_in_deg, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_in_deg); } c_allowed_edge_types = (igraph_edge_type_sw_t) Rf_asInteger(allowed_edge_types); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_graphical(&c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_allowed_edge_types, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_graphical(&c_out_deg, (Rf_isNull(in_deg) ? 0 : &c_in_deg), c_allowed_edge_types, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_out_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_in_deg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -8630,31 +8847,32 @@ SEXP R_igraph_bfs_simple(SEXP graph, SEXP root, SEXP mode) { SEXP parents; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_root = (igraph_integer_t) REAL(root)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_layers, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_layers); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_layers, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_layers); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bfs_simple(&c_graph, c_root, c_mode, &c_order, &c_layers, &c_parents)); + IGRAPH_LOCAL_R_CHECK(igraph_bfs_simple(&c_graph, c_root, c_mode, &c_order, &c_layers, &c_parents)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(order=Ry_igraph_vector_int_to_SEXPp1(&c_order)); igraph_vector_int_destroy(&c_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(layers=Ry_igraph_vector_int_to_SEXP(&c_layers)); igraph_vector_int_destroy(&c_layers); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, order); SET_VECTOR_ELT(r_result, 1, layers); SET_VECTOR_ELT(r_result, 2, parents); @@ -8685,6 +8903,7 @@ SEXP R_igraph_bipartite_projection_size(SEXP graph, SEXP types) { SEXP ecount2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); @@ -8693,7 +8912,7 @@ SEXP R_igraph_bipartite_projection_size(SEXP graph, SEXP types) { c_vcount2=0; c_ecount2=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_bipartite_projection_size(&c_graph, &c_types, &c_vcount1, &c_ecount1, &c_vcount2, &c_ecount2)); + IGRAPH_LOCAL_R_CHECK(igraph_bipartite_projection_size(&c_graph, &c_types, &c_vcount1, &c_ecount1, &c_vcount2, &c_ecount2)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); @@ -8739,35 +8958,36 @@ SEXP R_igraph_bipartite_projection(SEXP graph, SEXP types, SEXP probe1) { SEXP multiplicity2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_multiplicity1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_multiplicity1); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_multiplicity2, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_multiplicity2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_multiplicity1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_multiplicity1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_multiplicity2, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_multiplicity2); IGRAPH_R_CHECK_INT(probe1); c_probe1 = (igraph_integer_t) REAL(probe1)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_bipartite_projection(&c_graph, &c_types, &c_proj1, &c_proj2, &c_multiplicity1, &c_multiplicity2, c_probe1)); + IGRAPH_LOCAL_R_CHECK(igraph_bipartite_projection(&c_graph, &c_types, &c_proj1, &c_proj2, &c_multiplicity1, &c_multiplicity2, c_probe1)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); - IGRAPH_FINALLY(igraph_destroy, &c_proj1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_proj1); PROTECT(proj1=Ry_igraph_to_SEXP(&c_proj1)); IGRAPH_I_DESTROY(&c_proj1); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_proj2); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_proj2); PROTECT(proj2=Ry_igraph_to_SEXP(&c_proj2)); IGRAPH_I_DESTROY(&c_proj2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(multiplicity1=Ry_igraph_vector_int_to_SEXP(&c_multiplicity1)); igraph_vector_int_destroy(&c_multiplicity1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(multiplicity2=Ry_igraph_vector_int_to_SEXP(&c_multiplicity2)); igraph_vector_int_destroy(&c_multiplicity2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, proj1); SET_VECTOR_ELT(r_result, 1, proj2); SET_VECTOR_ELT(r_result, 2, multiplicity1); @@ -8795,22 +9015,23 @@ SEXP R_igraph_create_bipartite(SEXP types, SEXP edges, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector_bool(types, &c_types); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edges, &c_edges)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edges, &c_edges)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_create_bipartite(&c_graph, &c_types, &c_edges, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_create_bipartite(&c_graph, &c_types, &c_edges, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -8832,9 +9053,10 @@ SEXP R_igraph_biadjacency(SEXP incidence, SEXP directed, SEXP mode, SEXP multipl SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_types); Rz_SEXP_to_matrix(incidence, &c_incidence); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; @@ -8842,18 +9064,18 @@ SEXP R_igraph_biadjacency(SEXP incidence, SEXP directed, SEXP mode, SEXP multipl IGRAPH_R_CHECK_BOOL(multiple); c_multiple = LOGICAL(multiple)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_biadjacency(&c_graph, &c_types, &c_incidence, c_directed, c_mode, c_multiple)); + IGRAPH_LOCAL_R_CHECK(igraph_biadjacency(&c_graph, &c_types, &c_incidence, c_directed, c_mode, c_multiple)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_bool_to_SEXP(&c_types)); igraph_vector_bool_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -8880,30 +9102,31 @@ SEXP R_igraph_get_biadjacency(SEXP graph, SEXP types) { SEXP col_ids; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_row_ids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_row_ids); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_col_ids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_col_ids); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_row_ids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_row_ids); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_col_ids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_col_ids); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_biadjacency(&c_graph, &c_types, &c_res, &c_row_ids, &c_col_ids)); + IGRAPH_LOCAL_R_CHECK(igraph_get_biadjacency(&c_graph, &c_types, &c_res, &c_row_ids, &c_col_ids)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(row_ids=Ry_igraph_vector_int_to_SEXPp1(&c_row_ids)); igraph_vector_int_destroy(&c_row_ids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(col_ids=Ry_igraph_vector_int_to_SEXPp1(&c_col_ids)); igraph_vector_int_destroy(&c_col_ids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, row_ids); SET_VECTOR_ELT(r_result, 2, col_ids); @@ -8929,12 +9152,13 @@ SEXP R_igraph_is_bipartite(SEXP graph) { SEXP type; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_type, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_type); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_type, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_bipartite(&c_graph, &c_res, &c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_is_bipartite(&c_graph, &c_res, &c_type)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -8943,7 +9167,7 @@ SEXP R_igraph_is_bipartite(SEXP graph) { LOGICAL(res)[0]=c_res; PROTECT(type=Ry_igraph_vector_bool_to_SEXP(&c_type)); igraph_vector_bool_destroy(&c_type); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, type); SET_STRING_ELT(r_names, 0, Rf_mkChar("res")); @@ -8971,9 +9195,10 @@ SEXP R_igraph_bipartite_game_gnp(SEXP n1, SEXP n2, SEXP p, SEXP directed, SEXP m SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_types); IGRAPH_R_CHECK_INT(n1); c_n1 = (igraph_integer_t) REAL(n1)[0]; IGRAPH_R_CHECK_INT(n2); @@ -8984,18 +9209,18 @@ SEXP R_igraph_bipartite_game_gnp(SEXP n1, SEXP n2, SEXP p, SEXP directed, SEXP m c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bipartite_game_gnp(&c_graph, &c_types, c_n1, c_n2, c_p, c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_bipartite_game_gnp(&c_graph, &c_types, c_n1, c_n2, c_p, c_directed, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_bool_to_SEXP(&c_types)); igraph_vector_bool_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -9023,9 +9248,10 @@ SEXP R_igraph_bipartite_game_gnm(SEXP n1, SEXP n2, SEXP m, SEXP directed, SEXP m SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_types); IGRAPH_R_CHECK_INT(n1); c_n1 = (igraph_integer_t) REAL(n1)[0]; IGRAPH_R_CHECK_INT(n2); @@ -9036,18 +9262,18 @@ SEXP R_igraph_bipartite_game_gnm(SEXP n1, SEXP n2, SEXP m, SEXP directed, SEXP m c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bipartite_game_gnm(&c_graph, &c_types, c_n1, c_n2, c_m, c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_bipartite_game_gnm(&c_graph, &c_types, c_n1, c_n2, c_m, c_directed, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_bool_to_SEXP(&c_types)); igraph_vector_bool_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -9077,9 +9303,10 @@ SEXP R_igraph_bipartite_game(SEXP type, SEXP n1, SEXP n2, SEXP p, SEXP m, SEXP d SEXP types; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_bool_init(&c_types, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &c_types); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&c_types, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &c_types); c_type = (igraph_erdos_renyi_t) Rf_asInteger(type); IGRAPH_R_CHECK_INT(n1); c_n1 = (igraph_integer_t) REAL(n1)[0]; @@ -9093,18 +9320,18 @@ SEXP R_igraph_bipartite_game(SEXP type, SEXP n1, SEXP n2, SEXP p, SEXP m, SEXP d c_directed = LOGICAL(directed)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bipartite_game(&c_graph, &c_types, c_type, c_n1, c_n2, c_p, c_m, c_directed, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_bipartite_game(&c_graph, &c_types, c_type, c_n1, c_n2, c_p, c_m, c_directed, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(types=Ry_igraph_vector_bool_to_SEXP(&c_types)); igraph_vector_bool_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, types); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -9129,22 +9356,23 @@ SEXP R_igraph_get_laplacian(SEXP graph, SEXP mode, SEXP normalization, SEXP weig SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); c_normalization = (igraph_laplacian_normalization_t) Rf_asInteger(normalization); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_laplacian(&c_graph, &c_res, c_mode, c_normalization, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_get_laplacian(&c_graph, &c_res, c_mode, c_normalization, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9164,22 +9392,23 @@ SEXP R_igraph_get_laplacian_sparse(SEXP graph, SEXP mode, SEXP normalization, SE SEXP sparseres; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_sparsemat_init(&c_sparseres, 0, 0, 0)); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_sparseres); + IGRAPH_LOCAL_R_CHECK(igraph_sparsemat_init(&c_sparseres, 0, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_sparseres); c_mode = (igraph_neimode_t) Rf_asInteger(mode); c_normalization = (igraph_laplacian_normalization_t) Rf_asInteger(normalization); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_laplacian_sparse(&c_graph, &c_sparseres, c_mode, c_normalization, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_get_laplacian_sparse(&c_graph, &c_sparseres, c_mode, c_normalization, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(sparseres=Ry_igraph_sparsemat_to_SEXP(&c_sparseres)); igraph_sparsemat_destroy(&c_sparseres); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = sparseres; UNPROTECT(1); @@ -9201,26 +9430,27 @@ SEXP R_igraph_connected_components(SEXP graph, SEXP mode) { SEXP no; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_csize, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_csize); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_csize, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_csize); c_no=0; c_mode = (igraph_connectedness_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_connected_components(&c_graph, &c_membership, &c_csize, &c_no, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_connected_components(&c_graph, &c_membership, &c_csize, &c_no, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(csize=Ry_igraph_vector_int_to_SEXP(&c_csize)); igraph_vector_int_destroy(&c_csize); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(no=NEW_NUMERIC(1)); REAL(no)[0]=(double) c_no; SET_VECTOR_ELT(r_result, 0, membership); @@ -9247,11 +9477,12 @@ SEXP R_igraph_is_connected(SEXP graph, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_connectedness_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_connected(&c_graph, &c_res, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_is_connected(&c_graph, &c_res, c_mode)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -9275,22 +9506,23 @@ SEXP R_igraph_decompose(SEXP graph, SEXP mode, SEXP maxcompno, SEXP minelements) SEXP components; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_graph_list_init(&c_components, 0)); - IGRAPH_FINALLY(igraph_graph_list_destroy, &c_components); + IGRAPH_LOCAL_R_CHECK(igraph_graph_list_init(&c_components, 0)); + IGRAPH_LOCAL_FINALLY(igraph_graph_list_destroy, &c_components); c_mode = (igraph_connectedness_t) Rf_asInteger(mode); IGRAPH_R_CHECK_INT(maxcompno); c_maxcompno = (igraph_integer_t) REAL(maxcompno)[0]; IGRAPH_R_CHECK_INT(minelements); c_minelements = (igraph_integer_t) REAL(minelements)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_decompose(&c_graph, &c_components, c_mode, c_maxcompno, c_minelements)); + IGRAPH_LOCAL_R_CHECK(igraph_decompose(&c_graph, &c_components, c_mode, c_maxcompno, c_minelements)); /* Convert output */ PROTECT(components=Ry_igraph_graphlist_to_SEXP(&c_components)); IGRAPH_FREE(c_components.stor_begin); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = components; UNPROTECT(1); @@ -9307,17 +9539,18 @@ SEXP R_igraph_articulation_points(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_articulation_points(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_articulation_points(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9342,19 +9575,20 @@ SEXP R_igraph_biconnected_components(SEXP graph) { SEXP articulation_points; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_no=0; - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_tree_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_tree_edges); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_component_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_component_edges); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_components, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_components); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_articulation_points, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_articulation_points); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_tree_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_tree_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_component_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_component_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_components, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_components); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_articulation_points, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_articulation_points); /* Call igraph */ - IGRAPH_R_CHECK(igraph_biconnected_components(&c_graph, &c_no, &c_tree_edges, &c_component_edges, &c_components, &c_articulation_points)); + IGRAPH_LOCAL_R_CHECK(igraph_biconnected_components(&c_graph, &c_no, &c_tree_edges, &c_component_edges, &c_components, &c_articulation_points)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); @@ -9363,16 +9597,16 @@ SEXP R_igraph_biconnected_components(SEXP graph) { REAL(no)[0]=(double) c_no; PROTECT(tree_edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_tree_edges)); igraph_vector_int_list_destroy(&c_tree_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(component_edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_component_edges)); igraph_vector_int_list_destroy(&c_component_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(components=Ry_igraph_vector_int_list_to_SEXPp1(&c_components)); igraph_vector_int_list_destroy(&c_components); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(articulation_points=Ry_igraph_vector_int_to_SEXPp1(&c_articulation_points)); igraph_vector_int_destroy(&c_articulation_points); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, no); SET_VECTOR_ELT(r_result, 1, tree_edges); SET_VECTOR_ELT(r_result, 2, component_edges); @@ -9400,17 +9634,18 @@ SEXP R_igraph_bridges(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bridges(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_bridges(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9427,10 +9662,11 @@ SEXP R_igraph_is_biconnected(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_biconnected(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_biconnected(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -9452,18 +9688,19 @@ SEXP R_igraph_count_reachable(SEXP graph, SEXP mode) { SEXP counts; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_counts, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_counts); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_counts, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_counts); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_reachable(&c_graph, &c_counts, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_count_reachable(&c_graph, &c_counts, c_mode)); /* Convert output */ PROTECT(counts=Ry_igraph_vector_int_to_SEXP(&c_counts)); igraph_vector_int_destroy(&c_counts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = counts; UNPROTECT(1); @@ -9483,33 +9720,34 @@ SEXP R_igraph_bond_percolation(SEXP graph, SEXP edge_order) { SEXP vetex_count; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_giant_size); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vetex_count, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vetex_count); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_giant_size); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vetex_count, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vetex_count); if (!Rf_isNull(edge_order)) { Rz_SEXP_to_vector_int_copy(edge_order, &c_edge_order); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_order); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_order); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_order); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_bond_percolation(&c_graph, &c_giant_size, &c_vetex_count, (Rf_isNull(edge_order) ? 0 : &c_edge_order))); + IGRAPH_LOCAL_R_CHECK(igraph_bond_percolation(&c_graph, &c_giant_size, &c_vetex_count, (Rf_isNull(edge_order) ? 0 : &c_edge_order))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(giant_size=Ry_igraph_vector_int_to_SEXP(&c_giant_size)); igraph_vector_int_destroy(&c_giant_size); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vetex_count=Ry_igraph_vector_int_to_SEXP(&c_vetex_count)); igraph_vector_int_destroy(&c_vetex_count); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, giant_size); SET_VECTOR_ELT(r_result, 1, vetex_count); SET_STRING_ELT(r_names, 0, Rf_mkChar("giant_size")); @@ -9534,33 +9772,34 @@ SEXP R_igraph_site_percolation(SEXP graph, SEXP vertex_order) { SEXP edge_count; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_giant_size); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_count, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_count); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_giant_size); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_count, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_count); if (!Rf_isNull(vertex_order)) { Rz_SEXP_to_vector_int_copy(vertex_order, &c_vertex_order); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_order); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_order); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_order); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_site_percolation(&c_graph, &c_giant_size, &c_edge_count, (Rf_isNull(vertex_order) ? 0 : &c_vertex_order))); + IGRAPH_LOCAL_R_CHECK(igraph_site_percolation(&c_graph, &c_giant_size, &c_edge_count, (Rf_isNull(vertex_order) ? 0 : &c_vertex_order))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(giant_size=Ry_igraph_vector_int_to_SEXP(&c_giant_size)); igraph_vector_int_destroy(&c_giant_size); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_count=Ry_igraph_vector_int_to_SEXP(&c_edge_count)); igraph_vector_int_destroy(&c_edge_count); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, giant_size); SET_VECTOR_ELT(r_result, 1, edge_count); SET_STRING_ELT(r_names, 0, Rf_mkChar("giant_size")); @@ -9584,15 +9823,16 @@ SEXP R_igraph_edgelist_percolation(SEXP edges) { SEXP vertex_count; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector_int_copy(edges, &c_edges); IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_giant_size); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_count, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_count); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_giant_size, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_giant_size); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_count, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_count); /* Call igraph */ - IGRAPH_R_CHECK(igraph_edgelist_percolation(&c_edges, &c_giant_size, &c_vertex_count)); + IGRAPH_LOCAL_R_CHECK(igraph_edgelist_percolation(&c_edges, &c_giant_size, &c_vertex_count)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -9601,10 +9841,10 @@ SEXP R_igraph_edgelist_percolation(SEXP edges) { IGRAPH_FINALLY_CLEAN(1); PROTECT(giant_size=Ry_igraph_vector_int_to_SEXP(&c_giant_size)); igraph_vector_int_destroy(&c_giant_size); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_count=Ry_igraph_vector_int_to_SEXP(&c_vertex_count)); igraph_vector_int_destroy(&c_vertex_count); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, giant_size); SET_VECTOR_ELT(r_result, 1, vertex_count); SET_STRING_ELT(r_names, 0, Rf_mkChar("giant_size")); @@ -9628,6 +9868,7 @@ SEXP R_igraph_is_clique(SEXP graph, SEXP candidate, SEXP directed) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_candidate_data; @@ -9635,7 +9876,7 @@ SEXP R_igraph_is_clique(SEXP graph, SEXP candidate, SEXP directed) { IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_clique(&c_graph, c_candidate, c_directed, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_clique(&c_graph, c_candidate, c_directed, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_candidate_data); @@ -9660,21 +9901,22 @@ SEXP R_igraph_cliques(SEXP graph, SEXP min_size, SEXP max_size) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); IGRAPH_R_CHECK_INT(min_size); c_min_size = (igraph_integer_t) REAL(min_size)[0]; IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_cliques(&c_graph, &c_res, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_cliques(&c_graph, &c_res, c_min_size, c_max_size)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9693,21 +9935,22 @@ SEXP R_igraph_clique_size_hist(SEXP graph, SEXP min_size, SEXP max_size) { SEXP hist; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_hist, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_hist); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_hist, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_hist); IGRAPH_R_CHECK_INT(min_size); c_min_size = (igraph_integer_t) REAL(min_size)[0]; IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_clique_size_hist(&c_graph, &c_hist, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_clique_size_hist(&c_graph, &c_hist, c_min_size, c_max_size)); /* Convert output */ PROTECT(hist=Ry_igraph_vector_to_SEXP(&c_hist)); igraph_vector_destroy(&c_hist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hist; UNPROTECT(1); @@ -9724,17 +9967,18 @@ SEXP R_igraph_largest_cliques(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_largest_cliques(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_largest_cliques(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9753,21 +9997,22 @@ SEXP R_igraph_maximal_cliques(SEXP graph, SEXP min_size, SEXP max_size) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); IGRAPH_R_CHECK_INT(min_size); c_min_size = (igraph_integer_t) REAL(min_size)[0]; IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques(&c_graph, &c_res, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques(&c_graph, &c_res, c_min_size, c_max_size)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9790,12 +10035,13 @@ SEXP R_igraph_maximal_cliques_subset(SEXP graph, SEXP subset, SEXP outfile, SEXP SEXP no; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_int_copy(subset, &c_subset); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_subset); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_subset); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); c_no=0; if (!Rf_isNull(outfile)) { c_outfile = Ry_igraph_fopen_write(outfile); @@ -9806,16 +10052,16 @@ SEXP R_igraph_maximal_cliques_subset(SEXP graph, SEXP subset, SEXP outfile, SEXP IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques_subset(&c_graph, &c_subset, &c_res, &c_no, (Rf_isNull(outfile) ? 0 : c_outfile), c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques_subset(&c_graph, &c_subset, &c_res, &c_no, (Rf_isNull(outfile) ? 0 : c_outfile), c_min_size, c_max_size)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_vector_int_destroy(&c_subset); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(no=NEW_NUMERIC(1)); REAL(no)[0]=(double) c_no; SET_VECTOR_ELT(r_result, 0, res); @@ -9841,6 +10087,7 @@ SEXP R_igraph_maximal_cliques_count(SEXP graph, SEXP min_size, SEXP max_size) { SEXP no; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_no=0; @@ -9849,7 +10096,7 @@ SEXP R_igraph_maximal_cliques_count(SEXP graph, SEXP min_size, SEXP max_size) { IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques_count(&c_graph, &c_no, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques_count(&c_graph, &c_no, c_min_size, c_max_size)); /* Convert output */ PROTECT(no=NEW_NUMERIC(1)); @@ -9870,6 +10117,7 @@ SEXP R_igraph_maximal_cliques_file(SEXP graph, SEXP res, SEXP min_size, SEXP max igraph_integer_t c_min_size; igraph_integer_t c_max_size; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res = Ry_igraph_fopen_write(res); @@ -9879,7 +10127,7 @@ SEXP R_igraph_maximal_cliques_file(SEXP graph, SEXP res, SEXP min_size, SEXP max IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques_file(&c_graph, c_res, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques_file(&c_graph, c_res, c_min_size, c_max_size)); /* Convert output */ @@ -9900,21 +10148,22 @@ SEXP R_igraph_maximal_cliques_hist(SEXP graph, SEXP min_size, SEXP max_size) { SEXP hist; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_hist, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_hist); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_hist, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_hist); IGRAPH_R_CHECK_INT(min_size); c_min_size = (igraph_integer_t) REAL(min_size)[0]; IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques_hist(&c_graph, &c_hist, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques_hist(&c_graph, &c_hist, c_min_size, c_max_size)); /* Convert output */ PROTECT(hist=Ry_igraph_vector_to_SEXP(&c_hist)); igraph_vector_destroy(&c_hist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hist; UNPROTECT(1); @@ -9931,11 +10180,12 @@ SEXP R_igraph_clique_number(SEXP graph) { SEXP no; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_no=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_clique_number(&c_graph, &c_no)); + IGRAPH_LOCAL_R_CHECK(igraph_clique_number(&c_graph, &c_no)); /* Convert output */ PROTECT(no=NEW_NUMERIC(1)); @@ -9960,13 +10210,14 @@ SEXP R_igraph_weighted_cliques(SEXP graph, SEXP vertex_weights, SEXP min_weight, SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(vertex_weights)) { Rz_SEXP_to_vector(vertex_weights, &c_vertex_weights); } - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); IGRAPH_R_CHECK_REAL(min_weight); c_min_weight = REAL(min_weight)[0]; IGRAPH_R_CHECK_REAL(max_weight); @@ -9974,12 +10225,12 @@ SEXP R_igraph_weighted_cliques(SEXP graph, SEXP vertex_weights, SEXP min_weight, IGRAPH_R_CHECK_BOOL(maximal); c_maximal = LOGICAL(maximal)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_weighted_cliques(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res, c_min_weight, c_max_weight, c_maximal)); + IGRAPH_LOCAL_R_CHECK(igraph_weighted_cliques(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res, c_min_weight, c_max_weight, c_maximal)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -9997,20 +10248,21 @@ SEXP R_igraph_largest_weighted_cliques(SEXP graph, SEXP vertex_weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(vertex_weights)) { Rz_SEXP_to_vector(vertex_weights, &c_vertex_weights); } - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_largest_weighted_cliques(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_largest_weighted_cliques(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10028,13 +10280,14 @@ SEXP R_igraph_weighted_clique_number(SEXP graph, SEXP vertex_weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(vertex_weights)) { Rz_SEXP_to_vector(vertex_weights, &c_vertex_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_weighted_clique_number(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_weighted_clique_number(&c_graph, (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -10056,12 +10309,13 @@ SEXP R_igraph_is_independent_vertex_set(SEXP graph, SEXP candidate) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_candidate_data; Rz_SEXP_to_igraph_vs(candidate, &c_graph, &c_candidate, &c_candidate_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_independent_vertex_set(&c_graph, c_candidate, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_independent_vertex_set(&c_graph, c_candidate, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_candidate_data); @@ -10086,21 +10340,22 @@ SEXP R_igraph_independent_vertex_sets(SEXP graph, SEXP min_size, SEXP max_size) SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); IGRAPH_R_CHECK_INT(min_size); c_min_size = (igraph_integer_t) REAL(min_size)[0]; IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_independent_vertex_sets(&c_graph, &c_res, c_min_size, c_max_size)); + IGRAPH_LOCAL_R_CHECK(igraph_independent_vertex_sets(&c_graph, &c_res, c_min_size, c_max_size)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10117,17 +10372,18 @@ SEXP R_igraph_largest_independent_vertex_sets(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_largest_independent_vertex_sets(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_largest_independent_vertex_sets(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10144,17 +10400,18 @@ SEXP R_igraph_maximal_independent_vertex_sets(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_independent_vertex_sets(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_independent_vertex_sets(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_list_to_SEXPp1(&c_res)); igraph_vector_int_list_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10171,11 +10428,12 @@ SEXP R_igraph_independence_number(SEXP graph) { SEXP no; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_no=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_independence_number(&c_graph, &c_no)); + IGRAPH_LOCAL_R_CHECK(igraph_independence_number(&c_graph, &c_no)); /* Convert output */ PROTECT(no=NEW_NUMERIC(1)); @@ -10196,17 +10454,18 @@ SEXP R_igraph_layout_random(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_random(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_random(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10224,19 +10483,20 @@ SEXP R_igraph_layout_circle(SEXP graph, SEXP order) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_order_data; Rz_SEXP_to_igraph_vs(order, &c_graph, &c_order, &c_order_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_circle(&c_graph, &c_res, c_order)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_circle(&c_graph, &c_res, c_order)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_order_data); igraph_vs_destroy(&c_order); r_result = res; @@ -10257,27 +10517,28 @@ SEXP R_igraph_layout_star(SEXP graph, SEXP center, SEXP order) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); c_center = (igraph_integer_t) REAL(center)[0]; if (!Rf_isNull(order)) { Rz_SEXP_to_vector_int_copy(order, &c_order); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_star(&c_graph, &c_res, c_center, (Rf_isNull(order) ? 0 : &c_order))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_star(&c_graph, &c_res, c_center, (Rf_isNull(order) ? 0 : &c_order))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10295,19 +10556,20 @@ SEXP R_igraph_layout_grid(SEXP graph, SEXP width) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_INT(width); c_width = (igraph_integer_t) REAL(width)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_grid(&c_graph, &c_res, c_width)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_grid(&c_graph, &c_res, c_width)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10326,21 +10588,22 @@ SEXP R_igraph_layout_grid_3d(SEXP graph, SEXP width, SEXP height) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_INT(width); c_width = (igraph_integer_t) REAL(width)[0]; IGRAPH_R_CHECK_INT(height); c_height = (igraph_integer_t) REAL(height)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_grid_3d(&c_graph, &c_res, c_width, c_height)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_grid_3d(&c_graph, &c_res, c_width, c_height)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10369,11 +10632,12 @@ SEXP R_igraph_layout_fruchterman_reingold(SEXP graph, SEXP coords, SEXP use_seed SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(coords)) { - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_coords); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_coords); } IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; @@ -10398,12 +10662,12 @@ SEXP R_igraph_layout_fruchterman_reingold(SEXP graph, SEXP coords, SEXP use_seed Rz_SEXP_to_vector(maxy, &c_maxy); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_fruchterman_reingold(&c_graph, &c_coords, c_use_seed, c_niter, c_start_temp, c_grid, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_fruchterman_reingold(&c_graph, &c_coords, c_use_seed, c_niter, c_start_temp, c_grid, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy))); /* Convert output */ PROTECT(coords=Ry_igraph_matrix_to_SEXP(&c_coords)); igraph_matrix_destroy(&c_coords); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = coords; UNPROTECT(1); @@ -10428,10 +10692,11 @@ SEXP R_igraph_layout_kamada_kawai(SEXP graph, SEXP coords, SEXP use_seed, SEXP m igraph_vector_t c_maxy; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_coords); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_coords); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; IGRAPH_R_CHECK_INT(maxiter); @@ -10456,12 +10721,12 @@ SEXP R_igraph_layout_kamada_kawai(SEXP graph, SEXP coords, SEXP use_seed, SEXP m Rz_SEXP_to_vector(maxy, &c_maxy); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_kamada_kawai(&c_graph, &c_coords, c_use_seed, c_maxiter, c_epsilon, c_kkconst, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_kamada_kawai(&c_graph, &c_coords, c_use_seed, c_maxiter, c_epsilon, c_kkconst, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy))); /* Convert output */ PROTECT(coords=Ry_igraph_matrix_to_SEXP(&c_coords)); igraph_matrix_destroy(&c_coords); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = coords; UNPROTECT(1); @@ -10485,10 +10750,11 @@ SEXP R_igraph_layout_lgl(SEXP graph, SEXP maxiter, SEXP maxdelta, SEXP area, SEX SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_INT(maxiter); c_maxiter = (igraph_integer_t) REAL(maxiter)[0]; IGRAPH_R_CHECK_REAL(maxdelta); @@ -10504,12 +10770,12 @@ SEXP R_igraph_layout_lgl(SEXP graph, SEXP maxiter, SEXP maxdelta, SEXP area, SEX IGRAPH_R_CHECK_INT(root); c_root = (igraph_integer_t) REAL(root)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_lgl(&c_graph, &c_res, c_maxiter, c_maxdelta, c_area, c_coolexp, c_repulserad, c_cellsize, c_root)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_lgl(&c_graph, &c_res, c_maxiter, c_maxdelta, c_area, c_coolexp, c_repulserad, c_cellsize, c_root)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10529,36 +10795,37 @@ SEXP R_igraph_layout_reingold_tilford(SEXP graph, SEXP mode, SEXP roots, SEXP ro SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); if (!Rf_isNull(roots)) { Rz_SEXP_to_vector_int_copy(roots, &c_roots); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_roots, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_roots, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } if (!Rf_isNull(rootlevel)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(rootlevel, &c_rootlevel)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_rootlevel); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(rootlevel, &c_rootlevel)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_rootlevel); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_rootlevel, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_rootlevel); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_rootlevel, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_rootlevel); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_reingold_tilford(&c_graph, &c_res, c_mode, (Rf_isNull(roots) ? 0 : &c_roots), (Rf_isNull(rootlevel) ? 0 : &c_rootlevel))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_reingold_tilford(&c_graph, &c_res, c_mode, (Rf_isNull(roots) ? 0 : &c_roots), (Rf_isNull(rootlevel) ? 0 : &c_rootlevel))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_rootlevel); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10578,36 +10845,37 @@ SEXP R_igraph_layout_reingold_tilford_circular(SEXP graph, SEXP mode, SEXP roots SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); c_mode = (igraph_neimode_t) Rf_asInteger(mode); if (!Rf_isNull(roots)) { Rz_SEXP_to_vector_int_copy(roots, &c_roots); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_roots, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_roots, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } if (!Rf_isNull(rootlevel)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(rootlevel, &c_rootlevel)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_rootlevel); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(rootlevel, &c_rootlevel)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_rootlevel); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_rootlevel, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_rootlevel); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_rootlevel, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_rootlevel); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_reingold_tilford_circular(&c_graph, &c_res, c_mode, (Rf_isNull(roots) ? 0 : &c_roots), (Rf_isNull(rootlevel) ? 0 : &c_rootlevel))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_reingold_tilford_circular(&c_graph, &c_res, c_mode, (Rf_isNull(roots) ? 0 : &c_roots), (Rf_isNull(rootlevel) ? 0 : &c_rootlevel))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_rootlevel); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10626,19 +10894,20 @@ SEXP R_igraph_roots_for_tree_layout(SEXP graph, SEXP mode, SEXP heuristic) { SEXP roots; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_neimode_t) Rf_asInteger(mode); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_roots, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_roots, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); c_heuristic = (igraph_root_choice_t) Rf_asInteger(heuristic); /* Call igraph */ - IGRAPH_R_CHECK(igraph_roots_for_tree_layout(&c_graph, c_mode, &c_roots, c_heuristic)); + IGRAPH_LOCAL_R_CHECK(igraph_roots_for_tree_layout(&c_graph, c_mode, &c_roots, c_heuristic)); /* Convert output */ PROTECT(roots=Ry_igraph_vector_int_to_SEXPp1(&c_roots)); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = roots; UNPROTECT(1); @@ -10655,17 +10924,18 @@ SEXP R_igraph_layout_random_3d(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_random_3d(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_random_3d(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10682,17 +10952,18 @@ SEXP R_igraph_layout_sphere(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_sphere(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_sphere(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10722,11 +10993,12 @@ SEXP R_igraph_layout_fruchterman_reingold_3d(SEXP graph, SEXP coords, SEXP use_s SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(coords)) { - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_coords); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_coords); } IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; @@ -10756,12 +11028,12 @@ SEXP R_igraph_layout_fruchterman_reingold_3d(SEXP graph, SEXP coords, SEXP use_s Rz_SEXP_to_vector(maxz, &c_maxz); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_fruchterman_reingold_3d(&c_graph, &c_coords, c_use_seed, c_niter, c_start_temp, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy), (Rf_isNull(minz) ? 0 : &c_minz), (Rf_isNull(maxz) ? 0 : &c_maxz))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_fruchterman_reingold_3d(&c_graph, &c_coords, c_use_seed, c_niter, c_start_temp, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy), (Rf_isNull(minz) ? 0 : &c_minz), (Rf_isNull(maxz) ? 0 : &c_maxz))); /* Convert output */ PROTECT(coords=Ry_igraph_matrix_to_SEXP(&c_coords)); igraph_matrix_destroy(&c_coords); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = coords; UNPROTECT(1); @@ -10788,10 +11060,11 @@ SEXP R_igraph_layout_kamada_kawai_3d(SEXP graph, SEXP coords, SEXP use_seed, SEX igraph_vector_t c_maxz; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_coords); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(coords, &c_coords)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_coords); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; IGRAPH_R_CHECK_INT(maxiter); @@ -10822,12 +11095,12 @@ SEXP R_igraph_layout_kamada_kawai_3d(SEXP graph, SEXP coords, SEXP use_seed, SEX Rz_SEXP_to_vector(maxz, &c_maxz); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_kamada_kawai_3d(&c_graph, &c_coords, c_use_seed, c_maxiter, c_epsilon, c_kkconst, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy), (Rf_isNull(minz) ? 0 : &c_minz), (Rf_isNull(maxz) ? 0 : &c_maxz))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_kamada_kawai_3d(&c_graph, &c_coords, c_use_seed, c_maxiter, c_epsilon, c_kkconst, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(minx) ? 0 : &c_minx), (Rf_isNull(maxx) ? 0 : &c_maxx), (Rf_isNull(miny) ? 0 : &c_miny), (Rf_isNull(maxy) ? 0 : &c_maxy), (Rf_isNull(minz) ? 0 : &c_minz), (Rf_isNull(maxz) ? 0 : &c_maxz))); /* Convert output */ PROTECT(coords=Ry_igraph_matrix_to_SEXP(&c_coords)); igraph_matrix_destroy(&c_coords); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = coords; UNPROTECT(1); @@ -10850,10 +11123,11 @@ SEXP R_igraph_layout_graphopt(SEXP graph, SEXP res, SEXP niter, SEXP node_charge igraph_bool_t c_use_seed; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_INT(niter); c_niter = (igraph_integer_t) REAL(niter)[0]; IGRAPH_R_CHECK_REAL(node_charge); @@ -10869,12 +11143,12 @@ SEXP R_igraph_layout_graphopt(SEXP graph, SEXP res, SEXP niter, SEXP node_charge IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_graphopt(&c_graph, &c_res, c_niter, c_node_charge, c_node_mass, c_spring_length, c_spring_constant, c_max_sa_movement, c_use_seed)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_graphopt(&c_graph, &c_res, c_niter, c_node_charge, c_node_mass, c_spring_length, c_spring_constant, c_max_sa_movement, c_use_seed)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10893,10 +11167,11 @@ SEXP R_igraph_layout_drl(SEXP graph, SEXP res, SEXP use_seed, SEXP options, SEXP igraph_vector_t c_weights; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; Rz_SEXP_to_igraph_layout_drl_options(options, &c_options); @@ -10904,12 +11179,12 @@ SEXP R_igraph_layout_drl(SEXP graph, SEXP res, SEXP use_seed, SEXP options, SEXP Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_drl(&c_graph, &c_res, c_use_seed, &c_options, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_drl(&c_graph, &c_res, c_use_seed, &c_options, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10928,10 +11203,11 @@ SEXP R_igraph_layout_drl_3d(SEXP graph, SEXP res, SEXP use_seed, SEXP options, S igraph_vector_t c_weights; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; Rz_SEXP_to_igraph_layout_drl_options(options, &c_options); @@ -10939,12 +11215,12 @@ SEXP R_igraph_layout_drl_3d(SEXP graph, SEXP res, SEXP use_seed, SEXP options, S Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_drl_3d(&c_graph, &c_res, c_use_seed, &c_options, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_drl_3d(&c_graph, &c_res, c_use_seed, &c_options, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -10962,22 +11238,23 @@ SEXP R_igraph_layout_merge_dla(SEXP graphs, SEXP coords) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ igraph_t *c_graphs_storage; - IGRAPH_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &c_graphs); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &c_graphs); Ry_igraph_SEXP_to_matrixlist(coords, &c_coords); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_merge_dla(&c_graphs, &c_coords, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_merge_dla(&c_graphs, &c_coords, &c_res)); /* Convert output */ igraph_vector_ptr_destroy(&c_graphs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11003,18 +11280,19 @@ SEXP R_igraph_layout_sugiyama(SEXP graph, SEXP layers, SEXP hgap, SEXP vgap, SEX SEXP extd_to_orig_eids; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_extd_to_orig_eids, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_extd_to_orig_eids); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_extd_to_orig_eids, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_extd_to_orig_eids); if (!Rf_isNull(layers)) { Rz_SEXP_to_vector_int_copy(layers, &c_layers); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_layers); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_layers); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_layers, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_layers); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_layers, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_layers); } IGRAPH_R_CHECK_REAL(hgap); c_hgap = REAL(hgap)[0]; @@ -11026,23 +11304,23 @@ SEXP R_igraph_layout_sugiyama(SEXP graph, SEXP layers, SEXP hgap, SEXP vgap, SEX Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_sugiyama(&c_graph, &c_res, &c_extd_graph, &c_extd_to_orig_eids, (Rf_isNull(layers) ? 0 : &c_layers), c_hgap, c_vgap, c_maxiter, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_layout_sugiyama(&c_graph, &c_res, &c_extd_graph, &c_extd_to_orig_eids, (Rf_isNull(layers) ? 0 : &c_layers), c_hgap, c_vgap, c_maxiter, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_extd_graph); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_extd_graph); PROTECT(extd_graph=Ry_igraph_to_SEXP(&c_extd_graph)); IGRAPH_I_DESTROY(&c_extd_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(extd_to_orig_eids=Ry_igraph_vector_int_to_SEXPp1(&c_extd_to_orig_eids)); igraph_vector_int_destroy(&c_extd_to_orig_eids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_layers); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, extd_graph); SET_VECTOR_ELT(r_result, 2, extd_to_orig_eids); @@ -11068,22 +11346,23 @@ SEXP R_igraph_layout_mds(SEXP graph, SEXP dist, SEXP dim) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); if (!Rf_isNull(dist)) { Rz_SEXP_to_matrix(dist, &c_dist); } IGRAPH_R_CHECK_INT(dim); c_dim = (igraph_integer_t) REAL(dim)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_mds(&c_graph, &c_res, (Rf_isNull(dist) ? 0 : &c_dist), c_dim)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_mds(&c_graph, &c_res, (Rf_isNull(dist) ? 0 : &c_dist), c_dim)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11104,11 +11383,12 @@ SEXP R_igraph_layout_bipartite(SEXP graph, SEXP types, SEXP hgap, SEXP vgap, SEX SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_REAL(hgap); c_hgap = REAL(hgap)[0]; IGRAPH_R_CHECK_REAL(vgap); @@ -11116,12 +11396,12 @@ SEXP R_igraph_layout_bipartite(SEXP graph, SEXP types, SEXP hgap, SEXP vgap, SEX IGRAPH_R_CHECK_INT(maxiter); c_maxiter = (igraph_integer_t) REAL(maxiter)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_bipartite(&c_graph, &c_types, &c_res, c_hgap, c_vgap, c_maxiter)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_bipartite(&c_graph, &c_types, &c_res, c_hgap, c_vgap, c_maxiter)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11142,10 +11422,11 @@ SEXP R_igraph_layout_gem(SEXP graph, SEXP res, SEXP use_seed, SEXP maxiter, SEXP igraph_real_t c_temp_init; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; IGRAPH_R_CHECK_INT(maxiter); @@ -11157,12 +11438,12 @@ SEXP R_igraph_layout_gem(SEXP graph, SEXP res, SEXP use_seed, SEXP maxiter, SEXP IGRAPH_R_CHECK_REAL(temp_init); c_temp_init = REAL(temp_init)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_gem(&c_graph, &c_res, c_use_seed, c_maxiter, c_temp_max, c_temp_min, c_temp_init)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_gem(&c_graph, &c_res, c_use_seed, c_maxiter, c_temp_max, c_temp_min, c_temp_init)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11187,10 +11468,11 @@ SEXP R_igraph_layout_davidson_harel(SEXP graph, SEXP res, SEXP use_seed, SEXP ma igraph_real_t c_weight_node_edge_dist; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; IGRAPH_R_CHECK_INT(maxiter); @@ -11210,12 +11492,12 @@ SEXP R_igraph_layout_davidson_harel(SEXP graph, SEXP res, SEXP use_seed, SEXP ma IGRAPH_R_CHECK_REAL(weight_node_edge_dist); c_weight_node_edge_dist = REAL(weight_node_edge_dist)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_davidson_harel(&c_graph, &c_res, c_use_seed, c_maxiter, c_fineiter, c_cool_fact, c_weight_node_dist, c_weight_border, c_weight_edge_lengths, c_weight_edge_crossings, c_weight_node_edge_dist)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_davidson_harel(&c_graph, &c_res, c_use_seed, c_maxiter, c_fineiter, c_cool_fact, c_weight_node_dist, c_weight_border, c_weight_edge_lengths, c_weight_edge_crossings, c_weight_node_edge_dist)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11236,10 +11518,11 @@ SEXP R_igraph_layout_umap(SEXP graph, SEXP res, SEXP use_seed, SEXP distances, S igraph_bool_t c_distances_are_weights; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; if (!Rf_isNull(distances)) { @@ -11252,12 +11535,12 @@ SEXP R_igraph_layout_umap(SEXP graph, SEXP res, SEXP use_seed, SEXP distances, S IGRAPH_R_CHECK_BOOL(distances_are_weights); c_distances_are_weights = LOGICAL(distances_are_weights)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_umap(&c_graph, &c_res, c_use_seed, (Rf_isNull(distances) ? 0 : &c_distances), c_min_dist, c_epochs, c_distances_are_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_umap(&c_graph, &c_res, c_use_seed, (Rf_isNull(distances) ? 0 : &c_distances), c_min_dist, c_epochs, c_distances_are_weights)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11278,10 +11561,11 @@ SEXP R_igraph_layout_umap_3d(SEXP graph, SEXP res, SEXP use_seed, SEXP distances igraph_bool_t c_distances_are_weights; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(res, &c_res)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(use_seed); c_use_seed = LOGICAL(use_seed)[0]; if (!Rf_isNull(distances)) { @@ -11294,12 +11578,12 @@ SEXP R_igraph_layout_umap_3d(SEXP graph, SEXP res, SEXP use_seed, SEXP distances IGRAPH_R_CHECK_BOOL(distances_are_weights); c_distances_are_weights = LOGICAL(distances_are_weights)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_umap_3d(&c_graph, &c_res, c_use_seed, (Rf_isNull(distances) ? 0 : &c_distances), c_min_dist, c_epochs, c_distances_are_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_umap_3d(&c_graph, &c_res, c_use_seed, (Rf_isNull(distances) ? 0 : &c_distances), c_min_dist, c_epochs, c_distances_are_weights)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11316,18 +11600,19 @@ SEXP R_igraph_layout_umap_compute_weights(SEXP graph, SEXP distances, SEXP weigh igraph_vector_t c_weights; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(distances, &c_distances); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(weights, &c_weights)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_weights); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(weights, &c_weights)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_weights); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_umap_compute_weights(&c_graph, &c_distances, &c_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_umap_compute_weights(&c_graph, &c_distances, &c_weights)); /* Convert output */ PROTECT(weights=Ry_igraph_vector_to_SEXP(&c_weights)); igraph_vector_destroy(&c_weights); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = weights; UNPROTECT(1); @@ -11343,17 +11628,18 @@ SEXP R_igraph_layout_align(SEXP graph, SEXP layout) { igraph_matrix_t c_layout; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(layout, &c_layout)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_layout); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(layout, &c_layout)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_layout); /* Call igraph */ - IGRAPH_R_CHECK(igraph_layout_align(&c_graph, &c_layout)); + IGRAPH_LOCAL_R_CHECK(igraph_layout_align(&c_graph, &c_layout)); /* Convert output */ PROTECT(layout=Ry_igraph_matrix_to_SEXP(&c_layout)); igraph_matrix_destroy(&c_layout); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = layout; UNPROTECT(1); @@ -11371,19 +11657,20 @@ SEXP R_igraph_cocitation(SEXP graph, SEXP vids) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_cocitation(&c_graph, &c_res, c_vids)); + IGRAPH_LOCAL_R_CHECK(igraph_cocitation(&c_graph, &c_res, c_vids)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -11403,19 +11690,20 @@ SEXP R_igraph_bibcoupling(SEXP graph, SEXP vids) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_bibcoupling(&c_graph, &c_res, c_vids)); + IGRAPH_LOCAL_R_CHECK(igraph_bibcoupling(&c_graph, &c_res, c_vids)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -11437,22 +11725,23 @@ SEXP R_igraph_similarity_dice(SEXP graph, SEXP vids, SEXP mode, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_dice(&c_graph, &c_res, c_vids, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_dice(&c_graph, &c_res, c_vids, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -11474,22 +11763,23 @@ SEXP R_igraph_similarity_dice_es(SEXP graph, SEXP es, SEXP mode, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_dice_es(&c_graph, &c_res, c_es, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_dice_es(&c_graph, &c_res, c_es, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -11511,24 +11801,25 @@ SEXP R_igraph_similarity_dice_pairs(SEXP graph, SEXP pairs, SEXP mode, SEXP loop SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); Rz_SEXP_to_vector_int_copy(pairs, &c_pairs); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_pairs); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_pairs); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_dice_pairs(&c_graph, &c_res, &c_pairs, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_dice_pairs(&c_graph, &c_res, &c_pairs, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_pairs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11547,20 +11838,21 @@ SEXP R_igraph_similarity_inverse_log_weighted(SEXP graph, SEXP vids, SEXP mode) SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_inverse_log_weighted(&c_graph, &c_res, c_vids, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_inverse_log_weighted(&c_graph, &c_res, c_vids, c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -11582,22 +11874,23 @@ SEXP R_igraph_similarity_jaccard(SEXP graph, SEXP vids, SEXP mode, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_jaccard(&c_graph, &c_res, c_vids, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_jaccard(&c_graph, &c_res, c_vids, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -11619,22 +11912,23 @@ SEXP R_igraph_similarity_jaccard_es(SEXP graph, SEXP es, SEXP mode, SEXP loops) SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_es_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(es, &c_graph, &c_es, &c_es_data)); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_jaccard_es(&c_graph, &c_res, c_es, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_jaccard_es(&c_graph, &c_res, c_es, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_es_data); igraph_es_destroy(&c_es); r_result = res; @@ -11656,24 +11950,25 @@ SEXP R_igraph_similarity_jaccard_pairs(SEXP graph, SEXP pairs, SEXP mode, SEXP l SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); Rz_SEXP_to_vector_int_copy(pairs, &c_pairs); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_pairs); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_pairs); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_similarity_jaccard_pairs(&c_graph, &c_res, &c_pairs, c_mode, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_similarity_jaccard_pairs(&c_graph, &c_res, &c_pairs, c_mode, c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_pairs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -11692,20 +11987,21 @@ SEXP R_igraph_compare_communities(SEXP comm1, SEXP comm2, SEXP method) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(comm1, &c_comm1)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_comm1); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(comm2, &c_comm2)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_comm2); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(comm1, &c_comm1)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_comm1); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(comm2, &c_comm2)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_comm2); c_method = (igraph_community_comparison_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_compare_communities(&c_comm1, &c_comm2, &c_res, c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_compare_communities(&c_comm1, &c_comm2, &c_res, c_method)); /* Convert output */ igraph_vector_int_destroy(&c_comm1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_comm2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_NUMERIC(1)); REAL(res)[0]=c_res; r_result = res; @@ -11740,15 +12036,16 @@ SEXP R_igraph_community_spinglass(SEXP graph, SEXP weights, SEXP spins, SEXP par SEXP csize; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_csize, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_csize); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_csize, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_csize); IGRAPH_R_CHECK_INT(spins); c_spins = (igraph_integer_t) REAL(spins)[0]; IGRAPH_R_CHECK_BOOL(parupdate); @@ -11766,7 +12063,7 @@ SEXP R_igraph_community_spinglass(SEXP graph, SEXP weights, SEXP spins, SEXP par IGRAPH_R_CHECK_REAL(lambda); c_lambda = REAL(lambda)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_spinglass(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_modularity, &c_temperature, &c_membership, &c_csize, c_spins, c_parupdate, c_starttemp, c_stoptemp, c_coolfact, c_update_rule, c_gamma, c_implementation, c_lambda)); + IGRAPH_LOCAL_R_CHECK(igraph_community_spinglass(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_modularity, &c_temperature, &c_membership, &c_csize, c_spins, c_parupdate, c_starttemp, c_stoptemp, c_coolfact, c_update_rule, c_gamma, c_implementation, c_lambda)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); @@ -11777,10 +12074,10 @@ SEXP R_igraph_community_spinglass(SEXP graph, SEXP weights, SEXP spins, SEXP par REAL(temperature)[0]=c_temperature; PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(csize=Ry_igraph_vector_int_to_SEXP(&c_csize)); igraph_vector_int_destroy(&c_csize); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, modularity); SET_VECTOR_ELT(r_result, 1, temperature); SET_VECTOR_ELT(r_result, 2, membership); @@ -11819,6 +12116,7 @@ SEXP R_igraph_community_spinglass_single(SEXP graph, SEXP weights, SEXP vertex, SEXP outer_links; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -11826,8 +12124,8 @@ SEXP R_igraph_community_spinglass_single(SEXP graph, SEXP weights, SEXP vertex, } IGRAPH_R_CHECK_INT(vertex); c_vertex = (igraph_integer_t) REAL(vertex)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_community, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_community); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_community, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_community); c_inner_links=0; c_outer_links=0; IGRAPH_R_CHECK_INT(spins); @@ -11836,14 +12134,14 @@ SEXP R_igraph_community_spinglass_single(SEXP graph, SEXP weights, SEXP vertex, IGRAPH_R_CHECK_REAL(gamma); c_gamma = REAL(gamma)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_spinglass_single(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_vertex, &c_community, &c_cohesion, &c_adhesion, &c_inner_links, &c_outer_links, c_spins, c_update_rule, c_gamma)); + IGRAPH_LOCAL_R_CHECK(igraph_community_spinglass_single(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_vertex, &c_community, &c_cohesion, &c_adhesion, &c_inner_links, &c_outer_links, c_spins, c_update_rule, c_gamma)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); PROTECT(r_names=NEW_CHARACTER(5)); PROTECT(community=Ry_igraph_vector_int_to_SEXP(&c_community)); igraph_vector_int_destroy(&c_community); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cohesion=NEW_NUMERIC(1)); REAL(cohesion)[0]=c_cohesion; PROTECT(adhesion=NEW_NUMERIC(1)); @@ -11885,6 +12183,7 @@ SEXP R_igraph_community_walktrap(SEXP graph, SEXP weights, SEXP steps) { SEXP membership; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -11892,27 +12191,27 @@ SEXP R_igraph_community_walktrap(SEXP graph, SEXP weights, SEXP steps) { } IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); - IGRAPH_R_CHECK(igraph_vector_init(&c_modularity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_modularity); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_modularity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_modularity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_walktrap(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_steps, &c_merges, &c_modularity, &c_membership)); + IGRAPH_LOCAL_R_CHECK(igraph_community_walktrap(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_steps, &c_merges, &c_modularity, &c_membership)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(merges=Ry_igraph_matrix_int_to_SEXP(&c_merges)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=Ry_igraph_vector_to_SEXP(&c_modularity)); igraph_vector_destroy(&c_modularity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, merges); SET_VECTOR_ELT(r_result, 1, modularity); SET_VECTOR_ELT(r_result, 2, membership); @@ -11948,49 +12247,50 @@ SEXP R_igraph_community_edge_betweenness(SEXP graph, SEXP directed, SEXP weights SEXP membership; SEXP r_result, r_names; - /* Convert input */ - Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_removed_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_removed_edges); - IGRAPH_R_CHECK(igraph_vector_init(&c_edge_betweenness, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_edge_betweenness); - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_bridges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_bridges); - IGRAPH_R_CHECK(igraph_vector_init(&c_modularity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_modularity); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_FINALLY_STACK; + /* Convert input */ + Rz_SEXP_to_igraph(graph, &c_graph); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_removed_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_removed_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_edge_betweenness, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_edge_betweenness); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_bridges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_bridges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_modularity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_modularity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_edge_betweenness(&c_graph, &c_removed_edges, &c_edge_betweenness, &c_merges, &c_bridges, &c_modularity, &c_membership, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_community_edge_betweenness(&c_graph, &c_removed_edges, &c_edge_betweenness, &c_merges, &c_bridges, &c_modularity, &c_membership, c_directed, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(r_result=NEW_LIST(6)); PROTECT(r_names=NEW_CHARACTER(6)); PROTECT(removed_edges=Ry_igraph_vector_int_to_SEXP(&c_removed_edges)); igraph_vector_int_destroy(&c_removed_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_betweenness=Ry_igraph_vector_to_SEXP(&c_edge_betweenness)); igraph_vector_destroy(&c_edge_betweenness); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(merges=Ry_igraph_matrix_int_to_SEXP(&c_merges)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(bridges=Ry_igraph_vector_int_to_SEXPp1(&c_bridges)); igraph_vector_int_destroy(&c_bridges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=Ry_igraph_vector_to_SEXP(&c_modularity)); igraph_vector_destroy(&c_modularity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, removed_edges); SET_VECTOR_ELT(r_result, 1, edge_betweenness); SET_VECTOR_ELT(r_result, 2, merges); @@ -12029,43 +12329,44 @@ SEXP R_igraph_community_eb_get_merges(SEXP graph, SEXP directed, SEXP edges, SEX SEXP membership; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; Rz_SEXP_to_vector_int_copy(edges, &c_edges); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_bridges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_bridges); - IGRAPH_R_CHECK(igraph_vector_init(&c_modularity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_modularity); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_bridges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_bridges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_modularity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_modularity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_eb_get_merges(&c_graph, c_directed, &c_edges, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_bridges, &c_modularity, &c_membership)); + IGRAPH_LOCAL_R_CHECK(igraph_community_eb_get_merges(&c_graph, c_directed, &c_edges, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_bridges, &c_modularity, &c_membership)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(merges=Ry_igraph_matrix_int_to_SEXP(&c_merges)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(bridges=Ry_igraph_vector_int_to_SEXPp1(&c_bridges)); igraph_vector_int_destroy(&c_bridges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=Ry_igraph_vector_to_SEXP(&c_modularity)); igraph_vector_destroy(&c_modularity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, merges); SET_VECTOR_ELT(r_result, 1, bridges); SET_VECTOR_ELT(r_result, 2, modularity); @@ -12096,32 +12397,33 @@ SEXP R_igraph_community_fastgreedy(SEXP graph, SEXP weights) { SEXP membership; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); - IGRAPH_R_CHECK(igraph_vector_init(&c_modularity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_modularity); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_modularity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_modularity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_fastgreedy(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_modularity, &c_membership)); + IGRAPH_LOCAL_R_CHECK(igraph_community_fastgreedy(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_modularity, &c_membership)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(merges=Ry_igraph_matrix_int_to_SEXP(&c_merges)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=Ry_igraph_vector_to_SEXP(&c_modularity)); igraph_vector_destroy(&c_modularity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, merges); SET_VECTOR_ELT(r_result, 1, modularity); SET_VECTOR_ELT(r_result, 2, membership); @@ -12149,31 +12451,32 @@ SEXP R_igraph_community_to_membership(SEXP merges, SEXP nodes, SEXP steps) { SEXP csize; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix_int(merges, &c_merges); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); IGRAPH_R_CHECK_INT(nodes); c_nodes = (igraph_integer_t) REAL(nodes)[0]; IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_csize, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_csize); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_csize, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_csize); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_to_membership(&c_merges, c_nodes, c_steps, &c_membership, &c_csize)); + IGRAPH_LOCAL_R_CHECK(igraph_community_to_membership(&c_merges, c_nodes, c_steps, &c_membership, &c_csize)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(csize=Ry_igraph_vector_int_to_SEXP(&c_csize)); igraph_vector_int_destroy(&c_csize); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, membership); SET_VECTOR_ELT(r_result, 1, csize); SET_STRING_ELT(r_names, 0, Rf_mkChar("membership")); @@ -12197,29 +12500,30 @@ SEXP R_igraph_le_community_to_membership(SEXP merges, SEXP steps, SEXP membershi SEXP csize; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix_int(merges, &c_merges); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_csize, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_csize); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_csize, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_csize); /* Call igraph */ - IGRAPH_R_CHECK(igraph_le_community_to_membership(&c_merges, c_steps, &c_membership, &c_csize)); + IGRAPH_LOCAL_R_CHECK(igraph_le_community_to_membership(&c_merges, c_steps, &c_membership, &c_csize)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(csize=Ry_igraph_vector_int_to_SEXP(&c_csize)); igraph_vector_int_destroy(&c_csize); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, membership); SET_VECTOR_ELT(r_result, 1, csize); SET_STRING_ELT(r_names, 0, Rf_mkChar("membership")); @@ -12245,10 +12549,11 @@ SEXP R_igraph_modularity(SEXP graph, SEXP membership, SEXP weights, SEXP resolut SEXP modularity; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } @@ -12257,11 +12562,11 @@ SEXP R_igraph_modularity(SEXP graph, SEXP membership, SEXP weights, SEXP resolut IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_modularity(&c_graph, &c_membership, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, c_directed, &c_modularity)); + IGRAPH_LOCAL_R_CHECK(igraph_modularity(&c_graph, &c_membership, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, c_directed, &c_modularity)); /* Convert output */ igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=NEW_NUMERIC(1)); REAL(modularity)[0]=c_modularity; r_result = modularity; @@ -12283,6 +12588,7 @@ SEXP R_igraph_modularity_matrix(SEXP graph, SEXP weights, SEXP resolution, SEXP SEXP modmat; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -12290,17 +12596,17 @@ SEXP R_igraph_modularity_matrix(SEXP graph, SEXP weights, SEXP resolution, SEXP } IGRAPH_R_CHECK_REAL(resolution); c_resolution = REAL(resolution)[0]; - IGRAPH_R_CHECK(igraph_matrix_init(&c_modmat, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_modmat); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_modmat, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_modmat); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_modularity_matrix(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, &c_modmat, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_modularity_matrix(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, &c_modmat, c_directed)); /* Convert output */ PROTECT(modmat=Ry_igraph_matrix_to_SEXP(&c_modmat)); igraph_matrix_destroy(&c_modmat); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = modmat; UNPROTECT(1); @@ -12319,24 +12625,25 @@ SEXP R_igraph_reindex_membership(SEXP membership) { SEXP nb_clusters; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_new_to_old, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_new_to_old); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_new_to_old, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_new_to_old); c_nb_clusters=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_reindex_membership(&c_membership, &c_new_to_old, &c_nb_clusters)); + IGRAPH_LOCAL_R_CHECK(igraph_reindex_membership(&c_membership, &c_new_to_old, &c_nb_clusters)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(new_to_old=Ry_igraph_vector_int_to_SEXPp1(&c_new_to_old)); igraph_vector_int_destroy(&c_new_to_old); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(nb_clusters=NEW_NUMERIC(1)); REAL(nb_clusters)[0]=(double) c_nb_clusters; SET_VECTOR_ELT(r_result, 0, membership); @@ -12363,19 +12670,20 @@ SEXP R_igraph_community_fluid_communities(SEXP graph, SEXP no_of_communities) { SEXP membership; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(no_of_communities); c_no_of_communities = (igraph_integer_t) REAL(no_of_communities)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_fluid_communities(&c_graph, c_no_of_communities, &c_membership)); + IGRAPH_LOCAL_R_CHECK(igraph_community_fluid_communities(&c_graph, c_no_of_communities, &c_membership)); /* Convert output */ PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = membership; UNPROTECT(1); @@ -12396,33 +12704,34 @@ SEXP R_igraph_community_label_propagation(SEXP graph, SEXP mode, SEXP weights, S SEXP membership; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); c_mode = (igraph_neimode_t) Rf_asInteger(mode); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } if (!Rf_isNull(initial)) { Rz_SEXP_to_vector_int_copy(initial, &c_initial); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_initial); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_initial); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_initial, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_initial); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_initial, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_initial); } if (!Rf_isNull(fixed)) { Rz_SEXP_to_vector_bool(fixed, &c_fixed); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_label_propagation(&c_graph, &c_membership, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(initial) ? 0 : &c_initial), (Rf_isNull(fixed) ? 0 : &c_fixed))); + IGRAPH_LOCAL_R_CHECK(igraph_community_label_propagation(&c_graph, &c_membership, c_mode, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(initial) ? 0 : &c_initial), (Rf_isNull(fixed) ? 0 : &c_fixed))); /* Convert output */ PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_initial); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = membership; UNPROTECT(1); @@ -12445,6 +12754,7 @@ SEXP R_igraph_community_multilevel(SEXP graph, SEXP weights, SEXP resolution) { SEXP modularity; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -12452,27 +12762,27 @@ SEXP R_igraph_community_multilevel(SEXP graph, SEXP weights, SEXP resolution) { } IGRAPH_R_CHECK_REAL(resolution); c_resolution = REAL(resolution)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_memberships, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_memberships); - IGRAPH_R_CHECK(igraph_vector_init(&c_modularity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_modularity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_memberships, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_memberships); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_modularity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_modularity); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_multilevel(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, &c_membership, &c_memberships, &c_modularity)); + IGRAPH_LOCAL_R_CHECK(igraph_community_multilevel(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), c_resolution, &c_membership, &c_memberships, &c_modularity)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(memberships=Ry_igraph_matrix_int_to_SEXP(&c_memberships)); igraph_matrix_int_destroy(&c_memberships); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=Ry_igraph_vector_to_SEXP(&c_modularity)); igraph_vector_destroy(&c_modularity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, membership); SET_VECTOR_ELT(r_result, 1, memberships); SET_VECTOR_ELT(r_result, 2, modularity); @@ -12499,15 +12809,16 @@ SEXP R_igraph_community_optimal_modularity(SEXP graph, SEXP weights) { SEXP membership; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_optimal_modularity(&c_graph, &c_modularity, &c_membership, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_community_optimal_modularity(&c_graph, &c_modularity, &c_membership, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -12516,7 +12827,7 @@ SEXP R_igraph_community_optimal_modularity(SEXP graph, SEXP weights) { REAL(modularity)[0]=c_modularity; PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, modularity); SET_VECTOR_ELT(r_result, 1, membership); SET_STRING_ELT(r_names, 0, Rf_mkChar("modularity")); @@ -12547,6 +12858,7 @@ SEXP R_igraph_community_leiden(SEXP graph, SEXP weights, SEXP vertex_weights, SE SEXP quality; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { @@ -12564,22 +12876,22 @@ SEXP R_igraph_community_leiden(SEXP graph, SEXP weights, SEXP vertex_weights, SE IGRAPH_R_CHECK_INT(n_iterations); c_n_iterations = (igraph_integer_t) REAL(n_iterations)[0]; if (!Rf_isNull(membership)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); } c_nb_clusters=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_leiden(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), c_resolution, c_beta, c_start, c_n_iterations, &c_membership, &c_nb_clusters, &c_quality)); + IGRAPH_LOCAL_R_CHECK(igraph_community_leiden(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), (Rf_isNull(vertex_weights) ? 0 : &c_vertex_weights), c_resolution, c_beta, c_start, c_n_iterations, &c_membership, &c_nb_clusters, &c_quality)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(nb_clusters=NEW_NUMERIC(1)); REAL(nb_clusters)[0]=(double) c_nb_clusters; PROTECT(quality=NEW_NUMERIC(1)); @@ -12610,23 +12922,24 @@ SEXP R_igraph_split_join_distance(SEXP comm1, SEXP comm2) { SEXP distance21; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(comm1, &c_comm1)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_comm1); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(comm2, &c_comm2)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_comm2); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(comm1, &c_comm1)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_comm1); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(comm2, &c_comm2)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_comm2); c_distance12=0; c_distance21=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_split_join_distance(&c_comm1, &c_comm2, &c_distance12, &c_distance21)); + IGRAPH_LOCAL_R_CHECK(igraph_split_join_distance(&c_comm1, &c_comm2, &c_distance12, &c_distance21)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_vector_int_destroy(&c_comm1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_comm2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(distance12=NEW_NUMERIC(1)); REAL(distance12)[0]=(double) c_distance12; PROTECT(distance21=NEW_NUMERIC(1)); @@ -12657,6 +12970,7 @@ SEXP R_igraph_community_infomap(SEXP graph, SEXP e_weights, SEXP v_weights, SEXP SEXP codelength; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(e_weights)) { @@ -12667,17 +12981,17 @@ SEXP R_igraph_community_infomap(SEXP graph, SEXP e_weights, SEXP v_weights, SEXP } IGRAPH_R_CHECK_INT(nb_trials); c_nb_trials = (igraph_integer_t) REAL(nb_trials)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_infomap(&c_graph, (Rf_isNull(e_weights) ? 0 : &c_e_weights), (Rf_isNull(v_weights) ? 0 : &c_v_weights), c_nb_trials, &c_membership, &c_codelength)); + IGRAPH_LOCAL_R_CHECK(igraph_community_infomap(&c_graph, (Rf_isNull(e_weights) ? 0 : &c_e_weights), (Rf_isNull(v_weights) ? 0 : &c_v_weights), c_nb_trials, &c_membership, &c_codelength)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(codelength=NEW_NUMERIC(1)); REAL(codelength)[0]=c_codelength; SET_VECTOR_ELT(r_result, 0, membership); @@ -12709,12 +13023,13 @@ SEXP R_igraph_community_voronoi(SEXP graph, SEXP lengths, SEXP weights, SEXP mod SEXP modularity; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_generators, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_generators); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_generators, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_generators); if (!Rf_isNull(lengths)) { Rz_SEXP_to_vector(lengths, &c_lengths); } @@ -12725,17 +13040,17 @@ SEXP R_igraph_community_voronoi(SEXP graph, SEXP lengths, SEXP weights, SEXP mod IGRAPH_R_CHECK_REAL(radius); c_radius = REAL(radius)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_voronoi(&c_graph, &c_membership, &c_generators, &c_modularity, (Rf_isNull(lengths) ? 0 : &c_lengths), (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_radius)); + IGRAPH_LOCAL_R_CHECK(igraph_community_voronoi(&c_graph, &c_membership, &c_generators, &c_modularity, (Rf_isNull(lengths) ? 0 : &c_lengths), (Rf_isNull(weights) ? 0 : &c_weights), c_mode, c_radius)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(generators=Ry_igraph_vector_int_to_SEXPp1(&c_generators)); igraph_vector_int_destroy(&c_generators); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(modularity=NEW_NUMERIC(1)); REAL(modularity)[0]=c_modularity; SET_VECTOR_ELT(r_result, 0, membership); @@ -12765,29 +13080,30 @@ SEXP R_igraph_graphlets(SEXP graph, SEXP weights, SEXP niter) { SEXP Mu; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_cliques, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_cliques); - IGRAPH_R_CHECK(igraph_vector_init(&c_Mu, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_Mu); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_cliques, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_cliques); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_Mu, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_Mu); IGRAPH_R_CHECK_INT(niter); c_niter = (igraph_integer_t) REAL(niter)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_graphlets(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_Mu, c_niter)); + IGRAPH_LOCAL_R_CHECK(igraph_graphlets(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_Mu, c_niter)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(cliques=Ry_igraph_vector_int_list_to_SEXPp1(&c_cliques)); igraph_vector_int_list_destroy(&c_cliques); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(Mu=Ry_igraph_vector_to_SEXP(&c_Mu)); igraph_vector_destroy(&c_Mu); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, cliques); SET_VECTOR_ELT(r_result, 1, Mu); SET_STRING_ELT(r_names, 0, Rf_mkChar("cliques")); @@ -12812,27 +13128,28 @@ SEXP R_igraph_graphlets_candidate_basis(SEXP graph, SEXP weights) { SEXP thresholds; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_cliques, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_cliques); - IGRAPH_R_CHECK(igraph_vector_init(&c_thresholds, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_thresholds); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_cliques, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_cliques); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_thresholds, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_thresholds); /* Call igraph */ - IGRAPH_R_CHECK(igraph_graphlets_candidate_basis(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_thresholds)); + IGRAPH_LOCAL_R_CHECK(igraph_graphlets_candidate_basis(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_thresholds)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(cliques=Ry_igraph_vector_int_list_to_SEXPp1(&c_cliques)); igraph_vector_int_list_destroy(&c_cliques); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(thresholds=Ry_igraph_vector_to_SEXP(&c_thresholds)); igraph_vector_destroy(&c_thresholds); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, cliques); SET_VECTOR_ELT(r_result, 1, thresholds); SET_STRING_ELT(r_names, 0, Rf_mkChar("cliques")); @@ -12857,32 +13174,33 @@ SEXP R_igraph_graphlets_project(SEXP graph, SEXP weights, SEXP cliques, SEXP Muc igraph_integer_t c_niter; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } if (!Rf_isNull(cliques)) { - IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(cliques, &c_cliques)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_cliques); + IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(cliques, &c_cliques)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_cliques); } - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(Muc, &c_Muc)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_Muc); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(Muc, &c_Muc)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_Muc); IGRAPH_R_CHECK_BOOL(startMu); c_startMu = LOGICAL(startMu)[0]; IGRAPH_R_CHECK_INT(niter); c_niter = (igraph_integer_t) REAL(niter)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_graphlets_project(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_Muc, c_startMu, c_niter)); + IGRAPH_LOCAL_R_CHECK(igraph_graphlets_project(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_cliques, &c_Muc, c_startMu, c_niter)); /* Convert output */ if (!Rf_isNull(cliques)) { igraph_vector_int_list_destroy(&c_cliques); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } PROTECT(Muc=Ry_igraph_vector_to_SEXP(&c_Muc)); igraph_vector_destroy(&c_Muc); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = Muc; UNPROTECT(1); @@ -12900,21 +13218,22 @@ SEXP R_igraph_hrg_fit(SEXP graph, SEXP hrg, SEXP start, SEXP steps) { igraph_integer_t c_steps; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); IGRAPH_R_CHECK_BOOL(start); c_start = LOGICAL(start)[0]; IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_fit(&c_graph, &c_hrg, c_start, c_steps)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_fit(&c_graph, &c_hrg, c_start, c_steps)); /* Convert output */ PROTECT(hrg=Ry_igraph_hrg_to_SEXP(&c_hrg)); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hrg; UNPROTECT(1); @@ -12931,19 +13250,20 @@ SEXP R_igraph_hrg_sample(SEXP hrg) { SEXP sample; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_sample(&c_hrg, &c_sample)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_sample(&c_hrg, &c_sample)); /* Convert output */ igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_sample); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_sample); PROTECT(sample=Ry_igraph_to_SEXP(&c_sample)); IGRAPH_I_DESTROY(&c_sample); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = sample; UNPROTECT(1); @@ -12961,22 +13281,23 @@ SEXP R_igraph_hrg_sample_many(SEXP hrg, SEXP num_samples) { SEXP samples; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); - IGRAPH_R_CHECK(igraph_graph_list_init(&c_samples, 0)); - IGRAPH_FINALLY(igraph_graph_list_destroy, &c_samples); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(igraph_graph_list_init(&c_samples, 0)); + IGRAPH_LOCAL_FINALLY(igraph_graph_list_destroy, &c_samples); IGRAPH_R_CHECK_INT(num_samples); c_num_samples = (igraph_integer_t) REAL(num_samples)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_sample_many(&c_hrg, &c_samples, c_num_samples)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_sample_many(&c_hrg, &c_samples, c_num_samples)); /* Convert output */ igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(samples=Ry_igraph_graphlist_to_SEXP(&c_samples)); IGRAPH_FREE(c_samples.stor_begin); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = samples; UNPROTECT(1); @@ -12993,19 +13314,20 @@ SEXP R_igraph_hrg_game(SEXP hrg) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_game(&c_graph, &c_hrg)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_game(&c_graph, &c_hrg)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13027,33 +13349,34 @@ SEXP R_igraph_hrg_consensus(SEXP graph, SEXP hrg, SEXP start, SEXP num_samples) SEXP weights; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_init(&c_weights, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_weights); - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_weights, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_weights); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); IGRAPH_R_CHECK_BOOL(start); c_start = LOGICAL(start)[0]; IGRAPH_R_CHECK_INT(num_samples); c_num_samples = (igraph_integer_t) REAL(num_samples)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_consensus(&c_graph, &c_parents, &c_weights, &c_hrg, c_start, c_num_samples)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_consensus(&c_graph, &c_parents, &c_weights, &c_hrg, c_start, c_num_samples)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(weights=Ry_igraph_vector_to_SEXP(&c_weights)); igraph_vector_destroy(&c_weights); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(hrg=Ry_igraph_hrg_to_SEXP(&c_hrg)); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, parents); SET_VECTOR_ELT(r_result, 1, weights); SET_VECTOR_ELT(r_result, 2, hrg); @@ -13083,14 +13406,15 @@ SEXP R_igraph_hrg_predict(SEXP graph, SEXP hrg, SEXP start, SEXP num_samples, SE SEXP prob; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); - IGRAPH_R_CHECK(igraph_vector_init(&c_prob, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_prob); - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_prob, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_prob); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); IGRAPH_R_CHECK_BOOL(start); c_start = LOGICAL(start)[0]; IGRAPH_R_CHECK_INT(num_samples); @@ -13098,20 +13422,20 @@ SEXP R_igraph_hrg_predict(SEXP graph, SEXP hrg, SEXP start, SEXP num_samples, SE IGRAPH_R_CHECK_INT(num_bins); c_num_bins = (igraph_integer_t) REAL(num_bins)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_predict(&c_graph, &c_edges, &c_prob, &c_hrg, c_start, c_num_samples, c_num_bins)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_predict(&c_graph, &c_edges, &c_prob, &c_hrg, c_start, c_num_samples, c_num_bins)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(prob=Ry_igraph_vector_to_SEXP(&c_prob)); igraph_vector_destroy(&c_prob); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(hrg=Ry_igraph_hrg_to_SEXP(&c_hrg)); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, edges); SET_VECTOR_ELT(r_result, 1, prob); SET_VECTOR_ELT(r_result, 2, hrg); @@ -13136,18 +13460,19 @@ SEXP R_igraph_hrg_create(SEXP graph, SEXP prob) { SEXP hrg; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_hrg_init(&c_hrg, 0)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_init(&c_hrg, 0)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(prob, &c_prob); /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_create(&c_hrg, &c_graph, &c_prob)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_create(&c_hrg, &c_graph, &c_prob)); /* Convert output */ PROTECT(hrg=Ry_igraph_hrg_to_SEXP(&c_hrg)); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hrg; UNPROTECT(1); @@ -13163,18 +13488,19 @@ SEXP R_igraph_hrg_resize(SEXP hrg, SEXP newsize) { igraph_integer_t c_newsize; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); IGRAPH_R_CHECK_INT(newsize); c_newsize = (igraph_integer_t) REAL(newsize)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_hrg_resize(&c_hrg, c_newsize)); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_resize(&c_hrg, c_newsize)); /* Convert output */ PROTECT(hrg=Ry_igraph_hrg_to_SEXP(&c_hrg)); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hrg; UNPROTECT(1); @@ -13189,15 +13515,16 @@ SEXP R_igraph_hrg_size(SEXP hrg) { igraph_hrg_t c_hrg; igraph_integer_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); /* Call igraph */ c_result=igraph_hrg_size(&c_hrg); /* Convert output */ igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(r_result=NEW_NUMERIC(1)); REAL(r_result)[0]=(double) c_result; @@ -13217,26 +13544,27 @@ SEXP R_igraph_from_hrg_dendrogram(SEXP hrg) { SEXP prob; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); - IGRAPH_FINALLY(igraph_hrg_destroy, &c_hrg); - IGRAPH_R_CHECK(igraph_vector_init(&c_prob, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_prob); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(hrg, &c_hrg)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &c_hrg); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_prob, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_prob); /* Call igraph */ - IGRAPH_R_CHECK(igraph_from_hrg_dendrogram(&c_graph, &c_hrg, &c_prob)); + IGRAPH_LOCAL_R_CHECK(igraph_from_hrg_dendrogram(&c_graph, &c_hrg, &c_prob)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_hrg_destroy(&c_hrg); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(prob=Ry_igraph_vector_to_SEXP(&c_prob)); igraph_vector_destroy(&c_prob); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, prob); SET_STRING_ELT(r_names, 0, Rf_mkChar("graph")); @@ -13261,22 +13589,23 @@ SEXP R_igraph_get_adjacency(SEXP graph, SEXP type, SEXP weights, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); c_type = (igraph_get_adjacency_t) Rf_asInteger(type); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_adjacency(&c_graph, &c_res, c_type, (Rf_isNull(weights) ? 0 : &c_weights), c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_get_adjacency(&c_graph, &c_res, c_type, (Rf_isNull(weights) ? 0 : &c_weights), c_loops)); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -13296,22 +13625,23 @@ SEXP R_igraph_get_adjacency_sparse(SEXP graph, SEXP type, SEXP weights, SEXP loo SEXP sparsemat; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_sparsemat_init(&c_sparsemat, 0, 0, 0)); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_sparsemat); + IGRAPH_LOCAL_R_CHECK(igraph_sparsemat_init(&c_sparsemat, 0, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_sparsemat); c_type = (igraph_get_adjacency_t) Rf_asInteger(type); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_loops = (igraph_loops_t) Rf_asInteger(loops); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_adjacency_sparse(&c_graph, &c_sparsemat, c_type, (Rf_isNull(weights) ? 0 : &c_weights), c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_get_adjacency_sparse(&c_graph, &c_sparsemat, c_type, (Rf_isNull(weights) ? 0 : &c_weights), c_loops)); /* Convert output */ PROTECT(sparsemat=Ry_igraph_sparsemat_to_SEXP(&c_sparsemat)); igraph_sparsemat_destroy(&c_sparsemat); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = sparsemat; UNPROTECT(1); @@ -13329,19 +13659,20 @@ SEXP R_igraph_get_edgelist(SEXP graph, SEXP bycol) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); IGRAPH_R_CHECK_BOOL(bycol); c_bycol = LOGICAL(bycol)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_edgelist(&c_graph, &c_res, c_bycol)); + IGRAPH_LOCAL_R_CHECK(igraph_get_edgelist(&c_graph, &c_res, c_bycol)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXP(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -13360,22 +13691,23 @@ SEXP R_igraph_get_stochastic(SEXP graph, SEXP column_wise, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_res, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_res); IGRAPH_R_CHECK_BOOL(column_wise); c_column_wise = LOGICAL(column_wise)[0]; if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_stochastic(&c_graph, &c_res, c_column_wise, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_get_stochastic(&c_graph, &c_res, c_column_wise, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_matrix_to_SEXP(&c_res)); igraph_matrix_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -13394,22 +13726,23 @@ SEXP R_igraph_get_stochastic_sparse(SEXP graph, SEXP column_wise, SEXP weights) SEXP sparsemat; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_sparsemat_init(&c_sparsemat, 0, 0, 0)); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_sparsemat); + IGRAPH_LOCAL_R_CHECK(igraph_sparsemat_init(&c_sparsemat, 0, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_sparsemat); IGRAPH_R_CHECK_BOOL(column_wise); c_column_wise = LOGICAL(column_wise)[0]; if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_stochastic_sparse(&c_graph, &c_sparsemat, c_column_wise, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_get_stochastic_sparse(&c_graph, &c_sparsemat, c_column_wise, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(sparsemat=Ry_igraph_sparsemat_to_SEXP(&c_sparsemat)); igraph_sparsemat_destroy(&c_sparsemat); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = sparsemat; UNPROTECT(1); @@ -13425,17 +13758,18 @@ SEXP R_igraph_to_directed(SEXP graph, SEXP mode) { igraph_to_directed_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); c_mode = (igraph_to_directed_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_to_directed(&c_graph, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_to_directed(&c_graph, c_mode)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13452,21 +13786,22 @@ SEXP R_igraph_to_undirected(SEXP graph, SEXP mode, SEXP edge_attr_comb) { igraph_attribute_combination_t c_edge_attr_comb; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); c_mode = (igraph_to_undirected_t) Rf_asInteger(mode); Rz_SEXP_to_attr_comb(edge_attr_comb, &c_edge_attr_comb); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, &c_edge_attr_comb); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, &c_edge_attr_comb); /* Call igraph */ - IGRAPH_R_CHECK(igraph_to_undirected(&c_graph, c_mode, &c_edge_attr_comb)); + IGRAPH_LOCAL_R_CHECK(igraph_to_undirected(&c_graph, c_mode, &c_edge_attr_comb)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_attribute_combination_destroy(&c_edge_attr_comb); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13485,6 +13820,7 @@ SEXP R_igraph_read_graph_edgelist(SEXP instream, SEXP n, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); @@ -13493,13 +13829,13 @@ SEXP R_igraph_read_graph_edgelist(SEXP instream, SEXP n, SEXP directed) { IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_edgelist(&c_graph, c_instream, c_n, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_edgelist(&c_graph, c_instream, c_n, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13520,6 +13856,7 @@ SEXP R_igraph_read_graph_ncol(SEXP instream, SEXP predefnames, SEXP names, SEXP SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); @@ -13532,13 +13869,13 @@ SEXP R_igraph_read_graph_ncol(SEXP instream, SEXP predefnames, SEXP names, SEXP IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_ncol(&c_graph, c_instream, (Rf_isNull(predefnames) ? 0 : &c_predefnames), c_names, c_weights, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_ncol(&c_graph, c_instream, (Rf_isNull(predefnames) ? 0 : &c_predefnames), c_names, c_weights, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13558,6 +13895,7 @@ SEXP R_igraph_read_graph_lgl(SEXP instream, SEXP names, SEXP weights, SEXP direc SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); @@ -13567,13 +13905,13 @@ SEXP R_igraph_read_graph_lgl(SEXP instream, SEXP names, SEXP weights, SEXP direc IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_lgl(&c_graph, c_instream, c_names, c_weights, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_lgl(&c_graph, c_instream, c_names, c_weights, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13590,17 +13928,18 @@ SEXP R_igraph_read_graph_pajek(SEXP instream) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_pajek(&c_graph, c_instream)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_pajek(&c_graph, c_instream)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13618,19 +13957,20 @@ SEXP R_igraph_read_graph_graphml(SEXP instream, SEXP index) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); IGRAPH_R_CHECK_INT(index); c_index = (igraph_integer_t) REAL(index)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_graphml(&c_graph, c_instream, c_index)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_graphml(&c_graph, c_instream, c_index)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13658,42 +13998,43 @@ SEXP R_igraph_read_graph_dimacs_flow(SEXP instream, SEXP directed) { SEXP capacity; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); - IGRAPH_R_CHECK(igraph_strvector_init(&c_problem, 0)); - IGRAPH_FINALLY(igraph_strvector_destroy, &c_problem); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_label, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_label); + IGRAPH_LOCAL_R_CHECK(igraph_strvector_init(&c_problem, 0)); + IGRAPH_LOCAL_FINALLY(igraph_strvector_destroy, &c_problem); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_label, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_label); c_source=0; c_target=0; - IGRAPH_R_CHECK(igraph_vector_init(&c_capacity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_capacity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_capacity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_capacity); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_dimacs_flow(&c_graph, c_instream, &c_problem, &c_label, &c_source, &c_target, &c_capacity, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_dimacs_flow(&c_graph, c_instream, &c_problem, &c_label, &c_source, &c_target, &c_capacity, c_directed)); /* Convert output */ PROTECT(r_result=NEW_LIST(6)); PROTECT(r_names=NEW_CHARACTER(6)); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(problem=Rx_igraph_strvector_to_SEXP(&c_problem)); igraph_strvector_destroy(&c_problem); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(label=Ry_igraph_vector_int_to_SEXP(&c_label)); igraph_vector_int_destroy(&c_label); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(source=NEW_NUMERIC(1)); REAL(source)[0]=(double) c_source; PROTECT(target=NEW_NUMERIC(1)); REAL(target)[0]=(double) c_target; PROTECT(capacity=Ry_igraph_vector_to_SEXP(&c_capacity)); igraph_vector_destroy(&c_capacity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graph); SET_VECTOR_ELT(r_result, 1, problem); SET_VECTOR_ELT(r_result, 2, label); @@ -13724,19 +14065,20 @@ SEXP R_igraph_read_graph_graphdb(SEXP instream, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_graphdb(&c_graph, c_instream, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_graphdb(&c_graph, c_instream, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13753,17 +14095,18 @@ SEXP R_igraph_read_graph_gml(SEXP instream) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_gml(&c_graph, c_instream)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_gml(&c_graph, c_instream)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13781,19 +14124,20 @@ SEXP R_igraph_read_graph_dl(SEXP instream, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_instream = Ry_igraph_fopen_read(instream); IGRAPH_FINALLY(fclose, c_instream); IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_read_graph_dl(&c_graph, c_instream, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_read_graph_dl(&c_graph, c_instream, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13808,12 +14152,13 @@ SEXP R_igraph_write_graph_edgelist(SEXP graph, SEXP outstream) { igraph_t c_graph; FILE* c_outstream; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); IGRAPH_FINALLY(fclose, c_outstream); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_edgelist(&c_graph, c_outstream)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_edgelist(&c_graph, c_outstream)); /* Convert output */ @@ -13832,6 +14177,7 @@ SEXP R_igraph_write_graph_ncol(SEXP graph, SEXP outstream, SEXP names, SEXP weig const char* c_names; const char* c_weights; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); @@ -13839,7 +14185,7 @@ SEXP R_igraph_write_graph_ncol(SEXP graph, SEXP outstream, SEXP names, SEXP weig c_names = Rf_translateCharUTF8(STRING_ELT(names, 0)); c_weights = Rf_translateCharUTF8(STRING_ELT(weights, 0)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_ncol(&c_graph, c_outstream, c_names, c_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_ncol(&c_graph, c_outstream, c_names, c_weights)); /* Convert output */ @@ -13859,6 +14205,7 @@ SEXP R_igraph_write_graph_lgl(SEXP graph, SEXP outstream, SEXP names, SEXP weigh const char* c_weights; igraph_bool_t c_isolates; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); @@ -13868,7 +14215,7 @@ SEXP R_igraph_write_graph_lgl(SEXP graph, SEXP outstream, SEXP names, SEXP weigh IGRAPH_R_CHECK_BOOL(isolates); c_isolates = LOGICAL(isolates)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_lgl(&c_graph, c_outstream, c_names, c_weights, c_isolates)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_lgl(&c_graph, c_outstream, c_names, c_weights, c_isolates)); /* Convert output */ @@ -13887,6 +14234,7 @@ SEXP R_igraph_write_graph_leda(SEXP graph, SEXP outstream, SEXP names, SEXP weig const char* c_names; const char* c_weights; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); @@ -13894,7 +14242,7 @@ SEXP R_igraph_write_graph_leda(SEXP graph, SEXP outstream, SEXP names, SEXP weig c_names = Rf_translateCharUTF8(STRING_ELT(names, 0)); c_weights = Rf_translateCharUTF8(STRING_ELT(weights, 0)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_leda(&c_graph, c_outstream, c_names, c_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_leda(&c_graph, c_outstream, c_names, c_weights)); /* Convert output */ @@ -13912,6 +14260,7 @@ SEXP R_igraph_write_graph_graphml(SEXP graph, SEXP outstream, SEXP prefixattr) { FILE* c_outstream; igraph_bool_t c_prefixattr; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); @@ -13919,7 +14268,7 @@ SEXP R_igraph_write_graph_graphml(SEXP graph, SEXP outstream, SEXP prefixattr) { IGRAPH_R_CHECK_BOOL(prefixattr); c_prefixattr = LOGICAL(prefixattr)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_graphml(&c_graph, c_outstream, c_prefixattr)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_graphml(&c_graph, c_outstream, c_prefixattr)); /* Convert output */ @@ -13936,12 +14285,13 @@ SEXP R_igraph_write_graph_pajek(SEXP graph, SEXP outstream) { igraph_t c_graph; FILE* c_outstream; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); IGRAPH_FINALLY(fclose, c_outstream); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_pajek(&c_graph, c_outstream)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_pajek(&c_graph, c_outstream)); /* Convert output */ @@ -13962,21 +14312,22 @@ SEXP R_igraph_write_graph_dimacs_flow(SEXP graph, SEXP outstream, SEXP source, S igraph_vector_t c_capacity; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); IGRAPH_FINALLY(fclose, c_outstream); c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; Rz_SEXP_to_vector(capacity, &c_capacity); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_dimacs_flow(&c_graph, c_outstream, c_source, c_target, &c_capacity)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_dimacs_flow(&c_graph, c_outstream, c_source, c_target, &c_capacity)); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -13994,6 +14345,7 @@ SEXP R_igraph_write_graph_gml(SEXP graph, SEXP outstream, SEXP options, SEXP id, igraph_vector_t c_id; const char* c_creator; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); @@ -14004,7 +14356,7 @@ SEXP R_igraph_write_graph_gml(SEXP graph, SEXP outstream, SEXP options, SEXP id, c_creator = Rf_translateCharUTF8(STRING_ELT(creator, 0)); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_gml(&c_graph, c_outstream, c_options, &c_id, (Rf_isNull(creator) ? 0 : c_creator))); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_gml(&c_graph, c_outstream, c_options, &c_id, (Rf_isNull(creator) ? 0 : c_creator))); /* Convert output */ @@ -14021,12 +14373,13 @@ SEXP R_igraph_write_graph_dot(SEXP graph, SEXP outstream) { igraph_t c_graph; FILE* c_outstream; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_outstream = Ry_igraph_fopen_write(outstream); IGRAPH_FINALLY(fclose, c_outstream); /* Call igraph */ - IGRAPH_R_CHECK(igraph_write_graph_dot(&c_graph, c_outstream)); + IGRAPH_LOCAL_R_CHECK(igraph_write_graph_dot(&c_graph, c_outstream)); /* Convert output */ @@ -14047,22 +14400,23 @@ SEXP R_igraph_motifs_randesu(SEXP graph, SEXP size, SEXP cut_prob) { SEXP hist; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_hist, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_hist); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_hist, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_hist); IGRAPH_R_CHECK_INT(size); c_size = (igraph_integer_t) REAL(size)[0]; if (!Rf_isNull(cut_prob)) { Rz_SEXP_to_vector(cut_prob, &c_cut_prob); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_motifs_randesu(&c_graph, &c_hist, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob))); + IGRAPH_LOCAL_R_CHECK(igraph_motifs_randesu(&c_graph, &c_hist, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob))); /* Convert output */ PROTECT(hist=Ry_igraph_vector_to_SEXP(&c_hist)); igraph_vector_destroy(&c_hist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = hist; UNPROTECT(1); @@ -14083,6 +14437,7 @@ SEXP R_igraph_motifs_randesu_estimate(SEXP graph, SEXP size, SEXP cut_prob, SEXP SEXP est; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_est=0; @@ -14094,20 +14449,20 @@ SEXP R_igraph_motifs_randesu_estimate(SEXP graph, SEXP size, SEXP cut_prob, SEXP IGRAPH_R_CHECK_INT(sample_size); c_sample_size = (igraph_integer_t) REAL(sample_size)[0]; if (!Rf_isNull(sample)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(sample, &c_sample)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_sample); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(sample, &c_sample)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_sample); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_sample, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_sample); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_sample, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_sample); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_motifs_randesu_estimate(&c_graph, &c_est, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob), c_sample_size, (Rf_isNull(sample) ? 0 : &c_sample))); + IGRAPH_LOCAL_R_CHECK(igraph_motifs_randesu_estimate(&c_graph, &c_est, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob), c_sample_size, (Rf_isNull(sample) ? 0 : &c_sample))); /* Convert output */ PROTECT(est=NEW_NUMERIC(1)); REAL(est)[0]=(double) c_est; igraph_vector_int_destroy(&c_sample); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = est; UNPROTECT(1); @@ -14126,6 +14481,7 @@ SEXP R_igraph_motifs_randesu_no(SEXP graph, SEXP size, SEXP cut_prob) { SEXP no; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_no=0; @@ -14135,7 +14491,7 @@ SEXP R_igraph_motifs_randesu_no(SEXP graph, SEXP size, SEXP cut_prob) { Rz_SEXP_to_vector(cut_prob, &c_cut_prob); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_motifs_randesu_no(&c_graph, &c_no, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob))); + IGRAPH_LOCAL_R_CHECK(igraph_motifs_randesu_no(&c_graph, &c_no, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob))); /* Convert output */ PROTECT(no=NEW_NUMERIC(1)); @@ -14160,10 +14516,11 @@ SEXP R_igraph_dyad_census(SEXP graph) { SEXP null; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_dyad_census(&c_graph, &c_mut, &c_asym, &c_null)); + IGRAPH_LOCAL_R_CHECK(igraph_dyad_census(&c_graph, &c_mut, &c_asym, &c_null)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); @@ -14197,17 +14554,18 @@ SEXP R_igraph_triad_census(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_triad_census(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_triad_census(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14225,19 +14583,20 @@ SEXP R_igraph_count_adjacent_triangles(SEXP graph, SEXP vids) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_adjacent_triangles(&c_graph, &c_res, c_vids)); + IGRAPH_LOCAL_R_CHECK(igraph_count_adjacent_triangles(&c_graph, &c_res, c_vids)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); r_result = res; @@ -14256,10 +14615,11 @@ SEXP R_igraph_count_triangles(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_triangles(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_count_triangles(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -14282,21 +14642,22 @@ SEXP R_igraph_local_scan_0(SEXP graph, SEXP weights, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_0(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_0(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14316,22 +14677,23 @@ SEXP R_igraph_local_scan_0_them(SEXP us, SEXP them, SEXP weights_them, SEXP mode SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(us, &c_us); Rz_SEXP_to_igraph(them, &c_them); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights_them)) { Rz_SEXP_to_vector(weights_them, &c_weights_them); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_0_them(&c_us, &c_them, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_0_them(&c_us, &c_them, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14350,21 +14712,22 @@ SEXP R_igraph_local_scan_1_ecount(SEXP graph, SEXP weights, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_1_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_1_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14384,22 +14747,23 @@ SEXP R_igraph_local_scan_1_ecount_them(SEXP us, SEXP them, SEXP weights_them, SE SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(us, &c_us); Rz_SEXP_to_igraph(them, &c_them); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights_them)) { Rz_SEXP_to_vector(weights_them, &c_weights_them); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_1_ecount_them(&c_us, &c_them, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_1_ecount_them(&c_us, &c_them, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14419,23 +14783,24 @@ SEXP R_igraph_local_scan_k_ecount(SEXP graph, SEXP k, SEXP weights, SEXP mode) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_k_ecount(&c_graph, c_k, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_k_ecount(&c_graph, c_k, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14456,24 +14821,25 @@ SEXP R_igraph_local_scan_k_ecount_them(SEXP us, SEXP them, SEXP k, SEXP weights_ SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(us, &c_us); Rz_SEXP_to_igraph(them, &c_them); IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights_them)) { Rz_SEXP_to_vector(weights_them, &c_weights_them); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_k_ecount_them(&c_us, &c_them, c_k, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_k_ecount_them(&c_us, &c_them, c_k, &c_res, (Rf_isNull(weights_them) ? 0 : &c_weights_them), c_mode)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14492,27 +14858,28 @@ SEXP R_igraph_local_scan_neighborhood_ecount(SEXP graph, SEXP weights, SEXP neig SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } if (!Rf_isNull(neighborhoods)) { - IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(neighborhoods, &c_neighborhoods)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_neighborhoods); + IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(neighborhoods, &c_neighborhoods)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_neighborhoods); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_neighborhood_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), &c_neighborhoods)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_neighborhood_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), &c_neighborhoods)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); if (!Rf_isNull(neighborhoods)) { igraph_vector_int_list_destroy(&c_neighborhoods); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } r_result = res; @@ -14532,27 +14899,28 @@ SEXP R_igraph_local_scan_subset_ecount(SEXP graph, SEXP weights, SEXP subsets) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } if (!Rf_isNull(subsets)) { - IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(subsets, &c_subsets)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_subsets); + IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(subsets, &c_subsets)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_subsets); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_local_scan_subset_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), &c_subsets)); + IGRAPH_LOCAL_R_CHECK(igraph_local_scan_subset_ecount(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights), &c_subsets)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); if (!Rf_isNull(subsets)) { igraph_vector_int_list_destroy(&c_subsets); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } r_result = res; @@ -14570,17 +14938,18 @@ SEXP R_igraph_list_triangles(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_list_triangles(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_list_triangles(&c_graph, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14598,17 +14967,18 @@ SEXP R_igraph_disjoint_union(SEXP left, SEXP right) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(left, &c_left); Rz_SEXP_to_igraph(right, &c_right); /* Call igraph */ - IGRAPH_R_CHECK(igraph_disjoint_union(&c_res, &c_left, &c_right)); + IGRAPH_LOCAL_R_CHECK(igraph_disjoint_union(&c_res, &c_left, &c_right)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14625,20 +14995,21 @@ SEXP R_igraph_disjoint_union_many(SEXP graphs) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ igraph_t *c_graphs_storage; - IGRAPH_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &c_graphs); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &c_graphs); /* Call igraph */ - IGRAPH_R_CHECK(igraph_disjoint_union_many(&c_res, &c_graphs)); + IGRAPH_LOCAL_R_CHECK(igraph_disjoint_union_many(&c_res, &c_graphs)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_ptr_destroy(&c_graphs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14656,17 +15027,18 @@ SEXP R_igraph_join(SEXP left, SEXP right) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(left, &c_left); Rz_SEXP_to_igraph(right, &c_right); /* Call igraph */ - IGRAPH_R_CHECK(igraph_join(&c_res, &c_left, &c_right)); + IGRAPH_LOCAL_R_CHECK(igraph_join(&c_res, &c_left, &c_right)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14688,29 +15060,30 @@ SEXP R_igraph_union(SEXP left, SEXP right) { SEXP edge_map_right; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(left, &c_left); Rz_SEXP_to_igraph(right, &c_right); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map_left, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map_left); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map_right, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map_right); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map_left, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map_left); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map_right, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map_right); /* Call igraph */ - IGRAPH_R_CHECK(igraph_union(&c_res, &c_left, &c_right, &c_edge_map_left, &c_edge_map_right)); + IGRAPH_LOCAL_R_CHECK(igraph_union(&c_res, &c_left, &c_right, &c_edge_map_left, &c_edge_map_right)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map_left=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map_left)); igraph_vector_int_destroy(&c_edge_map_left); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map_right=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map_right)); igraph_vector_int_destroy(&c_edge_map_right); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, edge_map_left); SET_VECTOR_ELT(r_result, 2, edge_map_right); @@ -14736,27 +15109,28 @@ SEXP R_igraph_union_many(SEXP graphs) { SEXP edgemaps; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ igraph_t *c_graphs_storage; - IGRAPH_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &c_graphs); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edgemaps, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edgemaps); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &c_graphs); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edgemaps, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edgemaps); /* Call igraph */ - IGRAPH_R_CHECK(igraph_union_many(&c_res, &c_graphs, &c_edgemaps)); + IGRAPH_LOCAL_R_CHECK(igraph_union_many(&c_res, &c_graphs, &c_edgemaps)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_ptr_destroy(&c_graphs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edgemaps=Ry_igraph_vector_int_list_to_SEXP(&c_edgemaps)); igraph_vector_int_list_destroy(&c_edgemaps); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, edgemaps); SET_STRING_ELT(r_names, 0, Rf_mkChar("res")); @@ -14783,29 +15157,30 @@ SEXP R_igraph_intersection(SEXP left, SEXP right) { SEXP edge_map_right; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(left, &c_left); Rz_SEXP_to_igraph(right, &c_right); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map_left, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map_left); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map_right, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map_right); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map_left, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map_left); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map_right, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map_right); /* Call igraph */ - IGRAPH_R_CHECK(igraph_intersection(&c_res, &c_left, &c_right, &c_edge_map_left, &c_edge_map_right)); + IGRAPH_LOCAL_R_CHECK(igraph_intersection(&c_res, &c_left, &c_right, &c_edge_map_left, &c_edge_map_right)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map_left=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map_left)); igraph_vector_int_destroy(&c_edge_map_left); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map_right=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map_right)); igraph_vector_int_destroy(&c_edge_map_right); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, edge_map_left); SET_VECTOR_ELT(r_result, 2, edge_map_right); @@ -14831,27 +15206,28 @@ SEXP R_igraph_intersection_many(SEXP graphs) { SEXP edgemaps; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ igraph_t *c_graphs_storage; - IGRAPH_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &c_graphs); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edgemaps, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edgemaps); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_graph_ptr_list(graphs, &c_graphs, &c_graphs_storage)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &c_graphs); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edgemaps, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edgemaps); /* Call igraph */ - IGRAPH_R_CHECK(igraph_intersection_many(&c_res, &c_graphs, &c_edgemaps)); + IGRAPH_LOCAL_R_CHECK(igraph_intersection_many(&c_res, &c_graphs, &c_edgemaps)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_ptr_destroy(&c_graphs); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edgemaps=Ry_igraph_vector_int_list_to_SEXP(&c_edgemaps)); igraph_vector_int_list_destroy(&c_edgemaps); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, edgemaps); SET_STRING_ELT(r_names, 0, Rf_mkChar("res")); @@ -14874,17 +15250,18 @@ SEXP R_igraph_difference(SEXP orig, SEXP sub) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(orig, &c_orig); Rz_SEXP_to_igraph(sub, &c_sub); /* Call igraph */ - IGRAPH_R_CHECK(igraph_difference(&c_res, &c_orig, &c_sub)); + IGRAPH_LOCAL_R_CHECK(igraph_difference(&c_res, &c_orig, &c_sub)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14902,18 +15279,19 @@ SEXP R_igraph_complementer(SEXP graph, SEXP loops) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_BOOL(loops); c_loops = LOGICAL(loops)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_complementer(&c_res, &c_graph, c_loops)); + IGRAPH_LOCAL_R_CHECK(igraph_complementer(&c_res, &c_graph, c_loops)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -14935,29 +15313,30 @@ SEXP R_igraph_compose(SEXP g1, SEXP g2) { SEXP edge_map2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(g1, &c_g1); Rz_SEXP_to_igraph(g2, &c_g2); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map1); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_map2, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_map2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_map2, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_map2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_compose(&c_res, &c_g1, &c_g2, &c_edge_map1, &c_edge_map2)); + IGRAPH_LOCAL_R_CHECK(igraph_compose(&c_res, &c_g1, &c_g2, &c_edge_map1, &c_edge_map2)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map1=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map1)); igraph_vector_int_destroy(&c_edge_map1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_map2=Ry_igraph_vector_int_to_SEXPp1(&c_edge_map2)); igraph_vector_int_destroy(&c_edge_map2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, edge_map1); SET_VECTOR_ELT(r_result, 2, edge_map2); @@ -14987,33 +15366,34 @@ SEXP R_igraph_induced_subgraph_map(SEXP graph, SEXP vids, SEXP impl) { SEXP invmap; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_vids_data; Rz_SEXP_to_igraph_vs(vids, &c_graph, &c_vids, &c_vids_data); c_impl = (igraph_subgraph_implementation_t) Rf_asInteger(impl); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_invmap, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_invmap); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_invmap, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_invmap); /* Call igraph */ - IGRAPH_R_CHECK(igraph_induced_subgraph_map(&c_graph, &c_res, c_vids, c_impl, &c_map, &c_invmap)); + IGRAPH_LOCAL_R_CHECK(igraph_induced_subgraph_map(&c_graph, &c_res, c_vids, c_impl, &c_map, &c_invmap)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vids_data); igraph_vs_destroy(&c_vids); PROTECT(map=Ry_igraph_vector_int_to_SEXPp1(&c_map)); igraph_vector_int_destroy(&c_map); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(invmap=Ry_igraph_vector_int_to_SEXPp1(&c_invmap)); igraph_vector_int_destroy(&c_invmap); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, map); SET_VECTOR_ELT(r_result, 2, invmap); @@ -15038,18 +15418,19 @@ SEXP R_igraph_mycielskian(SEXP graph, SEXP k) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(k); c_k = (igraph_integer_t) REAL(k)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_mycielskian(&c_graph, &c_res, c_k)); + IGRAPH_LOCAL_R_CHECK(igraph_mycielskian(&c_graph, &c_res, c_k)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -15068,18 +15449,19 @@ SEXP R_igraph_product(SEXP g1, SEXP g2, SEXP type) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(g1, &c_g1); Rz_SEXP_to_igraph(g2, &c_g2); c_type = (igraph_product_t) Rf_asInteger(type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_product(&c_res, &c_g1, &c_g2, c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_product(&c_res, &c_g1, &c_g2, c_type)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -15098,18 +15480,19 @@ SEXP R_igraph_rooted_product(SEXP g1, SEXP g2, SEXP root) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(g1, &c_g1); Rz_SEXP_to_igraph(g2, &c_g2); c_root = (igraph_integer_t) REAL(root)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_rooted_product(&c_res, &c_g1, &c_g2, c_root)); + IGRAPH_LOCAL_R_CHECK(igraph_rooted_product(&c_res, &c_g1, &c_g2, c_root)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -15129,26 +15512,27 @@ SEXP R_igraph_gomory_hu_tree(SEXP graph, SEXP capacity) { SEXP flows; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_flows, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_flows); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_flows, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_flows); if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_gomory_hu_tree(&c_graph, &c_tree, &c_flows, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_gomory_hu_tree(&c_graph, &c_tree, &c_flows, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_tree); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_tree); PROTECT(tree=Ry_igraph_to_SEXP(&c_tree)); IGRAPH_I_DESTROY(&c_tree); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(flows=Ry_igraph_vector_to_SEXP(&c_flows)); igraph_vector_destroy(&c_flows); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, tree); SET_VECTOR_ELT(r_result, 1, flows); SET_STRING_ELT(r_names, 0, Rf_mkChar("tree")); @@ -15183,23 +15567,24 @@ SEXP R_igraph_maxflow(SEXP graph, SEXP source, SEXP target, SEXP capacity) { SEXP stats; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_flow, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_flow); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_cut, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_cut); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition1); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_flow, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_flow); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_cut, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_cut); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition2); c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_maxflow(&c_graph, &c_value, &c_flow, &c_cut, &c_partition1, &c_partition2, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity), &c_stats)); + IGRAPH_LOCAL_R_CHECK(igraph_maxflow(&c_graph, &c_value, &c_flow, &c_cut, &c_partition1, &c_partition2, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity), &c_stats)); /* Convert output */ PROTECT(r_result=NEW_LIST(6)); @@ -15208,16 +15593,16 @@ SEXP R_igraph_maxflow(SEXP graph, SEXP source, SEXP target, SEXP capacity) { REAL(value)[0]=c_value; PROTECT(flow=Ry_igraph_vector_to_SEXP(&c_flow)); igraph_vector_destroy(&c_flow); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cut=Ry_igraph_vector_int_to_SEXPp1(&c_cut)); igraph_vector_int_destroy(&c_cut); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition1=Ry_igraph_vector_int_to_SEXPp1(&c_partition1)); igraph_vector_int_destroy(&c_partition1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition2=Ry_igraph_vector_int_to_SEXPp1(&c_partition2)); igraph_vector_int_destroy(&c_partition2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(stats=Ry_igraph_maxflow_stats_to_SEXP(&c_stats)); SET_VECTOR_ELT(r_result, 0, value); SET_VECTOR_ELT(r_result, 1, flow); @@ -15253,6 +15638,7 @@ SEXP R_igraph_maxflow_value(SEXP graph, SEXP source, SEXP target, SEXP capacity) SEXP stats; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_source = (igraph_integer_t) REAL(source)[0]; @@ -15261,7 +15647,7 @@ SEXP R_igraph_maxflow_value(SEXP graph, SEXP source, SEXP target, SEXP capacity) Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_maxflow_value(&c_graph, &c_value, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity), &c_stats)); + IGRAPH_LOCAL_R_CHECK(igraph_maxflow_value(&c_graph, &c_value, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity), &c_stats)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -15297,19 +15683,20 @@ SEXP R_igraph_mincut(SEXP graph, SEXP capacity) { SEXP cut; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition1); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition2); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_cut, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_cut); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_cut, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_cut); if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_mincut(&c_graph, &c_value, &c_partition1, &c_partition2, &c_cut, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_mincut(&c_graph, &c_value, &c_partition1, &c_partition2, &c_cut, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); @@ -15318,13 +15705,13 @@ SEXP R_igraph_mincut(SEXP graph, SEXP capacity) { REAL(value)[0]=c_value; PROTECT(partition1=Ry_igraph_vector_int_to_SEXPp1(&c_partition1)); igraph_vector_int_destroy(&c_partition1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition2=Ry_igraph_vector_int_to_SEXPp1(&c_partition2)); igraph_vector_int_destroy(&c_partition2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cut=Ry_igraph_vector_int_to_SEXPp1(&c_cut)); igraph_vector_int_destroy(&c_cut); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, value); SET_VECTOR_ELT(r_result, 1, partition1); SET_VECTOR_ELT(r_result, 2, partition2); @@ -15351,13 +15738,14 @@ SEXP R_igraph_mincut_value(SEXP graph, SEXP capacity) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_mincut_value(&c_graph, &c_res, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_mincut_value(&c_graph, &c_res, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15382,26 +15770,27 @@ SEXP R_igraph_residual_graph(SEXP graph, SEXP capacity, SEXP flow) { SEXP residual_capacity; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(capacity, &c_capacity); - IGRAPH_R_CHECK(igraph_vector_init(&c_residual_capacity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_residual_capacity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_residual_capacity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_residual_capacity); residual_capacity=R_GlobalEnv; /* hack to have a non-NULL value */ Rz_SEXP_to_vector(flow, &c_flow); /* Call igraph */ - IGRAPH_R_CHECK(igraph_residual_graph(&c_graph, &c_capacity, &c_residual, &c_residual_capacity, &c_flow)); + IGRAPH_LOCAL_R_CHECK(igraph_residual_graph(&c_graph, &c_capacity, &c_residual, &c_residual_capacity, &c_flow)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_residual); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_residual); PROTECT(residual=Ry_igraph_to_SEXP(&c_residual)); IGRAPH_I_DESTROY(&c_residual); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(residual_capacity=Ry_igraph_0orvector_to_SEXP(&c_residual_capacity)); igraph_vector_destroy(&c_residual_capacity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, residual); SET_VECTOR_ELT(r_result, 1, residual_capacity); SET_STRING_ELT(r_names, 0, Rf_mkChar("residual")); @@ -15425,18 +15814,19 @@ SEXP R_igraph_reverse_residual_graph(SEXP graph, SEXP capacity, SEXP flow) { SEXP residual; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(capacity, &c_capacity); Rz_SEXP_to_vector(flow, &c_flow); /* Call igraph */ - IGRAPH_R_CHECK(igraph_reverse_residual_graph(&c_graph, &c_capacity, &c_residual, &c_flow)); + IGRAPH_LOCAL_R_CHECK(igraph_reverse_residual_graph(&c_graph, &c_capacity, &c_residual, &c_flow)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_residual); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_residual); PROTECT(residual=Ry_igraph_to_SEXP(&c_residual)); IGRAPH_I_DESTROY(&c_residual); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = residual; UNPROTECT(1); @@ -15462,21 +15852,22 @@ SEXP R_igraph_st_mincut(SEXP graph, SEXP source, SEXP target, SEXP capacity) { SEXP partition2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_cut, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_cut); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition1); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_partition2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_cut, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_cut); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition1, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition1); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_partition2, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_partition2); c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_st_mincut(&c_graph, &c_value, &c_cut, &c_partition1, &c_partition2, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_st_mincut(&c_graph, &c_value, &c_cut, &c_partition1, &c_partition2, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); @@ -15485,13 +15876,13 @@ SEXP R_igraph_st_mincut(SEXP graph, SEXP source, SEXP target, SEXP capacity) { REAL(value)[0]=c_value; PROTECT(cut=Ry_igraph_vector_int_to_SEXPp1(&c_cut)); igraph_vector_int_destroy(&c_cut); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition1=Ry_igraph_vector_int_to_SEXPp1(&c_partition1)); igraph_vector_int_destroy(&c_partition1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition2=Ry_igraph_vector_int_to_SEXPp1(&c_partition2)); igraph_vector_int_destroy(&c_partition2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, value); SET_VECTOR_ELT(r_result, 1, cut); SET_VECTOR_ELT(r_result, 2, partition1); @@ -15520,6 +15911,7 @@ SEXP R_igraph_st_mincut_value(SEXP graph, SEXP source, SEXP target, SEXP capacit SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_source = (igraph_integer_t) REAL(source)[0]; @@ -15528,7 +15920,7 @@ SEXP R_igraph_st_mincut_value(SEXP graph, SEXP source, SEXP target, SEXP capacit Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_st_mincut_value(&c_graph, &c_res, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_st_mincut_value(&c_graph, &c_res, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15552,6 +15944,7 @@ SEXP R_igraph_st_vertex_connectivity(SEXP graph, SEXP source, SEXP target, SEXP SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; @@ -15559,7 +15952,7 @@ SEXP R_igraph_st_vertex_connectivity(SEXP graph, SEXP source, SEXP target, SEXP c_target = (igraph_integer_t) REAL(target)[0]; c_neighbors = (igraph_vconn_nei_t) Rf_asInteger(neighbors); /* Call igraph */ - IGRAPH_R_CHECK(igraph_st_vertex_connectivity(&c_graph, &c_res, c_source, c_target, c_neighbors)); + IGRAPH_LOCAL_R_CHECK(igraph_st_vertex_connectivity(&c_graph, &c_res, c_source, c_target, c_neighbors)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15581,13 +15974,14 @@ SEXP R_igraph_vertex_connectivity(SEXP graph, SEXP checks) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; IGRAPH_R_CHECK_BOOL(checks); c_checks = LOGICAL(checks)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_vertex_connectivity(&c_graph, &c_res, c_checks)); + IGRAPH_LOCAL_R_CHECK(igraph_vertex_connectivity(&c_graph, &c_res, c_checks)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15610,13 +16004,14 @@ SEXP R_igraph_st_edge_connectivity(SEXP graph, SEXP source, SEXP target) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_st_edge_connectivity(&c_graph, &c_res, c_source, c_target)); + IGRAPH_LOCAL_R_CHECK(igraph_st_edge_connectivity(&c_graph, &c_res, c_source, c_target)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15638,13 +16033,14 @@ SEXP R_igraph_edge_connectivity(SEXP graph, SEXP checks) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; IGRAPH_R_CHECK_BOOL(checks); c_checks = LOGICAL(checks)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge_connectivity(&c_graph, &c_res, c_checks)); + IGRAPH_LOCAL_R_CHECK(igraph_edge_connectivity(&c_graph, &c_res, c_checks)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15667,13 +16063,14 @@ SEXP R_igraph_edge_disjoint_paths(SEXP graph, SEXP source, SEXP target) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_edge_disjoint_paths(&c_graph, &c_res, c_source, c_target)); + IGRAPH_LOCAL_R_CHECK(igraph_edge_disjoint_paths(&c_graph, &c_res, c_source, c_target)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15696,13 +16093,14 @@ SEXP R_igraph_vertex_disjoint_paths(SEXP graph, SEXP source, SEXP target) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_vertex_disjoint_paths(&c_graph, &c_res, c_source, c_target)); + IGRAPH_LOCAL_R_CHECK(igraph_vertex_disjoint_paths(&c_graph, &c_res, c_source, c_target)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15724,13 +16122,14 @@ SEXP R_igraph_adhesion(SEXP graph, SEXP checks) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; IGRAPH_R_CHECK_BOOL(checks); c_checks = LOGICAL(checks)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_adhesion(&c_graph, &c_res, c_checks)); + IGRAPH_LOCAL_R_CHECK(igraph_adhesion(&c_graph, &c_res, c_checks)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15752,13 +16151,14 @@ SEXP R_igraph_cohesion(SEXP graph, SEXP checks) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_res=0; IGRAPH_R_CHECK_BOOL(checks); c_checks = LOGICAL(checks)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_cohesion(&c_graph, &c_res, c_checks)); + IGRAPH_LOCAL_R_CHECK(igraph_cohesion(&c_graph, &c_res, c_checks)); /* Convert output */ PROTECT(res=NEW_NUMERIC(1)); @@ -15785,30 +16185,31 @@ SEXP R_igraph_dominator_tree(SEXP graph, SEXP root, SEXP mode) { SEXP leftout; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_root = (igraph_integer_t) REAL(root)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_dom, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dom); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_leftout, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_leftout); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_dom, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_dom); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_leftout, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_leftout); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_dominator_tree(&c_graph, c_root, &c_dom, &c_domtree, &c_leftout, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_dominator_tree(&c_graph, c_root, &c_dom, &c_domtree, &c_leftout, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(dom=Ry_igraph_vector_int_to_SEXPp1(&c_dom)); igraph_vector_int_destroy(&c_dom); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_domtree); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_domtree); PROTECT(domtree=Ry_igraph_to_SEXP(&c_domtree)); IGRAPH_I_DESTROY(&c_domtree); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(leftout=Ry_igraph_vector_int_to_SEXPp1(&c_leftout)); igraph_vector_int_destroy(&c_leftout); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, dom); SET_VECTOR_ELT(r_result, 1, domtree); SET_VECTOR_ELT(r_result, 2, leftout); @@ -15836,26 +16237,27 @@ SEXP R_igraph_all_st_cuts(SEXP graph, SEXP source, SEXP target) { SEXP partition1s; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_cuts, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_cuts); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_partition1s, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_partition1s); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_cuts, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_cuts); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_partition1s, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_partition1s); c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_all_st_cuts(&c_graph, &c_cuts, &c_partition1s, c_source, c_target)); + IGRAPH_LOCAL_R_CHECK(igraph_all_st_cuts(&c_graph, &c_cuts, &c_partition1s, c_source, c_target)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(cuts=Ry_igraph_vector_int_list_to_SEXPp1(&c_cuts)); igraph_vector_int_list_destroy(&c_cuts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition1s=Ry_igraph_vector_int_list_to_SEXPp1(&c_partition1s)); igraph_vector_int_list_destroy(&c_partition1s); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, cuts); SET_VECTOR_ELT(r_result, 1, partition1s); SET_STRING_ELT(r_names, 0, Rf_mkChar("cuts")); @@ -15884,19 +16286,20 @@ SEXP R_igraph_all_st_mincuts(SEXP graph, SEXP source, SEXP target, SEXP capacity SEXP partition1s; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_cuts, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_cuts); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_partition1s, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_partition1s); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_cuts, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_cuts); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_partition1s, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_partition1s); c_source = (igraph_integer_t) REAL(source)[0]; c_target = (igraph_integer_t) REAL(target)[0]; if (!Rf_isNull(capacity)) { Rz_SEXP_to_vector(capacity, &c_capacity); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_all_st_mincuts(&c_graph, &c_value, &c_cuts, &c_partition1s, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); + IGRAPH_LOCAL_R_CHECK(igraph_all_st_mincuts(&c_graph, &c_value, &c_cuts, &c_partition1s, c_source, c_target, (Rf_isNull(capacity) ? 0 : &c_capacity))); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); @@ -15905,10 +16308,10 @@ SEXP R_igraph_all_st_mincuts(SEXP graph, SEXP source, SEXP target, SEXP capacity REAL(value)[0]=c_value; PROTECT(cuts=Ry_igraph_vector_int_list_to_SEXPp1(&c_cuts)); igraph_vector_int_list_destroy(&c_cuts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(partition1s=Ry_igraph_vector_int_list_to_SEXPp1(&c_partition1s)); igraph_vector_int_list_destroy(&c_partition1s); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, value); SET_VECTOR_ELT(r_result, 1, cuts); SET_VECTOR_ELT(r_result, 2, partition1s); @@ -15934,24 +16337,25 @@ SEXP R_igraph_even_tarjan_reduction(SEXP graph) { SEXP capacity; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_capacity, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_capacity); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_capacity, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_capacity); capacity=R_GlobalEnv; /* hack to have a non-NULL value */ /* Call igraph */ - IGRAPH_R_CHECK(igraph_even_tarjan_reduction(&c_graph, &c_graphbar, &c_capacity)); + IGRAPH_LOCAL_R_CHECK(igraph_even_tarjan_reduction(&c_graph, &c_graphbar, &c_capacity)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); - IGRAPH_FINALLY(igraph_destroy, &c_graphbar); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graphbar); PROTECT(graphbar=Ry_igraph_to_SEXP(&c_graphbar)); IGRAPH_I_DESTROY(&c_graphbar); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(capacity=Ry_igraph_0orvector_to_SEXP(&c_capacity)); igraph_vector_destroy(&c_capacity); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, graphbar); SET_VECTOR_ELT(r_result, 1, capacity); SET_STRING_ELT(r_names, 0, Rf_mkChar("graphbar")); @@ -15974,12 +16378,13 @@ SEXP R_igraph_is_separator(SEXP graph, SEXP candidate) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_candidate_data; Rz_SEXP_to_igraph_vs(candidate, &c_graph, &c_candidate, &c_candidate_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_separator(&c_graph, c_candidate, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_separator(&c_graph, c_candidate, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_candidate_data); @@ -16003,12 +16408,13 @@ SEXP R_igraph_is_minimal_separator(SEXP graph, SEXP candidate) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); igraph_vector_int_t c_candidate_data; Rz_SEXP_to_igraph_vs(candidate, &c_graph, &c_candidate, &c_candidate_data); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_minimal_separator(&c_graph, c_candidate, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_minimal_separator(&c_graph, c_candidate, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_candidate_data); @@ -16031,17 +16437,18 @@ SEXP R_igraph_all_minimal_st_separators(SEXP graph) { SEXP separators; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_separators, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_separators); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_separators, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_separators); /* Call igraph */ - IGRAPH_R_CHECK(igraph_all_minimal_st_separators(&c_graph, &c_separators)); + IGRAPH_LOCAL_R_CHECK(igraph_all_minimal_st_separators(&c_graph, &c_separators)); /* Convert output */ PROTECT(separators=Ry_igraph_vector_int_list_to_SEXPp1(&c_separators)); igraph_vector_int_list_destroy(&c_separators); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = separators; UNPROTECT(1); @@ -16058,17 +16465,18 @@ SEXP R_igraph_minimum_size_separators(SEXP graph) { SEXP separators; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_separators, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_separators); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_separators, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_separators); /* Call igraph */ - IGRAPH_R_CHECK(igraph_minimum_size_separators(&c_graph, &c_separators)); + IGRAPH_LOCAL_R_CHECK(igraph_minimum_size_separators(&c_graph, &c_separators)); /* Convert output */ PROTECT(separators=Ry_igraph_vector_int_list_to_SEXPp1(&c_separators)); igraph_vector_int_list_destroy(&c_separators); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = separators; UNPROTECT(1); @@ -16091,33 +16499,34 @@ SEXP R_igraph_cohesive_blocks(SEXP graph) { SEXP blockTree; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_blocks, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_blocks); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_cohesion, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_cohesion); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parent, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parent); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_blocks, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_blocks); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_cohesion, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_cohesion); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parent, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parent); /* Call igraph */ - IGRAPH_R_CHECK(igraph_cohesive_blocks(&c_graph, &c_blocks, &c_cohesion, &c_parent, &c_blockTree)); + IGRAPH_LOCAL_R_CHECK(igraph_cohesive_blocks(&c_graph, &c_blocks, &c_cohesion, &c_parent, &c_blockTree)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(blocks=Ry_igraph_vector_int_list_to_SEXPp1(&c_blocks)); igraph_vector_int_list_destroy(&c_blocks); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cohesion=Ry_igraph_vector_int_to_SEXP(&c_cohesion)); igraph_vector_int_destroy(&c_cohesion); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(parent=Ry_igraph_vector_int_to_SEXPp1(&c_parent)); igraph_vector_int_destroy(&c_parent); - IGRAPH_FINALLY_CLEAN(1); - IGRAPH_FINALLY(igraph_destroy, &c_blockTree); + IGRAPH_LOCAL_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_blockTree); PROTECT(blockTree=Ry_igraph_to_SEXP(&c_blockTree)); IGRAPH_I_DESTROY(&c_blockTree); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, blocks); SET_VECTOR_ELT(r_result, 1, cohesion); SET_VECTOR_ELT(r_result, 2, parent); @@ -16144,18 +16553,19 @@ SEXP R_igraph_coreness(SEXP graph, SEXP mode) { SEXP cores; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_cores, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_cores); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_cores, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_cores); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_coreness(&c_graph, &c_cores, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_coreness(&c_graph, &c_cores, c_mode)); /* Convert output */ PROTECT(cores=Ry_igraph_vector_int_to_SEXP(&c_cores)); igraph_vector_int_destroy(&c_cores); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = cores; UNPROTECT(1); @@ -16172,11 +16582,12 @@ SEXP R_igraph_isoclass(SEXP graph) { SEXP isoclass; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_isoclass=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_isoclass(&c_graph, &c_isoclass)); + IGRAPH_LOCAL_R_CHECK(igraph_isoclass(&c_graph, &c_isoclass)); /* Convert output */ PROTECT(isoclass=NEW_NUMERIC(1)); @@ -16198,11 +16609,12 @@ SEXP R_igraph_isomorphic(SEXP graph1, SEXP graph2) { SEXP iso; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_isomorphic(&c_graph1, &c_graph2, &c_iso)); + IGRAPH_LOCAL_R_CHECK(igraph_isomorphic(&c_graph1, &c_graph2, &c_iso)); /* Convert output */ PROTECT(iso=NEW_LOGICAL(1)); @@ -16224,17 +16636,18 @@ SEXP R_igraph_isoclass_subgraph(SEXP graph, SEXP vids) { SEXP isoclass; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vids, &c_vids)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vids); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vids, &c_vids)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vids); c_isoclass=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_isoclass_subgraph(&c_graph, &c_vids, &c_isoclass)); + IGRAPH_LOCAL_R_CHECK(igraph_isoclass_subgraph(&c_graph, &c_vids, &c_isoclass)); /* Convert output */ igraph_vector_int_destroy(&c_vids); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(isoclass=NEW_NUMERIC(1)); REAL(isoclass)[0]=(double) c_isoclass; r_result = isoclass; @@ -16255,6 +16668,7 @@ SEXP R_igraph_isoclass_create(SEXP size, SEXP number, SEXP directed) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(size); c_size = (igraph_integer_t) REAL(size)[0]; @@ -16263,13 +16677,13 @@ SEXP R_igraph_isoclass_create(SEXP size, SEXP number, SEXP directed) { IGRAPH_R_CHECK_BOOL(directed); c_directed = LOGICAL(directed)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_isoclass_create(&c_graph, c_size, c_number, c_directed)); + IGRAPH_LOCAL_R_CHECK(igraph_isoclass_create(&c_graph, c_size, c_number, c_directed)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -16298,59 +16712,60 @@ SEXP R_igraph_isomorphic_vf2(SEXP graph1, SEXP graph2, SEXP vertex_color1, SEXP SEXP map21; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map12, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map12); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map21, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map21); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map12, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map12); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map21, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map21); /* Call igraph */ - IGRAPH_R_CHECK(igraph_isomorphic_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_iso, &c_map12, &c_map21, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_isomorphic_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_iso, &c_map12, &c_map21, 0, 0, 0)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(iso=NEW_LOGICAL(1)); LOGICAL(iso)[0]=c_iso; PROTECT(map12=Ry_igraph_vector_int_to_SEXPp1(&c_map12)); igraph_vector_int_destroy(&c_map12); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(map21=Ry_igraph_vector_int_to_SEXPp1(&c_map21)); igraph_vector_int_destroy(&c_map21); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, iso); SET_VECTOR_ELT(r_result, 1, map12); SET_VECTOR_ELT(r_result, 2, map21); @@ -16382,46 +16797,47 @@ SEXP R_igraph_count_isomorphisms_vf2(SEXP graph1, SEXP graph2, SEXP vertex_color SEXP count; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); c_count=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_isomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_count, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_count_isomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_count, 0, 0, 0)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(count=NEW_NUMERIC(1)); REAL(count)[0]=(double) c_count; r_result = count; @@ -16448,50 +16864,51 @@ SEXP R_igraph_get_isomorphisms_vf2(SEXP graph1, SEXP graph2, SEXP vertex_color1, SEXP maps; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_maps); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_maps); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_isomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_maps, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_get_isomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_maps, 0, 0, 0)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(maps=Ry_igraph_vector_int_list_to_SEXP(&c_maps)); igraph_vector_int_list_destroy(&c_maps); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = maps; UNPROTECT(1); @@ -16509,11 +16926,12 @@ SEXP R_igraph_subisomorphic(SEXP graph1, SEXP graph2) { SEXP iso; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_subisomorphic(&c_graph1, &c_graph2, &c_iso)); + IGRAPH_LOCAL_R_CHECK(igraph_subisomorphic(&c_graph1, &c_graph2, &c_iso)); /* Convert output */ PROTECT(iso=NEW_LOGICAL(1)); @@ -16546,59 +16964,60 @@ SEXP R_igraph_subisomorphic_vf2(SEXP graph1, SEXP graph2, SEXP vertex_color1, SE SEXP map21; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map12, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map12); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map21, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map21); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map12, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map12); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map21, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map21); /* Call igraph */ - IGRAPH_R_CHECK(igraph_subisomorphic_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_iso, &c_map12, &c_map21, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_subisomorphic_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_iso, &c_map12, &c_map21, 0, 0, 0)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(iso=NEW_LOGICAL(1)); LOGICAL(iso)[0]=c_iso; PROTECT(map12=Ry_igraph_vector_int_to_SEXPp1(&c_map12)); igraph_vector_int_destroy(&c_map12); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(map21=Ry_igraph_vector_int_to_SEXPp1(&c_map21)); igraph_vector_int_destroy(&c_map21); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, iso); SET_VECTOR_ELT(r_result, 1, map12); SET_VECTOR_ELT(r_result, 2, map21); @@ -16630,46 +17049,47 @@ SEXP R_igraph_count_subisomorphisms_vf2(SEXP graph1, SEXP graph2, SEXP vertex_co SEXP count; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); c_count=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_subisomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_count, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_count_subisomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_count, 0, 0, 0)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(count=NEW_NUMERIC(1)); REAL(count)[0]=(double) c_count; r_result = count; @@ -16696,50 +17116,51 @@ SEXP R_igraph_get_subisomorphisms_vf2(SEXP graph1, SEXP graph2, SEXP vertex_colo SEXP maps; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_maps); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_maps); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_subisomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_maps, 0, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_get_subisomorphisms_vf2(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), &c_maps, 0, 0, 0)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(maps=Ry_igraph_vector_int_list_to_SEXP(&c_maps)); igraph_vector_int_list_destroy(&c_maps); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = maps; UNPROTECT(1); @@ -16760,28 +17181,29 @@ SEXP R_igraph_canonical_permutation(SEXP graph, SEXP colors, SEXP sh) { SEXP info; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(colors)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_labeling, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_labeling); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_labeling, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_labeling); c_sh = (igraph_bliss_sh_t) Rf_asInteger(sh); /* Call igraph */ - IGRAPH_R_CHECK(igraph_canonical_permutation(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), &c_labeling, c_sh, &c_info)); + IGRAPH_LOCAL_R_CHECK(igraph_canonical_permutation(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), &c_labeling, c_sh, &c_info)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_vector_int_destroy(&c_colors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(labeling=Ry_igraph_vector_int_to_SEXPp1(&c_labeling)); igraph_vector_int_destroy(&c_labeling); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(info=Ry_igraph_bliss_info_to_SEXP(&c_info)); if (c_info.group_size) { free(c_info.group_size); } SET_VECTOR_ELT(r_result, 0, labeling); @@ -16806,20 +17228,21 @@ SEXP R_igraph_permute_vertices(SEXP graph, SEXP permutation) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_int_copy(permutation, &c_permutation); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_permutation); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_permutation); /* Call igraph */ - IGRAPH_R_CHECK(igraph_permute_vertices(&c_graph, &c_res, &c_permutation)); + IGRAPH_LOCAL_R_CHECK(igraph_permute_vertices(&c_graph, &c_res, &c_permutation)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_permutation); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -16848,44 +17271,45 @@ SEXP R_igraph_isomorphic_bliss(SEXP graph1, SEXP graph2, SEXP colors1, SEXP colo SEXP info2; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(colors1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(colors1, &c_colors1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(colors1, &c_colors1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors1); if (!Rf_isNull(colors2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(colors2, &c_colors2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(colors2, &c_colors2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors2); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map12, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map12); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map21, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map21); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors2); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map12, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map12); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map21, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map21); c_sh = (igraph_bliss_sh_t) Rf_asInteger(sh); /* Call igraph */ - IGRAPH_R_CHECK(igraph_isomorphic_bliss(&c_graph1, &c_graph2, (Rf_isNull(colors1) ? 0 : &c_colors1), (Rf_isNull(colors2) ? 0 : &c_colors2), &c_iso, &c_map12, &c_map21, c_sh, &c_info1, &c_info2)); + IGRAPH_LOCAL_R_CHECK(igraph_isomorphic_bliss(&c_graph1, &c_graph2, (Rf_isNull(colors1) ? 0 : &c_colors1), (Rf_isNull(colors2) ? 0 : &c_colors2), &c_iso, &c_map12, &c_map21, c_sh, &c_info1, &c_info2)); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); PROTECT(r_names=NEW_CHARACTER(5)); igraph_vector_int_destroy(&c_colors1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_colors2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(iso=NEW_LOGICAL(1)); LOGICAL(iso)[0]=c_iso; PROTECT(map12=Ry_igraph_vector_int_to_SEXPp1(&c_map12)); igraph_vector_int_destroy(&c_map12); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(map21=Ry_igraph_vector_int_to_SEXPp1(&c_map21)); igraph_vector_int_destroy(&c_map21); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(info1=Ry_igraph_bliss_info_to_SEXP(&c_info1)); if (c_info1.group_size) { free(c_info1.group_size); } PROTECT(info2=Ry_igraph_bliss_info_to_SEXP(&c_info2)); @@ -16919,21 +17343,22 @@ SEXP R_igraph_count_automorphisms(SEXP graph, SEXP colors, SEXP sh) { SEXP info; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(colors)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors); c_sh = (igraph_bliss_sh_t) Rf_asInteger(sh); /* Call igraph */ - IGRAPH_R_CHECK(igraph_count_automorphisms(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), c_sh, &c_info)); + IGRAPH_LOCAL_R_CHECK(igraph_count_automorphisms(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), c_sh, &c_info)); /* Convert output */ igraph_vector_int_destroy(&c_colors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(info=Ry_igraph_bliss_info_to_SEXP(&c_info)); if (c_info.group_size) { free(c_info.group_size); } r_result = info; @@ -16956,28 +17381,29 @@ SEXP R_igraph_automorphism_group(SEXP graph, SEXP colors, SEXP sh) { SEXP info; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(colors)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(colors, &c_colors)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_generators, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_generators); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_generators, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_generators); c_sh = (igraph_bliss_sh_t) Rf_asInteger(sh); /* Call igraph */ - IGRAPH_R_CHECK(igraph_automorphism_group(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), &c_generators, c_sh, &c_info)); + IGRAPH_LOCAL_R_CHECK(igraph_automorphism_group(&c_graph, (Rf_isNull(colors) ? 0 : &c_colors), &c_generators, c_sh, &c_info)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); igraph_vector_int_destroy(&c_colors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(generators=Ry_igraph_vector_int_list_to_SEXPp1(&c_generators)); igraph_vector_int_list_destroy(&c_generators); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(info=Ry_igraph_bliss_info_to_SEXP(&c_info)); if (c_info.group_size) { free(c_info.group_size); } SET_VECTOR_ELT(r_result, 0, generators); @@ -17009,39 +17435,40 @@ SEXP R_igraph_subisomorphic_lad(SEXP pattern, SEXP target, SEXP domains, SEXP in SEXP maps; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(pattern, &c_pattern); Rz_SEXP_to_igraph(target, &c_target); if (!Rf_isNull(domains)) { - IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(domains, &c_domains)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_domains); + IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(domains, &c_domains)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_domains); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_map, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_map); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_maps); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_map, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_map); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_maps, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_maps); IGRAPH_R_CHECK_BOOL(induced); c_induced = LOGICAL(induced)[0]; IGRAPH_R_CHECK_INT(time_limit); c_time_limit = (igraph_integer_t) REAL(time_limit)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_subisomorphic_lad(&c_pattern, &c_target, (Rf_isNull(domains) ? 0 : &c_domains), &c_iso, &c_map, &c_maps, c_induced, c_time_limit)); + IGRAPH_LOCAL_R_CHECK(igraph_subisomorphic_lad(&c_pattern, &c_target, (Rf_isNull(domains) ? 0 : &c_domains), &c_iso, &c_map, &c_maps, c_induced, c_time_limit)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); if (!Rf_isNull(domains)) { igraph_vector_int_list_destroy(&c_domains); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } PROTECT(iso=NEW_LOGICAL(1)); LOGICAL(iso)[0]=c_iso; PROTECT(map=Ry_igraph_vector_int_to_SEXPp1(&c_map)); igraph_vector_int_destroy(&c_map); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(maps=Ry_igraph_vector_int_list_to_SEXP(&c_maps)); igraph_vector_int_list_destroy(&c_maps); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, iso); SET_VECTOR_ELT(r_result, 1, map); SET_VECTOR_ELT(r_result, 2, maps); @@ -17069,28 +17496,29 @@ SEXP R_igraph_simplify_and_colorize(SEXP graph) { SEXP edge_color; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color); /* Call igraph */ - IGRAPH_R_CHECK(igraph_simplify_and_colorize(&c_graph, &c_res, &c_vertex_color, &c_edge_color)); + IGRAPH_LOCAL_R_CHECK(igraph_simplify_and_colorize(&c_graph, &c_res, &c_vertex_color, &c_edge_color)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); - IGRAPH_FINALLY(igraph_destroy, &c_res); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_res); PROTECT(res=Ry_igraph_to_SEXP(&c_res)); IGRAPH_I_DESTROY(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_color=Ry_igraph_vector_int_to_SEXP(&c_vertex_color)); igraph_vector_int_destroy(&c_vertex_color); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edge_color=Ry_igraph_vector_int_to_SEXP(&c_edge_color)); igraph_vector_int_destroy(&c_edge_color); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, vertex_color); SET_VECTOR_ELT(r_result, 2, edge_color); @@ -17115,6 +17543,7 @@ SEXP R_igraph_graph_count(SEXP n, SEXP directed) { SEXP count; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -17122,7 +17551,7 @@ SEXP R_igraph_graph_count(SEXP n, SEXP directed) { c_directed = LOGICAL(directed)[0]; c_count=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_graph_count(c_n, c_directed, &c_count)); + IGRAPH_LOCAL_R_CHECK(igraph_graph_count(c_n, c_directed, &c_count)); /* Convert output */ PROTECT(count=NEW_NUMERIC(1)); @@ -17145,19 +17574,20 @@ SEXP R_igraph_is_matching(SEXP graph, SEXP types, SEXP matching) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(types)) { Rz_SEXP_to_vector_bool(types, &c_types); } Rz_SEXP_to_vector_int_copy(matching, &c_matching); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_matching); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_matching); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_matching(&c_graph, (Rf_isNull(types) ? 0 : &c_types), &c_matching, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_matching(&c_graph, (Rf_isNull(types) ? 0 : &c_types), &c_matching, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_matching); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -17178,19 +17608,20 @@ SEXP R_igraph_is_maximal_matching(SEXP graph, SEXP types, SEXP matching) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(types)) { Rz_SEXP_to_vector_bool(types, &c_types); } Rz_SEXP_to_vector_int_copy(matching, &c_matching); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_matching); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_matching); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_maximal_matching(&c_graph, (Rf_isNull(types) ? 0 : &c_types), &c_matching, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_maximal_matching(&c_graph, (Rf_isNull(types) ? 0 : &c_types), &c_matching, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_matching); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -17216,19 +17647,20 @@ SEXP R_igraph_maximum_bipartite_matching(SEXP graph, SEXP types, SEXP weights, S SEXP matching; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); c_matching_size=0; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_matching, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_matching); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_matching, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_matching); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } IGRAPH_R_CHECK_REAL(eps); c_eps = REAL(eps)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximum_bipartite_matching(&c_graph, &c_types, &c_matching_size, &c_matching_weight, &c_matching, (Rf_isNull(weights) ? 0 : &c_weights), c_eps)); + IGRAPH_LOCAL_R_CHECK(igraph_maximum_bipartite_matching(&c_graph, &c_types, &c_matching_size, &c_matching_weight, &c_matching, (Rf_isNull(weights) ? 0 : &c_weights), c_eps)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); @@ -17239,7 +17671,7 @@ SEXP R_igraph_maximum_bipartite_matching(SEXP graph, SEXP types, SEXP weights, S REAL(matching_weight)[0]=c_matching_weight; PROTECT(matching=Ry_igraph_vector_int_to_SEXPp1(&c_matching)); igraph_vector_int_destroy(&c_matching); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, matching_size); SET_VECTOR_ELT(r_result, 1, matching_weight); SET_VECTOR_ELT(r_result, 2, matching); @@ -17273,6 +17705,7 @@ SEXP R_igraph_adjacency_spectral_embedding(SEXP graph, SEXP no, SEXP weights, SE SEXP D; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(no); @@ -17283,29 +17716,29 @@ SEXP R_igraph_adjacency_spectral_embedding(SEXP graph, SEXP no, SEXP weights, SE c_which=INTEGER(which)[0]; IGRAPH_R_CHECK_BOOL(scaled); c_scaled = LOGICAL(scaled)[0]; - IGRAPH_R_CHECK(igraph_matrix_init(&c_X, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_X); - IGRAPH_R_CHECK(igraph_matrix_init(&c_Y, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_Y); - IGRAPH_R_CHECK(igraph_vector_init(&c_D, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_D); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_X, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_X); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_Y, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_Y); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_D, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_D); Rz_SEXP_to_vector(cvec, &c_cvec); Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_adjacency_spectral_embedding(&c_graph, c_no, (Rf_isNull(weights) ? 0 : &c_weights), c_which, c_scaled, &c_X, &c_Y, &c_D, &c_cvec, &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_adjacency_spectral_embedding(&c_graph, c_no, (Rf_isNull(weights) ? 0 : &c_weights), c_which, c_scaled, &c_X, &c_Y, &c_D, &c_cvec, &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(X=Ry_igraph_matrix_to_SEXP(&c_X)); igraph_matrix_destroy(&c_X); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(Y=Ry_igraph_matrix_to_SEXP(&c_Y)); igraph_matrix_destroy(&c_Y); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(D=Ry_igraph_vector_to_SEXP(&c_D)); igraph_vector_destroy(&c_D); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); SET_VECTOR_ELT(r_result, 0, X); SET_VECTOR_ELT(r_result, 1, Y); @@ -17342,6 +17775,7 @@ SEXP R_igraph_laplacian_spectral_embedding(SEXP graph, SEXP no, SEXP weights, SE SEXP D; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(no); @@ -17353,28 +17787,28 @@ SEXP R_igraph_laplacian_spectral_embedding(SEXP graph, SEXP no, SEXP weights, SE c_type = (igraph_laplacian_spectral_embedding_type_t) Rf_asInteger(type); IGRAPH_R_CHECK_BOOL(scaled); c_scaled = LOGICAL(scaled)[0]; - IGRAPH_R_CHECK(igraph_matrix_init(&c_X, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_X); - IGRAPH_R_CHECK(igraph_matrix_init(&c_Y, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_Y); - IGRAPH_R_CHECK(igraph_vector_init(&c_D, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_D); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_X, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_X); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_Y, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_Y); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_D, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_D); Rz_SEXP_to_igraph_arpack_options(options, &c_options); /* Call igraph */ - IGRAPH_R_CHECK(igraph_laplacian_spectral_embedding(&c_graph, c_no, (Rf_isNull(weights) ? 0 : &c_weights), c_which, c_type, c_scaled, &c_X, &c_Y, &c_D, &c_options)); + IGRAPH_LOCAL_R_CHECK(igraph_laplacian_spectral_embedding(&c_graph, c_no, (Rf_isNull(weights) ? 0 : &c_weights), c_which, c_type, c_scaled, &c_X, &c_Y, &c_D, &c_options)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(X=Ry_igraph_matrix_to_SEXP(&c_X)); igraph_matrix_destroy(&c_X); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(Y=Ry_igraph_matrix_to_SEXP(&c_Y)); igraph_matrix_destroy(&c_Y); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(D=Ry_igraph_vector_to_SEXP(&c_D)); igraph_vector_destroy(&c_D); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); SET_VECTOR_ELT(r_result, 0, X); SET_VECTOR_ELT(r_result, 1, Y); @@ -17411,23 +17845,24 @@ SEXP R_igraph_eigen_adjacency(SEXP graph, SEXP algorithm, SEXP which, SEXP optio SEXP cmplxvectors; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_algorithm = (igraph_eigen_algorithm_t) Rf_asInteger(algorithm); Rz_SEXP_to_igraph_eigen_which(which, &c_which); Rz_SEXP_to_igraph_arpack_options(options, &c_options); - IGRAPH_R_CHECK(igraph_vector_init(&c_values, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_values); - IGRAPH_R_CHECK(igraph_matrix_init(&c_vectors, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_vectors); - IGRAPH_R_CHECK(igraph_vector_complex_init(&c_cmplxvalues, 0)); - IGRAPH_FINALLY(igraph_vector_complex_destroy, &c_cmplxvalues); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_values, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_values); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_vectors, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_vectors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_complex_init(&c_cmplxvalues, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_complex_destroy, &c_cmplxvalues); cmplxvalues=R_GlobalEnv; /* hack to have a non-NULL value */ - IGRAPH_R_CHECK(igraph_matrix_complex_init(&c_cmplxvectors, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_complex_destroy, &c_cmplxvectors); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_complex_init(&c_cmplxvectors, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_complex_destroy, &c_cmplxvectors); cmplxvectors=R_GlobalEnv; /* hack to have a non-NULL value */ /* Call igraph */ - IGRAPH_R_CHECK(igraph_eigen_adjacency(&c_graph, c_algorithm, &c_which, &c_options, 0, &c_values, &c_vectors, (Rf_isNull(cmplxvalues) ? NULL : &c_cmplxvalues), (Rf_isNull(cmplxvectors) ? NULL : &c_cmplxvectors))); + IGRAPH_LOCAL_R_CHECK(igraph_eigen_adjacency(&c_graph, c_algorithm, &c_which, &c_options, 0, &c_values, &c_vectors, (Rf_isNull(cmplxvalues) ? NULL : &c_cmplxvalues), (Rf_isNull(cmplxvectors) ? NULL : &c_cmplxvectors))); /* Convert output */ PROTECT(r_result=NEW_LIST(5)); @@ -17435,16 +17870,16 @@ SEXP R_igraph_eigen_adjacency(SEXP graph, SEXP algorithm, SEXP which, SEXP optio PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); PROTECT(values=Ry_igraph_vector_to_SEXP(&c_values)); igraph_vector_destroy(&c_values); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vectors=Ry_igraph_matrix_to_SEXP(&c_vectors)); igraph_matrix_destroy(&c_vectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cmplxvalues=Ry_igraph_0orvector_complex_to_SEXP(&c_cmplxvalues)); igraph_vector_complex_destroy(&c_cmplxvalues); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(cmplxvectors=Ry_igraph_0ormatrix_complex_to_SEXP(&c_cmplxvectors)); igraph_matrix_complex_destroy(&c_cmplxvectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, options); SET_VECTOR_ELT(r_result, 1, values); SET_VECTOR_ELT(r_result, 2, vectors); @@ -17474,6 +17909,7 @@ SEXP R_igraph_power_law_fit(SEXP data, SEXP xmin, SEXP force_continuous) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector(data, &c_data); IGRAPH_R_CHECK_REAL(xmin); @@ -17481,7 +17917,7 @@ SEXP R_igraph_power_law_fit(SEXP data, SEXP xmin, SEXP force_continuous) { IGRAPH_R_CHECK_BOOL(force_continuous); c_force_continuous = LOGICAL(force_continuous)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_power_law_fit(&c_data, &c_res, c_xmin, c_force_continuous)); + IGRAPH_LOCAL_R_CHECK(igraph_power_law_fit(&c_data, &c_res, c_xmin, c_force_continuous)); /* Convert output */ PROTECT(res=Ry_igraph_plfit_result_to_SEXP(&c_res)); @@ -17504,6 +17940,7 @@ SEXP R_igraph_sir(SEXP graph, SEXP beta, SEXP gamma, SEXP no_sim) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_REAL(beta); @@ -17512,15 +17949,15 @@ SEXP R_igraph_sir(SEXP graph, SEXP beta, SEXP gamma, SEXP no_sim) { c_gamma = REAL(gamma)[0]; IGRAPH_R_CHECK_INT(no_sim); c_no_sim = (igraph_integer_t) REAL(no_sim)[0]; - IGRAPH_R_CHECK(igraph_vector_ptr_init(&c_res, 0)); - IGRAPH_FINALLY(Ry_igraph_sirlist_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_ptr_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(Ry_igraph_sirlist_destroy, &c_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_sir(&c_graph, c_beta, c_gamma, c_no_sim, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_sir(&c_graph, c_beta, c_gamma, c_no_sim, &c_res)); /* Convert output */ PROTECT(res=Ry_igraph_sirlist_to_SEXP(&c_res)); Ry_igraph_sirlist_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -17538,19 +17975,20 @@ SEXP R_igraph_running_mean(SEXP data, SEXP binwidth) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector(data, &c_data); - IGRAPH_R_CHECK(igraph_vector_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_res); IGRAPH_R_CHECK_INT(binwidth); c_binwidth = (igraph_integer_t) REAL(binwidth)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_running_mean(&c_data, &c_res, c_binwidth)); + IGRAPH_LOCAL_R_CHECK(igraph_running_mean(&c_data, &c_res, c_binwidth)); /* Convert output */ PROTECT(res=Ry_igraph_vector_to_SEXP(&c_res)); igraph_vector_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -17569,9 +18007,10 @@ SEXP R_igraph_random_sample(SEXP l, SEXP h, SEXP length) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); IGRAPH_R_CHECK_INT(l); c_l = (igraph_integer_t) REAL(l)[0]; IGRAPH_R_CHECK_INT(h); @@ -17579,12 +18018,12 @@ SEXP R_igraph_random_sample(SEXP l, SEXP h, SEXP length) { IGRAPH_R_CHECK_INT(length); c_length = (igraph_integer_t) REAL(length)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_random_sample(&c_res, c_l, c_h, c_length)); + IGRAPH_LOCAL_R_CHECK(igraph_random_sample(&c_res, c_l, c_h, c_length)); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXP(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -17603,24 +18042,25 @@ SEXP R_igraph_convex_hull_2d(SEXP data) { SEXP rescoords; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(data, &c_data); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_resverts, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_resverts); - IGRAPH_R_CHECK(igraph_matrix_init(&c_rescoords, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_rescoords); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_resverts, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_resverts); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_rescoords, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_rescoords); /* Call igraph */ - IGRAPH_R_CHECK(igraph_convex_hull_2d(&c_data, &c_resverts, &c_rescoords)); + IGRAPH_LOCAL_R_CHECK(igraph_convex_hull_2d(&c_data, &c_resverts, &c_rescoords)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(resverts=Ry_igraph_vector_int_to_SEXPp1(&c_resverts)); igraph_vector_int_destroy(&c_resverts); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(rescoords=Ry_igraph_matrix_to_SEXP(&c_rescoords)); igraph_matrix_destroy(&c_rescoords); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, resverts); SET_VECTOR_ELT(r_result, 1, rescoords); SET_STRING_ELT(r_names, 0, Rf_mkChar("resverts")); @@ -17642,11 +18082,12 @@ SEXP R_igraph_dim_select(SEXP sv) { SEXP dim; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector(sv, &c_sv); c_dim=0; /* Call igraph */ - IGRAPH_R_CHECK(igraph_dim_select(&c_sv, &c_dim)); + IGRAPH_LOCAL_R_CHECK(igraph_dim_select(&c_sv, &c_dim)); /* Convert output */ PROTECT(dim=NEW_NUMERIC(1)); @@ -17667,6 +18108,7 @@ SEXP R_igraph_almost_equals(SEXP a, SEXP b, SEXP eps) { double c_eps; igraph_bool_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_REAL(a); c_a = REAL(a)[0]; @@ -17696,6 +18138,7 @@ SEXP R_igraph_cmp_epsilon(SEXP a, SEXP b, SEXP eps) { double c_eps; int c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_REAL(a); c_a = REAL(a)[0]; @@ -17735,36 +18178,37 @@ SEXP R_igraph_eigen_matrix(SEXP A, SEXP sA, SEXP n, SEXP algorithm, SEXP which, SEXP vectors; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(A, &c_A); Rz_SEXP_to_sparsemat(sA, &c_sA); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_sA); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_sA); IGRAPH_R_CHECK_INT(n); c_n = INTEGER(n)[0]; c_algorithm = (igraph_eigen_algorithm_t) Rf_asInteger(algorithm); Rz_SEXP_to_igraph_eigen_which(which, &c_which); Rz_SEXP_to_igraph_arpack_options(options, &c_options); - IGRAPH_R_CHECK(igraph_vector_complex_init(&c_values, 0)); - IGRAPH_FINALLY(igraph_vector_complex_destroy, &c_values); + IGRAPH_LOCAL_R_CHECK(igraph_vector_complex_init(&c_values, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_complex_destroy, &c_values); values=R_GlobalEnv; /* hack to have a non-NULL value */ - IGRAPH_R_CHECK(igraph_matrix_complex_init(&c_vectors, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_complex_destroy, &c_vectors); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_complex_init(&c_vectors, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_complex_destroy, &c_vectors); vectors=R_GlobalEnv; /* hack to have a non-NULL value */ /* Call igraph */ - IGRAPH_R_CHECK(igraph_eigen_matrix(&c_A, &c_sA, 0, c_n, 0, c_algorithm, &c_which, &c_options, 0, (Rf_isNull(values) ? NULL : &c_values), (Rf_isNull(vectors) ? NULL : &c_vectors))); + IGRAPH_LOCAL_R_CHECK(igraph_eigen_matrix(&c_A, &c_sA, 0, c_n, 0, c_algorithm, &c_which, &c_options, 0, (Rf_isNull(values) ? NULL : &c_values), (Rf_isNull(vectors) ? NULL : &c_vectors))); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); igraph_sparsemat_destroy(&c_sA); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); PROTECT(values=Ry_igraph_0orvector_complex_to_SEXP(&c_values)); igraph_vector_complex_destroy(&c_values); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vectors=Ry_igraph_0ormatrix_complex_to_SEXP(&c_vectors)); igraph_matrix_complex_destroy(&c_vectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, options); SET_VECTOR_ELT(r_result, 1, values); SET_VECTOR_ELT(r_result, 2, vectors); @@ -17798,34 +18242,35 @@ SEXP R_igraph_eigen_matrix_symmetric(SEXP A, SEXP sA, SEXP n, SEXP algorithm, SE SEXP vectors; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(A, &c_A); Rz_SEXP_to_sparsemat(sA, &c_sA); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &c_sA); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &c_sA); IGRAPH_R_CHECK_INT(n); c_n = INTEGER(n)[0]; c_algorithm = (igraph_eigen_algorithm_t) Rf_asInteger(algorithm); Rz_SEXP_to_igraph_eigen_which(which, &c_which); Rz_SEXP_to_igraph_arpack_options(options, &c_options); - IGRAPH_R_CHECK(igraph_vector_init(&c_values, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_values); - IGRAPH_R_CHECK(igraph_matrix_init(&c_vectors, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &c_vectors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_values, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_values); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&c_vectors, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &c_vectors); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eigen_matrix_symmetric(&c_A, &c_sA, 0, c_n, 0, c_algorithm, &c_which, &c_options, 0, &c_values, &c_vectors)); + IGRAPH_LOCAL_R_CHECK(igraph_eigen_matrix_symmetric(&c_A, &c_sA, 0, c_n, 0, c_algorithm, &c_which, &c_options, 0, &c_values, &c_vectors)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); igraph_sparsemat_destroy(&c_sA); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); PROTECT(values=Ry_igraph_vector_to_SEXP(&c_values)); igraph_vector_destroy(&c_values); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vectors=Ry_igraph_matrix_to_SEXP(&c_vectors)); igraph_matrix_destroy(&c_vectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, options); SET_VECTOR_ELT(r_result, 1, values); SET_VECTOR_ELT(r_result, 2, vectors); @@ -17850,19 +18295,20 @@ SEXP R_igraph_solve_lsap(SEXP c, SEXP n) { SEXP p; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_matrix(c, &c_c); IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_p, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_p); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_p, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_p); /* Call igraph */ - IGRAPH_R_CHECK(igraph_solve_lsap(&c_c, c_n, &c_p)); + IGRAPH_LOCAL_R_CHECK(igraph_solve_lsap(&c_c, c_n, &c_p)); /* Convert output */ PROTECT(p=Ry_igraph_vector_int_to_SEXP(&c_p)); igraph_vector_int_destroy(&c_p); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = p; UNPROTECT(1); @@ -17882,25 +18328,26 @@ SEXP R_igraph_find_cycle(SEXP graph, SEXP mode) { SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edges); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_find_cycle(&c_graph, &c_vertices, &c_edges, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_find_cycle(&c_graph, &c_vertices, &c_edges, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_to_SEXPp1(&c_vertices)); igraph_vector_int_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_to_SEXPp1(&c_edges)); igraph_vector_int_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -17927,29 +18374,30 @@ SEXP R_igraph_simple_cycles(SEXP graph, SEXP mode, SEXP min_cycle_length, SEXP m SEXP edges; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_vertices); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_edges); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_vertices, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_vertices); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_edges, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_edges); c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_INT(min_cycle_length); c_min_cycle_length = (igraph_integer_t) REAL(min_cycle_length)[0]; IGRAPH_R_CHECK_INT(max_cycle_length); c_max_cycle_length = (igraph_integer_t) REAL(max_cycle_length)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_simple_cycles(&c_graph, &c_vertices, &c_edges, c_mode, c_min_cycle_length, c_max_cycle_length)); + IGRAPH_LOCAL_R_CHECK(igraph_simple_cycles(&c_graph, &c_vertices, &c_edges, c_mode, c_min_cycle_length, c_max_cycle_length)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vertices=Ry_igraph_vector_int_list_to_SEXPp1(&c_vertices)); igraph_vector_int_list_destroy(&c_vertices); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(edges=Ry_igraph_vector_int_list_to_SEXPp1(&c_edges)); igraph_vector_int_list_destroy(&c_edges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vertices); SET_VECTOR_ELT(r_result, 1, edges); SET_STRING_ELT(r_names, 0, Rf_mkChar("vertices")); @@ -17973,10 +18421,11 @@ SEXP R_igraph_is_eulerian(SEXP graph) { SEXP has_cycle; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_eulerian(&c_graph, &c_has_path, &c_has_cycle)); + IGRAPH_LOCAL_R_CHECK(igraph_is_eulerian(&c_graph, &c_has_path, &c_has_cycle)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -18008,24 +18457,25 @@ SEXP R_igraph_eulerian_path(SEXP graph) { SEXP vertex_res; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eulerian_path(&c_graph, &c_edge_res, &c_vertex_res)); + IGRAPH_LOCAL_R_CHECK(igraph_eulerian_path(&c_graph, &c_edge_res, &c_vertex_res)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(edge_res=Ry_igraph_vector_int_to_SEXPp1(&c_edge_res)); igraph_vector_int_destroy(&c_edge_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_res=Ry_igraph_vector_int_to_SEXPp1(&c_vertex_res)); igraph_vector_int_destroy(&c_vertex_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, edge_res); SET_VECTOR_ELT(r_result, 1, vertex_res); SET_STRING_ELT(r_names, 0, Rf_mkChar("epath")); @@ -18049,24 +18499,25 @@ SEXP R_igraph_eulerian_cycle(SEXP graph) { SEXP vertex_res; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_res); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_res); /* Call igraph */ - IGRAPH_R_CHECK(igraph_eulerian_cycle(&c_graph, &c_edge_res, &c_vertex_res)); + IGRAPH_LOCAL_R_CHECK(igraph_eulerian_cycle(&c_graph, &c_edge_res, &c_vertex_res)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(edge_res=Ry_igraph_vector_int_to_SEXPp1(&c_edge_res)); igraph_vector_int_destroy(&c_edge_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_res=Ry_igraph_vector_int_to_SEXPp1(&c_vertex_res)); igraph_vector_int_destroy(&c_vertex_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, edge_res); SET_VECTOR_ELT(r_result, 1, vertex_res); SET_STRING_ELT(r_names, 0, Rf_mkChar("epath")); @@ -18091,10 +18542,11 @@ SEXP R_igraph_fundamental_cycles(SEXP graph, SEXP start, SEXP bfs_cutoff, SEXP w SEXP basis; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_basis, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_basis); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_basis, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_basis); if (!Rf_isNull(start)) { c_start = (igraph_integer_t) REAL(start)[0]; } @@ -18104,12 +18556,12 @@ SEXP R_igraph_fundamental_cycles(SEXP graph, SEXP start, SEXP bfs_cutoff, SEXP w Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_fundamental_cycles(&c_graph, &c_basis, (Rf_isNull(start) ? 0 : c_start), c_bfs_cutoff, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_fundamental_cycles(&c_graph, &c_basis, (Rf_isNull(start) ? 0 : c_start), c_bfs_cutoff, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(basis=Ry_igraph_vector_int_list_to_SEXPp1(&c_basis)); igraph_vector_int_list_destroy(&c_basis); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = basis; UNPROTECT(1); @@ -18130,10 +18582,11 @@ SEXP R_igraph_minimum_cycle_basis(SEXP graph, SEXP bfs_cutoff, SEXP complete, SE SEXP basis; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_list_init(&c_basis, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &c_basis); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&c_basis, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &c_basis); IGRAPH_R_CHECK_INT(bfs_cutoff); c_bfs_cutoff = (igraph_integer_t) REAL(bfs_cutoff)[0]; IGRAPH_R_CHECK_BOOL(complete); @@ -18144,12 +18597,12 @@ SEXP R_igraph_minimum_cycle_basis(SEXP graph, SEXP bfs_cutoff, SEXP complete, SE Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_minimum_cycle_basis(&c_graph, &c_basis, c_bfs_cutoff, c_complete, c_use_cycle_order, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_minimum_cycle_basis(&c_graph, &c_basis, c_bfs_cutoff, c_complete, c_use_cycle_order, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(basis=Ry_igraph_vector_int_list_to_SEXPp1(&c_basis)); igraph_vector_int_list_destroy(&c_basis); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = basis; UNPROTECT(1); @@ -18169,12 +18622,13 @@ SEXP R_igraph_is_tree(SEXP graph, SEXP mode) { SEXP root; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_root = -1; c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_tree(&c_graph, &c_res, &c_root, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_is_tree(&c_graph, &c_res, &c_root, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -18207,13 +18661,14 @@ SEXP R_igraph_is_forest(SEXP graph, SEXP mode) { SEXP roots; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_roots, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_roots, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_forest(&c_graph, &c_res, &c_roots, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_is_forest(&c_graph, &c_res, &c_roots, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); @@ -18222,7 +18677,7 @@ SEXP R_igraph_is_forest(SEXP graph, SEXP mode) { LOGICAL(res)[0]=c_res; PROTECT(roots=Ry_igraph_vector_int_to_SEXPp1(&c_roots)); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, res); SET_VECTOR_ELT(r_result, 1, roots); SET_STRING_ELT(r_names, 0, Rf_mkChar("res")); @@ -18244,19 +18699,20 @@ SEXP R_igraph_from_prufer(SEXP prufer) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector_int_copy(prufer, &c_prufer); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_prufer); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_prufer); /* Call igraph */ - IGRAPH_R_CHECK(igraph_from_prufer(&c_graph, &c_prufer)); + IGRAPH_LOCAL_R_CHECK(igraph_from_prufer(&c_graph, &c_prufer)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_prufer); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -18273,17 +18729,18 @@ SEXP R_igraph_to_prufer(SEXP graph) { SEXP prufer; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_prufer, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_prufer); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_prufer, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_prufer); /* Call igraph */ - IGRAPH_R_CHECK(igraph_to_prufer(&c_graph, &c_prufer)); + IGRAPH_LOCAL_R_CHECK(igraph_to_prufer(&c_graph, &c_prufer)); /* Convert output */ PROTECT(prufer=Ry_igraph_vector_int_to_SEXPp1(&c_prufer)); igraph_vector_int_destroy(&c_prufer); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = prufer; UNPROTECT(1); @@ -18301,20 +18758,21 @@ SEXP R_igraph_tree_from_parent_vector(SEXP parents, SEXP type) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector_int_copy(parents, &c_parents); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); c_type = (igraph_tree_mode_t) Rf_asInteger(type); /* Call igraph */ - IGRAPH_R_CHECK(igraph_tree_from_parent_vector(&c_graph, &c_parents, c_type)); + IGRAPH_LOCAL_R_CHECK(igraph_tree_from_parent_vector(&c_graph, &c_parents, c_type)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -18331,10 +18789,11 @@ SEXP R_igraph_is_complete(SEXP graph) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_complete(&c_graph, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_complete(&c_graph, &c_res)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -18356,20 +18815,21 @@ SEXP R_igraph_minimum_spanning_tree(SEXP graph, SEXP weights) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_minimum_spanning_tree(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights))); + IGRAPH_LOCAL_R_CHECK(igraph_minimum_spanning_tree(&c_graph, &c_res, (Rf_isNull(weights) ? 0 : &c_weights))); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -18386,16 +18846,17 @@ SEXP R_igraph_minimum_spanning_tree_unweighted(SEXP graph) { SEXP mst; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); /* Call igraph */ - IGRAPH_R_CHECK(igraph_minimum_spanning_tree_unweighted(&c_graph, &c_mst)); + IGRAPH_LOCAL_R_CHECK(igraph_minimum_spanning_tree_unweighted(&c_graph, &c_mst)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_mst); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_mst); PROTECT(mst=Ry_igraph_to_SEXP(&c_mst)); IGRAPH_I_DESTROY(&c_mst); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = mst; UNPROTECT(1); @@ -18413,17 +18874,18 @@ SEXP R_igraph_minimum_spanning_tree_prim(SEXP graph, SEXP weights) { SEXP mst; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector(weights, &c_weights); /* Call igraph */ - IGRAPH_R_CHECK(igraph_minimum_spanning_tree_prim(&c_graph, &c_mst, &c_weights)); + IGRAPH_LOCAL_R_CHECK(igraph_minimum_spanning_tree_prim(&c_graph, &c_mst, &c_weights)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_mst); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_mst); PROTECT(mst=Ry_igraph_to_SEXP(&c_mst)); IGRAPH_I_DESTROY(&c_mst); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = mst; UNPROTECT(1); @@ -18441,20 +18903,21 @@ SEXP R_igraph_random_spanning_tree(SEXP graph, SEXP vid) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_res, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_res); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_res, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_res); if (!Rf_isNull(vid)) { c_vid = (igraph_integer_t) REAL(vid)[0]; } /* Call igraph */ - IGRAPH_R_CHECK(igraph_random_spanning_tree(&c_graph, &c_res, (Rf_isNull(vid) ? 0 : c_vid))); + IGRAPH_LOCAL_R_CHECK(igraph_random_spanning_tree(&c_graph, &c_res, (Rf_isNull(vid) ? 0 : c_vid))); /* Convert output */ PROTECT(res=Ry_igraph_vector_int_to_SEXPp1(&c_res)); igraph_vector_int_destroy(&c_res); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = res; UNPROTECT(1); @@ -18473,6 +18936,7 @@ SEXP R_igraph_tree_game(SEXP n, SEXP directed, SEXP method) { SEXP graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(n); c_n = (igraph_integer_t) REAL(n)[0]; @@ -18480,13 +18944,13 @@ SEXP R_igraph_tree_game(SEXP n, SEXP directed, SEXP method) { c_directed = LOGICAL(directed)[0]; c_method = (igraph_random_tree_t) Rf_asInteger(method); /* Call igraph */ - IGRAPH_R_CHECK(igraph_tree_game(&c_graph, c_n, c_directed, c_method)); + IGRAPH_LOCAL_R_CHECK(igraph_tree_game(&c_graph, c_n, c_directed, c_method)); /* Convert output */ - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -18504,18 +18968,19 @@ SEXP R_igraph_vertex_coloring_greedy(SEXP graph, SEXP heuristic) { SEXP colors; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_colors, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_colors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_colors, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_colors); c_heuristic = (igraph_coloring_greedy_t) Rf_asInteger(heuristic); /* Call igraph */ - IGRAPH_R_CHECK(igraph_vertex_coloring_greedy(&c_graph, &c_colors, c_heuristic)); + IGRAPH_LOCAL_R_CHECK(igraph_vertex_coloring_greedy(&c_graph, &c_colors, c_heuristic)); /* Convert output */ PROTECT(colors=Ry_igraph_vector_int_to_SEXP(&c_colors)); igraph_vector_int_destroy(&c_colors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = colors; UNPROTECT(1); @@ -18533,20 +18998,21 @@ SEXP R_igraph_is_vertex_coloring(SEXP graph, SEXP types) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(types)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(types, &c_types)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(types, &c_types)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_types, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_types, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_vertex_coloring(&c_graph, &c_types, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_vertex_coloring(&c_graph, &c_types, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -18568,11 +19034,12 @@ SEXP R_igraph_is_bipartite_coloring(SEXP graph, SEXP types) { SEXP mode; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); Rz_SEXP_to_vector_bool(types, &c_types); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_bipartite_coloring(&c_graph, &c_types, &c_res, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_is_bipartite_coloring(&c_graph, &c_types, &c_res, 0)); /* Convert output */ PROTECT(res=NEW_LOGICAL(1)); @@ -18594,20 +19061,21 @@ SEXP R_igraph_is_edge_coloring(SEXP graph, SEXP types) { SEXP res; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(types)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(types, &c_types)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(types, &c_types)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_types, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_types, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_types); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_types); /* Call igraph */ - IGRAPH_R_CHECK(igraph_is_edge_coloring(&c_graph, &c_types, &c_res)); + IGRAPH_LOCAL_R_CHECK(igraph_is_edge_coloring(&c_graph, &c_types, &c_res)); /* Convert output */ igraph_vector_int_destroy(&c_types); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(res=NEW_LOGICAL(1)); LOGICAL(res)[0]=c_res; r_result = res; @@ -18629,21 +19097,22 @@ SEXP R_igraph_deterministic_optimal_imitation(SEXP graph, SEXP vid, SEXP optimal igraph_neimode_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_vid = (igraph_integer_t) REAL(vid)[0]; c_optimality = (igraph_optimal_t) Rf_asInteger(optimality); Rz_SEXP_to_vector(quantities, &c_quantities); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_strategies); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_strategies); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_deterministic_optimal_imitation(&c_graph, c_vid, c_optimality, &c_quantities, &c_strategies, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_deterministic_optimal_imitation(&c_graph, c_vid, c_optimality, &c_quantities, &c_strategies, c_mode)); /* Convert output */ PROTECT(strategies=Ry_igraph_vector_int_to_SEXP(&c_strategies)); igraph_vector_int_destroy(&c_strategies); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = strategies; UNPROTECT(1); @@ -18662,28 +19131,29 @@ SEXP R_igraph_moran_process(SEXP graph, SEXP weights, SEXP quantities, SEXP stra igraph_neimode_t c_mode; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(quantities, &c_quantities)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_quantities); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_strategies); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(quantities, &c_quantities)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_quantities); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_strategies); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_moran_process(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_quantities, &c_strategies, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_moran_process(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_quantities, &c_strategies, c_mode)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(quantities=Ry_igraph_vector_to_SEXP(&c_quantities)); igraph_vector_destroy(&c_quantities); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(strategies=Ry_igraph_vector_int_to_SEXP(&c_strategies)); igraph_vector_int_destroy(&c_strategies); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, quantities); SET_VECTOR_ELT(r_result, 1, strategies); SET_STRING_ELT(r_names, 0, Rf_mkChar("quantities")); @@ -18708,22 +19178,23 @@ SEXP R_igraph_roulette_wheel_imitation(SEXP graph, SEXP vid, SEXP is_local, SEXP igraph_neimode_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_vid = (igraph_integer_t) REAL(vid)[0]; IGRAPH_R_CHECK_BOOL(is_local); c_is_local = LOGICAL(is_local)[0]; Rz_SEXP_to_vector(quantities, &c_quantities); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_strategies); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_strategies); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_roulette_wheel_imitation(&c_graph, c_vid, c_is_local, &c_quantities, &c_strategies, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_roulette_wheel_imitation(&c_graph, c_vid, c_is_local, &c_quantities, &c_strategies, c_mode)); /* Convert output */ PROTECT(strategies=Ry_igraph_vector_int_to_SEXP(&c_strategies)); igraph_vector_int_destroy(&c_strategies); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = strategies; UNPROTECT(1); @@ -18743,21 +19214,22 @@ SEXP R_igraph_stochastic_imitation(SEXP graph, SEXP vid, SEXP algo, SEXP quantit igraph_neimode_t c_mode; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_vid = (igraph_integer_t) REAL(vid)[0]; c_algo = (igraph_imitate_algorithm_t) Rf_asInteger(algo); Rz_SEXP_to_vector(quantities, &c_quantities); - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_strategies); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(strategies, &c_strategies)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_strategies); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_stochastic_imitation(&c_graph, c_vid, c_algo, &c_quantities, &c_strategies, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_stochastic_imitation(&c_graph, c_vid, c_algo, &c_quantities, &c_strategies, c_mode)); /* Convert output */ PROTECT(strategies=Ry_igraph_vector_int_to_SEXP(&c_strategies)); igraph_vector_int_destroy(&c_strategies); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = strategies; UNPROTECT(1); @@ -18778,29 +19250,30 @@ SEXP R_igraph_convergence_degree(SEXP graph) { SEXP out; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); - IGRAPH_R_CHECK(igraph_vector_init(&c_result, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_result); - IGRAPH_R_CHECK(igraph_vector_init(&c_in, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_in); - IGRAPH_R_CHECK(igraph_vector_init(&c_out, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_out); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_result, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_result); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_in, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_in); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_out, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_out); /* Call igraph */ - IGRAPH_R_CHECK(igraph_convergence_degree(&c_graph, &c_result, &c_in, &c_out)); + IGRAPH_LOCAL_R_CHECK(igraph_convergence_degree(&c_graph, &c_result, &c_in, &c_out)); /* Convert output */ PROTECT(r_result=NEW_LIST(3)); PROTECT(r_names=NEW_CHARACTER(3)); PROTECT(result=Ry_igraph_vector_to_SEXP(&c_result)); igraph_vector_destroy(&c_result); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(in=Ry_igraph_vector_to_SEXP(&c_in)); igraph_vector_destroy(&c_in); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(out=Ry_igraph_vector_to_SEXP(&c_out)); igraph_vector_destroy(&c_out); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, result); SET_VECTOR_ELT(r_result, 1, in); SET_VECTOR_ELT(r_result, 2, out); @@ -18821,6 +19294,7 @@ SEXP R_igraph_has_attribute_table(void) { /* Declarations */ igraph_bool_t c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ /* Call igraph */ @@ -18844,12 +19318,13 @@ SEXP R_igraph_progress(SEXP message, SEXP percent) { igraph_real_t c_percent; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_message = Rf_translateCharUTF8(STRING_ELT(message, 0)); IGRAPH_R_CHECK_REAL(percent); c_percent = REAL(percent)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_progress(c_message, c_percent, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_progress(c_message, c_percent, 0)); /* Convert output */ @@ -18866,10 +19341,11 @@ SEXP R_igraph_status(SEXP message) { const char* c_message; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ c_message = Rf_translateCharUTF8(STRING_ELT(message, 0)); /* Call igraph */ - IGRAPH_R_CHECK(igraph_status(c_message, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_status(c_message, 0)); /* Convert output */ @@ -18886,6 +19362,7 @@ SEXP R_igraph_strerror(SEXP igraph_errno) { igraph_error_t c_igraph_errno; const char* c_result; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ IGRAPH_R_CHECK_INT(igraph_errno); c_igraph_errno = (igraph_error_t) REAL(igraph_errno)[0]; @@ -18908,16 +19385,17 @@ SEXP R_igraph_expand_path_to_pairs(SEXP path) { igraph_vector_int_t c_path; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_vector_int_copy(path, &c_path); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_path); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_path); /* Call igraph */ - IGRAPH_R_CHECK(igraph_expand_path_to_pairs(&c_path)); + IGRAPH_LOCAL_R_CHECK(igraph_expand_path_to_pairs(&c_path)); /* Convert output */ PROTECT(path=Ry_igraph_vector_int_to_SEXPp1(&c_path)); igraph_vector_int_destroy(&c_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = path; UNPROTECT(1); @@ -18932,16 +19410,17 @@ SEXP R_igraph_invalidate_cache(SEXP graph) { igraph_t c_graph; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph_copy(graph, &c_graph); - IGRAPH_FINALLY(igraph_destroy, &c_graph); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &c_graph); /* Call igraph */ igraph_invalidate_cache(&c_graph); /* Convert output */ PROTECT(graph=Ry_igraph_to_SEXP(&c_graph)); IGRAPH_I_DESTROY(&c_graph); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = graph; UNPROTECT(1); @@ -18961,25 +19440,26 @@ SEXP R_igraph_vertex_path_from_edge_path(SEXP graph, SEXP start, SEXP edge_path, SEXP vertex_path; SEXP r_result; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(start)) { c_start = (igraph_integer_t) REAL(start)[0]; } Rz_SEXP_to_vector_int_copy(edge_path, &c_edge_path); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_path); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_path); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_path); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_path, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_path); c_mode = (igraph_neimode_t) Rf_asInteger(mode); /* Call igraph */ - IGRAPH_R_CHECK(igraph_vertex_path_from_edge_path(&c_graph, (Rf_isNull(start) ? 0 : c_start), &c_edge_path, &c_vertex_path, c_mode)); + IGRAPH_LOCAL_R_CHECK(igraph_vertex_path_from_edge_path(&c_graph, (Rf_isNull(start) ? 0 : c_start), &c_edge_path, &c_vertex_path, c_mode)); /* Convert output */ igraph_vector_int_destroy(&c_edge_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(vertex_path=Ry_igraph_vector_int_to_SEXPp1(&c_vertex_path)); igraph_vector_int_destroy(&c_vertex_path); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); r_result = vertex_path; UNPROTECT(1); @@ -19001,6 +19481,7 @@ SEXP R_igraph_version(void) { SEXP subminor; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ /* Call igraph */ @@ -19057,66 +19538,67 @@ SEXP R_igraph_bfs_closure(SEXP graph, SEXP root, SEXP roots, SEXP mode, SEXP unr SEXP dist; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_root = (igraph_integer_t) REAL(root)[0]; if (!Rf_isNull(roots)) { Rz_SEXP_to_vector_int_copy(roots, &c_roots); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_roots, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_roots); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_roots, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_roots); } c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(unreachable); c_unreachable = LOGICAL(unreachable)[0]; if (!Rf_isNull(restricted)) { Rz_SEXP_to_vector_int_copy(restricted, &c_restricted); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_restricted); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_restricted); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_restricted, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_restricted); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_restricted, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_restricted); } - IGRAPH_R_CHECK(igraph_vector_int_init(&c_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_rank, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_rank); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_parents, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_parents); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_pred, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_pred); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_succ, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_succ); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_dist, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dist); - /* Call igraph */ - IGRAPH_R_CHECK(igraph_bfs_closure(&c_graph, c_root, (Rf_isNull(roots) ? 0 : &c_roots), c_mode, c_unreachable, (Rf_isNull(restricted) ? 0 : &c_restricted), &c_order, &c_rank, &c_parents, &c_pred, &c_succ, &c_dist, callback)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_rank, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_rank); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_parents, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_parents); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_pred, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_pred); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_succ, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_succ); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_dist, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_dist); + /* Call igraph */ + IGRAPH_LOCAL_R_CHECK(igraph_bfs_closure(&c_graph, c_root, (Rf_isNull(roots) ? 0 : &c_roots), c_mode, c_unreachable, (Rf_isNull(restricted) ? 0 : &c_restricted), &c_order, &c_rank, &c_parents, &c_pred, &c_succ, &c_dist, callback)); /* Convert output */ PROTECT(r_result=NEW_LIST(6)); PROTECT(r_names=NEW_CHARACTER(6)); igraph_vector_int_destroy(&c_roots); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_restricted); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(order=Ry_igraph_vector_int_to_SEXPp1(&c_order)); igraph_vector_int_destroy(&c_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(rank=Ry_igraph_vector_int_to_SEXP(&c_rank)); igraph_vector_int_destroy(&c_rank); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(parents=Ry_igraph_vector_int_to_SEXP(&c_parents)); igraph_vector_int_destroy(&c_parents); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(pred=Ry_igraph_vector_int_to_SEXP(&c_pred)); igraph_vector_int_destroy(&c_pred); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(succ=Ry_igraph_vector_int_to_SEXP(&c_succ)); igraph_vector_int_destroy(&c_succ); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(dist=Ry_igraph_vector_int_to_SEXP(&c_dist)); igraph_vector_int_destroy(&c_dist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, order); SET_VECTOR_ELT(r_result, 1, rank); SET_VECTOR_ELT(r_result, 2, parents); @@ -19157,38 +19639,39 @@ SEXP R_igraph_dfs_closure(SEXP graph, SEXP root, SEXP mode, SEXP unreachable, SE SEXP dist; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_root = (igraph_integer_t) REAL(root)[0]; c_mode = (igraph_neimode_t) Rf_asInteger(mode); IGRAPH_R_CHECK_BOOL(unreachable); c_unreachable = LOGICAL(unreachable)[0]; - IGRAPH_R_CHECK(igraph_vector_int_init(&c_order, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_order_out, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_order_out); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_father, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_father); - IGRAPH_R_CHECK(igraph_vector_int_init(&c_dist, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dist); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_order, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_order_out, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_order_out); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_father, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_father); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_dist, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_dist); /* Call igraph */ - IGRAPH_R_CHECK(igraph_dfs_closure(&c_graph, c_root, c_mode, c_unreachable, &c_order, &c_order_out, &c_father, &c_dist, in_callback, out_callback)); + IGRAPH_LOCAL_R_CHECK(igraph_dfs_closure(&c_graph, c_root, c_mode, c_unreachable, &c_order, &c_order_out, &c_father, &c_dist, in_callback, out_callback)); /* Convert output */ PROTECT(r_result=NEW_LIST(4)); PROTECT(r_names=NEW_CHARACTER(4)); PROTECT(order=Ry_igraph_vector_int_to_SEXPp1(&c_order)); igraph_vector_int_destroy(&c_order); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(order_out=Ry_igraph_vector_int_to_SEXPp1(&c_order_out)); igraph_vector_int_destroy(&c_order_out); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(father=Ry_igraph_vector_int_to_SEXP(&c_father)); igraph_vector_int_destroy(&c_father); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(dist=Ry_igraph_vector_int_to_SEXP(&c_dist)); igraph_vector_int_destroy(&c_dist); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, order); SET_VECTOR_ELT(r_result, 1, order_out); SET_VECTOR_ELT(r_result, 2, father); @@ -19214,6 +19697,7 @@ SEXP R_igraph_cliques_callback_closure(SEXP graph, SEXP min_size, SEXP max_size, igraph_integer_t c_max_size; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(min_size); @@ -19221,7 +19705,7 @@ SEXP R_igraph_cliques_callback_closure(SEXP graph, SEXP min_size, SEXP max_size, IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_cliques_callback_closure(&c_graph, c_min_size, c_max_size, callback)); + IGRAPH_LOCAL_R_CHECK(igraph_cliques_callback_closure(&c_graph, c_min_size, c_max_size, callback)); /* Convert output */ @@ -19240,6 +19724,7 @@ SEXP R_igraph_maximal_cliques_callback_closure(SEXP graph, SEXP min_size, SEXP m igraph_integer_t c_max_size; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(min_size); @@ -19247,7 +19732,7 @@ SEXP R_igraph_maximal_cliques_callback_closure(SEXP graph, SEXP min_size, SEXP m IGRAPH_R_CHECK_INT(max_size); c_max_size = (igraph_integer_t) REAL(max_size)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_maximal_cliques_callback_closure(&c_graph, c_min_size, c_max_size, callback)); + IGRAPH_LOCAL_R_CHECK(igraph_maximal_cliques_callback_closure(&c_graph, c_min_size, c_max_size, callback)); /* Convert output */ @@ -19283,55 +19768,56 @@ SEXP R_igraph_community_leading_eigenvector_callback_closure(SEXP graph, SEXP we SEXP history; SEXP r_result, r_names; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); if (!Rf_isNull(weights)) { Rz_SEXP_to_vector(weights, &c_weights); } - IGRAPH_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &c_merges); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&c_merges, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &c_merges); if (!Rf_isNull(membership)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(membership, &c_membership)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_membership, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_membership); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_membership, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_membership); } IGRAPH_R_CHECK_INT(steps); c_steps = (igraph_integer_t) REAL(steps)[0]; Rz_SEXP_to_igraph_arpack_options(options, &c_options); IGRAPH_R_CHECK_BOOL(start); c_start = LOGICAL(start)[0]; - IGRAPH_R_CHECK(igraph_vector_init(&c_eigenvalues, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_eigenvalues); - IGRAPH_R_CHECK(igraph_vector_list_init(&c_eigenvectors, 0)); - IGRAPH_FINALLY(igraph_vector_list_destroy, &c_eigenvectors); - IGRAPH_R_CHECK(igraph_vector_init(&c_history, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &c_history); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_eigenvalues, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_eigenvalues); + IGRAPH_LOCAL_R_CHECK(igraph_vector_list_init(&c_eigenvectors, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_list_destroy, &c_eigenvectors); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&c_history, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &c_history); /* Call igraph */ - IGRAPH_R_CHECK(igraph_community_leading_eigenvector_callback_closure(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_membership, c_steps, &c_options, &c_modularity, c_start, &c_eigenvalues, &c_eigenvectors, &c_history, callback, extra, env, env_arp)); + IGRAPH_LOCAL_R_CHECK(igraph_community_leading_eigenvector_callback_closure(&c_graph, (Rf_isNull(weights) ? 0 : &c_weights), &c_merges, &c_membership, c_steps, &c_options, &c_modularity, c_start, &c_eigenvalues, &c_eigenvectors, &c_history, callback, extra, env, env_arp)); /* Convert output */ PROTECT(r_result=NEW_LIST(7)); PROTECT(r_names=NEW_CHARACTER(7)); PROTECT(merges=Ry_igraph_matrix_int_to_SEXP(&c_merges)); igraph_matrix_int_destroy(&c_merges); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(membership=Ry_igraph_vector_int_to_SEXP(&c_membership)); igraph_vector_int_destroy(&c_membership); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(options=Ry_igraph_arpack_options_to_SEXP(&c_options)); PROTECT(modularity=NEW_NUMERIC(1)); REAL(modularity)[0]=c_modularity; PROTECT(eigenvalues=Ry_igraph_vector_to_SEXP(&c_eigenvalues)); igraph_vector_destroy(&c_eigenvalues); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(eigenvectors=Rx_igraph_vector_list_to_SEXP(&c_eigenvectors)); igraph_vector_list_destroy(&c_eigenvectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(history=Ry_igraph_vector_to_SEXP(&c_history)); igraph_vector_destroy(&c_history); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, merges); SET_VECTOR_ELT(r_result, 1, membership); SET_VECTOR_ELT(r_result, 2, options); @@ -19366,45 +19852,46 @@ SEXP R_igraph_get_isomorphisms_vf2_callback_closure(SEXP graph1, SEXP graph2, SE igraph_vector_int_t c_edge_color2; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_isomorphisms_vf2_callback_closure(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), callback)); + IGRAPH_LOCAL_R_CHECK(igraph_get_isomorphisms_vf2_callback_closure(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), callback)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); return(R_NilValue); @@ -19423,45 +19910,46 @@ SEXP R_igraph_get_subisomorphisms_vf2_callback_closure(SEXP graph1, SEXP graph2, igraph_vector_int_t c_edge_color2; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph1, &c_graph1); Rz_SEXP_to_igraph(graph2, &c_graph2); if (!Rf_isNull(vertex_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color1, &c_vertex_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color1); if (!Rf_isNull(vertex_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(vertex_color2, &c_vertex_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_vertex_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_vertex_color2); if (!Rf_isNull(edge_color1)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color1, &c_edge_color1)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color1, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color1); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color1); if (!Rf_isNull(edge_color2)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(edge_color2, &c_edge_color2)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&c_edge_color2, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &c_edge_color2); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &c_edge_color2); /* Call igraph */ - IGRAPH_R_CHECK(igraph_get_subisomorphisms_vf2_callback_closure(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), callback)); + IGRAPH_LOCAL_R_CHECK(igraph_get_subisomorphisms_vf2_callback_closure(&c_graph1, &c_graph2, (Rf_isNull(vertex_color1) ? 0 : &c_vertex_color1), (Rf_isNull(vertex_color2) ? 0 : &c_vertex_color2), (Rf_isNull(edge_color1) ? 0 : &c_edge_color1), (Rf_isNull(edge_color2) ? 0 : &c_edge_color2), callback)); /* Convert output */ igraph_vector_int_destroy(&c_vertex_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_vertex_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color1); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); igraph_vector_int_destroy(&c_edge_color2); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); return(R_NilValue); @@ -19478,6 +19966,7 @@ SEXP R_igraph_simple_cycles_callback_closure(SEXP graph, SEXP mode, SEXP min_cyc igraph_integer_t c_max_cycle_length; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); c_mode = (igraph_neimode_t) Rf_asInteger(mode); @@ -19486,7 +19975,7 @@ SEXP R_igraph_simple_cycles_callback_closure(SEXP graph, SEXP mode, SEXP min_cyc IGRAPH_R_CHECK_INT(max_cycle_length); c_max_cycle_length = (igraph_integer_t) REAL(max_cycle_length)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_simple_cycles_callback_closure(&c_graph, c_mode, c_min_cycle_length, c_max_cycle_length, callback)); + IGRAPH_LOCAL_R_CHECK(igraph_simple_cycles_callback_closure(&c_graph, c_mode, c_min_cycle_length, c_max_cycle_length, callback)); /* Convert output */ @@ -19505,6 +19994,7 @@ SEXP R_igraph_motifs_randesu_callback_closure(SEXP graph, SEXP size, SEXP cut_pr igraph_vector_t c_cut_prob; + IGRAPH_LOCAL_FINALLY_STACK; /* Convert input */ Rz_SEXP_to_igraph(graph, &c_graph); IGRAPH_R_CHECK_INT(size); @@ -19513,7 +20003,7 @@ SEXP R_igraph_motifs_randesu_callback_closure(SEXP graph, SEXP size, SEXP cut_pr Rz_SEXP_to_vector(cut_prob, &c_cut_prob); } /* Call igraph */ - IGRAPH_R_CHECK(igraph_motifs_randesu_callback_closure(&c_graph, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob), callback)); + IGRAPH_LOCAL_R_CHECK(igraph_motifs_randesu_callback_closure(&c_graph, c_size, (Rf_isNull(cut_prob) ? 0 : &c_cut_prob), callback)); /* Convert output */ diff --git a/src/rinterface.h b/src/rinterface.h index c1a18271c7b..b18074a3dba 100644 --- a/src/rinterface.h +++ b/src/rinterface.h @@ -142,6 +142,84 @@ void igraph_vector_int_destroy_pv(void *pv_ptr); void igraph_vector_bool_destroy_pv(void *pv_ptr); void igraph_vector_int_list_destroy_pv(void *pv_ptr); +/* Local finally stack for reentrant variants of IGRAPH_FINALLY* API */ + +// Maximum number of elements in a local finally stack +#define IGRAPH_LOCAL_FINALLY_STACK_SIZE 100 + +// Declare a local finally stack. +// This should be placed at the beginning of a function. +// After this declaration, use IGRAPH_LOCAL_R_CHECK instead of IGRAPH_R_CHECK. +#define IGRAPH_LOCAL_FINALLY_STACK \ + struct igraph_i_protectedPtr igraph_i_local_finally_stack[IGRAPH_LOCAL_FINALLY_STACK_SIZE]; \ + int igraph_i_local_finally_stack_size = 0 + +// Add a destructor to the local finally stack +#define IGRAPH_LOCAL_FINALLY_REAL(func_arg, ptr_arg) \ + do { \ + int no = igraph_i_local_finally_stack_size; \ + if (no >= IGRAPH_LOCAL_FINALLY_STACK_SIZE) { \ + IGRAPH_FATALF("Local finally stack too large: it contains %d elements.", no); \ + } \ + igraph_i_local_finally_stack[no].ptr = (ptr_arg); \ + igraph_i_local_finally_stack[no].func = (func_arg); \ + igraph_i_local_finally_stack[no].level = 0; \ + igraph_i_local_finally_stack_size++; \ + } while (0) + +// Remove items from the local finally stack without calling their destructors +#define IGRAPH_LOCAL_FINALLY_CLEAN(minus) \ + do { \ + igraph_i_local_finally_stack_size -= (minus); \ + if (igraph_i_local_finally_stack_size < 0) { \ + int left = igraph_i_local_finally_stack_size + (minus); \ + igraph_i_local_finally_stack_size = 0; \ + IGRAPH_FATALF("Corrupt local finally stack: trying to pop %d element(s) when only %d left.", (minus), left); \ + } \ + } while (0) + +// Call all destructors in the local finally stack and empty it +#define IGRAPH_LOCAL_FINALLY_FREE() \ + do { \ + for (; igraph_i_local_finally_stack_size > 0; igraph_i_local_finally_stack_size--) { \ + int p = igraph_i_local_finally_stack_size - 1; \ + igraph_i_local_finally_stack[p].func(igraph_i_local_finally_stack[p].ptr); \ + } \ + } while (0) + +// Variant of IGRAPH_FINALLY for the local stack +#define IGRAPH_LOCAL_FINALLY(func, ptr) \ + do { \ + if (0) { func(ptr); } \ + IGRAPH_LOCAL_FINALLY_REAL((igraph_finally_func_t*)(func), (ptr)); \ + } while (0) + +// Variant of IGRAPH_FINALLY_PV for the local stack (satisfies UBSAN checks) +#define IGRAPH_LOCAL_FINALLY_PV(func, ptr) \ + do { \ + if (0) { func(ptr); } \ + IGRAPH_LOCAL_FINALLY_REAL((func##_pv), (ptr)); \ + } while (0) + +// Variant of IGRAPH_R_CHECK for functions with local finally stacks +// This ensures the local stack is cleaned up before calling error handlers +#define IGRAPH_LOCAL_R_CHECK(func) \ + do { \ + Rx_igraph_attribute_clean_preserve_list(); \ + Rx_igraph_set_in_r_check(true); \ + igraph_error_type_t __c = func; \ + Rx_igraph_set_in_r_check(false); \ + Rx_igraph_warning(); \ + if (__c == IGRAPH_INTERRUPTED) { \ + IGRAPH_LOCAL_FINALLY_FREE(); \ + Rx_igraph_interrupt(); \ + } \ + else if (__c != IGRAPH_SUCCESS) { \ + IGRAPH_LOCAL_FINALLY_FREE(); \ + Rx_igraph_error(); \ + } \ + } while (0) + #define IGRAPH_R_CHECK_INT(v) R_check_int_scalar(v) #define IGRAPH_R_CHECK_REAL(v) R_check_real_scalar(v) #define IGRAPH_R_CHECK_BOOL(v) R_check_bool_scalar(v) diff --git a/src/rinterface_extra.c b/src/rinterface_extra.c index b9699995125..8e1da4c5dfc 100644 --- a/src/rinterface_extra.c +++ b/src/rinterface_extra.c @@ -386,10 +386,11 @@ SEXP Rx_igraph_get_attr_mode(SEXP graph, SEXP pwhich) { /* HELPER: internal C; must use IGRAPH_CHECK */ igraph_error_t Rz_SEXP_to_attr_comb(SEXP input, igraph_attribute_combination_t *comb) { + IGRAPH_LOCAL_FINALLY_STACK; igraph_integer_t n = Rf_xlength(input); IGRAPH_CHECK(igraph_attribute_combination_init(comb)); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, comb); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, comb); for (igraph_integer_t i=0; iattr; SEXP val, rep=0, names, newnames; igraph_vector_int_t news; @@ -699,7 +701,7 @@ igraph_error_t Rx_igraph_attribute_add_vertices(igraph_t *graph, igraph_integer_ /* First add the new attributes, if any */ newattrs=0; if (igraph_vector_int_init(&news, 0)) Rf_error("Out of memory"); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &news); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &news); for (igraph_integer_t i=0; iname; @@ -734,7 +736,7 @@ igraph_error_t Rx_igraph_attribute_add_vertices(igraph_t *graph, igraph_integer_ UNPROTECT(9); } igraph_vector_int_destroy(&news); - IGRAPH_FINALLY_CLEAN(1); /* news */ + IGRAPH_LOCAL_FINALLY_CLEAN(1); /* news */ /* Now append the new values */ Rx_igraph_attribute_add_vertices_append(val, nv, nattr); @@ -1018,6 +1020,7 @@ void Rx_igraph_attribute_add_edges_append(SEXP eal, /* HELPER: internal C; must use IGRAPH_CHECK */ igraph_error_t Rx_igraph_attribute_add_edges(igraph_t *graph, const igraph_vector_int_t *edges, igraph_vector_ptr_t *nattr) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP attr=graph->attr; SEXP eal, names, newnames; igraph_vector_int_t news; @@ -1026,7 +1029,7 @@ igraph_error_t Rx_igraph_attribute_add_edges(igraph_t *graph, const igraph_vecto int px = 0; if (igraph_vector_int_init(&news, 0)) Rf_error("Out of memory"); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &news); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &news); SEXP newattr = PROTECT(Rx_igraph_attribute_add_edges_dup(attr)); px++; attr=graph->attr=newattr; @@ -1078,7 +1081,7 @@ igraph_error_t Rx_igraph_attribute_add_edges(igraph_t *graph, const igraph_vecto UNPROTECT(9); } igraph_vector_int_destroy(&news); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); /* Now append the new values */ Rx_igraph_attribute_add_edges_append(eal, edges, nattr); @@ -1397,6 +1400,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_vertex_attr(const igraph_t *graph const char *name, igraph_vs_t vs, igraph_vector_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP val=VECTOR_ELT(graph->attr, 2); SEXP va=Rx_igraph_getListElement(val, name); igraph_vector_t newvalue; @@ -1416,7 +1420,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_vertex_attr(const igraph_t *graph igraph_vit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_vit_create(graph, vs, &it)); - IGRAPH_FINALLY(igraph_vit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_vit_destroy, &it); IGRAPH_CHECK(igraph_vector_resize(value, IGRAPH_VIT_SIZE(it))); if (IS_NUMERIC(va)) { while (!IGRAPH_VIT_END(it)) { @@ -1434,7 +1438,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_vertex_attr(const igraph_t *graph } } igraph_vit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1445,6 +1449,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_vertex_attr(const igraph_t *graph, const char *name, igraph_vs_t vs, igraph_vector_bool_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP val=VECTOR_ELT(graph->attr, 2); SEXP va=Rx_igraph_getListElement(val, name); igraph_vector_bool_t newvalue; @@ -1464,7 +1469,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_vertex_attr(const igraph_t *graph, igraph_vit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_vit_create(graph, vs, &it)); - IGRAPH_FINALLY(igraph_vit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_vit_destroy, &it); IGRAPH_CHECK(igraph_vector_bool_resize(value, IGRAPH_VIT_SIZE(it))); while (!IGRAPH_VIT_END(it)) { igraph_integer_t v=IGRAPH_VIT_GET(it); @@ -1473,7 +1478,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_vertex_attr(const igraph_t *graph, i++; } igraph_vit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1484,6 +1489,7 @@ igraph_error_t Rx_igraph_attribute_get_string_vertex_attr(const igraph_t *graph, const char *name, igraph_vs_t vs, igraph_strvector_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP val, va; val=VECTOR_ELT(graph->attr, 2); @@ -1501,7 +1507,7 @@ igraph_error_t Rx_igraph_attribute_get_string_vertex_attr(const igraph_t *graph, igraph_vit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_vit_create(graph, vs, &it)); - IGRAPH_FINALLY(igraph_vit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_vit_destroy, &it); IGRAPH_CHECK(igraph_strvector_resize(value, IGRAPH_VIT_SIZE(it))); while (!IGRAPH_VIT_END(it)) { igraph_integer_t v=IGRAPH_VIT_GET(it); @@ -1511,7 +1517,7 @@ igraph_error_t Rx_igraph_attribute_get_string_vertex_attr(const igraph_t *graph, i++; } igraph_vit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1522,6 +1528,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_edge_attr(const igraph_t *graph, const char *name, igraph_es_t es, igraph_vector_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP eal=VECTOR_ELT(graph->attr, 3); SEXP ea=Rx_igraph_getListElement(eal, name); igraph_vector_t newvalue; @@ -1541,7 +1548,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_edge_attr(const igraph_t *graph, igraph_eit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_eit_create(graph, es, &it)); - IGRAPH_FINALLY(igraph_eit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_eit_destroy, &it); IGRAPH_CHECK(igraph_vector_resize(value, IGRAPH_EIT_SIZE(it))); if (IS_NUMERIC(ea)) { while (!IGRAPH_EIT_END(it)) { @@ -1559,7 +1566,7 @@ igraph_error_t Rx_igraph_attribute_get_numeric_edge_attr(const igraph_t *graph, } } igraph_eit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1570,6 +1577,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_edge_attr(const igraph_t *graph, const char *name, igraph_es_t es, igraph_vector_bool_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP eal=VECTOR_ELT(graph->attr, 3); SEXP ea=Rx_igraph_getListElement(eal, name); igraph_vector_bool_t newvalue; @@ -1589,7 +1597,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_edge_attr(const igraph_t *graph, igraph_eit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_eit_create(graph, es, &it)); - IGRAPH_FINALLY(igraph_eit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_eit_destroy, &it); IGRAPH_CHECK(igraph_vector_bool_resize(value, IGRAPH_EIT_SIZE(it))); while (!IGRAPH_EIT_END(it)) { igraph_integer_t e=IGRAPH_EIT_GET(it); @@ -1598,7 +1606,7 @@ igraph_error_t Rx_igraph_attribute_get_bool_edge_attr(const igraph_t *graph, i++; } igraph_eit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1609,6 +1617,7 @@ igraph_error_t Rx_igraph_attribute_get_string_edge_attr(const igraph_t *graph, const char *name, igraph_es_t es, igraph_strvector_t *value) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP eal=VECTOR_ELT(graph->attr, 3); SEXP ea=Rx_igraph_getListElement(eal, name); @@ -1625,7 +1634,7 @@ igraph_error_t Rx_igraph_attribute_get_string_edge_attr(const igraph_t *graph, igraph_eit_t it; igraph_integer_t i=0; IGRAPH_CHECK(igraph_eit_create(graph, es, &it)); - IGRAPH_FINALLY(igraph_eit_destroy, &it); + IGRAPH_LOCAL_FINALLY(igraph_eit_destroy, &it); IGRAPH_CHECK(igraph_strvector_resize(value, IGRAPH_EIT_SIZE(it))); while (!IGRAPH_EIT_END(it)) { igraph_integer_t e=IGRAPH_EIT_GET(it); @@ -1635,7 +1644,7 @@ igraph_error_t Rx_igraph_attribute_get_string_edge_attr(const igraph_t *graph, i++; } igraph_eit_destroy(&it); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } return 0; @@ -1998,7 +2007,7 @@ igraph_error_t Rx_igraph_attribute_combine_vertices(const igraph_t *graph, igraph_t *newgraph, const igraph_vector_int_list_t *merges, const igraph_attribute_combination_t *comb) { - + IGRAPH_LOCAL_FINALLY_STACK; SEXP attr=graph->attr; SEXP toattr=newgraph->attr; SEXP val=VECTOR_ELT(attr, 2); @@ -2018,14 +2027,14 @@ igraph_error_t Rx_igraph_attribute_combine_vertices(const igraph_t *graph, IGRAPH_ERROR("Cannot combine edge attributes", IGRAPH_ENOMEM); } - IGRAPH_FINALLY(igraph_free, TODO); + IGRAPH_LOCAL_FINALLY(igraph_free, TODO); funcs=IGRAPH_CALLOC(valno, igraph_function_pointer_t); if (!funcs) { UNPROTECT(px); IGRAPH_ERROR("Cannot combine edge attributes", IGRAPH_ENOMEM); } - IGRAPH_FINALLY(igraph_free, funcs); + IGRAPH_LOCAL_FINALLY(igraph_free, funcs); for (igraph_integer_t i=0; iattr; SEXP toattr=newgraph->attr; SEXP eal=VECTOR_ELT(attr, 3); @@ -2186,14 +2195,14 @@ igraph_error_t Rx_igraph_attribute_combine_edges(const igraph_t *graph, IGRAPH_ERROR("Cannot combine edge attributes", IGRAPH_ENOMEM); } - IGRAPH_FINALLY(igraph_free, TODO); + IGRAPH_LOCAL_FINALLY(igraph_free, TODO); funcs=igraph_Calloc(ealno, igraph_function_pointer_t); if (!funcs) { UNPROTECT(px); IGRAPH_ERROR("Cannot combine edge attributes", IGRAPH_ENOMEM); } - IGRAPH_FINALLY(igraph_free, funcs); + IGRAPH_LOCAL_FINALLY(igraph_free, funcs); for (igraph_integer_t i=0; ileft)); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &hrg->left); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &hrg->left); IGRAPH_CHECK(Rz_SEXP_to_vector_int_copy(VECTOR_ELT(shrg, 1), &hrg->right)); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &hrg->right); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &hrg->right); IGRAPH_CHECK(Rz_SEXP_to_vector_copy(VECTOR_ELT(shrg, 2), &hrg->prob)); - IGRAPH_FINALLY_PV(igraph_vector_destroy, &hrg->prob); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_destroy, &hrg->prob); IGRAPH_CHECK(Rz_SEXP_to_vector_int_copy(VECTOR_ELT(shrg, 3), &hrg->edges)); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &hrg->edges); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &hrg->edges); IGRAPH_CHECK(Rz_SEXP_to_vector_int_copy(VECTOR_ELT(shrg, 4), &hrg->vertices)); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &hrg->vertices); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &hrg->vertices); - IGRAPH_FINALLY_CLEAN(5); + IGRAPH_LOCAL_FINALLY_CLEAN(5); return IGRAPH_SUCCESS; } @@ -3346,6 +3357,7 @@ SEXP Ry_igraph_maxflow_stats_to_SEXP(const igraph_maxflow_stats_t *st) { /* TOP-LEVEL: called from R via .Call; must use IGRAPH_R_CHECK */ SEXP Rx_igraph_arpack_unpack_complex(SEXP vectors, SEXP values, SEXP nev) { + IGRAPH_LOCAL_FINALLY_STACK; /* Declarations */ igraph_matrix_t c_vectors; igraph_matrix_t c_values; @@ -3356,24 +3368,24 @@ SEXP Rx_igraph_arpack_unpack_complex(SEXP vectors, SEXP values, SEXP nev) { if (0 != Rz_SEXP_to_igraph_matrix_copy(vectors, &c_vectors)) { igraph_error("", __FILE__, __LINE__, IGRAPH_ENOMEM); } - IGRAPH_FINALLY_PV(igraph_matrix_destroy, &c_vectors); + IGRAPH_LOCAL_FINALLY_PV(igraph_matrix_destroy, &c_vectors); if (0 != Rz_SEXP_to_igraph_matrix_copy(values, &c_values)) { igraph_error("", __FILE__, __LINE__, IGRAPH_ENOMEM); } - IGRAPH_FINALLY_PV(igraph_matrix_destroy, &c_values); + IGRAPH_LOCAL_FINALLY_PV(igraph_matrix_destroy, &c_values); c_nev=REAL(nev)[0]; /* Call igraph */ - IGRAPH_R_CHECK(igraph_arpack_unpack_complex(&c_vectors, &c_values, c_nev)); + IGRAPH_LOCAL_R_CHECK(igraph_arpack_unpack_complex(&c_vectors, &c_values, c_nev)); /* Convert output */ PROTECT(r_result=NEW_LIST(2)); PROTECT(r_names=NEW_CHARACTER(2)); PROTECT(vectors=Ry_igraph_matrix_to_SEXP(&c_vectors)); igraph_matrix_destroy(&c_vectors); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PROTECT(values=Ry_igraph_matrix_to_SEXP(&c_values)); igraph_matrix_destroy(&c_values); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SET_VECTOR_ELT(r_result, 0, vectors); SET_VECTOR_ELT(r_result, 1, values); SET_STRING_ELT(r_names, 0, Rf_mkChar("vectors")); @@ -3431,6 +3443,7 @@ void Ry_igraph_sirlist_destroy(igraph_vector_ptr_t *sl) { /* HELPER: internal C; must use IGRAPH_CHECK */ SEXP Ry_igraph_sparsemat_to_SEXP_triplet(const igraph_sparsemat_t *sp) { + IGRAPH_LOCAL_FINALLY_STACK; SEXP res, names; int nz=igraph_sparsemat_nonzero_storage(sp); @@ -3446,13 +3459,13 @@ SEXP Ry_igraph_sparsemat_to_SEXP_triplet(const igraph_sparsemat_t *sp) { igraph_vector_int_t i, j; igraph_vector_t x; igraph_vector_int_init(&i, nz); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &i); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &i); igraph_vector_int_init(&j, nz); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &j); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &j); igraph_vector_init(&x, nz); - IGRAPH_FINALLY_PV(igraph_vector_destroy, &x); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_destroy, &x); igraph_sparsemat_getelements(sp, &j, &i, &x); SET_VECTOR_ELT(res, 2, Ry_igraph_vector_int_to_SEXP(&i)); @@ -3462,7 +3475,7 @@ SEXP Ry_igraph_sparsemat_to_SEXP_triplet(const igraph_sparsemat_t *sp) { igraph_vector_int_destroy(&i); igraph_vector_int_destroy(&j); igraph_vector_destroy(&x); - IGRAPH_FINALLY_CLEAN(3); + IGRAPH_LOCAL_FINALLY_CLEAN(3); } PROTECT(names=NEW_CHARACTER(5)); @@ -3585,8 +3598,9 @@ void Rz_SEXP_to_sparsemat(SEXP sm, igraph_sparsemat_t *sp) { igraph_error_t Rz_SEXP_to_igraph_adjlist(SEXP vectorlist, igraph_adjlist_t *ptr) { igraph_integer_t length = Rf_xlength(vectorlist); + IGRAPH_LOCAL_FINALLY_STACK; IGRAPH_CHECK(igraph_adjlist_init_empty(ptr, length)); - IGRAPH_FINALLY(igraph_adjlist_destroy, ptr); + IGRAPH_LOCAL_FINALLY(igraph_adjlist_destroy, ptr); for (igraph_integer_t i=0; i str: res = "\n".join(inout + out + [retdecl] + ["SEXP r_result;"]) else: res = "\n".join(inout + out + [retdecl] + ["SEXP r_result, r_names;"]) + + # Add local finally stack declaration + res += "\nIGRAPH_LOCAL_FINALLY_STACK;" + return indent(res) def chunk_inconv(self, desc: FunctionDescriptor) -> str: @@ -619,11 +623,11 @@ def chunk_call(self, desc: FunctionDescriptor) -> str: res = "" # No return type means - return type is igraph_error_t if not desc.return_type: - res = f" IGRAPH_R_CHECK({desc.name}({calls}));\n" + res = f" IGRAPH_LOCAL_R_CHECK({desc.name}({calls}));\n" else: return_type = self.get_type_descriptor(desc.return_type) if return_type.name == "ERROR": - res = f" IGRAPH_R_CHECK({desc.name}({calls}));\n" + res = f" IGRAPH_LOCAL_R_CHECK({desc.name}({calls}));\n" elif return_type.name == "VOID": res = f" {desc.name}({calls});\n" else: diff --git a/tools/stimulus/types-RC.yaml b/tools/stimulus/types-RC.yaml index 3d1ada36ec9..d08ed73e898 100644 --- a/tools/stimulus/types-RC.yaml +++ b/tools/stimulus/types-RC.yaml @@ -5,30 +5,30 @@ GRAPH: IN: Rz_SEXP_to_igraph(%I%, &%C%); INOUT: |- Rz_SEXP_to_igraph_copy(%I%, &%C%); - IGRAPH_FINALLY(igraph_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &%C%); OUTCONV: INOUT: |- PROTECT(%I%=Ry_igraph_to_SEXP(&%C%)); IGRAPH_I_DESTROY(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- - IGRAPH_FINALLY(igraph_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_destroy, &%C%); PROTECT(%I%=Ry_igraph_to_SEXP(&%C%)); IGRAPH_I_DESTROY(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); GRAPH_LIST: CALL: '&%C%' CTYPE: igraph_graph_list_t INCONV: OUT: |- - IGRAPH_R_CHECK(igraph_graph_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_graph_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_graph_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_graph_list_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_graphlist_to_SEXP(&%C%)); IGRAPH_FREE(%C%.stor_begin); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); GRAPH_PTR_LIST: CALL: '&%C%' @@ -36,19 +36,19 @@ GRAPH_PTR_LIST: INCONV: IN: |- igraph_t *%C%_storage; - IGRAPH_R_CHECK(Rz_SEXP_to_graph_ptr_list(%I%, &%C%, &%C%_storage)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_graph_ptr_list(%I%, &%C%, &%C%_storage)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_ptr_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_ptr_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_ptr_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_ptr_destroy, &%C%); OUTCONV: IN: |- igraph_vector_ptr_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_graph_ptr_list_to_SEXP(&%C%)); igraph_vector_ptr_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); INTEGER: CTYPE: igraph_integer_t @@ -146,7 +146,7 @@ DOUBLE: ERROR: # An igraph error code # Note: No OUTCONV is provided because ERROR is handled specially as a return - # type - it's wrapped in IGRAPH_R_CHECK() which doesn't use output conversion. + # type - it's wrapped in IGRAPH_LOCAL_R_CHECK() which doesn't use output conversion. # When ERROR is used as an input parameter (e.g., in igraph_strerror), only # INCONV is needed. CTYPE: igraph_error_t @@ -180,18 +180,18 @@ INDEX_VECTOR: INCONV: IN: |- Rz_SEXP_to_vector_int_copy(%I%, &%C%); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXPp1(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR: CALL: '&%C%' @@ -199,16 +199,16 @@ VECTOR: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR_BOOL: CALL: '&%C%' @@ -216,35 +216,35 @@ VECTOR_BOOL: INCONV: IN: Rz_SEXP_to_vector_bool(%I%, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_vector_bool_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_bool_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_bool_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_bool_to_SEXP(&%C%)); igraph_vector_bool_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR_INT: CALL: '&%C%' CTYPE: igraph_vector_int_t INCONV: IN: |- - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXP(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); MATRIX_LIST: CALL: '&%C%' @@ -253,13 +253,13 @@ MATRIX_LIST: IN: |- Ry_igraph_SEXP_to_matrixlist(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_matrix_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_matrix_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_list_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Rx_igraph_matrixlist_to_SEXP(&%C%)); igraph_matrix_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR_LIST: CALL: '&%C%' @@ -267,27 +267,27 @@ VECTOR_LIST: INCONV: IN: Ry_igraph_SEXP_to_vector_list(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_list_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Rx_igraph_vector_list_to_SEXP(&%C%)); igraph_vector_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR_INT_LIST: CALL: '&%C%' CTYPE: igraph_vector_int_list_t INCONV: - IN: if (!Rf_isNull(%I%)) { IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); } + IN: if (!Rf_isNull(%I%)) { IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); } OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_int_list_to_SEXP(&%C%)); igraph_vector_int_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEXSET_LIST: CALL: '&%C%' @@ -295,37 +295,37 @@ VERTEXSET_LIST: INCONV: IN: |- if (!Rf_isNull(%I%)) { - IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &%C%); } OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &%C%); OUTCONV: IN: |- if (!Rf_isNull(%I%)) { igraph_vector_int_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); } OUT: |- PROTECT(%I%=Ry_igraph_vector_int_list_to_SEXPp1(&%C%)); igraph_vector_int_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGESET_LIST: CALL: '&%C%' CTYPE: igraph_vector_int_list_t INCONV: IN: |- - if (!Rf_isNull(%I%)) { IGRAPH_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); } + if (!Rf_isNull(%I%)) { IGRAPH_LOCAL_R_CHECK(Ry_igraph_SEXP_to_vector_int_list(%I%, &%C%)); } OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_list_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_list_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_list_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_int_list_to_SEXPp1(&%C%)); igraph_vector_int_list_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGE_SELECTOR: CALL: @@ -337,10 +337,10 @@ EDGE_SELECTOR: INCONV: IN: |- igraph_vector_int_t %C%_data; - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_es(%I%, &%C1%, &%C%, &%C%_data)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_es(%I%, &%C1%, &%C%, &%C%_data)); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%_data); @@ -348,14 +348,14 @@ EDGE_SELECTOR: OUT: |- PROTECT(%I%=Ry_igraph_vector_to_SEXPp1(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); ADJLIST: CALL: '&%C%' CTYPE: igraph_adjlist_t INCONV: IN: |- - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_adjlist(%I%, &%C%)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_adjlist(%I%, &%C%)); OUTCONV: IN: igraph_adjlist_destroy(&%C%); @@ -365,14 +365,14 @@ EDGEWEIGHTS: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); %I%=R_GlobalEnv; /* hack to have a non-NULL value */ OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_0orvector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGE_LENGTHS: # Edge lengths vector - no automatic attribute lookup (unlike EDGEWEIGHTS which checks for "weight" attribute) @@ -396,14 +396,14 @@ VERTEXWEIGHTS: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); %I%=R_GlobalEnv; /* hack to have a non-NULL value */ OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_0orvector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGE_CAPACITY: CALL: '&%C%' @@ -411,14 +411,14 @@ EDGE_CAPACITY: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); %I%=R_GlobalEnv; /* hack to have a non-NULL value */ OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_0orvector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); MATRIX: CALL: '&%C%' @@ -426,16 +426,16 @@ MATRIX: INCONV: IN: Rz_SEXP_to_matrix(%I%, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_matrix_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_matrix_init(&%C%, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_init(&%C%, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_matrix_to_SEXP(&%C%)); igraph_matrix_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); MATRIX_INT: CALL: '&%C%' @@ -443,21 +443,21 @@ MATRIX_INT: INCONV: IN: |- Rz_SEXP_to_matrix_int(%I%, &%C%); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_igraph_matrix_int_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_igraph_matrix_int_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_matrix_int_init(&%C%, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_int_init(&%C%, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_int_destroy, &%C%); OUTCONV: IN: |- igraph_matrix_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_matrix_int_to_SEXP(&%C%)); igraph_matrix_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX: CALL: @@ -511,16 +511,16 @@ VERTEX_QTY: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); ALL_VERTEX_QTY: CALL: '&%C%' @@ -528,16 +528,16 @@ ALL_VERTEX_QTY: INCONV: IN: Rz_SEXP_to_vector(%I%, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_to_SEXP(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); NEIMODE: CALL: @@ -557,8 +557,8 @@ VERTEX_SELECTOR: igraph_vector_int_t %C%_data; Rz_SEXP_to_igraph_vs(%I%, &%C1%, &%C%, &%C%_data); OUT: |- - IGRAPH_R_CHECK(igraph_vector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%_data); @@ -566,7 +566,7 @@ VERTEX_SELECTOR: OUT: |- PROTECT(%I%=Ry_igraph_vector_to_SEXPp1(&%C%)); igraph_vector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX_INDICES: CALL: '&%C%' @@ -574,18 +574,18 @@ VERTEX_INDICES: INCONV: IN: |- Rz_SEXP_to_vector_int_copy(%I%, &%C%); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXPp1(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX_INDICES_PV: CALL: '&%C%' @@ -593,20 +593,20 @@ VERTEX_INDICES_PV: INCONV: IN: |- Rz_SEXP_to_vector_int_copy(%I%, &%C%); - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &%C%); OUT: |- if (0 != igraph_vector_int_init(&%C%, 0)) { igraph_error("", __FILE__, __LINE__, IGRAPH_ENOMEM); } - IGRAPH_FINALLY_PV(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY_PV(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXPp1(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX_INDEX_PAIRS: CALL: '&%C%' @@ -614,18 +614,18 @@ VERTEX_INDEX_PAIRS: INCONV: IN: |- Rz_SEXP_to_vector_int_copy(%I%, &%C%); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXP(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); INDEX_PAIRS: CALL: '&%C%' @@ -645,18 +645,18 @@ EDGE_INDICES: INCONV: IN: |- Rz_SEXP_to_vector_int_copy(%I%, &%C%); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXPp1(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); 'NULL': CALL: '0' @@ -743,13 +743,13 @@ VECTOR_STR: INCONV: IN: Rx_igraph_SEXP_to_strvector(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_strvector_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_strvector_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_strvector_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_strvector_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Rx_igraph_strvector_to_SEXP(&%C%)); igraph_strvector_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); BIPARTITE_TYPES: CALL: @@ -759,13 +759,13 @@ BIPARTITE_TYPES: INCONV: IN: Rz_SEXP_to_vector_bool(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_bool_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_bool_to_SEXP(&%C%)); igraph_vector_bool_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); ALL_BIPARTITE_TYPES: CALL: @@ -775,13 +775,13 @@ ALL_BIPARTITE_TYPES: INCONV: IN: Rz_SEXP_to_vector_bool(%I%, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_bool_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_bool_to_SEXP(&%C%)); igraph_vector_bool_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); BIPARTITE_TYPES_UNNAMED: CALL: @@ -789,13 +789,13 @@ BIPARTITE_TYPES_UNNAMED: CTYPE: igraph_vector_bool_t INCONV: OUT: |- - IGRAPH_R_CHECK(igraph_vector_bool_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_bool_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_bool_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_bool_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_vector_bool_to_SEXP(&%C%)); igraph_vector_bool_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX_COLOR: CALL: @@ -805,22 +805,22 @@ VERTEX_COLOR: INCONV: IN: |- if (!Rf_isNull(%I%)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXP(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGE_COLOR: CALL: @@ -830,22 +830,22 @@ EDGE_COLOR: INCONV: IN: |- if (!Rf_isNull(%I%)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_int_copy(%I%, &%C%)); } else { - IGRAPH_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); } - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(graph_vector_int_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_int_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_int_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_int_destroy, &%C%); OUTCONV: IN: |- igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_vector_int_to_SEXP(&%C%)); igraph_vector_int_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VERTEX_ATTRIBUTE_COMBINATION: CALL: '&%C%' @@ -853,11 +853,11 @@ VERTEX_ATTRIBUTE_COMBINATION: INCONV: IN: |- Rz_SEXP_to_attr_comb(%I%, &%C%); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, &%C%); OUTCONV: IN: |- igraph_attribute_combination_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); EDGE_ATTRIBUTE_COMBINATION: CALL: '&%C%' @@ -865,36 +865,36 @@ EDGE_ATTRIBUTE_COMBINATION: INCONV: IN: |- Rz_SEXP_to_attr_comb(%I%, &%C%); - IGRAPH_FINALLY(igraph_attribute_combination_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_attribute_combination_destroy, &%C%); OUTCONV: IN: |- igraph_attribute_combination_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); HRG: CALL: '&%C%' INCONV: IN: |- - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_hrg_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &%C%); INOUT: |- - IGRAPH_R_CHECK(Rz_SEXP_to_hrg_copy(%I%, &%C%)); - IGRAPH_FINALLY(igraph_hrg_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_hrg_copy(%I%, &%C%)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_hrg_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_hrg_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_hrg_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_hrg_destroy, &%C%); OUTCONV: IN: |- igraph_hrg_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); INOUT: |- PROTECT(%I%=Ry_igraph_hrg_to_SEXP(&%C%)); igraph_hrg_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_hrg_to_SEXP(&%C%)); igraph_hrg_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); SPARSEMAT: CALL: '&%C%' @@ -902,18 +902,18 @@ SPARSEMAT: INCONV: IN: |- Rz_SEXP_to_sparsemat(%I%, &%C%); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &%C%); OUT: |- - IGRAPH_R_CHECK(igraph_sparsemat_init(&%C%, 0, 0, 0)); - IGRAPH_FINALLY(igraph_sparsemat_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_sparsemat_init(&%C%, 0, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_sparsemat_destroy, &%C%); OUTCONV: IN: |- igraph_sparsemat_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); OUT: |- PROTECT(%I%=Ry_igraph_sparsemat_to_SEXP(&%C%)); igraph_sparsemat_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); VECTOR_COMPLEX: CALL: '(Rf_isNull(%I%) ? NULL : &%C%)' @@ -922,21 +922,21 @@ VECTOR_COMPLEX: IN: if (!Rf_isNull(%I%)) { Rz_SEXP_to_vector_complex(%I%, &%C%); } INOUT: |- if (!Rf_isNull(%I%)) { - IGRAPH_R_CHECK(Rz_SEXP_to_vector_complex_copy(%I%, &%C%)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_vector_complex_copy(%I%, &%C%)); } else { - IGRAPH_R_CHECK(igraph_vector_complex_init(&%C%, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_vector_complex_init(&%C%, 0)); } - IGRAPH_FINALLY(igraph_vector_complex_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_vector_complex_destroy, &%C%); %I%=NEW_NUMERIC(0); OUT: |- - IGRAPH_R_CHECK(igraph_vector_complex_init(&%C%, 0)); - IGRAPH_FINALLY(igraph_vector_complex_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_complex_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(igraph_vector_complex_destroy, &%C%); %I%=R_GlobalEnv; /* hack to have a non-NULL value */ OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_0orvector_complex_to_SEXP(&%C%)); igraph_vector_complex_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); MATRIX_COMPLEX: CALL: '(Rf_isNull(%I%) ? NULL : &%C%)' @@ -945,21 +945,21 @@ MATRIX_COMPLEX: IN: if (!Rf_isNull(%I%)) { Rz_SEXP_to_matrix_complex(%I%, &%C%); } INOUT: |- if (!Rf_isNull(%I%)) { - IGRAPH_R_CHECK(Rz_SEXP_to_matrix_complex_copy(%I%, &%C%)); + IGRAPH_LOCAL_R_CHECK(Rz_SEXP_to_matrix_complex_copy(%I%, &%C%)); } else { - IGRAPH_R_CHECK(igraph_matrix_complex_init(&%C%, 0, 0)); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_complex_init(&%C%, 0, 0)); } - IGRAPH_FINALLY(igraph_matrix_complex_destroy, &%C%); + IGRAPH_LOCAL_FINALLY(igraph_matrix_complex_destroy, &%C%); %I%=NEW_NUMERIC(0); OUT: |- - IGRAPH_R_CHECK(igraph_matrix_complex_init(&%C%, 0, 0)); - IGRAPH_FINALLY(igraph_matrix_complex_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_matrix_complex_init(&%C%, 0, 0)); + IGRAPH_LOCAL_FINALLY(igraph_matrix_complex_destroy, &%C%); %I%=R_GlobalEnv; /* hack to have a non-NULL value */ OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_0ormatrix_complex_to_SEXP(&%C%)); igraph_matrix_complex_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PLFIT: CALL: '&%C%' @@ -986,13 +986,13 @@ SIR_LIST: CTYPE: igraph_vector_ptr_t INCONV: OUT: |- - IGRAPH_R_CHECK(igraph_vector_ptr_init(&%C%, 0)); - IGRAPH_FINALLY(Ry_igraph_sirlist_destroy, &%C%); + IGRAPH_LOCAL_R_CHECK(igraph_vector_ptr_init(&%C%, 0)); + IGRAPH_LOCAL_FINALLY(Ry_igraph_sirlist_destroy, &%C%); OUTCONV: OUT: |- PROTECT(%I%=Ry_igraph_sirlist_to_SEXP(&%C%)); Ry_igraph_sirlist_destroy(&%C%); - IGRAPH_FINALLY_CLEAN(1); + IGRAPH_LOCAL_FINALLY_CLEAN(1); PAGERANKOPT: CTYPE: void*