/* Recursive file finder: * Originally by Svenzer (?) of Newmoon * Modified by Deutha to use call_outs. */ #define COLOUR "%^CYAN%^" inherit OBJECT_OBJ; int count, next_time; string found; int do_findfile(string file, string path); void setup() { set_name( "finder" ); set_short( "file finder" ); add_adjective( "file" ); set_main_plural( "file finders" ); set_long( "This is a creator tool to do a recursive search for a "+ "particular file, or directory, name beginning in the current "+ "directory if no path is provided.\nSyntax: findfile <filename> "+ "[<path>]\n" ); } /* setup() */ void init() { if ( creatorp(TP) ) { add_command("findfile", "<word>", (: do_findfile($4[0], 0) :) ); add_command("findfile", "<word> <word>", (: do_findfile($4[0], $4[1]) :) ); add_command("etc", ""); } } /* init() */ void add_to_found( string another, object finder ) { count++; found += another +"\n"; /* Some check to see if they want to be always told... */ tell_object( finder, COLOUR +"Search: "+ another +"%^RESET%^\n" ); } /* add_to_found() */ void check_for_end( string search, object finder ) { if ( find_call_out( "do_findfile_level" ) > -1 ) return; next_time = 0; if ( !count ) { tell_object( finder, COLOUR +"No incidences of "+ search + " found.%^RESET%^\n" ); return; } tell_object( finder, COLOUR + count +" incidence"+ ( count == 1 ? "" : "s" ) +" of "+ search +" found.%^RESET%^\n" ); finder->more_string( found, search ); } /* check_for_end() */ void do_findfile_level( string search, string path, object finder ) { int i; string *dir; if ( !finder ) { next_time = 0; return; } dir = get_dir( path + search ); for ( i = 0; i < sizeof( dir ); i++ ) add_to_found( path + dir[ i ], finder ); dir = get_dir( path ); for ( i = 0; i < sizeof( dir ); i++ ) if ( file_size( path + dir[ i ] ) == -2 ) { if ( next_time < time() ) next_time = time() + 1; else next_time++; call_out( "do_findfile_level", next_time - time(), search, path + dir[ i ] +"/", finder ); } remove_call_out( "check_for_end" ); call_out( "check_for_end", next_time - time() + 1, search, finder ); } /* do_findfile_level() */ int do_findfile( string file, string path ) { if ( next_time ) { notify_fail( "There is a search already in progress; estimated "+ "time of completion is "+ ctime( next_time ) +".\n" ); return 0; } if (!path) path = (string)this_player()->query_current_path(); if ( path[ 0 .. 0 ] != "/" ) path = "/" + path; if ( path[ strlen( path ) - 1 ] != '/' ) path += "/"; write( COLOUR +"Searching for "+ file +" in "+ path +"...%^RESET%^\n" ); count = 0; next_time = time() + 1; found = ""; call_out( "do_findfile_level", 1, file, path, this_player() ); return 1; } /* do_findfile() */ int do_etc() { if ( !next_time ) write( "There is no search in progress.\n" ); else write( "Estimated time of completion is "+ ctime( next_time ) +".\n" ); return 1; } /* do_etc() */