int main() { igraph_strvector_t sv1, sv2; char *str1; int i; /* igraph_strvector_init, igraph_strvector_destroy */ igraph_strvector_init(&sv1, 10); igraph_strvector_destroy(&sv1); igraph_strvector_init(&sv1, 0); igraph_strvector_destroy(&sv1); /* igraph_strvector_get, igraph_strvector_set */ igraph_strvector_init(&sv1, 5); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } igraph_strvector_set(&sv1, 0, "zero"); igraph_strvector_set(&sv1, 1, "one"); igraph_strvector_set(&sv1, 2, "two"); igraph_strvector_set(&sv1, 3, "three"); igraph_strvector_set(&sv1, 4, "four"); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } /* igraph_strvector_remove_section, igraph_strvector_remove, igraph_strvector_resize, igraph_strvector_size */ igraph_strvector_remove_section(&sv1, 0, 5); if (igraph_strvector_size(&sv1) != 0) { return 1; } igraph_strvector_resize(&sv1, 10); igraph_strvector_set(&sv1, 0, "zero"); igraph_strvector_set(&sv1, 1, "one"); igraph_strvector_set(&sv1, 2, "two"); igraph_strvector_set(&sv1, 3, "three"); igraph_strvector_set(&sv1, 4, "four"); igraph_strvector_resize(&sv1, 5); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } igraph_strvector_resize(&sv1, 0); if (igraph_strvector_size(&sv1) != 0) { return 1; } igraph_strvector_resize(&sv1, 10); igraph_strvector_set(&sv1, 0, "zero"); igraph_strvector_set(&sv1, 1, "one"); igraph_strvector_set(&sv1, 2, "two"); igraph_strvector_set(&sv1, 3, "three"); igraph_strvector_set(&sv1, 4, "four"); igraph_strvector_resize(&sv1, 5); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } /* igraph_strvector_move_interval */ igraph_strvector_move_interval(&sv1, 3, 5, 0); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } /* igraph_strvector_copy */ igraph_strvector_copy(&sv2, &sv1); for (i=0; i<igraph_strvector_size(&sv2); i++) { igraph_strvector_get(&sv2, i, &str1); printf("---%s---\n", str1); } igraph_strvector_resize(&sv1, 0); igraph_strvector_destroy(&sv2); igraph_strvector_copy(&sv2, &sv1); if (igraph_strvector_size(&sv2) != 0) { return 2; } igraph_strvector_destroy(&sv2); /* igraph_strvector_add */ igraph_strvector_add(&sv1, "zeroth"); igraph_strvector_add(&sv1, "first"); igraph_strvector_add(&sv1, "second"); igraph_strvector_add(&sv1, "third"); igraph_strvector_add(&sv1, "fourth"); for (i=0; i<igraph_strvector_size(&sv1); i++) { igraph_strvector_get(&sv1, i, &str1); printf("---%s---\n", str1); } /* TODO: igraph_strvector_permdelete */ /* TODO: igraph_strvector_remove_negidx */ igraph_strvector_destroy(&sv1); /* append */ printf("---\n"); igraph_strvector_init(&sv1, 0); igraph_strvector_init(&sv2, 0); igraph_strvector_append(&sv1, &sv2); strvector_print(&sv1); printf("---\n"); igraph_strvector_resize(&sv1, 3); igraph_strvector_append(&sv1, &sv2); strvector_print(&sv1); printf("---\n"); igraph_strvector_append(&sv2, &sv1); strvector_print(&sv2); printf("---\n"); igraph_strvector_set(&sv1, 0, "0"); igraph_strvector_set(&sv1, 1, "1"); igraph_strvector_set(&sv1, 2, "2"); igraph_strvector_set(&sv2, 0, "3"); igraph_strvector_set(&sv2, 1, "4"); igraph_strvector_set(&sv2, 2, "5"); igraph_strvector_append(&sv1, &sv2); strvector_print(&sv1); igraph_strvector_destroy(&sv1); igraph_strvector_destroy(&sv2); /* clear */ igraph_strvector_init(&sv1, 3); igraph_strvector_set(&sv1, 0, "0"); igraph_strvector_set(&sv1, 1, "1"); igraph_strvector_set(&sv1, 2, "2"); igraph_strvector_clear(&sv1); if (igraph_strvector_size(&sv1) != 0) { return 3; } igraph_strvector_resize(&sv1, 4); strvector_print(&sv1); igraph_strvector_set(&sv1, 0, "one"); igraph_strvector_set(&sv1, 2, "two"); strvector_print(&sv1); igraph_strvector_destroy(&sv1); /* STR */ igraph_strvector_init(&sv1, 5); igraph_strvector_set(&sv1, 0, "one"); igraph_strvector_set(&sv1, 1, "two"); igraph_strvector_set(&sv1, 2, "three"); igraph_strvector_set(&sv1, 3, "four"); igraph_strvector_set(&sv1, 4, "five"); strvector_print(&sv1); igraph_strvector_destroy(&sv1); if (!IGRAPH_FINALLY_STACK_EMPTY) return 4; return 0; }
void igraph_i_graphml_sax_handler_end_document(void *state0) { struct igraph_i_graphml_parser_state *state= (struct igraph_i_graphml_parser_state*)state0; long i, l; int r; igraph_i_attribute_record_t idrec, eidrec; const char *idstr="id"; igraph_bool_t already_has_vertex_id=0, already_has_edge_id=0; if (!state->successful) return; if (state->index<0) { igraph_vector_ptr_t vattr, eattr, gattr; long int esize=igraph_vector_ptr_size(&state->e_attrs); const void **tmp; r=igraph_vector_ptr_init(&vattr, igraph_vector_ptr_size(&state->v_attrs)+1); if (r) { igraph_error("Cannot parse GraphML file", __FILE__, __LINE__, r); igraph_i_graphml_sax_handler_error(state, "Cannot parse GraphML file"); return; } IGRAPH_FINALLY(igraph_vector_ptr_destroy, &vattr); if (igraph_strvector_size(&state->edgeids) != 0) { esize++; } r=igraph_vector_ptr_init(&eattr, esize); if (r) { igraph_error("Cannot parse GraphML file", __FILE__, __LINE__, r); igraph_i_graphml_sax_handler_error(state, "Cannot parse GraphML file"); return; } IGRAPH_FINALLY(igraph_vector_ptr_destroy, &eattr); r=igraph_vector_ptr_init(&gattr, igraph_vector_ptr_size(&state->g_attrs)); if (r) { igraph_error("Cannot parse GraphML file", __FILE__, __LINE__, r); igraph_i_graphml_sax_handler_error(state, "Cannot parse GraphML file"); return; } IGRAPH_FINALLY(igraph_vector_ptr_destroy, &gattr); for (i=0; i<igraph_vector_ptr_size(&state->v_attrs); i++) { igraph_i_graphml_attribute_record_t *graphmlrec= VECTOR(state->v_attrs)[i]; igraph_i_attribute_record_t *rec=&graphmlrec->record; /* Check that the name of the vertex attribute is not 'id'. If it is then we cannot the complimentary 'id' attribute. */ if (! strcmp(rec->name, idstr)) { already_has_vertex_id=1; } if (rec->type == IGRAPH_ATTRIBUTE_NUMERIC) { igraph_vector_t *vec=(igraph_vector_t*)rec->value; long int origsize=igraph_vector_size(vec); long int nodes=igraph_trie_size(&state->node_trie); igraph_vector_resize(vec, nodes); for (l=origsize; l<nodes; l++) { VECTOR(*vec)[l]=IGRAPH_NAN; } } else if (rec->type == IGRAPH_ATTRIBUTE_STRING) { igraph_strvector_t *strvec=(igraph_strvector_t*)rec->value; long int origsize=igraph_strvector_size(strvec); long int nodes=igraph_trie_size(&state->node_trie); igraph_strvector_resize(strvec, nodes); for (l=origsize; l<nodes; l++) { igraph_strvector_set(strvec, l, ""); } } VECTOR(vattr)[i]=rec; } if (!already_has_vertex_id) { idrec.name=idstr; idrec.type=IGRAPH_ATTRIBUTE_STRING; tmp=&idrec.value; igraph_trie_getkeys(&state->node_trie, (const igraph_strvector_t **)tmp); VECTOR(vattr)[i]=&idrec; } else { igraph_vector_ptr_pop_back(&vattr); IGRAPH_WARNING("Could not add vertex ids, " "there is already an 'id' vertex attribute"); } for (i=0; i<igraph_vector_ptr_size(&state->e_attrs); i++) { igraph_i_graphml_attribute_record_t *graphmlrec= VECTOR(state->e_attrs)[i]; igraph_i_attribute_record_t *rec=&graphmlrec->record; if (! strcmp(rec->name, idstr)) { already_has_edge_id=1; } if (rec->type == IGRAPH_ATTRIBUTE_NUMERIC) { igraph_vector_t *vec=(igraph_vector_t*)rec->value; long int origsize=igraph_vector_size(vec); long int edges=igraph_vector_size(&state->edgelist)/2; igraph_vector_resize(vec, edges); for (l=origsize; l<edges; l++) { VECTOR(*vec)[l]=IGRAPH_NAN; } } else if (rec->type == IGRAPH_ATTRIBUTE_STRING) { igraph_strvector_t *strvec=(igraph_strvector_t*)rec->value; long int origsize=igraph_strvector_size(strvec); long int edges=igraph_vector_size(&state->edgelist)/2; igraph_strvector_resize(strvec, edges); for (l=origsize; l<edges; l++) { igraph_strvector_set(strvec, l, ""); } } VECTOR(eattr)[i]=rec; } if (igraph_strvector_size(&state->edgeids) != 0) { if (!already_has_edge_id) { long int origsize=igraph_strvector_size(&state->edgeids); eidrec.name=idstr; eidrec.type=IGRAPH_ATTRIBUTE_STRING; igraph_strvector_resize(&state->edgeids, igraph_vector_size(&state->edgelist)/2); for (; origsize < igraph_strvector_size(&state->edgeids); origsize++) { igraph_strvector_set(&state->edgeids, origsize, ""); } eidrec.value=&state->edgeids; VECTOR(eattr)[(long int)igraph_vector_ptr_size(&eattr)-1]=&eidrec; } else { igraph_vector_ptr_pop_back(&eattr); IGRAPH_WARNING("Could not add edge ids, " "there is already an 'id' edge attribute"); } } for (i=0; i<igraph_vector_ptr_size(&state->g_attrs); i++) { igraph_i_graphml_attribute_record_t *graphmlrec= VECTOR(state->g_attrs)[i]; igraph_i_attribute_record_t *rec=&graphmlrec->record; if (rec->type == IGRAPH_ATTRIBUTE_NUMERIC) { igraph_vector_t *vec=(igraph_vector_t*)rec->value; long int origsize=igraph_vector_size(vec); igraph_vector_resize(vec, 1); for (l=origsize; l<1; l++) { VECTOR(*vec)[l]=IGRAPH_NAN; } } else if (rec->type == IGRAPH_ATTRIBUTE_STRING) { igraph_strvector_t *strvec=(igraph_strvector_t*)rec->value; long int origsize=igraph_strvector_size(strvec); igraph_strvector_resize(strvec, 1); for (l=origsize; l<1; l++) { igraph_strvector_set(strvec, l, ""); } } VECTOR(gattr)[i]=rec; } igraph_empty_attrs(state->g, 0, state->edges_directed, &gattr); igraph_add_vertices(state->g, igraph_trie_size(&state->node_trie), &vattr); igraph_add_edges(state->g, &state->edgelist, &eattr); igraph_vector_ptr_destroy(&vattr); igraph_vector_ptr_destroy(&eattr); igraph_vector_ptr_destroy(&gattr); IGRAPH_FINALLY_CLEAN(3); } igraph_i_graphml_destroy_state(state); }