Annotation of embedaddon/curl/lib/llist.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22:
! 23: #include "curl_setup.h"
! 24:
! 25: #include <curl/curl.h>
! 26:
! 27: #include "llist.h"
! 28: #include "curl_memory.h"
! 29:
! 30: /* this must be the last include file */
! 31: #include "memdebug.h"
! 32:
! 33: /*
! 34: * @unittest: 1300
! 35: */
! 36: void
! 37: Curl_llist_init(struct curl_llist *l, curl_llist_dtor dtor)
! 38: {
! 39: l->size = 0;
! 40: l->dtor = dtor;
! 41: l->head = NULL;
! 42: l->tail = NULL;
! 43: }
! 44:
! 45: /*
! 46: * Curl_llist_insert_next()
! 47: *
! 48: * Inserts a new list element after the given one 'e'. If the given existing
! 49: * entry is NULL and the list already has elements, the new one will be
! 50: * inserted first in the list.
! 51: *
! 52: * The 'ne' argument should be a pointer into the object to store.
! 53: *
! 54: * @unittest: 1300
! 55: */
! 56: void
! 57: Curl_llist_insert_next(struct curl_llist *list, struct curl_llist_element *e,
! 58: const void *p,
! 59: struct curl_llist_element *ne)
! 60: {
! 61: ne->ptr = (void *) p;
! 62: if(list->size == 0) {
! 63: list->head = ne;
! 64: list->head->prev = NULL;
! 65: list->head->next = NULL;
! 66: list->tail = ne;
! 67: }
! 68: else {
! 69: /* if 'e' is NULL here, we insert the new element first in the list */
! 70: ne->next = e?e->next:list->head;
! 71: ne->prev = e;
! 72: if(!e) {
! 73: list->head->prev = ne;
! 74: list->head = ne;
! 75: }
! 76: else if(e->next) {
! 77: e->next->prev = ne;
! 78: }
! 79: else {
! 80: list->tail = ne;
! 81: }
! 82: if(e)
! 83: e->next = ne;
! 84: }
! 85:
! 86: ++list->size;
! 87: }
! 88:
! 89: /*
! 90: * @unittest: 1300
! 91: */
! 92: void
! 93: Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,
! 94: void *user)
! 95: {
! 96: void *ptr;
! 97: if(e == NULL || list->size == 0)
! 98: return;
! 99:
! 100: if(e == list->head) {
! 101: list->head = e->next;
! 102:
! 103: if(list->head == NULL)
! 104: list->tail = NULL;
! 105: else
! 106: e->next->prev = NULL;
! 107: }
! 108: else {
! 109: if(!e->prev)
! 110: list->head = e->next;
! 111: else
! 112: e->prev->next = e->next;
! 113:
! 114: if(!e->next)
! 115: list->tail = e->prev;
! 116: else
! 117: e->next->prev = e->prev;
! 118: }
! 119:
! 120: ptr = e->ptr;
! 121:
! 122: e->ptr = NULL;
! 123: e->prev = NULL;
! 124: e->next = NULL;
! 125:
! 126: --list->size;
! 127:
! 128: /* call the dtor() last for when it actually frees the 'e' memory itself */
! 129: if(list->dtor)
! 130: list->dtor(user, ptr);
! 131: }
! 132:
! 133: void
! 134: Curl_llist_destroy(struct curl_llist *list, void *user)
! 135: {
! 136: if(list) {
! 137: while(list->size > 0)
! 138: Curl_llist_remove(list, list->tail, user);
! 139: }
! 140: }
! 141:
! 142: size_t
! 143: Curl_llist_count(struct curl_llist *list)
! 144: {
! 145: return list->size;
! 146: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>