diff options
| author | Alfred Perlstein <alfred@FreeBSD.org> | 2000-07-01 06:55:11 +0000 | 
|---|---|---|
| committer | Alfred Perlstein <alfred@FreeBSD.org> | 2000-07-01 06:55:11 +0000 | 
| commit | 64566a3e2ab2e0c5a7597e4a777e31d397fbfb91 (patch) | |
| tree | 2b068abb9634a2429201a28429385d879602c96b /lib/libc/stdlib/tsearch.c | |
| parent | b4739f39afe007754644eed77a913ed3b7a89f3d (diff) | |
Notes
Diffstat (limited to 'lib/libc/stdlib/tsearch.c')
| -rw-r--r-- | lib/libc/stdlib/tsearch.c | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/libc/stdlib/tsearch.c b/lib/libc/stdlib/tsearch.c new file mode 100644 index 000000000000..85832ce480a3 --- /dev/null +++ b/lib/libc/stdlib/tsearch.c @@ -0,0 +1,57 @@ +/*	$NetBSD: tsearch.c,v 1.3 1999/09/16 11:45:37 lukem Exp $	*/ +/* $FreeBSD$ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: tsearch.c,v 1.3 1999/09/16 11:45:37 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include <assert.h> +#define _SEARCH_PRIVATE +#include <search.h> +#include <stdlib.h> + +/* find or insert datum into search tree */ +void * +tsearch(vkey, vrootp, compar) +	const void *vkey;		/* key to be located */ +	void **vrootp;			/* address of tree root */ +	int (*compar) __P((const void *, const void *)); +{ +	node_t *q; +	node_t **rootp = (node_t **)vrootp; + +	if (rootp == NULL) +		return NULL; + +	while (*rootp != NULL) {	/* Knuth's T1: */ +		int r; + +		if ((r = (*compar)(vkey, (*rootp)->key)) == 0)	/* T2: */ +			return *rootp;		/* we found it! */ + +		rootp = (r < 0) ? +		    &(*rootp)->llink :		/* T3: follow left branch */ +		    &(*rootp)->rlink;		/* T4: follow right branch */ +	} + +	q = malloc(sizeof(node_t));		/* T5: key not found */ +	if (q != 0) {				/* make new node */ +		*rootp = q;			/* link new node to old */ +		/* LINTED const castaway ok */ +		q->key = (void *)vkey;		/* initialize new node */ +		q->llink = q->rlink = NULL; +	} +	return q; +}  | 
