// File : /cmds/std/_history.c
// Creator : Probably Wayfarer
//
// This command displays the list of the user's past commands
// stored in the history stack.
#include <mudlib.h>
inherit DAEMON;
#define log( x ) log_file( "hist_err",wrap( x ) )
string help();
string *helptext;
void create() {
::create();
helptext = ({
"\n",
"History",
"-------",
"Command line history very similar to such Un*x shells as csh.",
"There are several types of history access and these are listed below:",
"",
" !<command number>\t : This will do the command <command number>.",
" !<string pattern>\t : This will match the most recent command which",
"\t\t\t starts with <string pattern>.",
" !!\t\t\t : This will repeat the last command.",
" !!<args>\t\t : This will append <args> to the last command,",
"\t\t\t and execute it.",
" ^^<args>\t\t : This will prepend <args> to the last command,",
"\t\t\t and execute it.",
" ^<pattern 1>^<pattern 2> : This will substitute <pattern 1> in the last",
"\t\t\t command with <pattern 2>, and execute it.",
"",
"EXAMPLES:",
"(Sample history list. Typing 'history' will show you your list!)",
" 7 grovel",
" 8 kill orc",
" 9 knock on east door",
" 10 bounce",
" 11 look",
"",
"!7\t - will cause you to \"grovel\"",
"!-2\t - will cause you to \"bounce\"",
"!k\t - will cause you to \"knock on east door\"",
"!ki\t - will cause you to \"kill orc\"",
"!!\t - will cause you to \"look\"",
"!! board - will cause you to \"look board\"",
"^^help - will cause you to \"help look\" (note the space in \"^^help \")",
"^ook^s - will cause you to \"ls\""
});
}
int cmd_history(string str) {
int i, tptr;
int max, cmd_num, ptr;
string *history_queue;
object act_ob;
if( adminp(geteuid( previous_object() )) &&
str && sscanf( str, "-u %s", str ) ) {
act_ob = find_player(str);
if (!act_ob) {
write("History: user not found.\n");
return 1;
}
} else {
act_ob = previous_object();
}
if ((int)act_ob->query_npc())
return 0;
max = (int)act_ob->query_max();
cmd_num = (int)act_ob->query_cmd_num();
ptr = (int)act_ob->query_ptr();
history_queue = (string *)act_ob->query_history();
if (!history_queue || !pointerp(history_queue)) {
write("History seems to be broken. Please inform an Admin.\n");
return 1;
}
tptr = ptr;
for (i = max - 1; i >= 0; i--) {
if (history_queue[tptr])
printf("%4d %s\n", cmd_num - i, history_queue[tptr]);
tptr++;
if (tptr == max)
tptr = 0;
}
return 1;
}
string help() {
string tmp;
if (adminp(geteuid(this_player()))) {
tmp = "Syntax: history [-u user]\n"+implode(helptext, "\n");
} else {
tmp = "Syntax: history\n"+implode(helptext, "\n");
return tmp;
}
}