//
// 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; }