SYNOPSIS
        #include <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_program() 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.


BEISPIELE
        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" })

GESCHICHTE
        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)
