SYNOPSIS
        #include <sys/inherit_list.h>

        string *inherit_list();
        string *inherit_list(object ob);
        string *inherit_list(object ob, int flags);

BESCHREIBUNG
        Liefert die Namen von allen Dateien, die von <ob> geerbt werden,
        inklusive <ob>s eigener Dateiname. Wird <ob> nicht angegeben, wird
        standarndmaessig das aktuelle Objekt verwendet.

        Der Wert von <flags> bestimmt die Struktur des Rueckgabewertes:
          - <flag> = INHLIST_FLAT (0, default):
            inherit_list() liefert ein Array von Dateinamen, beginnend mit dem
            Namen von <ob> selbst, gefolgt von den Namen aller geerbten
            Objekten.
          - <flag> = INHLIST_TREE (1):
            inherit_list() liefert ein Array von Dateinamen, beginnend mit dem
            Namen von <ob> selbst. Wenn ein geerbte File selbst keine Files
            erbt, wird sein Name direkt in das Ergebnis eingetragen. Wenn ein
            geerbtes File selbst Files erbt, wird ein Untervektor erzeugt, in
            dem die Inherits eingetragen werden. Der Untervektor hat die
            gleiche Struktur wie der Haupvektor.
          - <flag> = INHLIST_TAG_VIRTUAL (2):
            Alle Namen im Ergebnisvektor haben ein leeres Tag "  " (zwei
            Leerschlaege) fuer normale Inherits und "v " fuer virtuelle
            Inherits als Praefix vorangestellt.

        Alle Flags koennen mit einem binaeren Oder | verbunden werden, wobei
        INHLIST_FLAT und INHLIST_TREE sich gegenseitig ausschliessen.

        Wenn ein Objekt, inklusive <ob>, einem replace_programm() unterworfen
        war, spiegeln die gelieferten Dateinamen das effektiv aktive Programm
        wider.

        Die Inheritpfade, die geliefert werden, beginnen immer mit '/'
        (absolute Pfade), auch wenn der Treiber im COMPAT Modus laeuft.

BEISPIEL
        Gegeben folgende Vererbungsstruktur:

            / c - d
          a
            \ b

        Wobei d virtuell geerbt wird, ergeben sich folgende Resultate:

            inherit_list(a) -> ({ "a", "c", "b", "d" })
            inherit_list(c) -> ({ "c", "d" })
            inherit_list(a, 1) -> ({ "a", ({ "c", "d" }), "b" })
            inherit_list(a, 3) -> ({ "  a", ({ " c", "v d" }), "  b" })

AENDERUNGEN
        Vor 3.2.8, begannen die gelieferten Namen niemals mit einem '/'.
        LDMud 3.2.9 fuehrte die Baumstruktur (_TREE) und Tags fuer virtuelle
            Inherits ("v ") ein.

SIEHE AUCH
        debug_info(E), include_list(E)
