trusty (3) Tcl_ConvertToType.3tcl.gz

Provided by: tcl8.4-doc_8.4.20-7_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.  The 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  supported  by  Tcl.
       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 Tcl_ObjType with name typeName.  It returns NULL if no type  with
       that name is registered.

       Tcl_AppendAllObjTypes  appends  the  name  of  each  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  to  that
       type.  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).

THE TCL_OBJTYPE STRUCTURE

       Extension writers can define new object types by defining four  procedures,  initializing  a  Tcl_ObjType
       structure to describe the type, and calling Tcl_RegisterObjType.  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 member describes the name of the type, e.g. int.  Extension writers can look up an  object  type
       using  its name with the Tcl_GetObjType procedure.  The remaining four members are pointers to procedures
       called by the generic Tcl object code:

       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 can't 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
       setFromAnyProc's Tcl_ObjType, 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  builtin  Tcl
       integer  type  gets  an  up-to-date string representation for objPtr by calling Tcl_GetStringFromObj.  It
       parses the string to obtain an integer and, if this succeeds, stores the  integer  in  objPtr's  internal
       representation and sets objPtr's typePtr member to point to the integer 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  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; this allows string representations that do  not  contain  null  bytes  to  be  treated  as
       conventional  null  character-terminated  C strings.  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 builtin list type, for example,
       builds an array of strings for each element object and then calls Tcl_Merge to construct  a  string  with
       proper Tcl list structure.  It stores this string as the list object's string representation.

       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 builtin list type's dupIntRepProc allocates a new array that points at the
       original element objects; the elements are shared between the two lists (and their reference  counts  are
       incremented to reflect the new references).

       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, Tcl list objects have  an
       internalRep.otherValuePtr  that  points  to  an  array of pointers to each element in the list.  The list
       type's freeIntRepProc decrements the reference count for each element object  (since  the  list  will  no
       longer  refer  to  those  objects),  then  deallocates  the  storage  for  the  array  of  pointers.  The
       freeIntRepProc member can be set to NULL to indicate that the internal representation  does  not  require
       freeing.

SEE ALSO

       Tcl_NewObj, Tcl_DecrRefCount, Tcl_IncrRefCount

KEYWORDS

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