Пример #1
0
/*
  ----------------------------------------------------------------------------------------------------------------
  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;
}
Пример #2
0
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;

}
Пример #3
0
/*!
 * \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;
}
Пример #4
0
/*!
 * \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;
}
Пример #5
0
/*!
 * \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;
}