tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
/*
// file: /std/player/history.c
// author: Portals (wayfarer and huthar)
// last modified: 1992/03/08 - Truilkan@TMI
// Changed so objects with euid Root can query_history()
//   (eg /cmds/std/_history.c when a non-admin user is
//    using the history command on themselves.)
// Pallando (93-02-06)
// Added a query_last_command() lfun. Mobydick, 5-26-93.
// Added support for porting history across su's Descartes 940811
//
// changed enqueue to hist_enqueue to prevent conflicting inheritance, Leto

*/

#include <commands.h>
#include <uid.h>

private static string *history_queue;
private static int cmd_num, ptr;
private static int max;

int query_cmd_num() { return cmd_num; }
int query_ptr() { return ptr; }
int query_max() { return max; }
 
string *query_history() {

   if(!adminp(geteuid(previous_object()))&&
      (geteuid(previous_object()) != ROOT_UID) &&
      (base_name(previous_object()) != CMD_SU))
     {
        log_file( "hist_err", wrap(ctime(time())+" "+geteuid(previous_object())+
                  identify(previous_object())) );
        return 0;
     }
 
// As soon as someone installs a driver with previous_object(n) I'm going
// to give the whole call stack so you can't get around this
if( this_player(1) != this_object() && adminp(getuid(this_object())) )
  receive( sprintf("%s just read your history!\n",
	capitalize( this_player(1)->query("name") ) ) );
return history_queue; }

void set_history(string *arr, int num, int p, int m) {
    if(base_name(previous_object()) != CMD_SU) return;
    history_queue = arr;
    cmd_num = num;
    ptr = p;
    max = m;
}
void hist_alloc(int size)
{
    if (pointerp(history_queue) && sizeof(history_queue))  return;
    if (size <= 1)  size = 2;
    history_queue = allocate(max = size);
    cmd_num = 0;
}

void hist_enqueue(string str)
{
   string tmp;

   if(!max)
      return;
   if (str == "" && cmd_num)
      if (ptr)
         str = history_queue[ptr-1];
      else
         str = history_queue[max-1];
   history_queue[ptr++] = str;
   cmd_num++;
   if(ptr == max)
      ptr = 0;
}

string handle_history(string str)
{
   int tmp, tmp2;
   string *tmpq;
   string *lines;
   string cmd;

   if(str[0] != '!' || str == "!")
   {
      hist_enqueue(str);
      return str;
   }

   if(!history_queue || sizeof(history_queue) == 0)
   {
      write(str[1 .. strlen(str) - 1]+": Event not found.\n");
      return "";
   }
   if(str[0 .. 1] == "!!")
   {
      if((tmp = ptr - 1) < 0)
         tmp = max - 1;
      cmd = history_queue[tmp];
      if(str != "!!")
         cmd = cmd + str[2 .. strlen(str) - 1];
   }
   else
   if(sscanf(str,"!%d",tmp2))
   {
      tmp = tmp2;
      if(tmp > 0)
         tmp = tmp - cmd_num - 1;
      if(tmp >= 0 || (-tmp) > max)
      {
         write(tmp2+": Event not found.\n");
         return "";
      }
      if((tmp = ptr + tmp) < 0)
         tmp = max + tmp;
      cmd = history_queue[tmp];
   }
   else
   {
      str = str[1..strlen(str)];
      if(!ptr)
         tmpq = history_queue;
      else
         tmpq = history_queue[ptr .. (max - 1)] +
            history_queue[0 .. ptr - 1];

      lines = regexp(tmpq,"^"+str);
      if(!sizeof(lines))
      {
         write(str+": Event not found.\n");
         return "";
      }
      cmd = lines[sizeof(lines) - 1];
   }

   write(cmd+"\n");
   hist_enqueue(cmd);
   return cmd;
}

string query_last_command() {
   if (previous_object() && !adminp(geteuid(previous_object())) &&
     (geteuid(previous_object()) != ROOT_UID))
     {
        log_file( "hist_err", wrap(ctime(time())+" "+geteuid(previous_object())+
                  identify(previous_object())) );
        return 0;
     }
	if (cmd_num<1) return "" ;
#if 0
	if (adminp(this_object()->query("name"))>-1){
	    if (geteuid(previous_object())!=ROOT_UID &&
		previous_object()!=this_object()) return "" ;
	}
#endif
	if (ptr == 0)
		return history_queue[max-1];
	return history_queue[ptr-1];
}