diff options
author | Yang Tse <yangsita@gmail.com> | 2007-10-02 02:18:01 +0000 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2007-10-02 02:18:01 +0000 |
commit | 343d6f221fea91aa47cd1e8a3ed9d7c462fc6f7f (patch) | |
tree | d54d1d5e112590d96e42aae433c94c98cd80c697 /ares_llist.c | |
parent | e4eb2d0e1d36937ff1dab2c9e2a00295c3bb5539 (diff) | |
download | c-ares-343d6f221fea91aa47cd1e8a3ed9d7c462fc6f7f.tar.gz c-ares-343d6f221fea91aa47cd1e8a3ed9d7c462fc6f7f.tar.bz2 c-ares-343d6f221fea91aa47cd1e8a3ed9d7c462fc6f7f.zip |
Avoid inline C99ism, and move c-ares routines for managing doubly-linked lists.
Diffstat (limited to 'ares_llist.c')
-rw-r--r-- | ares_llist.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/ares_llist.c b/ares_llist.c new file mode 100644 index 0000000..77cbd4d --- /dev/null +++ b/ares_llist.c @@ -0,0 +1,87 @@ +/* $Id$ */ + +/* Copyright 1998 by the Massachusetts Institute of Technology. + * + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in + * advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. + * M.I.T. makes no representations about the suitability of + * this software for any purpose. It is provided "as is" + * without express or implied warranty. + */ + +#include "setup.h" + +#include "ares.h" +#include "ares_private.h" + +/* Routines for managing doubly-linked circular linked lists with a + * dummy head. + */ + +/* Initialize a new head node */ +void ares__init_list_head(struct list_node* head) { + head->prev = head; + head->next = head; + head->data = NULL; +} + +/* Initialize a list node */ +void ares__init_list_node(struct list_node* node, void* d) { + node->prev = NULL; + node->next = NULL; + node->data = d; +} + +/* Returns true iff the given list is empty */ +int ares__is_list_empty(struct list_node* head) { + return ((head->next == head) && (head->prev == head)); +} + +/* Inserts new_node before old_node */ +void ares__insert_in_list(struct list_node* new_node, + struct list_node* old_node) { + new_node->next = old_node; + new_node->prev = old_node->prev; + old_node->prev->next = new_node; + old_node->prev = new_node; +} + +/* Removes the node from the list it's in, if any */ +void ares__remove_from_list(struct list_node* node) { + if (node->next != NULL) { + node->prev->next = node->next; + node->next->prev = node->prev; + node->prev = NULL; + node->next = NULL; + } +} + +/* Swap the contents of two lists */ +void ares__swap_lists(struct list_node* head_a, + struct list_node* head_b) { + int is_a_empty = ares__is_list_empty(head_a); + int is_b_empty = ares__is_list_empty(head_b); + struct list_node old_a = *head_a; + struct list_node old_b = *head_b; + + if (is_a_empty) { + ares__init_list_head(head_b); + } else { + *head_b = old_a; + old_a.next->prev = head_b; + old_a.prev->next = head_b; + } + if (is_b_empty) { + ares__init_list_head(head_a); + } else { + *head_a = old_b; + old_b.next->prev = head_a; + old_b.prev->next = head_a; + } +} |