diff options
| author | Robert Drehmel <robert@FreeBSD.org> | 2002-10-16 14:00:46 +0000 | 
|---|---|---|
| committer | Robert Drehmel <robert@FreeBSD.org> | 2002-10-16 14:00:46 +0000 | 
| commit | e768c1be41aefcb7cf8fb19b12cf21d523dc4cdf (patch) | |
| tree | f842a8fc345135dd3f0a7b4514d049f10569985e /lib/libc | |
| parent | dc51023cb319a421c1d1f7bfb06f90e5e0fb500a (diff) | |
Notes
Diffstat (limited to 'lib/libc')
| -rw-r--r-- | lib/libc/stdlib/Makefile.inc | 11 | ||||
| -rw-r--r-- | lib/libc/stdlib/insque.3 | 59 | ||||
| -rw-r--r-- | lib/libc/stdlib/insque.c | 48 | ||||
| -rw-r--r-- | lib/libc/stdlib/remque.c | 31 | 
4 files changed, 144 insertions, 5 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index a65ef1ee1684..b04c2da8184d 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/lib/libc/stdlib/Makefile.inc @@ -6,12 +6,12 @@  MISRCS+=_Exit.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \  	bsearch.c calloc.c div.c exit.c getenv.c getopt.c getopt_long.c \ -	getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c \ +	getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c insque.c \  	labs.c ldiv.c llabs.c lldiv.c malloc.c merge.c putenv.c \  	qsort.c qsort_r.c radixsort.c rand.c random.c reallocf.c realpath.c \ -	setenv.c strfmon.c strhash.c strtod.c strtoimax.c strtol.c strtoll.c \ -	strtoq.c strtoul.c strtoull.c strtoumax.c strtouq.c system.c \ -	tdelete.c tfind.c tsearch.c twalk.c +	remque.c setenv.c strfmon.c strhash.c strtod.c strtoimax.c strtol.c \ +	strtoll.c strtoq.c strtoul.c strtoull.c strtoumax.c strtouq.c \ +	system.c tdelete.c tfind.c tsearch.c twalk.c  # machine-dependent stdlib sources  .if exists(${.CURDIR}/../libc/${MACHINE_ARCH}/stdlib/Makefile.inc) @@ -21,7 +21,7 @@ MISRCS+=_Exit.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \  .if ${LIB} == "c"  MAN+=	abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 bsearch.3 \  	div.3 exit.3 getenv.3 getopt.3 getopt_long.3 getsubopt.3 hcreate.3 \ -	imaxabs.3 imaxdiv.3 labs.3 ldiv.3 llabs.3 lldiv.3 \ +	imaxabs.3 imaxdiv.3 insque.3 labs.3 ldiv.3 llabs.3 lldiv.3 \  	malloc.3 memory.3 qsort.3 radixsort.3 rand.3 random.3 \  	realpath.3 strfmon.3 strtod.3 strtol.3 strtoul.3 system.3 tsearch.3 @@ -29,6 +29,7 @@ MLINKS+=atol.3 atoll.3  MLINKS+=exit.3 _Exit.3  MLINKS+=getenv.3 putenv.3 getenv.3 setenv.3 getenv.3 unsetenv.3  MLINKS+=hcreate.3 hdestroy.3 hcreate.3 hsearch.3 +MLINKS+=insque.3 remque.3  MLINKS+=qsort.3 heapsort.3 qsort.3 mergesort.3 qsort.3 qsort_r.3  MLINKS+=rand.3 rand_r.3 rand.3 srand.3 rand.3 sranddev.3  MLINKS+=random.3 initstate.3 random.3 setstate.3 random.3 srandom.3 \ diff --git a/lib/libc/stdlib/insque.3 b/lib/libc/stdlib/insque.3 new file mode 100644 index 000000000000..7df48f018652 --- /dev/null +++ b/lib/libc/stdlib/insque.3 @@ -0,0 +1,59 @@ +.\" +.\" Initial implementation: +.\" Copyright (c) 2002 Robert Drehmel +.\" All rights reserved. +.\" +.\" As long as the above copyright statement and this notice remain +.\" unchanged, you can do what ever you want with this file.  +.\" +.\" $FreeBSD$ +.\" +.Dd October 10, 2002 +.Dt INSQUE 3 +.Os +.Sh NAME +.Nm insque , +.Nm remque +.Nd doubly-linked list management +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In search.h +.Ft void +.Fn insque "void *element1" "void *pred" +.Ft void +.Fn remque "void *element" +.Sh DESCRIPTION +.Pp +The +.Fn insque +and +.Fn remque +functions encapsulate the ever-repeating task of doing insertion and +removal operations on doubly linked lists.  The functions expect their +arguments to point to a structure whose first and second members are +pointers to the next and previous element, respectively. +The +.Fn insque +functions also allows the +.Fa pred +argument to be a NULL pointer for the initialization of a new list's +head element. +.Sh HISTORY +The +.Fn insque +and +.Fn remque +functions appeared in +.Bx 4.2 . +In +.Fx 5.0 , +they reappeared conforming to +.St -p1003.1-2001 . +.Sh STANDARDS +The +.Fn insque +and +.Fn remque +functions conform to +.St -p1003.1-2001 . diff --git a/lib/libc/stdlib/insque.c b/lib/libc/stdlib/insque.c new file mode 100644 index 000000000000..08d179a5f988 --- /dev/null +++ b/lib/libc/stdlib/insque.c @@ -0,0 +1,48 @@ +/* + * Initial implementation: + * Copyright (c) 2002 Robert Drehmel + * All rights reserved. + * + * As long as the above copyright statement and this notice remain + * unchanged, you can do what ever you want with this file.  + * + * $FreeBSD$ + */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#define	_SEARCH_PRIVATE +#include <search.h> +#ifdef DEBUG +#include <stdio.h> +#else +#include <stdlib.h>	/* for NULL */ +#endif + +void insque(void *element, void *pred) +{ +	struct que_elem *prev, *next, *elem; + +	elem = (struct que_elem *)element; +	prev = (struct que_elem *)pred; + +	if (prev == NULL) { +		elem->prev = elem->next = NULL; +		return; +	} + +	next = prev->next; +	if (next != NULL) { +#ifdef DEBUG +		if (next->prev != prev) { +			fprintf(stderr, "insque: Inconsistency detected:" +			    " next(%p)->prev(%p) != prev(%p)\n", +			    next, next->prev, prev); +		} +#endif +		next->prev = elem; +	} +	prev->next = elem; +	elem->prev = prev; +	elem->next = next; +} diff --git a/lib/libc/stdlib/remque.c b/lib/libc/stdlib/remque.c new file mode 100644 index 000000000000..234118876891 --- /dev/null +++ b/lib/libc/stdlib/remque.c @@ -0,0 +1,31 @@ +/* + * Initial implementation: + * Copyright (c) 2002 Robert Drehmel + * All rights reserved. + * + * As long as the above copyright statement and this notice remain + * unchanged, you can do what ever you want with this file.  + * + * $FreeBSD$ + */ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#define	_SEARCH_PRIVATE +#include <search.h> +#include <stdlib.h>	/* for NULL */ + +void remque(void *element) +{ +	struct que_elem *prev, *next, *elem; + +	elem = (struct que_elem *)element; + +	prev = elem->prev; +	next = elem->next; + +	if (prev != NULL) +		prev->next = next; +	if (next != NULL) +		next->prev = prev; +}  | 
