/*
* htab.c - table hashing routines
*/
#include "copyright.h"
#include "config.h"
#include "db.h"
#include "externs.h"
#include "htab.h"
#include "alloc.h"
#include "mudconf.h"
/*
* ---------------------------------------------------------------------------
* * search_nametab: Search a name table for a match and return the flag value.
*/
int search_nametab(dbref player, NAMETAB * ntab, char *flagname)
{
NAMETAB *nt;
for(nt = ntab; nt->name; nt++) {
if(minmatch(flagname, nt->name, nt->minlen)) {
if(check_access(player, nt->perm)) {
return nt->flag;
} else
return -2;
}
}
return -1;
}
/*
* ---------------------------------------------------------------------------
* * find_nametab_ent: Search a name table for a match and return a pointer to it.
*/
NAMETAB *find_nametab_ent(dbref player, NAMETAB * ntab, char *flagname)
{
NAMETAB *nt;
for(nt = ntab; nt->name; nt++) {
if(minmatch(flagname, nt->name, nt->minlen)) {
if(check_access(player, nt->perm)) {
return nt;
}
}
}
return NULL;
}
/*
* ---------------------------------------------------------------------------
* * display_nametab: Print out the names of the entries in a name table.
*/
void display_nametab(dbref player, NAMETAB * ntab, char *prefix,
int list_if_none)
{
char *buf, *bp, *cp;
NAMETAB *nt;
int got_one;
buf = alloc_lbuf("display_nametab");
bp = buf;
got_one = 0;
for(cp = prefix; *cp; cp++)
*bp++ = *cp;
for(nt = ntab; nt->name; nt++) {
if(God(player) || check_access(player, nt->perm)) {
*bp++ = ' ';
for(cp = nt->name; *cp; cp++)
*bp++ = *cp;
got_one = 1;
}
}
*bp = '\0';
if(got_one || list_if_none)
notify(player, buf);
free_lbuf(buf);
}
/*
* ---------------------------------------------------------------------------
* * interp_nametab: Print values for flags defined in name table.
*/
void interp_nametab(dbref player, NAMETAB * ntab, int flagword, char *prefix,
char *true_text, char *false_text)
{
char *buf, *bp, *cp;
NAMETAB *nt;
buf = alloc_lbuf("interp_nametab");
bp = buf;
for(cp = prefix; *cp; cp++)
*bp++ = *cp;
nt = ntab;
while (nt->name) {
if(God(player) || check_access(player, nt->perm)) {
*bp++ = ' ';
for(cp = nt->name; *cp; cp++)
*bp++ = *cp;
*bp++ = '.';
*bp++ = '.';
*bp++ = '.';
if((flagword & nt->flag) != 0)
cp = true_text;
else
cp = false_text;
while (*cp)
*bp++ = *cp++;
if((++nt)->name)
*bp++ = ';';
}
}
*bp = '\0';
notify(player, buf);
free_lbuf(buf);
}
/*
* ---------------------------------------------------------------------------
* * listset_nametab: Print values for flags defined in name table.
*/
void listset_nametab(dbref player, NAMETAB * ntab, int flagword, char *prefix,
int list_if_none)
{
char *buf, *bp, *cp;
NAMETAB *nt;
int got_one;
buf = bp = alloc_lbuf("listset_nametab");
for(cp = prefix; *cp; cp++)
*bp++ = *cp;
nt = ntab;
got_one = 0;
while (nt->name) {
if(((flagword & nt->flag) != 0) && (God(player) ||
check_access(player, nt->perm))) {
*bp++ = ' ';
for(cp = nt->name; *cp; cp++)
*bp++ = *cp;
got_one = 1;
}
nt++;
}
*bp = '\0';
if(got_one || list_if_none)
notify(player, buf);
free_lbuf(buf);
}
extern void cf_log_notfound(dbref, char *, const char *, char *);
int cf_ntab_access(int *vp, char *str, long extra, dbref player, char *cmd)
{
NAMETAB *np;
char *ap;
for(ap = str; *ap && !isspace(*ap); ap++);
if(*ap)
*ap++ = '\0';
while (*ap && isspace(*ap))
ap++;
for(np = (NAMETAB *) vp; np->name; np++) {
if(minmatch(str, np->name, np->minlen)) {
return cf_modify_bits(&(np->perm), ap, extra, player, cmd);
}
}
cf_log_notfound(player, cmd, "Entry", str);
return -1;
}