/* Finds a filename, given a starting path. */
#include <standard.h>
#include <cmd.h>
inherit CMD_BASE;
void setup()
{
position = 1;
}
string query_usage() {
return "findfile [<path>] <filename>\n";
}
string query_short_help() {
return "Find a file in the mud's filesystem.\n"
"examples:\n"
" findfile narg.c -- it will look for narg.c "
"starting with /\n"
" findfile /w/hamlet narg.c -- look for narg.c starting "
"with /w/hamlet\n";
}
static int cmd(string str, object me) {
string *args;
string *files;
string path;
string fname;
string *match;
string *tmp;
int i = 0,j = 0;
int MATCHED;
int stopper = 0;
notify_fail("usage: findfile [<path>] <filename\n");
if(!str)
return 0;
args = explode(str," ");
if(sizeof(args) == 1) {
path = "/";
fname = args[0];
}
else {
path = args[0];
if(path[strlen(path)-1..strlen(path)-1] != "/")
path += "/";
fname = args[1];
}
files = me->get_files(path);
if(!sizeof(files)) {
tell_object(me, "findfile: that path was invalid.\n");
me->set_trivial_action();
return 1;
}
while(1) {
if(sizeof(match = regexp(files[i..sizeof(files)-1],fname))) {
MATCHED = 1;
for(j=0; j<sizeof(match); j++)
tell_object(me, match[j]+"\n");
}
if(i==sizeof(files))
break;
stopper = sizeof(files);
for(;i<stopper;i++) {
if(file_size(files[i]) != -2)
continue;
if(files[i][strlen(files[i])-1..strlen(files[i])-1] != "/")
tmp = get_dir(files[i]+"/");
else
tmp = get_dir(files[i]);
for(j=0;j<sizeof(tmp);j++)
if(files[i] == "/")
files += ({ "/" + tmp[j] });
else
files += ({ files[i] + "/" + tmp[j] });
}
if(sizeof(files) > stopper) {
files = files[stopper..sizeof(files)];
i = 0;
}
}
if(!MATCHED)
tell_object(me,"No matches found.\n");
me->set_trivial_action();
return 1;
}