/*
// File : cmd_d.c
// Purpose : This file acts as an Application Program Interface for
// command parsing. It maintains a table of all available
// commands and adds new elements when necessary.
// 92-02-25 : Written by Buddha@TMI based on the old cmd_d.c, by Sulam@TMI,
// which did not deal with multiple "bin" directories.
// This file is part of the TMI-2 mudlib distribution.
// Please retain this header if you use any of this code.
// 92-03-08 : Truilkan@TMI added the ADM_CMDS dir
// 93-02-05 : Pallando@TMI-2 added the REF_CMDS and WIZF_CMDS dirs
// 93-07-22 : Pallando@TMI-2 added the WIZX_CMDS dir
// 93-08-25 : Pallando@TMI-2 changed REF_CMDS to OBJ_CMDS
// I thought the point of defines was not having to change them? 8-)
// 93-10-02 : Pallando@Rift improved the efficiency of rehash()
*/
#include <uid.h>
#include <config.h>
mapping cmd_table;
void create();
int rehash(string path);
string find_cmd(string cmd, string *path);
void create() {
seteuid(ROOT_UID);
cmd_table = ([ ]);
rehash(USER_CMDS);
rehash(WIZ_CMDS);
rehash(ADM_CMDS);
rehash(WIZX_CMDS);
rehash(WIZF_CMDS);
rehash(OBJ_CMDS);
}
// Function: find_cmd
// Purpose: looks up the command entered in the mapping, and loads the
// entry for its directory if not loaded.
// Arguements: the command typed, and the path to be searched for it
// Returns: the full path (minus the .c) for the command.
// Other: may cause errors if there are files other than "bin" files
// in the directory. This should be tested.
string find_cmd(string cmd, string *path) {
int i;
for (i=0;i<sizeof(path);i++) {
/* first check for invalid path */
if(!cmd_table[path[i]] && !rehash(path[i])) continue;
/* then see if the command is there */
if(member_array(cmd, cmd_table[path[i]]) > -1)
return path[i] + "/_" + cmd;
}
return 0;
}
// Function: rehash
// Purpose: updates the mapping for the directory specified, when
// new commands are added or old ones are removed.
// Arguements: the path of the directory to be updated
// Returns: 1 if success, 0 if there is no such directory
// Other: There should a function to update all the directories
// stored. Perhaps this file should save itself and restore
// itself so as to further minimize disk usage.
int rehash(string path) {
string *bin_ls, *result, tmp;
int i, s;
if(!stringp(path)) { write("Badness! Invalid path!\n"); return 0; }
if(file_size(path) != -2) return 0;
bin_ls = get_dir(path + "/");
s = sizeof( bin_ls );
result = allocate( s );
for( i = 0 ; i < s ; i++ ) {
if(sscanf(bin_ls[i], "_%s.c", tmp) == 1)
result[i] = tmp;
}
result -= ({ 0 });
cmd_table[path] = result;
return 1;
}
string *list_cmds(string path) {
if (!cmd_table[path]) rehash(path);
return cmd_table[path];
}
void qq() {
save_object("/tmp/cmd_d");
}
/* I don't think the printing of a table should be done by the daemon,
but since it's older than I am, I'll leave it that way. */
string show_cmds(string arg) {
string *tt;
int i;
int c;
string *ttt;
int j;
string * output;
string line;
output = ({});
tt=keys(cmd_table);
for (i=0;i<sizeof(tt);i++) {
output += ({"COMMAND PATH: "+tt[i]});
c=0;
line = "";
ttt=cmd_table[tt[i]];
for (j=0;j<sizeof(ttt);j++)
{
if (!(c%4))
{
output += ({line});
line = "";
}
c++;
line += sprintf("%-19s",ttt[j]);
}
output += ({line,""});
}
this_player()->more( output );
return "Ok.\n";
}