.github
.zed
admin
appl
cf
doc
etc
include
kadmin
kcm
kdc
kpasswd
kuser
lib
asn1
base
com_err
gss_preauth
gssapi
hcrypto
hdb
heimdal
hx509
ipc
kadm5
kafs
kdfs
krb5
libedit
ntlm
otp
roken
ChangeLog
Makefile.am
NTMakefile
base32-test.c
base32.c
base32.h
base64-test.c
base64.c
base64.h
bswap.c
chown.c
cloexec.c
closefrom.c
clz.c
concat.c
copyhostent.c
ct.c
daemon.c
detach.c
dirent-test.c
dirent.c
dirent.hin
dlfcn.hin
dlfcn_w32.c
doxygen.c
dumpdata.c
ecalloc.3
ecalloc.c
emalloc.c
environment.c
eread.c
erealloc.c
err.c
err.hin
errx.c
esetenv.c
estrdup.c
ewrite.c
fchown.c
flock.c
fnmatch.c
fnmatch.hin
freeaddrinfo.c
freehostent.c
fseeko.c
ftello.c
gai_strerror.c
get_window_size.c
getaddrinfo-test.c
getaddrinfo.c
getaddrinfo_hostspec.c
getarg.3
getarg.c
getarg.h
getauxval.c
getauxval.h
getcwd.c
getdtablesize.c
getegid.c
geteuid.c
getgid.c
gethostname.c
getifaddrs-test.c
getifaddrs.c
getifaddrs_w32.c
getipnodebyaddr.c
getipnodebyname.c
getnameinfo.c
getnameinfo_verified.c
getopt.c
getprogname.c
gettimeofday.c
getuid.c
getuserinfo.c
getusershell.c
h_errno.c
hex-test.c
hex.c
hex.h
hostent_find_fqdn.c
hstrerror.c
ifaddrs.hin
inet_aton.c
inet_ntop.c
inet_pton.c
initgroups.c
innetgr.c
install-sh
issuid.c
localtime_r.c
lstat.c
memmem.c
memmove.c
memset_s.c
mergesort.c
mergesort_r.c
mini_inetd.c
missing
mkdir.c
mkdtemp.c
mkinstalldirs
mkostemp.c
mkstemp.c
ndbm_wrap.c
ndbm_wrap.h
net_read.c
net_write.c
parse_bytes-test.c
parse_bytes.c
parse_bytes.h
parse_reply-test.c
parse_time-test.c
parse_time.3
parse_time.c
parse_time.h
parse_units.c
parse_units.h
putenv.c
qsort.c
rand.c
rcmd.c
readv.c
realloc.c
recvmsg.c
rename.c
resolve-test.c
resolve.c
resolve.h
rkpty.c
roken-common.h
roken.awk
roken.h.in
roken_gethostby.c
rtbl.3
rtbl.c
rtbl.h
search.hin
secure_getenv.c
secure_getenv.h
sendmsg.c
setegid.c
setenv.c
seteuid.c
setprogname.c
signal.c
simple_exec.c
simple_exec_w32.c
sleep.c
snprintf-test.c
snprintf.c
socket.c
socket_wrapper.c
socket_wrapper.h
sockstartup_w32.c
stdbool.hin
stdint.hin
strcasecmp.c
strcollect.c
strdup.c
strerror.c
strerror_r.c
strftime.c
strlcat.c
strlcpy.c
strlwr.c
strncasecmp.c
strndup.c
strnlen.c
strpftime-test.c
strpftime-test.h
strpool.c
strptime.c
strsep.c
strsep_copy.c
strtok_r.c
strtoll.c
strtoull.c
strupr.c
swab.c
syslog.hin
syslogc.c
test-auxval.c
test-detach.c
test-getuserinfo.c
test-mem.c
test-mem.h
test-mini_inetd.c
test-readenv.c
timegm.c
timeval.c
tm2time.c
tsearch-test.c
tsearch.c
unsetenv.c
unvis.c
verr.c
verrx.c
version-script.map
versionsupport.h
vis-extras.h
vis.c
vis.hin
vsyslog.c
vwarn.c
vwarnx.c
warn.c
warnerr.c
warnx.c
win32_alloc.c
win32_version.c
write_pid.c
writev.c
xdbm.h
xfree.c
sl
sqlite
vers
wind
Makefile.am
NTMakefile
nix
packages
po
tests
tools
windows
.gitignore
.travis.yml
CODE_OF_CONDUCT.md
ChangeLog
ChangeLog.1998
ChangeLog.1999
ChangeLog.2000
ChangeLog.2001
ChangeLog.2002
ChangeLog.2003
ChangeLog.2004
ChangeLog.2005
ChangeLog.2006
ChangeLog.2007
LICENSE
Makefile.am
Makefile.am.common
NEWS
NTMakefile
README
README.fast
README.md
SECURITY.md
TODO
acinclude.m4
appveyor.yml
autogen.sh
configure.ac
flake.lock
flake.nix
krb5.conf
126 lines
2.6 KiB
C
126 lines
2.6 KiB
C
/*
|
|
* 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 <config.h>
|
|
|
|
#include "roken.h"
|
|
#include "search.h"
|
|
|
|
struct node {
|
|
char *string;
|
|
int order;
|
|
};
|
|
|
|
extern void *rk_tdelete(const void *, void **,
|
|
int (*)(const void *, const void *));
|
|
extern void *rk_tfind(const void *, void * const *,
|
|
int (*)(const void *, const void *));
|
|
extern void *rk_tsearch(const void *, void **, int (*)(const void *, const void *));
|
|
extern void rk_twalk(const void *, void (*)(const void *, VISIT, int));
|
|
|
|
void *rootnode = NULL;
|
|
int numerr = 0;
|
|
|
|
/*
|
|
* This routine compares two nodes, based on an
|
|
* alphabetical ordering of the string field.
|
|
*/
|
|
int
|
|
node_compare(const void *node1, const void *node2)
|
|
{
|
|
return strcmp(((const struct node *) node1)->string,
|
|
((const struct node *) node2)->string);
|
|
}
|
|
|
|
static int walkorder = -1;
|
|
|
|
void
|
|
list_node(const void *ptr, VISIT order, int level)
|
|
{
|
|
const struct node *p = *(const struct node **) ptr;
|
|
|
|
if (order == postorder || order == leaf) {
|
|
walkorder++;
|
|
if (p->order != walkorder) {
|
|
warnx("sort failed: expected %d next, got %d\n", walkorder,
|
|
p->order);
|
|
numerr++;
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
int numtest = 1;
|
|
struct node *t, *p, tests[] = {
|
|
{ "", 0 },
|
|
{ "ab", 3 },
|
|
{ "abc", 4 },
|
|
{ "abcdefg", 8 },
|
|
{ "abcd", 5 },
|
|
{ "a", 2 },
|
|
{ "abcdef", 7 },
|
|
{ "abcde", 6 },
|
|
{ "=", 1 },
|
|
{ NULL }
|
|
};
|
|
|
|
for(t = tests; t->string; t++) {
|
|
/* Better not be there */
|
|
p = (struct node *)rk_tfind((void *)t, (void **)&rootnode,
|
|
node_compare);
|
|
|
|
if (p) {
|
|
warnx("erroneous list: found %d\n", p->order);
|
|
numerr++;
|
|
}
|
|
|
|
/* Put node into the tree. */
|
|
p = (struct node *) rk_tsearch((void *)t, (void **)&rootnode,
|
|
node_compare);
|
|
|
|
if (!p) {
|
|
warnx("erroneous list: missing %d\n", t->order);
|
|
numerr++;
|
|
}
|
|
}
|
|
|
|
rk_twalk(rootnode, list_node);
|
|
|
|
for(t = tests; t->string; t++) {
|
|
/* Better be there */
|
|
p = (struct node *) rk_tfind((void *)t, (void **)&rootnode,
|
|
node_compare);
|
|
|
|
if (!p) {
|
|
warnx("erroneous list: missing %d\n", t->order);
|
|
numerr++;
|
|
}
|
|
|
|
/* pull out node */
|
|
(void) rk_tdelete((void *)t, (void **)&rootnode,
|
|
node_compare);
|
|
|
|
/* Better not be there */
|
|
p = (struct node *) rk_tfind((void *)t, (void **)&rootnode,
|
|
node_compare);
|
|
|
|
if (p) {
|
|
warnx("erroneous list: found %d\n", p->order);
|
|
numerr++;
|
|
}
|
|
|
|
}
|
|
|
|
return numerr;
|
|
}
|