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