3
* $Id: container_list_ssll.c,v 1.3.2.1 2004/02/04 11:25:20 slif Exp $
7
#include <net-snmp/net-snmp-config.h>
16
#include <sys/types.h>
23
#include <net-snmp/net-snmp-includes.h>
24
#include <net-snmp/types.h>
25
#include <net-snmp/library/snmp_api.h>
26
#include <net-snmp/library/container.h>
27
#include <net-snmp/library/tools.h>
28
#include <net-snmp/library/snmp_assert.h>
30
#include <net-snmp/library/container_list_ssll.h>
32
typedef struct sl_node {
37
typedef struct sl_container_s {
40
size_t count; /* Index of the next free entry */
41
sl_node *head; /* head of list */
46
_get(netsnmp_container *c, const void *key, int exact)
48
sl_container *sl = (sl_container*)c;
49
sl_node *curr = sl->head;
51
if( (NULL != curr) && (NULL != key)) {
53
if (sl->c.compare(curr->data, key) == 0)
58
if((curr) && (!exact)) {
63
return curr ? (void *)curr->data : NULL;
66
/**********************************************************************
70
**********************************************************************/
72
_ssll_free(netsnmp_container *c)
80
_ssll_find(netsnmp_container *c, const void *data)
82
if((NULL == c) || (NULL == data))
85
return _get(c, data, 1);
89
_ssll_find_next(netsnmp_container *c, const void *data)
94
return _get(c, data, 0);
98
_ssll_insert(netsnmp_container *c, const void *data)
100
sl_container *sl = (sl_container*)c;
106
new_node = SNMP_MALLOC_TYPEDEF(sl_node);
109
new_node->data = data;
111
if(NULL == sl->head) {
115
sl_node *curr = sl->head, *last = NULL;
116
for( ; curr; last = curr, curr = curr->next) {
117
if(sl->c.compare(curr->data, data) > 0)
121
new_node->next = sl->head;
125
new_node->next = last->next;
126
last->next = new_node;
134
_ssll_remove(netsnmp_container *c, const void *data)
136
sl_container *sl = (sl_container*)c;
137
sl_node *curr = sl->head;
139
if((NULL == c) || (NULL == curr))
142
if(sl->c.compare(sl->head->data, data) == 0) {
144
sl->head = sl->head->next;
147
sl_node *last = sl->head;
148
for(curr = sl->head->next ; curr; last = curr, curr = curr->next)
149
if(sl->c.compare(curr->data, data) == 0) {
150
last->next = curr->next;
159
* free our node structure, but not the data
168
_ssll_size(netsnmp_container *c)
170
sl_container *sl = (sl_container*)c;
179
_ssll_for_each(netsnmp_container *c, netsnmp_container_obj_func *f,
182
sl_container *sl = (sl_container*)c;
188
for(curr = sl->head; curr; curr = curr->next)
189
(*f) ((void *)curr->data, context);
192
/**********************************************************************
196
**********************************************************************/
198
netsnmp_container_get_ssll(void)
203
sl_container *sl = SNMP_MALLOC_TYPEDEF(sl_container);
205
snmp_log(LOG_ERR, "couldn't allocate memory\n");
209
sl->c.cfree = (netsnmp_container_rc*)_ssll_free;
211
sl->c.get_size = _ssll_size;
213
sl->c.insert = _ssll_insert;
214
sl->c.remove = _ssll_remove;
215
sl->c.find = _ssll_find;
216
sl->c.find_next = _ssll_find_next;
217
sl->c.get_subset = NULL;
218
sl->c.get_iterator = NULL;
219
sl->c.for_each = _ssll_for_each;
222
return (netsnmp_container*)sl;
226
netsnmp_container_get_ssll_factory(void)
228
static netsnmp_factory f = {"sorted_singly_linked_list",
229
(netsnmp_factory_produce_f*)
230
netsnmp_container_get_ssll };
236
netsnmp_container_ssll_init(void)
238
netsnmp_container_register("sorted_singly_linked_list",
239
netsnmp_container_get_ssll_factory());