1
0
Files
irix-657m-src/irix/cmd/netman/lib/in_qual.c
2022-09-29 17:59:04 +03:00

98 lines
1.7 KiB
C

/*
* Copyright 1988 Silicon Graphics, Inc. All rights reserved.
*/
#include "index.h"
/*
* Look for a key with a certain qualifier.
*/
void *
in_matchqual(Index *in, void *key, long qual)
{
Entry *ent;
void *unqual;
ent = *in_lookup(in, key);
if (ent == 0)
return 0;
unqual = 0;
for (;;) {
if (!ent->ent_qual)
unqual = ent->ent_value;
if (ent->ent_qual == qual)
break;
do {
ent = ent->ent_next;
if (ent == 0)
return unqual;
} while (in_cmpkeys(in, ent->ent_key, key));
}
return ent->ent_value;
}
void *
in_matchuniq(Index *in, void *key, long qual)
{
Entry *ent;
ent = *in_lookup(in, key);
if (ent == 0)
return 0;
while (ent->ent_qual != qual) {
do {
ent = ent->ent_next;
if (ent == 0)
return 0;
} while (in_cmpkeys(in, ent->ent_key, key));
}
return ent->ent_value;
}
/*
* Enter a key distinguished by a qualifier.
*/
void
in_enterqual(Index *in, void *key, void *value, long qual)
{
Entry **ep, *ent;
ep = in_lookup(in, key);
ent = *ep;
if (ent == 0)
goto install;
for (;;) {
if (ent->ent_qual == qual) {
if (ent->ent_value)
in_freeval(in, ent);
ent->ent_value = value;
return;
}
do {
ep = &ent->ent_next;
ent = *ep;
if (ent == 0)
goto install;
} while (in_cmpkeys(in, ent->ent_key, key));
}
install:
ent = in_add(in, key, value, ep);
ent->ent_qual = qual;
}
/*
* Remove the key distinguished by a qualifier if it exists.
*/
void
in_removequal(Index *in, void *key, long qual)
{
Entry **ep, *ent;
for (ep = in_lookup(in, key); (ent = *ep) != 0; ep = &ent->ent_next) {
if (!in_cmpkeys(in, ent->ent_key, key)
&& ent->ent_qual == qual) {
in_delete(in, ep);
return;
}
}
}