ds2.1.1/bin/
ds2.1.1/extra/wolfpaw/
ds2.1.1/lib/cmds/admins/
ds2.1.1/lib/cmds/common/
ds2.1.1/lib/cmds/creators/include/
ds2.1.1/lib/cmds/creators/include/SCCS/
ds2.1.1/lib/daemon/services/
ds2.1.1/lib/doc/
ds2.1.1/lib/doc/efun/all/
ds2.1.1/lib/doc/efun/arrays/
ds2.1.1/lib/doc/efun/buffers/
ds2.1.1/lib/doc/efun/compile/
ds2.1.1/lib/doc/efun/floats/
ds2.1.1/lib/doc/efun/functions/
ds2.1.1/lib/doc/efun/general/
ds2.1.1/lib/doc/efun/mixed/
ds2.1.1/lib/doc/efun/numbers/
ds2.1.1/lib/doc/efun/parsing/
ds2.1.1/lib/doc/faq/
ds2.1.1/lib/doc/hbook/
ds2.1.1/lib/doc/help/classes/
ds2.1.1/lib/doc/lpc/basic/
ds2.1.1/lib/doc/lpc/concepts/
ds2.1.1/lib/doc/lpc/constructs/
ds2.1.1/lib/doc/lpc/etc/
ds2.1.1/lib/doc/lpc/intermediate/
ds2.1.1/lib/doc/lpc/types/
ds2.1.1/lib/doc/misc/
ds2.1.1/lib/doc/old/
ds2.1.1/lib/domains/Ylsrim/
ds2.1.1/lib/domains/Ylsrim/adm/
ds2.1.1/lib/domains/Ylsrim/armor/
ds2.1.1/lib/domains/Ylsrim/broken/
ds2.1.1/lib/domains/Ylsrim/fish/
ds2.1.1/lib/domains/Ylsrim/meal/
ds2.1.1/lib/domains/Ylsrim/npc/
ds2.1.1/lib/domains/Ylsrim/obj/
ds2.1.1/lib/domains/Ylsrim/virtual/
ds2.1.1/lib/domains/Ylsrim/weapon/
ds2.1.1/lib/domains/campus/adm/
ds2.1.1/lib/domains/campus/etc/
ds2.1.1/lib/domains/campus/meals/
ds2.1.1/lib/domains/campus/npc/
ds2.1.1/lib/domains/campus/txt/ai/charles/
ds2.1.1/lib/domains/campus/txt/ai/charles/bak2/
ds2.1.1/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.1.1/lib/domains/campus/txt/ai/charly/
ds2.1.1/lib/domains/campus/txt/ai/charly/bak/
ds2.1.1/lib/domains/campus/txt/jenny/
ds2.1.1/lib/domains/default/creator/
ds2.1.1/lib/domains/default/doors/
ds2.1.1/lib/domains/default/etc/
ds2.1.1/lib/domains/default/weap/
ds2.1.1/lib/domains/town/doors/
ds2.1.1/lib/domains/town/txt/
ds2.1.1/lib/domains/town/txt/shame/
ds2.1.1/lib/domains/town/virtual/
ds2.1.1/lib/lib/comp/
ds2.1.1/lib/lib/lvs/
ds2.1.1/lib/lib/user/
ds2.1.1/lib/lib/virtual/
ds2.1.1/lib/log/
ds2.1.1/lib/obj/book_source/
ds2.1.1/lib/obj/include/
ds2.1.1/lib/realms/template/
ds2.1.1/lib/realms/template/area/armor/
ds2.1.1/lib/realms/template/area/npc/
ds2.1.1/lib/realms/template/area/obj/
ds2.1.1/lib/realms/template/area/room/
ds2.1.1/lib/realms/template/area/weap/
ds2.1.1/lib/realms/template/bak/
ds2.1.1/lib/realms/template/cmds/
ds2.1.1/lib/save/kills/o/
ds2.1.1/lib/secure/cfg/
ds2.1.1/lib/secure/cfg/classes/
ds2.1.1/lib/secure/cfg/races/SCCS/
ds2.1.1/lib/secure/cmds/creators/include/
ds2.1.1/lib/secure/cmds/players/
ds2.1.1/lib/secure/cmds/players/include/
ds2.1.1/lib/secure/daemon/include/
ds2.1.1/lib/secure/lib/
ds2.1.1/lib/secure/lib/include/
ds2.1.1/lib/secure/lib/net/
ds2.1.1/lib/secure/lib/net/include/
ds2.1.1/lib/secure/lib/std/
ds2.1.1/lib/secure/modules/
ds2.1.1/lib/secure/npc/
ds2.1.1/lib/secure/obj/include/
ds2.1.1/lib/secure/room/
ds2.1.1/lib/secure/save/
ds2.1.1/lib/secure/save/boards/
ds2.1.1/lib/secure/verbs/creators/
ds2.1.1/lib/shadows/
ds2.1.1/lib/spells/
ds2.1.1/lib/verbs/admins/include/
ds2.1.1/lib/verbs/common/
ds2.1.1/lib/verbs/common/include/
ds2.1.1/lib/verbs/creators/
ds2.1.1/lib/verbs/creators/include/
ds2.1.1/lib/verbs/players/include/SCCS/
ds2.1.1/lib/verbs/rooms/
ds2.1.1/lib/verbs/rooms/include/
ds2.1.1/lib/www/errors/
ds2.1.1/lib/www/images/
ds2.1.1/v22.2b14/
ds2.1.1/v22.2b14/ChangeLog.old/
ds2.1.1/v22.2b14/Win32/
ds2.1.1/v22.2b14/compat/
ds2.1.1/v22.2b14/compat/simuls/
ds2.1.1/v22.2b14/include/
ds2.1.1/v22.2b14/testsuite/
ds2.1.1/v22.2b14/testsuite/clone/
ds2.1.1/v22.2b14/testsuite/command/
ds2.1.1/v22.2b14/testsuite/data/
ds2.1.1/v22.2b14/testsuite/etc/
ds2.1.1/v22.2b14/testsuite/include/
ds2.1.1/v22.2b14/testsuite/inherit/
ds2.1.1/v22.2b14/testsuite/inherit/master/
ds2.1.1/v22.2b14/testsuite/log/
ds2.1.1/v22.2b14/testsuite/single/
ds2.1.1/v22.2b14/testsuite/single/tests/compiler/
ds2.1.1/v22.2b14/testsuite/single/tests/efuns/
ds2.1.1/v22.2b14/testsuite/single/tests/operators/
ds2.1.1/v22.2b14/testsuite/u/
ds2.1.1/v22.2b14/tmp/
ds2.1.1/win32/
/*   /secure/sefun/to_object.c
 *   from the Dead Souls.4 Library
 *   recreated by Blitz@Dead Souls
 *
 *   Purpose: Parse passed string argument and
 *            return a matching object pointer
 *            if one is found.
 *
 *   Usage Examples:
 *     sword           (1st sword in inv or env)
 *     sword@here      (find sword in local env)
 *     sword#4         (find 4th sword)
 *     sword#2@foo     (find 2nd sword on player foo)
 *     sword@bag#2@foo (find 1st sword in foo's 2nd bag)
 *     ---------------
 *     /path/filename  (find or load filename)
 *     /path/file#999  (find unique cloned object)
 *     %foo            (explicitly find player foo)
 *     $foo            (explicitly find npc foo)
 *     @foo            (return foo's environment)
 *     
 *     tokens: me, here, sefun
 */

#include <global.h>

object to_object(mixed var) {
    object env, ob, *obs;
    string tmp, where;
    int i, char;

    if( objectp(var) ) return var;
    else if( !stringp(var) || !sizeof(var) ) return 0;
    if( sscanf(var, "%s@%s", tmp, where) == 2 ) {
	var = tmp;
	if( !env = to_object(where) ) return 0;
	if( !sizeof(var) ) return environment(env);
    }
    switch(var) {
    case "here" : return environment(this_player());
    case "me" : return this_player();
    case "sefun" : return find_object(SEFUN);
    }
    if( sscanf(var, "%s#%d", tmp, i) == 2 ) {
	if( ob = find_object(var) ) return ob;
	else var = tmp;
    }
    else i = 1;
    if( i < 1 ) return 0;
    if( member_array(var[0], ({ '/', '$', '%', }) ) > -1 ) {
	char = var[0];
	var = var[1..];
    }
    switch( char ) {
    case '/' :
	if( var[<2..] != ".c" ) var += ".c";
	if( !file_exists(var) ) return 0;
	return load_object(var);
	break;
    case '%' :
	if( !(ob = find_player(var)) ) return 0;
	else return ob;
	break;
    case '$' :
	if( env )  {
	    obs = filter(all_inventory(env),
	      (: living($1) && !interactive($1) && $1->id($(var)) :));
	    if( sizeof(obs) < i ) return 0;
	    else return obs[i - 1];
	}
	if( (ob = find_living(var)) && !interactive(ob) ) return ob;
	else return 0;
	break;
    default:
	if( !env ) {
	    env = this_player();
	}
	if( i > 1 ) {
	    obs = filter(all_inventory(env), (: $1->id($(var)) :));
	    if( sizeof(obs) < i ) {
		if( !env = environment(env) ) {
		    ob = 0;
		}
		else {
		    obs = filter(all_inventory(env), (: $1->id($(var)) :));
		    if( sizeof(obs) < i ) {
			ob = 0;
		    }
		    else {
			ob = obs[i - 1];
		    }
		}
	    }
	    else {
		ob = obs[i-1];
	    }
	    if( ob ) {
		return ob;
	    }
	}
	else {
	    ob = present(var, env);
	    if( ob ) return ob;
	    else if( env = environment(env) ) {
		ob = present(var, env);
		if( ob ) return ob;
	    }
	    if( ob = find_player(var) ) return ob;
	    if( ob = find_living(var) ) return ob;
	    if( !this_player() ) {
		return 0;
	    }
	    var = absolute_path(this_player()->query_cwd(), var);
	    if(!file_exists(var)) var += ".c";
	    if(!file_exists(var)) var = "";
	    if( sizeof(var) && ob = load_object(var) ) {
		return ob;
	    }
	}
	return 0;
    }
    return 0;
}