object_info()
*************


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)
