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/
//
//  Basic editor object
//
// Zak, 930129:
//  - if using ed and the file is not modified (i.e, Q pressed, for
//    example), it will abort as the simple editor does when ~q entered
//    (I'm sick of not having an abort in ed when mailing/posting...)
//
// Watcher, 930228
//  - Added ~r, ~w, and ~h commands to the editor and allow '**' as
//    optional edit closer (for those use to the old system)

void display_ed_help();

private static string edit_filename, callback;
private static mixed edit_args;
private static object act_ob;
private static int mtime;

varargs int edit (string fname, string fun, object ob, mixed args) {
   string tmp;
   mixed *stat_buf;

   callback = fun;
   edit_args = args;
   if (!ob) ob = this_player();
   act_ob = ob;
   if(!fname) {
      write("No filename passed to edit.\n");
      return 0;
   }
   tmp = read_file (fname);
   if (!write_file(fname,"")) {
      write("Edit can't write to " + fname +".\n");
      return 0;
   }
   edit_filename = fname;
   if ((string)this_player()->query_env("editor") == "ed") {
      stat_buf = stat( fname, -1 );
      mtime = (int) stat_buf[ 1 ];
      ed (edit_filename, "stop_ed");
      this_player()->set_is_editing(fname + " (Edit object)");
      this_player()->set("buffer_flag", 1);
      return 1;
   }
   write("To end message type \".\". To abort, type ~q. To view help, " +
	 "type ~h.\n");
   write("__________________________________________________________________\n");
   if (tmp) write (tmp);
   this_player()->set("buffer_flag", 1);
   this_player()->set_is_editing(fname + " (Edit object)");
   input_to("lines");
   return 1;
}

static void lines(string str) {
   string file;
 
   if (str == "." || str == "**") {
      this_player()->set_is_editing("");
      if (act_ob && function_exists(callback,act_ob)) {
	call_other(act_ob,callback,edit_args);
      } else write ("Can't find function: "+callback+"\n");
      this_player()->dump_buffer();
      return;
   }
   if (str == "~e") {
      ed(edit_filename,"stop_ed");
      return;
   }
   if (str == "~q") {
      write("Edit aborted.\n");
      this_player()->set_is_editing("");
      if (act_ob && function_exists ("abort",act_ob))
         act_ob->abort();
      this_player()->dump_buffer();
      return;
   }
   if (str == "~p") {
 
	  if(!file_exists(edit_filename) || !read_file(edit_filename)) 
	  write("Buffer empty.\n");
 
	  else write(read_file(edit_filename) + "\n");
 
	  input_to("lines");
	  return;
   }

   if (str == "~r" || str == "~w") {
	write("No filename given.\n");
	input_to("lines");
	return;
   }
 
   if(wizardp(this_object()) && sscanf(str, "~r %s", file) == 1) {
 
   	file = resolv_path("cwd", file);

	if(!file_exists(file)) {
	write("No such file : " + file + "\n");
	input_to("lines");
	return; }
 
	if((int)master()->valid_read(file, this_object()) == 0) {
  	write(file + " : Access denied.\n");
	input_to("lines");
	return; }
 
	write_file(edit_filename, read_file(file));
	write(file + " appended.\n");
	input_to("lines");
	return;

   }
 
   if(wizardp(this_object()) && sscanf(str,"~w %s", file) == 1) {

 	file = resolv_path("cwd", file);
 
	if((int)master()->valid_write(file, this_object()) == 0) {
	write(file + " : Write access denied.\n");
	input_to("lines");
	return; }

	if(file_exists(file))
	  write("Buffer appended to " + file + ".\n");
	else write("Buffer written to " + file + ".\n");
 
	write_file(file, read_file(edit_filename));
	input_to("lines");
	return;
 
   }
 
 
   if(str == "~h" || str == "~help") {
	display_ed_help();
	input_to("lines");
	return;
   }
 
   write_file(edit_filename,str + "\n");
   input_to("lines");
   return;
}

void stop_ed() {
   mixed *statbuf;

   this_player()->set_is_editing("");
   statbuf = stat( edit_filename, -1 );
   if ( !statbuf || mtime == statbuf[ 1] ) {
      write("Edit aborted.\n");
      if (act_ob && function_exists ("abort",act_ob))
         act_ob->abort();
      this_player()->dump_buffer();
      return;
   }
   if (act_ob && function_exists(callback,act_ob))
     call_other(act_ob,callback, edit_args);
   else
     write ("*Error: couldn't find target object when leaving ed.\n");
   this_player()->dump_buffer();
   return;
}

string query_edit_filename() {
   return edit_filename;
}

void set_edit_filename(string str) {
   edit_filename = str;
   return;
}
 
void display_ed_help() {

   write("\nStandard User Editor\n====================\n\n" +
	 "\t~e\t- Enter expanded editor system\n" +
	 "\t~h\t- This editor help display\n" +
	 "\t~p\t- Display contents of editor buffer\n" +
	 "\t~q\t- Abort editor without saving contents\n");
 
   if(wizardp(this_object()))
   write("\n\t~r [file]\t- Read contents of file into editor\n" +
	 "\t~w [file]\t- Write editor buffer to file\n");
 
   write("\n\tExit and save with \".\" or \"**\".\n\n");

return; }