/*
// autoload.c: adapted from 2.4.5 code by Truilkan@TMI
// inherited by /std/user.c
//
// This version stores the filenames to be autoloaded in an array
// named auto_load.
// (2-10-92) A potential problem caused by objects using the old
// style query_auto_load() { return 1; } fixed by Buddha
*/
 
#include <uid.h>
private mixed *auto_load;
/*
// load_autoload_obj: clones each object in the auto_load array into
// the player's inventory at login time.  Sends any stored data to
// the init_arg method
*/
void load_autoload_obj()
{
	string file;
	mixed item, argument;
	object ob;
	int j, limit;
  
	limit = (auto_load) ? sizeof(auto_load) : 0;
	for (j = 0; j < limit; j++) {
		item = auto_load[j];
		argument = 0;
		if (stringp(item))
			sscanf(item, "%s:%s", file, argument);
		else if (pointerp(item) && (sizeof(item) == 2)) {
			file = (string)item[0];
			argument = (mixed *)item[1];
		}
		else
			continue;
		if (file) {
                      if (file_size(file + ".c") <= 0 ||
                            catch(call_other(file, "?")) ||
                            catch(ob=clone_object(file))) {
				ob = 0;
				write("Unable to autoload: " + file + "\n");
			}
			if (ob) {
				if (argument)
					call_other(ob, "init_arg", argument);
				ob->move(this_object());
			}
		}
	}
}
/*
   compute_autoload_array: this method is called by ./save.c prior to each
   time the player is saved.
*/
void compute_autoload_array()
{
	object *inv, ob;
	mixed item;
	int j, ok;
   
	auto_load = ({});
	inv = all_inventory(this_object());
	for (j = 0; j < sizeof(inv); j++) {
		ob = inv[j];
		item = (mixed)call_other(ob, "query_auto_load");
		ok = 0;
		if (pointerp(item)) {
			if ((sizeof(item) == 2) && stringp(item[0]))
				ok = 1;
		}
		else if (stringp(item))
			ok = 1;
		if (!ok && item) {
			sscanf(file_name(ob), "%s#%*d", item);
			item += ":";
		}
		if (item)
			auto_load += ({ item });
   }
}
/* destroy_autoload_obj: this is called at logout time */
void destroy_autoload_obj()
{
	object *inv;
	int j;
   
	inv = all_inventory(this_object());
	for (j = 0; j < sizeof(inv); j++)
		if (inv[j]->query_auto_load())
			inv[j]->remove();
}
 
mixed *query_autoload_array() {
   if(!adminp(geteuid(previous_object())) &&
      geteuid(previous_object()) != ROOT_UID)  return 0;
return auto_load;  }