parent $db object $registry var $root dbref 'registry var $root child_index 0 var $root fertile 0 var $root manager $registry var $root owned [$registry] var $root owners [$core] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $db database #[] var $root inited 1 var $registry stripped_characters "" var $registry min_char_len 0 var $registry max_char_len 0 var $registry max_word_len 0 var $registry reserved_names [] var $registry invalid_names [] method init_registry .perms(caller(), $root); .set_trusted(1); . method uninit_registry .perms(caller(), $root); reserved_names = 0; invalid_names = 0; trusted = 0; stripped_characters = 0; . method set_max_word_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); max_word_len = value; . method set_max_char_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); max_char_len = value; . method set_min_char_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); min_char_len = value; . method set_stripped_characters arg string; .perms(sender(), 'manager); if (type(string) != 'string) throw(~type, "Value is not a string."); stripped_characters = string; . method insert arg name, obj; // registers obj with obj.name // .perms(caller(), 'trusts); if (stripped_characters) name = $string.strip(name, stripped_characters); (> pass(name, obj) <); . method remove arg name; // removes the object from the database. // THIS: is what is broken with guests, should fix it. // .perms(caller(), 'trusts); if (stripped_characters) name = $string.strip(name, stripped_characters); (> pass(name) <); . method database if (!('parameters in (.is_readable_by(sender())))) throw(~perm, "Database is not readable by sender."); return (> pass() <); . method exact_match arg name; // returns a direct match of the name (if there is one) if (!('parameters in (.is_readable_by(sender())))) throw(~perm, "Database is not readable by sender."); if (stripped_characters) name = $string.strip(name, stripped_characters); return (> pass(name) <); . method valid_name arg name; var word, sname; // returns 1 if the name is valid /// if (!('parameters in .is_readable_by(sender()))) // throw(~perm, "Database is not readable by sender."); (> .perms(caller(), 'trusts) <); // check name itself first sname = name; if (stripped_characters) sname = $string.strip(name, stripped_characters); if (max_word_len && (listlen(explode(name)) > max_word_len)) throw(~invname, ("Names can only be " + tostr(max_word_len)) + " words long."); if (min_char_len && (strlen(sname) < min_char_len)) throw(~invname, ("Names must have at least " + tostr(min_char_len)) + " alpha-numeric characters in them"); if (max_char_len && (strlen(name) > max_char_len)) throw(~invname, ("Names can only be " + tostr(max_char_len)) + " characters long."); // see if it already exists if ((| .exact_match(name) |)) { if (!(((.database())[sname]) == sender())) throw(~invname, "Name already exists."); } // check reserved and invalid names for word in (explode(name)) { if (reserved_names && (word in reserved_names)) throw(~invname, ("`" + word) + "' is a reserved name."); if (invalid_names) { for word in (invalid_names) { if (match_pattern(("*" + word) + "*", name)) throw(~invname, ("`" + word) + "' is not allowed as part of a name."); } } } . method match_begin arg name; var matches, obj; // returns a direct match, or partial matches if (stripped_characters) name = $string.strip(name, stripped_characters); return (> pass(name) <); . method stripped_characters return stripped_characters; . method key_changed arg old_name, new_name; // adjusts the database for the new name .perms(caller(), 'trusts); if (stripped_characters) { old_name = $string.strip(old_name, stripped_characters); new_name = $string.strip(new_name, stripped_characters); } (> pass(old_name, new_name) <); . method find arg name; var tmp; if (.stripped_characters()) name = $string.strip(name, .stripped_characters()); if (!name) throw(~namenf, "No matches found."); tmp = (| .exact_match(name) |); if (tmp) return tmp; catch any { tmp = (> .match_begin(name) <); } with handler { switch (error()) { case ~ambig: rethrow(error()); default: throw(~namenf, "No matches found."); } } return tmp; .