From 97ec5685b92ea727fe8f8b4bb8cf289a20f8580b Mon Sep 17 00:00:00 2001 From: Ivo Timmermans Date: Fri, 20 Oct 2000 16:44:32 +0000 Subject: [PATCH] Generalized list and hash handling functions --- lib/hash.c | 56 ++++++++++++++++++++ lib/hash.h | 1 + lib/list.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/list.h | 44 ++++++++++++++++ 4 files changed, 247 insertions(+) create mode 100644 lib/hash.c create mode 100644 lib/hash.h create mode 100644 lib/list.c create mode 100644 lib/list.h diff --git a/lib/hash.c b/lib/hash.c new file mode 100644 index 0000000..4963014 --- /dev/null +++ b/lib/hash.c @@ -0,0 +1,56 @@ +/* + hash.c -- Handle hash datastructures + Copyright (C) 2000 Ivo Timmermans + 2000 Guus Sliepen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: hash.c,v 1.1 2000/10/20 16:44:32 zarq Exp $ +*/ + +#include "config.h" + +/* + hash_delete + delete one element, indicated by key, from hash +*/ +int hash_delete(hash_t hash, char *key) +{ +} + +/* + hash_insert_maybe + insert an element into the hash, unless an element with the + same key already exists. +*/ +int hash_insert_maybe(hash_t hash, void *data, char *key) +{ + if(hash_retrieve(hash, key)) + { + } +} + +/* + hash_insert_or_update + + If an element indicated by key exists in the hash, update the + associated pointer. Otherwise, insert this pointer as a new + element. +*/ +int hash_insert_or_update(hash_t hash, void *data, char *key) +{ + +} + diff --git a/lib/hash.h b/lib/hash.h new file mode 100644 index 0000000..79a9626 --- /dev/null +++ b/lib/hash.h @@ -0,0 +1 @@ +/* */ diff --git a/lib/list.c b/lib/list.c new file mode 100644 index 0000000..5358f19 --- /dev/null +++ b/lib/list.c @@ -0,0 +1,146 @@ +/* + list.c -- functions to deal with double linked lists + Copyright (C) 2000 Ivo Timmermans + 2000 Guus Sliepen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: list.c,v 1.1 2000/10/20 16:44:32 zarq Exp $ +*/ + +#include "config.h" + +#include + +#include +#include +#include + +#include + +/* + list_new + + Initialize a new list. +*/ +list_t *list_new(void) +{ + list_t *list; + + list = xmalloc_and_zero(sizeof(list_t)); + return list; +} + +/* + list_delete + + Delete the element pointed to by idx from the list. +*/ +list_node_t *list_delete(list_t *list, list_node_t *idx) +{ + list_node_t *res; + + if(!list) + return NULL; + if(!idx) + return NULL; + + if(list->callbacks->delete != NULL) + if(list->callbacks->delete(idx->data)) + error(ERR_WARNING, N_("List callback[delete] failed for %08lx - freeing anyway"), idx->data); + + free(idx->data); + + if(idx->prev == NULL) + /* First element in list */ + { + res = idx->next; + list->head = idx->next; + } + if(idx->next == NULL) + /* Last element in list */ + { + res = NULL; + list->tail = idx->prev; + } + if(idx->prev != NULL && idx->next != NULL) + /* Neither first nor last element */ + { + idx->prev->next = idx->next; + idx->next->prev = idx->prev; + } + if(list->head == NULL) + list->tail = NULL; + else + if(list->tail == NULL) + list->head = NULL; + free(idx); + return res; +} + +/* + list_forall_nodes + + Call function() on each element in the list. If this function + returns non-zero, the element will be removed from the list. +*/ +void list_forall_nodes(list_t *list, int (*function)(void *data)) +{ + list_node_t *p; + int res; + + if(!list) /* no list given */ + return; + if(!function) /* no function given */ + return; + if(!list->head) /* list is empty */ + return; + for(p = list->head; p != NULL; p = p->next) + { + res = function(p->data); + if(res != 0) + p = list_delete(list, p); + } +} + +/* + list_destroy + + Free all datastructures contained in this list. It uses the delete + callback for this list to free each element. +*/ +void list_destroy(list_t *list) +{ + if(!list) + return; + list_destroy_nodes(list); + free(list); +} + +/* + list_append + + Append a new node to the list that points to data. +*/ +list_append(list_t *list, void *data) +{ + list_node_t *n; + + n = xmalloc_and_zero(sizeof(list_node_t)); + n->data = data; + n->prev = list->tail; + list->tail->next = n; + list->tail = n; +} diff --git a/lib/list.h b/lib/list.h new file mode 100644 index 0000000..9162833 --- /dev/null +++ b/lib/list.h @@ -0,0 +1,44 @@ +/* + list.h -- header file for list.c + Copyright (C) 2000 Ivo Timmermans + 2000 Guus Sliepen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + $Id: list.h,v 1.1 2000/10/20 16:44:32 zarq Exp $ +*/ + +#ifndef __TINC_LIST_H__ +#define __TINC_LIST_H__ + +typedef struct list_callbacks_t { + int (*delete) (void *); +} list_callbacks_t; + +typedef struct list_node_t { + void *data; + struct list_node_t *prev; + struct list_node_t *next; +} list_node_t; + +typedef struct list_t { + list_node_t *head; + list_node_t *tail; + list_callbacks_t *callbacks; +} list_t; + + + +#endif /* __TINC_LIST_H__ */ -- 2.25.1