4 * This file contains general linked list routines.
6 * Copyright 1990,1991 by the Massachusetts Institute of Technology
7 * For distribution and copying rights, see the file "mit-copyright.h"
10 #include <afsconfig.h>
15 #include "linked_list.h"
29 void ll_init(linked_list *list)
32 * List must point to a linked list structure. It is not acceptable
33 * to pass a null pointer to this routine.
37 * Initializes the list to be one with no elements. If list is
38 * NULL, prints an error message and causes the program to crash.
42 fprintf(stderr, "Error: calling ll_init with null pointer.\n");
46 /* This sets everything to zero, which is what we want. */
47 bzero((char *)list, sizeof(linked_list));
50 ll_node *ll_add_node(linked_list *list, ll_end which_end)
55 * Adds a node to one end of the list (as specified by which_end)
56 * and returns a pointer to the node added. which_end is of type
57 * ll_end and should be either ll_head or ll_tail as specified in
58 * list.h. If there is not enough memory to allocate a node,
59 * the program returns NULL.
64 if ((node = (ll_node *)calloc(1, sizeof(ll_node))) != NULL) {
65 if (list->nelements == 0) {
73 list->first->prev = node;
74 node->next = list->first;
78 list->last->next = node;
79 node->prev = list->last;
83 fprintf(stderr, "%s%s",
84 "ll_add_node got a which_end parameter that ",
85 "it can't handle.\n");
96 int ll_delete_node(linked_list *list, ll_node *node)
101 * If node is in list, deletes node and returns LL_SUCCESS.
102 * Otherwise, returns LL_FAILURE. If node contains other data,
103 * it is the responsibility of the caller to free it. Also, since
104 * this routine frees node, after the routine is called, "node"
105 * won't point to valid data.
108 int status = LL_SUCCESS;
109 ll_node *cur_node = NULL;
112 if (list->nelements == 0)
115 for (cur_node = list->first; (cur_node != NULL) && !found;
116 cur_node = cur_node->next) {
117 if (cur_node == node) {
120 cur_node->prev->next = cur_node->next;
122 list->first = cur_node->next;
125 cur_node->next->prev = cur_node->prev;
127 list->last = cur_node->prev;
143 /* ll_add_data is a macro defined in linked_list.h */
145 /* This routine maintains a list of strings preventing duplication. */
146 int ll_string(linked_list *list, ll_s_action action, char *string)
148 int status = LL_SUCCESS;
153 /* Scan the list until we find the string in question */
154 for (cur_node = list->first; cur_node && (status == FALSE);
155 cur_node = cur_node->next)
156 status = (strcmp(string, cur_node->data) == 0);
159 /* Add a string to the list. */
160 if (!ll_string(list, ll_s_check, string)) {
161 if ((cur_node = ll_add_node(list, ll_tail))) {
163 if ((new_string = (char *)calloc(strlen(string) + 1,
165 strcpy(new_string, string);
166 ll_add_data(cur_node, new_string);
176 /* This should never happen */