libdht

A simple helper library for distributed hash tables.
git clone git://r-36.net/libdht
Log | Files | Refs | LICENSE

dhtlist.c (2731B)


      1 /*
      2  * Copy me if you can.
      3  * by 20h
      4  */
      5 
      6 #define _GNU_SOURCE
      7 #include <unistd.h>
      8 #include <stdlib.h>
      9 #include <stdio.h>
     10 #include <string.h>
     11 #include <sys/types.h>
     12 #include <regex.h>
     13 
     14 #include "ind.h"
     15 #include "dht.h"
     16 
     17 dhtlistelem_t *
     18 dhtlistelem_set(dhtlistelem_t *elem, dhtnode_t *node)
     19 {
     20 	elem->node = node;
     21 
     22 	return elem;
     23 }
     24 
     25 dhtlistelem_t *
     26 dhtlistelem_new(dhtnode_t *node)
     27 {
     28 	return dhtlistelem_set(mallocz(sizeof(dhtlistelem_t), 2), node);
     29 }
     30 
     31 void
     32 dhtlistelem_free(dhtlistelem_t *elem)
     33 {
     34 	free(elem);
     35 }
     36 
     37 dhtlist_t *
     38 dhtlist_new(void)
     39 {
     40 	return (dhtlist_t *)mallocz(sizeof(dhtlist_t), 2);
     41 }
     42 
     43 void
     44 dhtlist_free(dhtlist_t *node)
     45 {
     46 	dhtlistelem_t *elem;
     47 
     48 	if (node->first != NULL) {
     49 		for (elem = node->first;;) {
     50 			if (elem->next != NULL) {
     51 				elem = elem->next;
     52 				free(elem->prev);
     53 			} else {
     54 				free(elem);
     55 				break;
     56 			}
     57 		}
     58 	}
     59 	free(node);
     60 }
     61 
     62 dhtlistelem_t *
     63 dhtlist_addelem(dhtlist_t *dhtlist, dhtlistelem_t *elem)
     64 {
     65 	if (dhtlist->first == NULL)
     66 		dhtlist->first = elem;
     67 	if (dhtlist->last == NULL)
     68 		dhtlist->last = elem;
     69 	else {
     70 		dhtlist->last->next = elem;
     71 		elem->prev = dhtlist->last;
     72 		dhtlist->last = elem;
     73 	}
     74 	dhtlist->len++;
     75 
     76 	return elem;
     77 }
     78 
     79 dhtlistelem_t *
     80 dhtlist_add(dhtlist_t *dhtlist, dhtnode_t *node)
     81 {
     82 	return dhtlist_addelem(dhtlist, dhtlistelem_new(node));
     83 }
     84 
     85 dhtlistelem_t *
     86 dhtlist_push(dhtlist_t *dhtlist, dhtnode_t *node)
     87 {
     88 	dhtlistelem_t *elem;
     89 
     90 	elem = dhtlistelem_new(node);
     91 
     92 	if (dhtlist->first == NULL)
     93 		dhtlist->first = elem;
     94 	else {
     95 		dhtlist->first->prev = elem;
     96 		elem->next = dhtlist->first;
     97 		dhtlist->first = elem;
     98 	}
     99 	if (dhtlist->last == NULL)
    100 		dhtlist->last = elem;
    101 	dhtlist->len++;
    102 
    103 	return elem;
    104 }
    105 
    106 void
    107 dhtlist_delelemlinks(dhtlist_t *dhtlist, dhtlistelem_t *elem)
    108 {
    109 	dhtlistelem_t *prev, *next;
    110 
    111 	prev = elem->prev;
    112 	next = elem->next;
    113 
    114 	if (prev != NULL)
    115 		prev->next = next;
    116 	if (next != NULL)
    117 		next->prev = prev;
    118 	if (dhtlist->first == elem)
    119 		dhtlist->first = next;
    120 	if (dhtlist->last == elem)
    121 		dhtlist->last = prev;
    122 	dhtlist->len--;
    123 }
    124 
    125 dhtlistelem_t *
    126 dhtlist_insert(dhtlist_t *dhtlist, dhtlistelem_t *elem, int idx)
    127 {
    128 	int i;
    129 	dhtlistelem_t *next;
    130 
    131 	i = 0;
    132 
    133 	if (idx > dhtlist->len-1)
    134 		return NULL;
    135 	if (idx == dhtlist->len-1)
    136 		return dhtlist_addelem(dhtlist, elem);
    137 
    138 	forodhtlist(dhtlist, next)
    139 		if (i == idx)
    140 			break;
    141 
    142 	if (next->prev != NULL)
    143 		next->prev->next = elem;
    144 	elem->prev = next->prev;
    145 	next->prev = elem;
    146 	elem->next = next;
    147 	dhtlist->len++;
    148 
    149 	return elem;
    150 }
    151 
    152 dhtlistelem_t *
    153 dhtlist_move(dhtlist_t *dhtlist, dhtlistelem_t *elem, int idx)
    154 {
    155 	dhtlist_delelemlinks(dhtlist, elem);
    156 	return dhtlist_insert(dhtlist, elem, idx);
    157 }
    158 
    159 void
    160 dhtlist_print(dhtlist_t *dhtlist)
    161 {
    162 	fordhtlist(dhtlist, elem)
    163 		printf("%p\n", (void *)elem);
    164 	fflush(stdout);
    165 }
    166