/* dbtop.c */
/* $Id: dbtop.c,v 1.4 1993/08/16 01:56:33 nils Exp $ */
#include "db.h"
#include "externs.h"
static void shuffle P((int));
static int top[30];
static dbref topp[30];
int dt_mem(x) /* TAKES A LONG TIME! don't use this very often. */
dbref x;
{
int tot=0;
dbref i;
if(db[x].owner != x) return -1;
for(i=0;i<db_top;i++) {
if(db[i].owner == x) {
tot+=mem_usage(i);
}
}
return tot;
}
int dt_cred(x)
dbref x;
{
return Pennies(x);
}
int dt_cont(x)
dbref x;
{
dbref l;
int num=0;
if(Typeof(x)==TYPE_EXIT || db[x].contents == NOTHING) return -1;
for(l=db[x].contents;l!=NOTHING;l=db[l].next)
num++;
return num;
}
int dt_exits(x)
dbref x;
{
dbref l;
int num=0;
if(Typeof(x)!=TYPE_ROOM || Exits(x) == NOTHING) return -1;
for(l=Exits(x);l!=NOTHING;l=db[l].next)
num++;
return num;
}
int dt_quota(x)
dbref x;
{
if(Typeof(x)!=TYPE_PLAYER) return -1;
if(power(x,POW_NOQUOTA)) return -1;
return atoi(atr_get(x,A_QUOTA));
/* return atoi(atr_get(x,A_RQUOTA))+dt_obj(x);*/
}
int dt_obj(x)
register dbref x;
{
if(Typeof(x)!=TYPE_PLAYER)
return -1;
/* for(y=0;y<db_top;y++)
if(db[y].owner == x)
num++;*/
return atoi(atr_get(x,A_QUOTA))-atoi(atr_get(x,A_RQUOTA));
/* return num;*/
}
int dt_numdefs(x)
dbref x;
{
register ATRDEF *j;
register int k=0;
for (j=db[x].atrdefs; j; j=j->next)
k++;
return k;
}
void do_dbtop(player,arg1)
dbref player;
char *arg1;
{
static struct dbtop_list {
char *nam;
int (*func) P((dbref));
} *ptr, funcs[]= {
{"numdefs", dt_numdefs},
{"credits", dt_cred},
{"contents", dt_cont},
{"exits", dt_exits},
{"quota", dt_quota},
{"objects", dt_obj},
{"memory", dt_mem},
{0, 0}};
int nm=0;
if(!power(player,POW_DBTOP)) {
notify(player,"@dbtop is a restricted command.");
return;
}
if(!*arg1)
arg1="foo! this shouldn't match anything";
for(ptr=funcs;ptr->nam;ptr++) {
if(string_prefix(ptr->nam,arg1) || !strcmp(arg1,"all")) {
nm++;
dbtop_internal(player,ptr->func,ptr->nam);
}
}
if(nm==0) {
notify(player,"Usage: @dbtop all|catagory");
notify(player,"catagories are:");
for(ptr=funcs;ptr->nam;ptr++)
notify(player,tprintf(" %s",ptr->nam));
}
}
void dbtop_internal(player,calc,nam)
dbref player;
int (*calc)();
char *nam;
{
int i,m,j;
for(j=0;j<30;j++) {
top[j]=top[j]=(-1);
topp[j]=topp[j]=(dbref)0;
}
notify(player,tprintf("** %s:",nam));
for(i=0;i<db_top;i++) {
m=(*calc)(i);
if(m>top[28]) { /* put it somewhere */
for(j=28;(j>0)&&(top[j]<m);j--);
j++;
shuffle(j);
top[j]=m;topp[j]=i;
}
}
for(j=1;j<27;j++) {
notify(player,tprintf("%2d) %s has %d %s",j,unparse_object(player, topp[j]),top[j],nam));
}
}
static void shuffle(jj)
int jj;
{
if(jj>28) return;
shuffle(jj+1);
top[jj+1]=top[jj];
topp[jj+1]=topp[jj];
}