Provided by: tcl8.5-doc_8.5.19-4_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