skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/* errors command, trial out by Turrican for a commands daemon. */

#include <log.h>
#include <board.h>
#include <mail.h>

class bugs {
  int bug_num;
  int bugs;
  string error;
  string file;
  string temp_body;
  string ed_file;
  int changed;
}

#define BUG_NUM ((class bugs)globvars[this_player()])->bug_num
#define BUGS ((class bugs)globvars[this_player()])->bugs
#define ERROR ((class bugs)globvars[this_player()])->error
#define FILE ((class bugs)globvars[this_player()])->file
#define TEMP_BODY ((class bugs)globvars[this_player()])->temp_body
#define ED_FILE ((class bugs)globvars[this_player()])->ed_file
#define CHANGED ((class bugs)globvars[this_player()])->changed

private nosave mapping globvars;

protected string get_bug(int i);
protected void request();

protected void create() {
  globvars = ([]);
}

mixed cmd(string str) {
   string temp, *temps;

  globvars[this_player()] = new(class bugs);
  if(!str)
    str = this_player()->query_current_path();
  if(str[<1] != '/')
    str += "/";
  str += ERROR_LOG;
  ERROR = read_file(str);
  FILE = str;
  if (!ERROR) {
   printf("No error found in this dir.\n");
   map_delete(globvars, this_player());
  } else {
    rm(TEMP_MAIL_LIST);
    rm(TEMP_FORWARD_LIST);
    temps = explode( ERROR, "\n" );
    temp = temps[ sizeof( temps ) - 1 ];
    sscanf(temp, ".END %d", BUGS);
    BUG_NUM = 1;
    printf( "%s", get_bug( BUG_NUM ) );
    request();
  }
  return 1;
}

protected string get_bug(int i) {
  int rtime;
  string fmt, bug, ret;
  string title, filename;
  string ftime, fname;
  string time, name;

  if(BUGS == 0 || i > BUGS)
    return 0;
  fmt = "%*s.START " + i + "\n%s.END " + i;
  sscanf(ERROR, fmt, bug);
  sscanf(bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s",title,filename,ftime,fname,
    time,name,bug);
  ret = sprintf( "%s\n", title );
  ret += sprintf( "%s\n", filename );
  if(ftime != "") {
    ret += sprintf( "Forwarded from : %s\n", capitalize( fname ) );
    sscanf(ftime, "%d", rtime);
    ret += sprintf( "at             : %s\n", ctime( rtime ) );
  }
  ret += sprintf( "Made by        : %s\n", capitalize( name ) );
  sscanf(time, "%d", rtime);
  ret += sprintf( "at             : %s\n", ctime( rtime ) );
  ret += bug;
  return ret;
}

protected void request() {
  if (BUGS > 0)
    printf("[1-%d] (%d) ", BUGS, BUG_NUM);
  else
    printf("[No bugs] ");
  printf("Choose from EBUFDNPGQX, H for help. ");
  input_to("commands");
}

void delete_bug(int n) {
  int i;
  string fmt, bug, trash;

  fmt = "%s.START " + n + "\n%s.END " + n + "\n%s";
  sscanf(ERROR, fmt, ERROR, bug, trash);
  ERROR += trash;
  for(i=n+1;i<BUGS+1;i++) {
    reset_eval_cost();
    fmt = "%s.START " + i + "\n%s.END " + i + "\n%s";
    sscanf(ERROR, fmt, ERROR, bug, trash);
    ERROR += ".START "+(i-1)+"\n"+bug+".END "+(i-1)+"\n"+trash;
  }
  BUGS--;
  if (BUG_NUM > BUGS)
    BUG_NUM--;
  CHANGED = 1;
}

void end_of_mail(string body) {
  string name, bug, rtime;

  if(body && body != "") {
    sscanf(TEMP_BODY, "%s %s %s", name, rtime, bug);
    if(sscanf(body, "%s$report$%s", body, TEMP_BODY) == 2)
      body += bug + TEMP_BODY;
    write_file(TEMP_MAIL_LIST, name + " " + rtime + " " + body + "END");
  }
  if (!BUGS)
    printf("No more errors.\n");
  else
    printf( "%s", get_bug( BUG_NUM ) );
  request();
}

void forward_bug(string NewDir) {
  string fmt, trash, bug;
  string title, filename;
  string ftime, fname;
  string rtime, name;

  fmt = "%s.START " + BUG_NUM + "\n%s.END " + BUG_NUM;
  sscanf(ERROR, fmt, trash, bug);
  sscanf(bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s",title,filename,ftime,
    fname,rtime,name,bug);

  if(ftime == "")
    write_file(TEMP_FORWARD_LIST, name + " " + rtime + " " + filename + "\n");
  else
    write_file(TEMP_FORWARD_LIST, name + " " + ftime + " " + filename + "\n");
  write_file(TEMP_FORWARD_LIST, ".START " + BUG_NUM + "\n" + NewDir + "\n" +
    title + "\n" + filename + "\n" + ftime + "\n" + fname + "\n" +
    rtime + "\n" + name + "\n" + bug + ".END " + BUG_NUM + "\n");
}

varargs void write_bug_report(string log, string title, string File,
			      string ftime, string fname, string rtime,
			      string name, string bug, int flag) {

  int i;
  string temp;

  if (!flag)
    log_file("TEMPORARY_ERRORS", name + " " + rtime + " " + File + "\n");
  i = file_length( log );
  if (i > 0) {
    temp = read_file(log, i, 1);
    if (sscanf(temp, ".END %d", i) == 1)
      i += 1;
    else
      i = 1;
  }
  else
    i = 1;

  temp = ".START " + i + "\n" + title + File + ftime + fname +
      rtime + name + bug + ".END " + i + "\n";

  master()->forward_error(log, temp);
}

int commands(string str) {
  int i;
  string bug, ed_file, trash, fmt;
  string title, filename;
  string ftime, fname;
  string rtime, name;

  if (!str)
    str = "";
  if (sizeof(str) > 1)
    str = lower_case(str[0..0])+str[1..];
  else
    str = lower_case(str);
  if(str[0] == 'g')
    sscanf(str, "%s %d", str, i);
  if(str[0] == 'e' || str[0] == 'f' || str[0] == 'd' || str[0] == 'b')
    sscanf(str, "%s %s", str, ed_file);
  str = lower_case(str);

  switch(str) {
    case "e" :
      if (!BUGS) {
        printf("No more errors.\n");
        request();
        return 1;
      }
      if (!ed_file) {
        fmt = "%*s.START " + BUG_NUM + "\n%s.END " + BUG_NUM;
        sscanf(ERROR, fmt, bug);
        sscanf(bug, "%*s\n%s\n", trash, ed_file);
        ed_file += ".c";
      }
      printf("Editing %s\n", ed_file);
      ed(ed_file, "request");
      return 1;
    case "b" :
      if (!BUGS) {
        printf("No more errors.\n");
        request();
        return 1;
      } 
      if (!ed_file)
        printf("You must give the name of a board to post on.\n");
      else {
        if (member_array(ed_file, (string *)BOARD_HAND->query_boards()) == -1)
          printf("The board %s does not exist.\n", ed_file);
        else {
          ED_FILE = ed_file;
          printf("Do you wish to edit the post ? [y/N] ");
          get_char("continue_post");
          return 1;
        }
      }
      request();
      return 1;
    case "u" :
      str = "f";
      ed_file = "unknown";
    case "f" :
      if (!BUGS) {
        printf("No more errors.\n");
        request();
        return 1;
      } 
      if(!ed_file)
        printf("You must either give the name of a creator, or a directory.\n");
      else {
        string cre;
        cre = this_player()->expand_nickname(ed_file);
        if( creatorp(cre) || cre == "unknown") {
          if (cre == "unknown")
            forward_bug("/log/" + ERROR_LOG);
          else
            forward_bug("/w/"+cre+"/" + ERROR_LOG);
          delete_bug(BUG_NUM);
          printf("Forwarded (hopefully :).\n");
        } else {
          if ( unguarded( (: file_size, ed_file :) ) == -2 ) {
            forward_bug(ed_file + "/" + ERROR_LOG);
            delete_bug(BUG_NUM);
            printf("Forwarded (hopefully :).\n");
          } else
            printf("Dir does not exist, or you haven't got read access.\n");
        }
      }
      if (!BUGS)
        printf("No more errors.\n");
      else
        printf( "%s", get_bug( BUG_NUM ) );
      request();
      return 1;
    case "d" :
      if (!BUGS) {
        printf("No more errors.\n");
        request();
        return 1;
      }
      if(ed_file == "f" || ed_file == "" || !ed_file) {
        fmt = "%*s.START " + BUG_NUM + "\n%s.END " + BUG_NUM + "\n%*s";
        sscanf(ERROR, fmt, bug);
        sscanf(bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
          fname, rtime, name, bug);
        bug = "The following bug has now been fixed.\n\n"+ bug +
          "\nThank you for reporting it.\n\n"+
          "This was an automatic mail.\n";
          write_file(TEMP_MAIL_LIST, name + " " + rtime + " " + bug + "END");
      }
      if(ed_file == "n") {
        fmt = "%*s.START " + BUG_NUM + "\n%s.END " + BUG_NUM + "\n%*s";
        sscanf(ERROR, fmt, bug);
        sscanf(bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
          fname, rtime, name, bug);
        bug = "The following report by you is not a bug.\n" + bug +
          "\n" + "Thank you for reporting it anyway though.\n"+
          "This was an automatic mail.\n";
        write_file(TEMP_MAIL_LIST, name + " " + rtime + " " + bug + "END");
      }
      if(ed_file == "r") {
        fmt = "%*s.START " + BUG_NUM + "\n%s.END " + BUG_NUM + "\n%*s";
        sscanf(ERROR, fmt, bug);
        sscanf(bug, "%s\n%s\n%s\n%s\n%s\n%s\n%s", title, filename, ftime,
          fname, rtime, name, bug);
        TEMP_BODY = name + " " + rtime + " " + bug;
        this_player()->do_edit(0,"end_of_mail");
      }
      delete_bug(BUG_NUM);
      if (ed_file != "r") {
        if (!BUGS)
          printf("No more errors.\n");
        else
          printf( "%s", get_bug( BUG_NUM ) );
        request();
      }
      return 1;
    case ""  :
    case "+" :
    case "n" :
      if(BUG_NUM < BUGS) {
        BUG_NUM += 1;
        printf( "%s", get_bug( BUG_NUM ) );
      }
      else
        printf("No more errors.\n");
      request();
      return 1;
    case "-" :
    case "p" :
      if(BUG_NUM > 1) {
        BUG_NUM -= 1;
        printf( "%s", get_bug( BUG_NUM ) );
      }
      else
        printf("This is the first error.\n");
      request();
      return 1;
    case "g" :
      if(i > 0 && i < BUGS+1) {
        BUG_NUM = i;
        printf( "%s", get_bug( BUG_NUM ) );
      }
      else
        printf("Error number doesn't exists.\n");
      request();
      return 1;
    case "q" :
      rm(TEMP_MAIL_LIST);
      rm(TEMP_FORWARD_LIST);
      map_delete(globvars, this_player());
      return 1;
    case "x" :
      if (CHANGED && rm(FILE)) {
        if (BUGS)
          write_file(FILE, ERROR);
        ERROR = read_file(TEMP_MAIL_LIST);
        if (ERROR) {
          while( sscanf( ERROR, "%s %s %sEND%s", name, rtime, bug, ERROR ) ==
              4 ) {
            AUTO_MAILER->auto_mail( name,
                this_player()->query_name(), "Bug report", "", bug, 0, 0);
          }
          rm(TEMP_MAIL_LIST);
        }
        i = 1;
	while ( i < file_length( TEMP_FORWARD_LIST ) ) {
          trash = read_file(TEMP_FORWARD_LIST, i++, 1);
          sscanf(trash, "%s %s %s\n", fname, ftime, filename);
          trash = read_file(TEMP_FORWARD_LIST, i++, 1);
          sscanf(trash, ".START %s", ERROR);
          ERROR = ".END " + ERROR;
          TEMP_BODY = read_file(TEMP_FORWARD_LIST, i++, 1);
          sscanf(TEMP_BODY, "%s\n", TEMP_BODY);
          title = read_file(TEMP_FORWARD_LIST, i++, 1);
          filename = read_file(TEMP_FORWARD_LIST, i++, 1);
          ftime = read_file(TEMP_FORWARD_LIST, i++, 1);
          fname = read_file(TEMP_FORWARD_LIST, i++, 1);
          rtime = read_file(TEMP_FORWARD_LIST, i++, 1);
          name = read_file(TEMP_FORWARD_LIST, i++, 1);
          bug = "";
          while((trash = read_file(TEMP_FORWARD_LIST, i++, 1)) != ERROR) {
            bug += trash;
          }
          write_bug_report(TEMP_BODY, title, filename, time()+"\n",
            this_player()->query_name()+"\n", rtime, name, bug, 1);
        }
        rm(TEMP_FORWARD_LIST);
        printf("Done.\n");
      } else if (CHANGED)
        printf( "You don't have write permission to this directory.\n" );
      else
	printf("No changes need saving.\n");
      map_delete(globvars, this_player());
      return 1;
    case "h" :
    case "?" :
      printf("B b - Post the error to board b.\n");
      printf("E   - Edit the file to correct the error.\n");
      printf("E f - Edit file with name f.\n");
      printf("U   - Forward and delete error to unknow list.\n");
      printf("F n - Forward and delete error to creator or directory n.\n");
      printf("D   - Delete bug and mark as fixed.\n");
      printf("D F - same as above.\n");
      printf("D N - Delete bug and mark as not an error.\n");
      printf("D R - Delete bug and reply to sender yourself.\n");
      printf( "      The word $report$ will be replaced by the original\n" );
      printf("      bug report.\n");
      printf("N/+ - Next error.\n");
      printf("P/- - Previous error.\n");
      printf("G   - Goto to error.\n");
      printf("Q   - Quit.\n");
      printf("X   - Save and quit.\n");
      printf("H/? - This help file.\n");
      request();
      return 1;
    default :
      request();
      return 1;
  }
}

void continue_post(string input) {
  if (!input || input == "" || input[0] == 13 || input[0] == 10 ||
      lower_case(input[0..0]) == "n") {
    if (lower_case(input) == "n")
      printf("o.\n");
    else
      printf("No.\n");
    BOARD_HAND->add_message(ED_FILE, 
        (string)this_player()->query_short(),
        "Bug report", get_bug(BUG_NUM));
    printf("Bug posted.\n");
    request();
    return;
  }
  if (lower_case(input[0..0]) != "y") {
    printf("Huh?  Please type y or n: ");
    get_char("continue_post");
    return;
  }
  if (lower_case(input) == "y")
    printf("es.\n");
  else
    printf("Yes.\n");
  printf("Entering editor...\n");
  this_player()->do_edit(get_bug(BUG_NUM), "finish_edit_post");
  return;
}

void finish_edit_post(string post) {
  if (!post || post == "") {
    request();
    return;
  }
  BOARD_HAND->add_message(ED_FILE, 
      (string)this_player()->query_short(),
      "Bug report", post);
  printf("Bug posted.\n");
  request();
  return;
}

void dest_me() {
  destruct(this_object());
}