/* -*- LPC -*- */
/*
* $Locker: $
* $Id: ed.c,v 1.7 2000/07/17 02:58:13 presto Exp $
* $Log: ed.c,v $
* Revision 1.7 2000/07/17 02:58:13 presto
* Fix up str arg passed to do_edit when using "magic"
*
* Revision 1.6 1998/10/02 01:21:15 presto
* changed so that "ed bing" doesn't try to open a file named " bing"
*
* Revision 1.5 1998/03/25 16:01:58 turrican
* Moved from /cmds/creator
*
* Revision 1.4 1998/01/19 00:04:06 presto
* Put it back the way it was
*
* Revision 1.1 1998/01/06 05:25:41 ceres
* Initial revision
*
*/
/* ed command, trial out by Turrican for a commands daemon. */
#include <creator.h>
inherit "/cmds/base";
object *people = ({ });
mixed cmd(string str) {
string *filenames, spam;
object *things;
people += ({ this_player() });
if ( this_player()->query_editor() == "magic" ) {
// set str to " " so that 'ed' with no argument gives you the correct
// command set
if ( !str ) str = " ";
this_player()->do_edit( 0, "fini_editor", 0, str );
return 1;
}
if (!str) {
this_player()->set_in_editor("(hidden)");
ed("frog", "fini_editor");
return 1;
}
/* dodgy idea, but allows 'ed here' or 'ed strawberry' */
if (sizeof(things = WIZ_PRESENT->wiz_present(str, this_player()))) {
spam = file_name(things[0]);
sscanf(spam, "%s#%*d", spam);
if (file_size(spam) < 0)
filenames = ({ spam+".c" });
else
filenames = ({ spam });
} else
filenames = this_player()->get_files(str);
if (!sizeof(filenames)) {
str = this_player()->get_path(str);
} else {
if (sizeof(filenames) > 0) {
str = filenames[0];
if (sizeof(filenames) > 1) {
int loop;
loop = 0;
while(loop < sizeof(filenames) && file_size(filenames[loop]) < 0)
loop++;
if(loop >= sizeof(filenames)) {
printf("No such file.\n");
people -= ({ this_player() });
return 0;
}
else {
str = filenames[loop];
}
printf("Ambiguous, using : %s\n", str);
}
}
}
if (file_size(str) == -2) {
printf("directory\n");
people -= ({ this_player() });
return 0;
}
this_player()->set_in_editor(str);
printf("Editing: %s ", str);
if (!master()->valid_write(str, geteuid(), "frog"))
printf("[read only]\n");
else
printf("\n");
ed(str, "fini_editor");
return 1;
}
void fini_editor() {
if (objectp(this_player())) {
people -= ({ this_player() });
this_player()->set_in_editor(0);
}
} /* fini_editor() */
int clean_up() {
people -= ({ 0 });
if ( !sizeof( people ) ) {
::clean_up();
}
return 1;
}
void reset() {
people -= ({ 0 });
if ( !sizeof( people ) ) {
::reset();
}
return;
}