Blame lib/driver/ds.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2005, 2008, 2011, 2016 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
Packit dd8086
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086

Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
# include "config.h"
Packit dd8086
# define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDLIB_H
Packit dd8086
#include <stdlib.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/ds.h>
Packit dd8086
#include <cdio/util.h>
Packit dd8086
#include <cdio/types.h>
Packit dd8086
#include "cdio_assert.h"
Packit dd8086
Packit dd8086
struct _CdioList
Packit dd8086
{
Packit dd8086
  unsigned length;
Packit dd8086
Packit dd8086
  CdioListNode_t *begin;
Packit dd8086
  CdioListNode_t *end;
Packit dd8086
};
Packit dd8086
Packit dd8086
struct _CdioListNode
Packit dd8086
{
Packit dd8086
  CdioList_t *list;
Packit dd8086
Packit dd8086
  CdioListNode_t *next;
Packit dd8086
Packit dd8086
  void *data;
Packit dd8086
};
Packit dd8086
Packit dd8086
/* impl */
Packit dd8086
Packit dd8086
CdioList_t *
Packit dd8086
_cdio_list_new (void)
Packit dd8086
{
Packit dd8086
  CdioList_t *p_new_obj = calloc (1, sizeof (CdioList_t));
Packit dd8086
Packit dd8086
  return p_new_obj;
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
_cdio_list_free (CdioList_t *p_list, int free_data, CdioDataFree_t free_fn)
Packit dd8086
{
Packit dd8086
  while (_cdio_list_length (p_list))
Packit dd8086
    _cdio_list_node_free (_cdio_list_begin (p_list), free_data, free_fn);
Packit dd8086
Packit dd8086
  free (p_list);
Packit dd8086
}
Packit dd8086
Packit dd8086
unsigned
Packit dd8086
_cdio_list_length (const CdioList_t *p_list)
Packit dd8086
{
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
Packit dd8086
  return p_list->length;
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
_cdio_list_prepend (CdioList_t *p_list, void *p_data)
Packit dd8086
{
Packit dd8086
  CdioListNode_t *p_new_node;
Packit dd8086
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
Packit dd8086
  p_new_node = calloc (1, sizeof (CdioListNode_t));
Packit dd8086
  cdio_assert (p_new_node != NULL);
Packit dd8086
Packit dd8086
  p_new_node->list = p_list;
Packit dd8086
  p_new_node->next = p_list->begin;
Packit dd8086
  p_new_node->data = p_data;
Packit dd8086
Packit dd8086
  p_list->begin = p_new_node;
Packit dd8086
  if (p_list->length == 0)
Packit dd8086
    p_list->end = p_new_node;
Packit dd8086
Packit dd8086
  p_list->length++;
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
_cdio_list_append (CdioList_t *p_list, void *p_data)
Packit dd8086
{
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
Packit dd8086
  if (p_list->length == 0)
Packit dd8086
    {
Packit dd8086
      _cdio_list_prepend (p_list, p_data);
Packit dd8086
    }
Packit dd8086
  else
Packit dd8086
    {
Packit dd8086
      CdioListNode_t *p_new_node = calloc (1, sizeof (CdioListNode_t));
Packit dd8086
      cdio_assert (p_new_node != NULL);
Packit dd8086
Packit dd8086
      p_new_node->list = p_list;
Packit dd8086
      p_new_node->next = NULL;
Packit dd8086
      p_new_node->data = p_data;
Packit dd8086
Packit dd8086
      p_list->end->next = p_new_node;
Packit dd8086
      p_list->end = p_new_node;
Packit dd8086
Packit dd8086
      p_list->length++;
Packit dd8086
    }
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
_cdio_list_foreach (CdioList_t *p_list, _cdio_list_iterfunc_t func,
Packit dd8086
                    void *p_user_data)
Packit dd8086
{
Packit dd8086
  CdioListNode_t *node;
Packit dd8086
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
  cdio_assert (func != 0);
Packit dd8086
Packit dd8086
  for (node = _cdio_list_begin (p_list);
Packit dd8086
       node != NULL;
Packit dd8086
       node = _cdio_list_node_next (node))
Packit dd8086
    func (_cdio_list_node_data (node), p_user_data);
Packit dd8086
}
Packit dd8086
Packit dd8086
CdioListNode_t *
Packit dd8086
_cdio_list_find (CdioList_t *p_list, _cdio_list_iterfunc_t cmp_func,
Packit dd8086
                 void *p_user_data)
Packit dd8086
{
Packit dd8086
  CdioListNode_t *p_node;
Packit dd8086
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
  cdio_assert (cmp_func != 0);
Packit dd8086
Packit dd8086
  for (p_node = _cdio_list_begin (p_list);
Packit dd8086
       p_node != NULL;
Packit dd8086
       p_node = _cdio_list_node_next (p_node))
Packit dd8086
    if (cmp_func (_cdio_list_node_data (p_node), p_user_data))
Packit dd8086
      break;
Packit dd8086
Packit dd8086
  return p_node;
Packit dd8086
}
Packit dd8086
Packit dd8086
CdioListNode_t *
Packit dd8086
_cdio_list_begin (const CdioList_t *p_list)
Packit dd8086
{
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
Packit dd8086
  return p_list->begin;
Packit dd8086
}
Packit dd8086
Packit dd8086
CdioListNode_t *
Packit dd8086
_cdio_list_end (CdioList_t *p_list)
Packit dd8086
{
Packit dd8086
  cdio_assert (p_list != NULL);
Packit dd8086
Packit dd8086
  return p_list->end;
Packit dd8086
}
Packit dd8086
Packit dd8086
CdioListNode_t *
Packit dd8086
_cdio_list_node_next (CdioListNode_t *p_node)
Packit dd8086
{
Packit dd8086
  if (p_node)
Packit dd8086
    return p_node->next;
Packit dd8086
Packit dd8086
  return NULL;
Packit dd8086
}
Packit dd8086
Packit dd8086
void
Packit dd8086
_cdio_list_node_free (CdioListNode_t *p_node,
Packit dd8086
                      int free_data, CdioDataFree_t free_fn)
Packit dd8086
{
Packit dd8086
  CdioList_t *p_list;
Packit dd8086
  CdioListNode_t *prev_node;
Packit dd8086
Packit dd8086
  cdio_assert (p_node != NULL);
Packit dd8086
Packit dd8086
  p_list = p_node->list;
Packit dd8086
Packit dd8086
  cdio_assert (_cdio_list_length (p_list) > 0);
Packit dd8086
Packit dd8086
  if (free_data && free_fn)
Packit dd8086
    free_fn (_cdio_list_node_data (p_node));
Packit dd8086
Packit dd8086
  if (_cdio_list_length (p_list) == 1)
Packit dd8086
    {
Packit dd8086
      cdio_assert (p_list->begin == p_list->end);
Packit dd8086
Packit dd8086
      p_list->end = p_list->begin = NULL;
Packit dd8086
      p_list->length = 0;
Packit dd8086
      free (p_node);
Packit dd8086
      return;
Packit dd8086
    }
Packit dd8086
Packit dd8086
  cdio_assert (p_list->begin != p_list->end);
Packit dd8086
Packit dd8086
  if (p_list->begin == p_node)
Packit dd8086
    {
Packit dd8086
      p_list->begin = p_node->next;
Packit dd8086
      free (p_node);
Packit dd8086
      p_list->length--;
Packit dd8086
      return;
Packit dd8086
    }
Packit dd8086
Packit dd8086
  for (prev_node = p_list->begin; prev_node->next; prev_node = prev_node->next)
Packit dd8086
    if (prev_node->next == p_node)
Packit dd8086
      break;
Packit dd8086
Packit dd8086
  cdio_assert (prev_node->next != NULL);
Packit dd8086
Packit dd8086
  if (p_list->end == p_node)
Packit dd8086
    p_list->end = prev_node;
Packit dd8086
Packit dd8086
  prev_node->next = p_node->next;
Packit dd8086
Packit dd8086
  p_list->length--;
Packit dd8086
Packit dd8086
  free (p_node);
Packit dd8086
}
Packit dd8086
Packit dd8086
void *
Packit dd8086
_cdio_list_node_data (CdioListNode_t *p_node)
Packit dd8086
{
Packit dd8086
  if (p_node)
Packit dd8086
    return p_node->data;
Packit dd8086
Packit dd8086
  return NULL;
Packit dd8086
}
Packit dd8086
Packit dd8086
/* eof */
Packit dd8086
Packit dd8086

Packit dd8086
/*
Packit dd8086
 * Local variables:
Packit dd8086
 *  c-file-style: "gnu"
Packit dd8086
 *  tab-width: 8
Packit dd8086
 *  indent-tabs-mode: nil
Packit dd8086
 * End:
Packit dd8086
 */