/* ---------------------------------------------------------------------------------------------------------------- nodelist_common_condensed2extended_nodelist ------------------------------------------- Construit une liste de noeuds etendue a partir d'une liste de noeuds condensee code retour : le nombre de noeud si ok -1 si erreur Rq : il est necessaire de liberer la memoire associee a *p_dst_list via un appel a free une fois son utilisation terminee ---------------------------------------------------------------------------------------------------------------- */ int nodelist_common_condensed2extended_nodelist(char *src_list, char **p_dst_list) { int fstatus, status; nodelist_nodelist_t nodelist; status = nodelist_nodelist_init(&nodelist, &src_list, 1); if (status == 0) { if (nodelist_nodelist_get_extended_string(&nodelist, p_dst_list) == 0) fstatus = nodelist_nodelist_nodes_quantity(&nodelist); else fstatus = -1; nodelist_nodelist_free_contents(&nodelist); } else { fstatus = -1; } return fstatus; }
int nodelist_nodelist_remove_nodes(nodelist_nodelist_t * nodelist, char *list) { int fstatus = -1; int status; char *prefix; char *idlist; char *suffix; int token_nb, i; char *token; nodelist_nodelist_t wlist; if(nodelist_common_string_get_tokens_quantity(list, ",", &token_nb) == 0) { token = NULL; for(i = 1; i <= token_nb; i++) { if(nodelist_common_string_get_token(list, ",", i, &token) == 0) { status = nodelist_common_split_nodelist_entry(token, &prefix, &idlist, &suffix); if(status) { fstatus = -1; } else { fstatus = nodelist_nodelist_init(&wlist, NULL, 0); if(fstatus == 0) { nodelist_nodepattern_set_prefix(&(wlist.pattern), prefix); nodelist_nodepattern_set_suffix(&(wlist.pattern), suffix); if(idlist != NULL) { wlist.pattern.basic = 0; fstatus = nodelist_nodelist_add_ids(&wlist, idlist); nodelist_nodepattern_set_padding(&(wlist.pattern), fstatus); fstatus = 0; } fstatus = nodelist_nodelist_remove_nodelist(nodelist, &wlist); nodelist_nodelist_free_contents(&wlist); } xfree(prefix); xfree(suffix); xfree(idlist); } free(token); } token = NULL; } } return fstatus; }
/*! * \ingroup NODELIST_COMMON * \brief Remove a node list from an other one * * \param nodelist the input/output nodes list * \param nodelist the second list to remove from the first one * * \retval 0 success * \retval -1 failure */ int nodelist_nodelist_remove_nodelist(nodelist_nodelist_t * nodelist, nodelist_nodelist_t * second_list) { int fstatus = -1; int add_flag; nodelist_nodelist_t worklist; nodelist_nodelist_t **pwldest; nodelist_nodelist_t **pwlsrc; /* If second list is emty, nothing to remove */ if(nodelist_nodelist_is_empty(second_list)) { return 0; } /* If nodelist is empty, nothing to remove */ if(nodelist_nodelist_is_empty(nodelist)) { return 0; } /* we have to remove each second list sublist from the first one */ else { /* initialize work list by copying the first nodelist */ fstatus = nodelist_nodelist_init(&worklist, NULL, 0); if(fstatus == 0) { pwldest = &nodelist; while(*pwldest != NULL) { add_flag = 1; pwlsrc = &second_list; while(*pwlsrc != NULL) { /* if patterns equal, try to remove ids and break */ if(nodelist_nodepattern_equals ((&(*pwldest)->pattern), &((*pwlsrc)->pattern))) { add_flag = 0; if((*pwldest)->pattern.basic == 0) { fstatus += nodelist_rangelist_remove_rangelist(& ((*pwldest)->rangelist), &((*pwlsrc)-> rangelist)); } else fstatus = 0; fprintf(stdout, "fstatus %d\n", fstatus); break; } pwlsrc = &((*pwlsrc)->next); /* increment src sublist */ } if(fstatus) break; if(add_flag == 1) { fstatus += nodelist_nodelist_add_nodelist(&worklist, *pwldest); } if(fstatus) break; pwldest = &((*pwldest)->next); /* increment dest sublist */ } if(fstatus == 0) { fstatus = nodelist_nodelist_copy(nodelist, &worklist); } nodelist_nodelist_free_contents(&worklist); } } return fstatus; }
/*! * \ingroup NODELIST_COMMON * \brief Add a node list to an other one * * \param nodelist the input/output nodes list * \param nodelist the second list to add to the first one * * \retval 0 success * \retval -1 failure */ int nodelist_nodelist_add_nodelist(nodelist_nodelist_t * nodelist, nodelist_nodelist_t * second_list) { int fstatus = -1; nodelist_nodelist_t **pwldest; nodelist_nodelist_t **pwlsrc; /* If second list is emty, nothing to add */ if(nodelist_nodelist_is_empty(second_list)) { return 0; } /* If nodelist is empty, duplicate second_list! */ if(nodelist_nodelist_is_empty(nodelist)) { fstatus = nodelist_nodelist_copy(nodelist, second_list); } /* we have to add each second list sublist to the first one */ else { pwlsrc = &second_list; while(*pwlsrc != NULL) { /* try to add src sublist to an existant dest list sublist */ pwldest = &nodelist; while(*pwldest != NULL) { /* if patterns equal, try to add ids and break */ if(nodelist_nodepattern_equals ((&(*pwldest)->pattern), &((*pwlsrc)->pattern))) { if((*pwldest)->pattern.padding < (*pwlsrc)->pattern.padding) nodelist_nodepattern_set_padding(&((*pwldest)->pattern), (*pwlsrc)->pattern.padding); fstatus = nodelist_rangelist_add_rangelist(&((*pwldest)->rangelist), &((*pwlsrc)->rangelist)); break; } pwldest = &((*pwldest)->next); /* increment dst sublist */ } /* add a new sublist to dest list if no equivalent pattern list was found */ if(*pwldest == NULL) { *pwldest = (nodelist_nodelist_t *) malloc(sizeof(nodelist_nodelist_t)); if(*pwldest != NULL) { fstatus = nodelist_nodelist_init(*pwldest, NULL, 0); if(fstatus == 0) { fstatus = nodelist_nodepattern_init_by_copy(&((*pwldest)->pattern), &((*pwlsrc)->pattern)); if(fstatus == 0) { fstatus = nodelist_rangelist_add_rangelist(&((*pwldest)->rangelist), &((*pwlsrc)->rangelist)); } } } } /* fstatus != 0 means that an error occured, break */ if(fstatus != 0) { break; } pwlsrc = &((*pwlsrc)->next); /* increment src sublist */ } } return fstatus; }
/*! * \ingroup NODELIST_COMMON * \brief Copy a node list into an other one * * \param dest_list the input/output nodes list * \param src_list the second list to copy into the first one * * \retval 0 success * \retval -1 failure */ int nodelist_nodelist_copy(nodelist_nodelist_t * dest_list, nodelist_nodelist_t * src_list) { int fstatus = -1; nodelist_nodelist_t **pwldest; nodelist_nodelist_t **pwlsrc; nodelist_nodelist_free_contents(dest_list); pwldest = &dest_list; if(nodelist_nodelist_init(*pwldest, NULL, 0) == 0) { if(src_list->pattern.prefix == NULL && src_list->pattern.suffix == NULL) { // second list is empty... so initialization will be sufficient fstatus = 0; } else { pwlsrc = &src_list; while(*pwlsrc != NULL) { fstatus = -1; if(nodelist_nodepattern_init_by_copy (&((*pwldest)->pattern), &((*pwlsrc)->pattern)) != 0) { // unable to copy pattern, break fstatus = -2; break; } else { if((*pwlsrc)->pattern.basic != 1) { // add ids if(nodelist_rangelist_init_by_copy (&((*pwldest)->rangelist), &((*pwlsrc)->rangelist)) != 0) { // unable to copy range list, break fstatus = -3; break; } } pwldest = &((*pwldest)->next); fstatus = 0; } pwlsrc = &((*pwlsrc)->next); } if(fstatus != 0) nodelist_nodelist_free_contents(dest_list); } } return fstatus; }