TinyMAZE/
TinyMAZE/config/
TinyMAZE/doc/
TinyMAZE/run/msgs/
TinyMAZE/src/
TinyMAZE/src/db/
TinyMAZE/src/ident/
TinyMAZE/src/io/
TinyMAZE/src/prog/
TinyMAZE/src/softcode/
TinyMAZE/src/util/
#include <stdio.h>
#include <stdlib.h>
#include "db.h"
#include "externs.h"

static time_t *cmdav_list = NULL;

void do_haltall(OBJ *player)
{
  CODE *c, *cnext;

  if(!power(player, POW_SECURITY))
  {
    notify(player, perm_denied());
    return;
  }

  log_important(tprintf("%s executed: @haltall", name(player)));

  for(c = code_list;c;c = cnext)
  {
    cnext = c->next;

    end_program(c->program, 0);
  }
}

void do_halt(OBJ *player, char *arg)
{
  CODE *c, *cnext;
  OBJ *victim;

  if(!*arg)
    victim = player;
  else
  {
    victim = match_object(player, arg, NOTYPE);

    if(!victim)
    {
      notify(player, no_match(arg));
      return;
    }
  }

  if(!controls(player, victim, POW_MODIFY))
  {
    notify(player, perm_denied());
    return;
  }

  for(c = code_list;c;c = cnext)
  {
    cnext = c->next;

    if(c->executor == victim)
      end_program(c->program, 0);
  }

  notify(player, tprintf("%s halted.", unparse_object(player, victim)));
}

void do_ps(OBJ *player)
{
  show_softcode_queue(player);
}

static void update_cmdav_list()
{
  int i, j;

  if(!cmdav_list)
  {
    cmdav_list = (time_t *)stack_alloc(sizeof(time_t), 1, 0);
    *cmdav_list = 0;
    return;
  }

  for(i = 0;cmdav_list[i] && cmdav_list[i] < now-60;i++); /* Whole loop */


  for(j = 0;cmdav_list[i];j++, i++)
    cmdav_list[j] = cmdav_list[i];
  cmdav_list[j] = 0;

  cmdav_list = (time_t *)stack_realloc(cmdav_list, sizeof(time_t)*(j+1));
}

static int cnt_cmdav_times(time_t seconds)
{
  int i, j;

  for(i = 0;cmdav_list[i] && cmdav_list[i] < seconds;++i); /* Whole loop */
  for(j = 0;cmdav_list[i];i++, j++);   /* Whole loop */

  return(j);
}

void do_cmdav(OBJ *player)
{
  update_cmdav_list();

  notify(player, "|+W|Commands in the last...");
  notify(player, tprintf("|+B|5 seconds |+W|: |+C|%d",
    cnt_cmdav_times(now-5)));
  notify(player, tprintf("|+B|30 seconds|+W|: |+C|%d",
    cnt_cmdav_times(now-30)));
  notify(player, tprintf("|+B|60 seconds|+W|: |+C|%d",
    cnt_cmdav_times(now-60)));
}

void inc_cmdav()
{
  int i;
  static int hits = 0;

  if(hits++ > 50)
  {
    update_cmdav_list();
    hits = 0;
  }

  if(!cmdav_list)
  {
    cmdav_list = (time_t *)stack_alloc(sizeof(time_t)*2, 1, 0);
    cmdav_list[0] = now;
    cmdav_list[1] = 0;
    return;
  }

  for(i = 0;cmdav_list[i];++i);  /* Whole loop */

  cmdav_list = (time_t *)stack_realloc(cmdav_list, sizeof(time_t)*(i+2));

  cmdav_list[i] = now;
  cmdav_list[i+1] = 0;
}

void free_cmdav(void)
{
  stack_free(cmdav_list);
}