/* $Id: list.c,v 1.76 2011/06/28 00:13:48 sbajic Exp $ */
/*
DSPAM
COPYRIGHT (C) 2002-2012 DSPAM PROJECT
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include "list.h"
#include "bnr.h"
/* list_node_create (used internally) to allocate space for a new node */
static struct bnr_list_node *
bnr_list_node_create (void *data)
{
struct bnr_list_node *node;
if ((node = (struct bnr_list_node *) malloc (sizeof (struct bnr_list_node))) == NULL)
{
perror("list_node_create: memory allocation error");
return NULL;
}
node->ptr = data;
node->next = (struct bnr_list_node *) NULL;
return (node);
}
/* list_create allocates space for and initializes a nodetree */
struct bnr_list *
bnr_list_create (int nodetype)
{
struct bnr_list *list = (struct bnr_list *) malloc (sizeof (struct bnr_list));
if (list == NULL)
{
perror("bnr_list_create: memory allocation error");
return NULL;
}
list->first = (struct bnr_list_node *) NULL;
list->insert = (struct bnr_list_node *) NULL;
list->items = 0;
list->nodetype = nodetype;
return (list);
}
/* list_destroy methodically destroys a nodetree, freeing resources */
void
bnr_list_destroy (struct bnr_list *list)
{
struct bnr_list_node *cur, *next;
int i;
if (list == NULL)
{
return;
}
cur = list->first;
for (i = 0; i < list->items; i++)
{
next = cur->next;
if (list->nodetype != BNR_INDEX)
free (cur->ptr);
free (cur);
cur = next;
}
free (list);
/* list = (struct bnr_list *) NULL; */
}
/* list_insert adds an item to the nodetree */
struct bnr_list_node *
bnr_list_insert (struct bnr_list *list, void *data, float value)
{
struct bnr_list_node *prev;
struct bnr_list_c c;
struct bnr_list_node *node = c_bnr_list_first (list, &c);
void *vptr;
if (list->insert) {
prev = list->insert;
} else {
prev = 0;
while (node)
{
prev = node;
node = node->next;
}
}
list->items++;
if (list->nodetype == BNR_CHAR)
{
long size = strlen ((char *) data) + 1;
vptr = malloc (size);
if (vptr == NULL)
{
perror("bnr_list_insert: memory allocation error");
return NULL;
}
strcpy (vptr, data);
}
else
{
vptr = data;
}
if (prev)
{
node = bnr_list_node_create (vptr);
if (node == NULL)
return NULL;
node->value = value;
node->eliminated = 0;
prev->next = node;
list->insert = node;
return (node);
}
else
{
node = bnr_list_node_create (vptr);
if (node == NULL)
return NULL;
node->value = value;
node->eliminated = 0;
list->first = node;
list->insert = node;
return (node);
}
}
/* c_bnr_list_next returns the next item in a nodetree */
struct bnr_list_node *
c_bnr_list_next (struct bnr_list *list, struct bnr_list_c *c)
{
struct bnr_list_node *node = c->iter_index;
if (node)
{
c->iter_index = node->next;
return (node->next);
}
else
{
if (list->items > 0)
{
c->iter_index = list->first;
return list->first;
}
}
return ((struct bnr_list_node *) NULL);
}
/* list_first returns the first item in a nodetree */
struct bnr_list_node *
c_bnr_list_first (struct bnr_list *list, struct bnr_list_c *c)
{
c->iter_index = list->first;
return (list->first);
}