SYNOPSIS
        #include <struct_info.h>
        #include <lpctypes.h>

        mixed * struct_info (struct st, int what)

DESCRIPTION
        Return information about the structure of struct <st> in an array.
        If <st> has a base struct, <what> determines how the information
        is returned:

        <what> == SINFO_FLAT:
            All members of <st>, including those inherited from the base
            struct, are returned on the top level of the result.
            The base struct is signified by just its name.

        <what> == SINFO_NESTED:
            Only the members defined in <st> itself are returned on
            the top level of the result. The information for the base
            struct is a array by itself, as it would be returned
            by a call to struct_info() for a base struct instance.

        The elements in the resulting array are:

          string [SI_NAME]:        the name of the struct
          string [SI_PROG_NAME]:   the name of program defining the struct
          string [SI_PROG_ID]:     the id of the program defining the struct
          mixed  [SI_BASE]:        0, or the base struct information
          mixed* [SI_MEMBER+0]:    the first member information
          mixed* [SI_MEMBER+n]:    the last member information

        The member information entries are arrays themselves with
        these elements:

          string [SIM_NAME]:  name of the member
          int    [SIM_TYPE]:  the type of the member (compile-time value)
          string [SIM_EXTRA]: 0, or if the member is a struct, the
                              struct name

HISTORY
        Introduced in LDMud 3.3.344.
        LDMud 3.3.417 introduced SI_PROG_NAME and SI_PROG_ID in exchange
          for SI_UNIQUE_NAME.

SEE ALSO
        structs(LPC)
