// /bin/system/_grep.c
// from the Dead Souls Mudlib
// searches for an expression in files
// created by Descartes of Borg 930822
#include <lib.h>
inherit LIB_DAEMON;
int cmd(string str) {
mapping borg;
string *lines, *files;
string output, exp, file, tmp, txt;
int i, max;
notify_fail("Correct syntax: <grep '[pattern]' [file] (> [output])>\n");
if(!str) return 0;
if(sscanf(str, "%s > %s", tmp, output) == 2) {
if(output[0] != '/')
output = (string)previous_object()->get_path()+"/"+output;
str = tmp;
}
else output = 0;
if(sscanf(str, "'%s' %s", exp, file) != 2 &&
sscanf(str, "%s %s", exp, file) != 2) return 0;
if(!(max = sizeof(files = (string *)previous_object()->wild_card(file)))) {
message("system", "File not found.", this_player());
return 1;
}
for(i=0, borg = ([]); i<max; i++) {
if(!(txt = read_file(files[i]))) continue;
borg[files[i]] = regexp(explode(txt, "\n"), exp);
if(!sizeof(borg[files[i]])) map_delete(borg, files[i]);
}
if(!(max = sizeof(files = keys(borg)))) str = "No matches found.\n";
else {
for(i=0, str = ""; i<max; i++)
str += sprintf("%s:\n%s\n\n", files[i], implode(borg[files[i]],"\n"));
}
if(output) {
if(!write_file(output, str))
message("system", "Failed to write to: "+output, this_player());
else message("system", "Grep sent to: "+output, this_player());
}
else message("Nsystem", str, this_player());
return 1;
}
void help() {
message("help",
"Syntax: <grep '[pattern]' [file] (> [redirect])>\n\n"
"Searches a file or group of files for a specific pattern. "
"If the pattern is a single word, then no '' is needed. Patterns "
"of more than one word however, need to be enclosed in ''. "
"You may redirect the output of the grep to to a file using the >."
"\n\nSee also: cd, ls, mv, pwd, rm", this_player()
);
}