[comp.lang.c] tsearch

jgp@moscom.UUCP (02/23/87)

I'm having some trouble with tsearch.  According to SYSVID (#2, v1 p239):
	"If the datum is found, tsearch returns a pointer to it.
	If not, tsearch returns a pointer to the inserted item."

To me, that sounds like tsearch should be returning a pointer to my
structure "struct mine *tsearch()".  After spending some time trying
to figure out why my program wasn't working, I determined that on my
system, tsearch was returning a pointer to a pointer to my structure
"struct mine **tsearch()".

Does anyone know which way it is supposed to work?  On both the systems
I have access to (NCR Tower 32/600 and AT&T 3b2/310 both with System V.2)
I get the double indirection which would lead me to suspect that SYSVID
is wrong (or that I'm just misinterpreting it).

The following program demonstrates the problem.  The output I get is:
	27a0 hello
	** 27a0 hello
	*  3c68 
According to SYSVID I would assume the '*' to be correct but the '**'
is what is being generated.

If anybody can either reconcile the above behavior with SYSVID or
mention systems that use the single indirection, I would be grateful.

#include	<stdio.h>
#include	<search.h>

int sqncmp();
char *tsearch();

struct foos {
	char *s;
	short c;
} foo = { "hello", 4 };
struct foos *root1 = NULL;
struct foos *root2 = NULL;

main()
{
	struct foos *p, **pp;
	
	printf("%lx %s\n", (long)&foo.s, foo.s);
	pp = (struct foos **)tsearch((char *)&foo, (char **)&root1, sqncmp);
	p = (struct foos *)tsearch((char *)&foo, (char **)&root2, sqncmp);
	printf("** %lx %s\n", (long)&(*pp)->s, (*pp)->s);
	printf("*  %lx %s\n", (long)&p->s, p->s);
}

int
sqncmp(p, q)
struct foos *p, *q;
{
	return strcmp(p->s, q->s);
}
-- 
Jim Prescott	rochester!moscom!jgp