Provided by: tcl8.5-doc_8.5.19-1_all bug

NAME

       Tcl_RegisterObjType,  Tcl_GetObjType,  Tcl_AppendAllObjTypes,  Tcl_ConvertToType  - manipulate Tcl object
       types

SYNOPSIS

       #include <tcl.h>

       Tcl_RegisterObjType(typePtr)

       Tcl_ObjType *
       Tcl_GetObjType(typeName)

       int
       Tcl_AppendAllObjTypes(interp, objPtr)

       int
       Tcl_ConvertToType(interp, objPtr, typePtr)

ARGUMENTS

       Tcl_ObjType *typePtr (in)          Points to the structure containing information about  the  Tcl  object
                                          type.   This  storage must live forever, typically by being statically
                                          allocated.

       const char *typeName (in)          The name of a Tcl object type that Tcl_GetObjType should look up.

       Tcl_Interp *interp (in)            Interpreter to use for error reporting.

       Tcl_Obj *objPtr (in)               For Tcl_AppendAllObjTypes, this points to the  object  onto  which  it
                                          appends  the  name  of  each  object  type  as  a  list  element.  For
                                          Tcl_ConvertToType, this points to an object that must  have  been  the
                                          result of a previous call to Tcl_NewObj.
________________________________________________________________________________________________________________

DESCRIPTION

       The  procedures  in  this  man page manage Tcl object types.  They are used to register new object types,
       look up types, and force conversions from one type to another.

       Tcl_RegisterObjType registers a new Tcl object type in the table of all object types that  Tcl_GetObjType
       can  look  up  by  name.  There are other object types supported by Tcl as well, which Tcl chooses not to
       register.  Extensions can likewise choose to register the object types they create or not.  The  argument
       typePtr points to a Tcl_ObjType structure that describes the new type by giving its name and by supplying
       pointers to four procedures that implement the type.  If the type table already contains a type with  the
       same name as in typePtr, it is replaced with the new type.  The Tcl_ObjType structure is described in the
       section THE TCL_OBJTYPE STRUCTURE below.

       Tcl_GetObjType returns a pointer to the registered Tcl_ObjType with name typeName.  It returns NULL if no
       type with that name is registered.

       Tcl_AppendAllObjTypes  appends  the  name  of  each registered object type as a list element onto the Tcl
       object referenced by objPtr.  The return value is TCL_OK unless there was an error converting objPtr to a
       list object; in that case TCL_ERROR is returned.

       Tcl_ConvertToType  converts  an  object  from one type to another if possible.  It creates a new internal
       representation for objPtr appropriate for the  target  type  typePtr  and  sets  its  typePtr  member  as
       determined  by calling the typePtr->setFromAnyProc routine.  Any internal representation for objPtr's old
       type is freed.  If an error occurs during conversion, it returns TCL_ERROR and leaves an error message in
       the result object for interp unless interp is NULL.  Otherwise, it returns TCL_OK.  Passing a NULL interp
       allows this procedure to be used as a test whether the conversion can be done (and in fact was done).     │

       In many cases, the typePtr->setFromAnyProc  routine  will  set  objPtr->typePtr  to  the  argument  value │
       typePtr, but that is no longer guaranteed.  The setFromAnyProc is free to set the internal representation │
       for objPtr to make use of another related Tcl_ObjType, if it sees fit.

THE TCL_OBJTYPE STRUCTURE

       Extension writers can define new object types by defining four procedures and initializing a  Tcl_ObjType
       structure to describe the type.  Extension writers may also pass a pointer to their Tcl_ObjType structure
       to Tcl_RegisterObjType if they wish to permit other extensions to look up their Tcl_ObjType by name  with
       the Tcl_GetObjType routine.  The Tcl_ObjType structure is defined as follows:

              typedef struct Tcl_ObjType {
                  char *name;
                  Tcl_FreeInternalRepProc *freeIntRepProc;
                  Tcl_DupInternalRepProc *dupIntRepProc;
                  Tcl_UpdateStringProc *updateStringProc;
                  Tcl_SetFromAnyProc *setFromAnyProc;
              } Tcl_ObjType;

   THE NAME FIELD
       The  name  member  describes the name of the type, e.g. int.  When a type is registered, this is the name
       used by callers of Tcl_GetObjType to lookup  the  type.   For  unregistered  types,  the  name  field  is
       primarily  of  value  for debugging.  The remaining four members are pointers to procedures called by the
       generic Tcl object code:

   THE SETFROMANYPROC FIELD
       The setFromAnyProc member contains  the  address  of  a  function  called  to  create  a  valid  internal
       representation from an object's string representation.

              typedef int (Tcl_SetFromAnyProc) (Tcl_Interp *interp,
                      Tcl_Obj *objPtr);

       If  an internal representation cannot be created from the string, it returns TCL_ERROR and puts a message
       describing the error in the result object for  interp  unless  interp  is  NULL.   If  setFromAnyProc  is
       successful,  it  stores  the  new  internal  representation, sets objPtr's typePtr member to point to the
       Tcl_ObjType struct corresponding to the new internal representation, and returns TCL_OK.  Before  setting
       the new internal representation, the setFromAnyProc must free any internal representation of objPtr's old
       type; it does this by calling the old type's freeIntRepProc if it is not NULL.

       As an example, the setFromAnyProc for the built-in Tcl list type gets an up-to-date string representation
       for  objPtr by calling Tcl_GetStringFromObj.  It parses the string to verify it is in a valid list format
       and to obtain each element value in the list, and, if this succeeds, stores the list elements in objPtr's
       internal  representation  and  sets  objPtr's  typePtr  member  to  point  to the list type's Tcl_ObjType
       structure.

       Do not release objPtr's old internal representation unless you replace it with a new  one  or  reset  the
       typePtr member to NULL.

       The  setFromAnyProc  member may be set to NULL, if the routines making use of the internal representation
       have no need to derive that internal representation from an arbitrary string  value.   However,  in  this
       case,  passing  a  pointer  to  the  type  to  Tcl_ConvertToType() will lead to a panic, so to avoid this
       possibility, the type should not be registered.

   THE UPDATESTRINGPROC FIELD
       The updateStringProc member contains  the  address  of  a  function  called  to  create  a  valid  string
       representation from an object's internal representation.

              typedef void (Tcl_UpdateStringProc) (Tcl_Obj *objPtr);

       objPtr's  bytes  member  is  always  NULL  when  it  is called.  It must always set bytes non-NULL before
       returning.  We require the string representation's byte array to have a null  after  the  last  byte,  at
       offset length, and to have no null bytes before that; this allows string representations to be treated as
       conventional null character-terminated C strings.  These restrictions  are  easily  met  by  using  Tcl's
       internal  UTF  encoding  for  the  string  representation,  same  as  one would do for other Tcl routines
       accepting string values as arguments.  Storage for the byte array  must  be  allocated  in  the  heap  by
       Tcl_Alloc  or  ckalloc.   Note that updateStringProcs must allocate enough storage for the string's bytes
       and the terminating null byte.

       The updateStringProc for Tcl's built-in double type, for example, calls Tcl_PrintDouble  to  write  to  a
       buffer of size TCL_DOUBLE_SPACE, then allocates and copies the string representation to just enough space
       to hold it.  A pointer to the allocated space is stored in the bytes member.

       The updateStringProc member may be set to NULL, if the routines making use of the internal representation
       are written so that the string representation is never invalidated.  Failure to meet this obligation will
       lead to panics or crashes when  Tcl_GetStringFromObj  or  other  similar  routines  ask  for  the  string
       representation.

   THE DUPINTREPPROC FIELD
       The  dupIntRepProc  member  contains  the address of a function called to copy an internal representation
       from one object to another.

              typedef void (Tcl_DupInternalRepProc) (Tcl_Obj *srcPtr,
                      Tcl_Obj *dupPtr);

       dupPtr's internal representation is made a copy of srcPtr's internal representation.   Before  the  call,
       srcPtr's  internal  representation  is  valid  and dupPtr's is not.  srcPtr's object type determines what
       copying its internal representation means.

       For example, the dupIntRepProc for the Tcl integer type simply copies  an  integer.   The  built-in  list
       type's  dupIntRepProc  uses  a  far  more  sophisticated scheme to continue sharing storage as much as it
       reasonably can.

   THE FREEINTREPPROC FIELD
       The freeIntRepProc member contains the address of a function that is called when an object is freed.

              typedef void (Tcl_FreeInternalRepProc) (Tcl_Obj *objPtr);

       The freeIntRepProc function can deallocate the storage for the object's internal  representation  and  do
       other type-specific processing necessary when an object is freed.

       For  example,  the  list  type's  freeIntRepProc  respects  the storage sharing scheme established by the
       dupIntRepProc so that it only frees storage when the last object sharing it is being freed.

       The freeIntRepProc member can be set to NULL to  indicate  that  the  internal  representation  does  not
       require freeing.  The freeIntRepProc implementation must not access the bytes member of the object, since
       Tcl makes its own internal uses of that  field  during  object  deletion.   The  defined  tasks  for  the
       freeIntRepProc have no need to consult the bytes member.

SEE ALSO

       Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount

KEYWORDS

       internal representation, object, object type, string representation, type conversion