Well a peek at tsearch.c enlightened me a bit:
The example in tsearch(3) has the following bit:
The example program depends on the fact that twalk makes
no further reference to a node after calling the user
function with argument "endorder" or "leaf". This works
with the GNU library implementation, but is not in the
SysV documentation.
Now that isn't exactly true with the current red-black tree implemenatation
as tdelete() mangles the tree in a way that makes it incompatible with twalk().
So it looks like the example was written back when tsearch used unbalanced
trees (like the other *IXes) instead of red-black trees. Maybe the manual page
should be updated to mention tdestroy() too? (as non-standard function)
... and yes I know the info pages are much more up to date ;)
There are two ways to fix this bug:
1. the evil way: abort() if tdelete() is called from twalk()
2. the compatible way: make tdelete() called from twalk() act like tdestroy()
Implementing the compatible way should be rather trivial once somebody gets
the evil way done ;)
Attachment:
pgpfFMI4Ld6Sn.pgp
Description: PGP signature