SYNOPSIS
        object first_inventory()
        object first_inventory(string ob)
        object first_inventory(object ob)

DESCRIPTION
        Get the first object in the inventory of ob, where ob is
        either an object or the file name of an object. If ob is not
        given, the current object is assumed.

EXAMPLES
        This efun is mostly used in the following context:

        for(ob=first_inventory(container);ob;ob=next_inventory(ob)) {
           <some actions>
        }

        If you use such calls frequently then it would be very useful
        to use a preprocessor macro:

        #define FORALL(x, y) for(x=first_inventory(y);x;x=next_inventory(x))

        So the above example could be written like this:

        FORALL(ob, container) {
           <some actions>
        }

        Warning: If the object ob is moved inside <some actions>, then
        next_inventory() will return an object from the new inventory
        of ob. You also shouldn't call next_inventory() on destructed
        objects. So in case of move and/or destruction the following
        is a better solution:

        for(ob=first_inventory(container);ob;) {
           next=next_inventory(ob);
           <some actions and moves and/or removes>
           ob=next;
        }


SEE ALSO
        next_inventory(E), all_inventory(E), environment(E),
        deep_inventory(E)
