insque.c revision 105245
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: head/lib/libc/stdlib/insque.c 105245 2002-10-16 14:00:46Z robert $
10 */
11#include <sys/cdefs.h>
12__FBSDID("$FreeBSD: head/lib/libc/stdlib/insque.c 105245 2002-10-16 14:00:46Z robert $");
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
22void 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