xref: /freebsd/lib/libc/stdlib/insque.c (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
1 /*
2  * Initial implementation:
3  * Copyright (c) 2002 Robert Drehmel
4  * All rights reserved.
5  *
6  * As long as the above copyright statement and this notice remain
7  * unchanged, you can do what ever you want with this file.
8  */
9 #include <sys/cdefs.h>
10 __FBSDID("$FreeBSD$");
11 
12 #define	_SEARCH_PRIVATE
13 #include <search.h>
14 #ifdef DEBUG
15 #include <stdio.h>
16 #else
17 #include <stdlib.h>	/* for NULL */
18 #endif
19 
20 void
21 insque(void *element, void *pred)
22 {
23 	struct que_elem *prev, *next, *elem;
24 
25 	elem = (struct que_elem *)element;
26 	prev = (struct que_elem *)pred;
27 
28 	if (prev == NULL) {
29 		elem->prev = elem->next = NULL;
30 		return;
31 	}
32 
33 	next = prev->next;
34 	if (next != NULL) {
35 #ifdef DEBUG
36 		if (next->prev != prev) {
37 			fprintf(stderr, "insque: Inconsistency detected:"
38 			    " next(%p)->prev(%p) != prev(%p)\n",
39 			    next, next->prev, prev);
40 		}
41 #endif
42 		next->prev = elem;
43 	}
44 	prev->next = elem;
45 	elem->prev = prev;
46 	elem->next = next;
47 }
48