xref: /freebsd/lib/libc/stdlib/insque.c (revision e768c1be41aefcb7cf8fb19b12cf21d523dc4cdf)
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  * $FreeBSD$
10  */
11 #include <sys/cdefs.h>
12 __FBSDID("$FreeBSD$");
13 
14 #define	_SEARCH_PRIVATE
15 #include <search.h>
16 #ifdef DEBUG
17 #include <stdio.h>
18 #else
19 #include <stdlib.h>	/* for NULL */
20 #endif
21 
22 void insque(void *element, void *pred)
23 {
24 	struct que_elem *prev, *next, *elem;
25 
26 	elem = (struct que_elem *)element;
27 	prev = (struct que_elem *)pred;
28 
29 	if (prev == NULL) {
30 		elem->prev = elem->next = NULL;
31 		return;
32 	}
33 
34 	next = prev->next;
35 	if (next != NULL) {
36 #ifdef DEBUG
37 		if (next->prev != prev) {
38 			fprintf(stderr, "insque: Inconsistency detected:"
39 			    " next(%p)->prev(%p) != prev(%p)\n",
40 			    next, next->prev, prev);
41 		}
42 #endif
43 		next->prev = elem;
44 	}
45 	prev->next = elem;
46 	elem->prev = prev;
47 	elem->next = next;
48 }
49