diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-12-03 20:06:33 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-12-03 20:06:33 (GMT) |
commit | 5df50c35e1baeee517a0895a2c8a2cc2052b087f (patch) | |
tree | b9d90fd123ec251ebb930cfcfaa2ffc805433812 /3rdParty/CAres/src/ares_llist.c | |
parent | 9b3edba27b8683f1a87ad66ee05802dd93bbbdfc (diff) | |
download | swift-contrib-5df50c35e1baeee517a0895a2c8a2cc2052b087f.zip swift-contrib-5df50c35e1baeee517a0895a2c8a2cc2052b087f.tar.bz2 |
Added C-Ares.
Diffstat (limited to '3rdParty/CAres/src/ares_llist.c')
-rw-r--r-- | 3rdParty/CAres/src/ares_llist.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/3rdParty/CAres/src/ares_llist.c b/3rdParty/CAres/src/ares_llist.c new file mode 100644 index 0000000..c820ed1 --- /dev/null +++ b/3rdParty/CAres/src/ares_llist.c @@ -0,0 +1,87 @@ +/* $Id: ares_llist.c,v 1.2 2009-11-02 11:55:53 yangtse Exp $ */ + +/* 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 "ares_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; + } +} |