muse1.7b4/
muse1.7b4/config/
muse1.7b4/doc/
muse1.7b4/run/
muse1.7b4/run/db/
muse1.7b4/src/
muse1.7b4/src/db/
muse1.7b4/src/files/
muse1.7b4/src/io/
muse1.7b4/src/prog/
muse1.7b4/src/util/
/* 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];
}