SYNOPSIS
        string load_name()
        string load_name(object obj)
        string load_name(lwobject obj)
        string load_name(string obj)

DESCRIPTION
        Return the load name for the object <obj> which may be a regular
        or lightweight object or the name of an object.

        If <obj> is a clone or a lightweight object, return the
        load_name() of <obj>'s blueprint.
        If <obj> is a blueprint, return the filename from which the
        blueprint was compiled.

        If <obj> is given by name but not/no longer existing, the
        function synthesizes the load name as it should be and returns
        that. If the given name is illegal, the function returns 0.

        As a special case, if <ob> is 0, the function returns 0.

        For virtual objects this efun returns the original load_name of the
        object created by the virtual compiler.

        If <obj> is omitted, the name for the current object is returned.

        In contrast to the object_name(), the load name can not be changed
        by with rename_object() or a VC. However, if an object uses 
        replace_program() the load name no longer reflects the actual 
        behaviour of an object.

        The returned name starts with a '/', unless the driver is running
        in COMPAT mode.

EXAMPLES
        object o;
        o = clone_object("/std/thing");
        write(load_name(o));  --> writes "/std/thing" in !compat mode
                                     and "std/thing"  in compat mode
        write(load_name("/std/thing"));  --> same as above
        write(load_name("/std/thing#4n5")); --> writes 0

HISTORY
        Introduced in LDMud 3.2.6.
        Strings are accepted as arguments since 3.2.8.
        0 is accepted as argument since 3.2.9.

SEE ALSO
        clone_object(E), clonep(E), object_name(E), load_object(E),
        replace_program(E), program_name(E), present_clone(E)
