DEPRECATED
SYNOPSIS
        #include <objectinfo.h>

        mixed * object_info(object ob, int what)
        mixed * object_info(object ob, int what, int index)

DESCRIPTION
        Returns some internal information about object <ob>, collected
        in an array. Argument <what> determines which information is
        returned.

        The result is usually an array. However, if <index> is specified,
        the result is the value from position <index> of the array which
        would have been returned normally.

        The possible values of <what>, and the indices of the returned
        arrays are defined in the include file <objectinfo.h>, and may
        change in future versions of the driver!


        <what> == OINFO_BASIC:

          This call returns basic information about <ob>:

          int [OIB_HEART_BEAT]:       1 if <ob> has a heart_beat, 0 else.
          int [OIB_IS_WIZARD]:        1 if <ob> has the wizard flag set,
                                        0 else.
            This entry is always 0 when set_is_wizard() is not available.
          int [OIB_ENABLE_COMMANDS]:  1 if <ob> can give commands, 0 else.
          int [OIB_CLONE]:            1 if <ob> is a clone, 0 else.
          int [OIB_DESTRUCTED]:       1 if <ob> is destructed, 0 else.
          int [OIB_SWAPPED]:          1 if <ob> is swapped, 0 else.
          int [OIB_ONCE_INTERACTIVE]: 1 if <ob> was once interactive, 0 else.
          int [OIB_RESET_STATE]:      1 if <ob> is (still) reset, 0 else.
          int [OIB_WILL_CLEAN_UP]:    1 if <ob> will call clean_up(), 0 else.
          int [OIB_LAMBDA_REFERENCED]: 1 if <ob> has lambdas, 0 else.
          int [OIB_SHADOW]:           1 if <ob> has a shadow structure tied
                                        to it, 0 if not.
          int [OIB_REPLACED]:         1 if the program for <ob> was replaced,
                                      0 else.
          int [OIB_NEXT_RESET]:   time of the next reset
          int [OIB_TIME_OF_REF]:  time of the last call to <ob>
          int [OIB_NEXT_CLEANUP]: time of the next data cleanup
          int [OIB_REF]:          number of references to <ob>
          int [OIB_GIGATICKS] and [OIB_TICKS]: together, these numbers
            give the accumulated evaluation cost spend in <ob>
          int [OIB_SWAP_NUM]:     the swap number for <ob>s program,
                                  or -1 if not swapped.
          int [OIB_PROG_SWAPPED]: 1 if <ob>'s program is swapped, 0 else.
          int [OIB_VAR_SWAPPED]:  1 if <ob>'s variables are swapped, 0 else.
          int [OIB_NAME]:         <ob>'s object name.
          int [OIB_LOAD_NAME]:    <ob>'s load name.
          object [OIB_NEXT_ALL]:  next object in the object list.
          object [OIB_PREV_ALL]:  previous object in the object list.


        <what> == OINFO_POSITION:

          This call returns information about <ob>'s position in the
          global list of objects:

          object [OIP_NEXT]: next object in the object list.
          object [OIP_PREV]: previous object in the object list.
          int    [OIP_POS]:  position of <ob> in list, counting from 0 up.

          This call can be expensive in computing time.


        <what> == OINFO_MEMORY:

          This call returns information about the program <ob> uses:

          int    [OIM_REF]:            number of references to the program.
          string [OIM_NAME]:           name of program.
          int    [OIM_PROG_SIZE]:      size of the program.
          int    [OIM_NUM_FUNCTIONS]:  number of functions in the program.
          int    [OIM_SIZE_FUNCTIONS]: size needed for the function structs.
          int    [OIM_NUM_VARIABLES]:  number of variables in the program.
          int    [OIM_SIZE_VARIABLES]: size needed for the variable structs.
          int    [OIM_NUM_STRINGS]:    number of strings in the program.
          int    [OIM_SIZE_STRINGS]:   size needed for the string pointers.
          int    [OIM_SIZE_STRINGS_DATA]: size needed for the string data,
                                       scaled down according to the extend of
                                       data sharing.
          int    [OIM_SIZE_STRINGS_TOTAL]: unmodified size needed for the
                                       string data.
          int    [OIM_NUM_INCLUDES]:   number of included files in the program.
          int    [OIM_NUM_INHERITED]:  number of inherited programs.
          int    [OIM_SIZE_INHERITED]: size needed for the inherit structs.
          int    [OIM_TOTAL_SIZE]:     total size of the program.
          int    [OIM_DATA_SIZE]:      total size of the values held in the
                                       object's variables, scaled down
                                       according to the extend of data
                                       sharing.
          int    [OIM_DATA_SIZE_TOTAL]: unmodified total size of the values
                                       held in the object's variables
          int    [OIM_NO_INHERIT]:     1 if the program can't be inherited.
          int    [OIM_NO_CLONE]:       1 if the program/blueprint can't be
                                       cloned.
          int    [OIM_NO_SHADOW]:      1 if the program's functions can't be
                                       shadowed.
          int    [OIM_SHARE_VARIABLES]:  1 if clones of this program share
                                       their initial variable values with
                                       the blueprint.

          This call swaps in the program if necessary.
          Note that the OIM_SIZE_xxx entries only give the size spent on
          the structures and pointers, not the size of the variable data,
          function code, and strings themselves.

HISTORY
        Introduced in LDMud 3.2.6.
        Changes in LDMud 3.2.7:
          - new basic result OIB_REPLACED.
          - basic result OIB_IS_WIZARD is always 0 if set_is_wizard()
              is not available.
          - basic result OIB_APPROVED is gone.
        LDMud 3.2.8 added OIM_DATA_SIZE to the result of OINFO_MEMORY.
        LDMud 3.2.9 added the index mechanism, OIM_NUM_INCLUDES,
          OIM_NO_INHERIT, OIM_NO_SHADOW, OIM_NO_CLONE, OIM_SIZE_STRINGS_DATA,
          OIM_SIZE_STRINGS_TOTAL, and OIM_DATA_SIZE_TOTAL to the result
          of OINFO_MEMORY.
        LDMud 3.3.378 added the OIM_SHARE_VARIABLES to the result
          of OINFO_MEMORY.
        LDMud 3.3.654 added the OIB_NEXT_CLEANUP to the result of OINFO_BASIC.

SEE ALSO
        debug_info(E)
