Provided by: tcl8.4-doc_8.4.20-7_all bug

NAME

       Tcl_OpenFileChannel,  Tcl_OpenCommandChannel,  Tcl_MakeFileChannel,  Tcl_GetChannel, Tcl_GetChannelNames,
       Tcl_GetChannelNamesEx,       Tcl_RegisterChannel,        Tcl_UnregisterChannel,        Tcl_DetachChannel,
       Tcl_IsStandardChannel,   Tcl_Close,   Tcl_ReadChars,   Tcl_Read,   Tcl_GetsObj,  Tcl_Gets,  Tcl_WriteObj,
       Tcl_WriteChars, Tcl_Write, Tcl_Flush,  Tcl_Seek,  Tcl_Tell,  Tcl_GetChannelOption,  Tcl_SetChannelOption,
       Tcl_Eof, Tcl_InputBlocked, Tcl_InputBuffered, Tcl_OutputBuffered, Tcl_Ungets, Tcl_ReadRaw, Tcl_WriteRaw -
       buffered I/O facilities using channels

SYNOPSIS

       #include <tcl.h>

       Tcl_Channel
       Tcl_OpenFileChannel(interp, fileName, mode, permissions)

       Tcl_Channel
       Tcl_OpenCommandChannel(interp, argc, argv, flags)

       Tcl_Channel
       Tcl_MakeFileChannel(handle, readOrWrite)

       Tcl_Channel
       Tcl_GetChannel(interp, channelName, modePtr)

       int                                                                                                       │
       Tcl_GetChannelNames(interp)                                                                               │

       int                                                                                                       │
       Tcl_GetChannelNamesEx(interp, pattern)                                                                    │

       void
       Tcl_RegisterChannel(interp, channel)

       int
       Tcl_UnregisterChannel(interp, channel)

       int
       Tcl_DetachChannel(interp, channel)

       int
       Tcl_IsStandardChannel(channel)

       int
       Tcl_Close(interp, channel)

       int                                                                                                       │
       Tcl_ReadChars(channel, readObjPtr, charsToRead, appendFlag)                                               │

       int                                                                                                       │
       Tcl_Read(channel, readBuf, bytesToRead)                                                                   │

       int                                                                                                       │
       Tcl_GetsObj(channel, lineObjPtr)                                                                          │

       int                                                                                                       │
       Tcl_Gets(channel, lineRead)                                                                               │

       int                                                                                                       │
       Tcl_Ungets(channel, input, inputLen, addAtEnd)                                                            │

       int                                                                                                       │
       Tcl_WriteObj(channel, writeObjPtr)                                                                        │

       int                                                                                                       │
       Tcl_WriteChars(channel, charBuf, bytesToWrite)                                                            │

       int                                                                                                       │
       Tcl_Write(channel, byteBuf, bytesToWrite)                                                                 │

       int                                                                                                       │
       Tcl_ReadRaw(channel, readBuf, bytesToRead)                                                                │

       int                                                                                                       │
       Tcl_WriteRaw(channel, byteBuf, bytesToWrite)                                                              │

       int
       Tcl_Eof(channel)

       int
       Tcl_Flush(channel)

       int
       Tcl_InputBlocked(channel)

       int
       Tcl_InputBuffered(channel)

       int                                                                                                       │
       Tcl_OutputBuffered(channel)                                                                               │

       Tcl_WideInt                                                                                               │
       Tcl_Seek(channel, offset, seekMode)                                                                       │

       Tcl_WideInt                                                                                               │
       Tcl_Tell(channel)                                                                                         │

       int
       Tcl_GetChannelOption(interp, channel, optionName, optionValue)

       int
       Tcl_SetChannelOption(interp, channel, optionName, newValue)

ARGUMENTS

       Tcl_Interp        *interp            (in)      Used  for  error  reporting  and  to  look  up  a  channel
                                                      registered in it.

       CONST char        *fileName          (in)      The name of a local or network file.

       CONST char        *mode              (in)      Specifies how the file is to be accessed.  May have any of
                                                      the values allowed for the mode argument to the  Tcl  open
                                                      command.

       int               permissions        (in)      POSIX-style  permission flags such as 0644.  If a new file
                                                      is created, these permissions will be set on  the  created
                                                      file.

       int               argc               (in)      The number of elements in argv.

       CONST char        **argv             (in)      Arguments  for  constructing  a  command  pipeline.  These
                                                      values have the same meaning as the  non-switch  arguments
                                                      to the Tcl exec command.

       int               flags              (in)      Specifies   the   disposition  of  the  stdio  handles  in
                                                      pipeline:  OR-ed  combination  of  TCL_STDIN,  TCL_STDOUT,
                                                      TCL_STDERR,  and  TCL_ENFORCE_MODE.  If  TCL_STDIN is set,
                                                      stdin for the first child in the pipe is the pipe channel,
                                                      otherwise  it  is  the  same  as the standard input of the
                                                      invoking process; likewise for TCL_STDOUT and  TCL_STDERR.
                                                      If TCL_ENFORCE_MODE is not set, then the pipe can redirect
                                                      stdio handles to override  the  stdio  handles  for  which
                                                      TCL_STDIN, TCL_STDOUT and TCL_STDERR have been set.  If it
                                                      is set, then such redirections cause an error.

       ClientData        handle             (in)      Operating system specific handle for I/O to  a  file.  For
                                                      Unix  this  is  a  file  descriptor,  for  Windows it is a
                                                      HANDLE.

       int               readOrWrite        (in)      OR-ed combination  of  TCL_READABLE  and  TCL_WRITABLE  to
                                                      indicate what operations are valid on handle.

       CONST char        *channelName       (in)      The name of the channel.

       int               *modePtr           (out)     Points  at  an integer variable that will receive an OR-ed
                                                      combination  of  TCL_READABLE  and  TCL_WRITABLE  denoting
                                                      whether the channel is open for reading and writing.       │

       CONST char        *pattern           (in)                                                                 │
                                                      The  pattern  to  match  on, passed to Tcl_StringMatch, or │
                                                      NULL.

       Tcl_Channel       channel            (in)      A Tcl channel for input or output.   Must  have  been  the
                                                      return value from a procedure such as Tcl_OpenFileChannel.

       Tcl_Obj           *readObjPtr        (in/out)                                                             │
                                                      A pointer to a Tcl Object in which to store the characters │
                                                      read from the channel.                                     │

       int               charsToRead        (in)                                                                 │
                                                      The number of characters to read from the channel.  If the │
                                                      channel's  encoding  is  binary, this is equivalent to the │
                                                      number of bytes to read from the channel.                  │

       int               appendFlag         (in)                                                                 │
                                                      If non-zero, data read from the channel will  be  appended │
                                                      to  the  object.   Otherwise,  the  data  will replace the │
                                                      existing contents of the object.                           │

       char              *readBuf           (out)                                                                │
                                                      A buffer in  which  to  store  the  bytes  read  from  the │
                                                      channel.                                                   │

       int               bytesToRead        (in)                                                                 │
                                                      The  number of bytes to read from the channel.  The buffer │
                                                      readBuf must be large enough to hold this many bytes.      │

       Tcl_Obj           *lineObjPtr        (in/out)                                                             │
                                                      A pointer to a Tcl object in which to store the line  read │
                                                      from  the  channel.  The line read will be appended to the │
                                                      current value of the object.                               │

       Tcl_DString       *lineRead          (in/out)                                                             │
                                                      A pointer to a Tcl dynamic string in which  to  store  the │
                                                      line read from the channel.  Must have been initialized by │
                                                      the caller.  The line read will be appended  to  any  data │
                                                      already in the dynamic string.                             │

       CONST char        *input             (in)                                                                 │
                                                      The input to add to a channel buffer.                      │

       int               inputLen           (in)                                                                 │
                                                      Length of the input                                        │

       int               addAtEnd           (in)                                                                 │
                                                      Flag  indicating  whether the input should be added to the │
                                                      end or beginning of the channel buffer.

       Tcl_Obj           *writeObjPtr       (in)      A pointer to a Tcl Object whose contents will be output to
                                                      the channel.

       CONST char        *charBuf           (in)      A  buffer  containing  the  characters  to  output  to the
                                                      channel.

       CONST char        *byteBuf           (in)      A buffer containing the bytes to output to the channel.

       int               bytesToWrite       (in)      The number of bytes to consume from charBuf or byteBuf and
                                                      output to the channel.

       Tcl_WideInt       offset             (in)      How  far  to move the access point in the channel at which
                                                      the next  input  or  output  operation  will  be  applied,
                                                      measured  in  bytes  from  the position given by seekMode.
                                                      May be either positive or negative.

       int               seekMode           (in)      Relative to which point  to  seek;  used  with  offset  to
                                                      calculate  the  new  access  point  for the channel. Legal
                                                      values are SEEK_SET, SEEK_CUR, and SEEK_END.

       CONST char        *optionName        (in)      The name of an option applicable to this channel, such  as
                                                      -blocking.   May  have  any  of the values accepted by the
                                                      fconfigure command.

       Tcl_DString       *optionValue       (in)      Where to store the value of an option or  a  list  of  all
                                                      options  and  their  values. Must have been initialized by
                                                      the caller.

       CONST char        *newValue          (in)      New value for the option given by optionName.
_________________________________________________________________

DESCRIPTION

       The Tcl channel mechanism provides a device-independent and platform-independent mechanism for performing
       buffered  input  and  output  operations  on  a  variety  of file, socket, and device types.  The channel
       mechanism is extensible to new channel types, by providing a low level channel driver for the  new  type;
       the  channel  driver  interface  is  described  in  the  manual  entry for Tcl_CreateChannel. The channel
       mechanism provides a buffering scheme  modeled  after  Unix's  standard  I/O,  and  it  also  allows  for
       nonblocking I/O on channels.

       The  procedures  described  in  this manual entry comprise the C APIs of the generic layer of the channel
       architecture. For a description of the channel driver architecture and how to implement  channel  drivers
       for new types of channels, see the manual entry for Tcl_CreateChannel.

TCL_OPENFILECHANNEL

       Tcl_OpenFileChannel  opens  a file specified by fileName and returns a channel handle that can be used to
       perform input and output on the file. This API is modeled after the fopen procedure of the Unix  standard
       I/O  library.   The syntax and meaning of all arguments is similar to those given in the Tcl open command
       when opening a file.  If an error occurs while opening the channel, Tcl_OpenFileChannel returns NULL  and
       records  a POSIX error code that can be retrieved with Tcl_GetErrno.  In addition, if interp is non-NULL,
       Tcl_OpenFileChannel leaves an error message in interp's result after any  error.   As  of  Tcl  8.4,  the
       object-based  API  Tcl_FSOpenFileChannel  should  be  used  in preference to Tcl_OpenFileChannel wherever
       possible.

       The newly  created  channel  is  not  registered  in  the  supplied  interpreter;  to  register  it,  use
       Tcl_RegisterChannel,  described  below.   If  one  of  the standard channels, stdin, stdout or stderr was
       previously closed, the act of creating the new channel also assigns it as a replacement for the  standard
       channel.

TCL_OPENCOMMANDCHANNEL

       Tcl_OpenCommandChannel  provides  a C-level interface to the functions of the exec and open commands.  It
       creates a sequence of subprocesses specified by the argv and argc arguments and returns  a  channel  that
       can  be  used  to  communicate  with  these  subprocesses.   The  flags  argument  indicates what sort of
       communication will exist with the command pipeline.

       If the TCL_STDIN flag is set then the standard input for  the  first  subprocess  will  be  tied  to  the
       channel:  writing  to  the  channel  will provide input to the subprocess.  If TCL_STDIN is not set, then
       standard input for the first subprocess will be the  same  as  this  application's  standard  input.   If
       TCL_STDOUT  is  set then standard output from the last subprocess can be read from the channel; otherwise
       it goes to this application's standard output.  If TCL_STDERR is  set,  standard  error  output  for  all
       subprocesses  is returned to the channel and results in an error when the channel is closed; otherwise it
       goes to this application's standard error.  If TCL_ENFORCE_MODE is  not  set,  then  argc  and  argv  can
       redirect the stdio handles to override TCL_STDIN, TCL_STDOUT, and TCL_STDERR; if it is set, then it is an
       error for argc and argv to override stdio channels for which TCL_STDIN, TCL_STDOUT, and  TCL_STDERR  have
       been set.

       If  an  error  occurs  while opening the channel, Tcl_OpenCommandChannel returns NULL and records a POSIX
       error code that can be retrieved with Tcl_GetErrno.  In addition, Tcl_OpenCommandChannel leaves an  error
       message in the interpreter's result if interp is not NULL.

       The  newly  created  channel  is  not  registered  in  the  supplied  interpreter;  to  register  it, use
       Tcl_RegisterChannel, described below.  If one of the standard  channels,  stdin,  stdout  or  stderr  was
       previously  closed, the act of creating the new channel also assigns it as a replacement for the standard
       channel.

TCL_MAKEFILECHANNEL

       Tcl_MakeFileChannel makes a Tcl_Channel from an existing,  platform-specific,  file  handle.   The  newly
       created  channel  is not registered in the supplied interpreter; to register it, use Tcl_RegisterChannel,
       described below.  If one of the standard channels, stdin, stdout or stderr was previously closed, the act
       of creating the new channel also assigns it as a replacement for the standard channel.

TCL_GETCHANNEL

       Tcl_GetChannel  returns  a  channel  given the channelName used to create it with Tcl_CreateChannel and a
       pointer to a Tcl interpreter in interp. If a channel by that name is not registered in that  interpreter,
       the  procedure  returns  NULL. If the modePtr argument is not NULL, it points at an integer variable that
       will receive an OR-ed combination of TCL_READABLE and TCL_WRITABLE describing whether the channel is open
       for reading and writing.

       Tcl_GetChannelNames  and  Tcl_GetChannelNamesEx  write  the  names  of  the  registered  channels  to the
       interpreter's result as a list object.  Tcl_GetChannelNamesEx will filter these names  according  to  the
       pattern.  If pattern is NULL, then it will not do any filtering.  The return value is TCL_OK if no errors
       occurred writing to the result, otherwise it  is  TCL_ERROR,  and  the  error  message  is  left  in  the
       interpreter's result.

TCL_REGISTERCHANNEL

       Tcl_RegisterChannel  adds  a  channel  to  the set of channels accessible in interp. After this call, Tcl
       programs executing in that interpreter can refer to the channel in input or output operations  using  the
       name  given  in  the call to Tcl_CreateChannel.  After this call, the channel becomes the property of the
       interpreter, and the caller should not call Tcl_Close  for  the  channel;  the  channel  will  be  closed
       automatically when it is unregistered from the interpreter.

       Code  executing  outside  of  any  Tcl  interpreter  can call Tcl_RegisterChannel with interp as NULL, to
       indicate that it wishes to hold a reference to this channel. Subsequently, the channel can be  registered
       in   a   Tcl   interpreter   and   it  will  only  be  closed  when  the  matching  number  of  calls  to
       Tcl_UnregisterChannel have been made.  This allows code executing outside of any  interpreter  to  safely
       hold a reference to a channel that is also registered in a Tcl interpreter.

       This  procedure  interacts  with  the  code  managing the standard channels. If no standard channels were
       initialized before the first call to Tcl_RegisterChannel they will get  initialized  by  that  call.  See
       Tcl_StandardChannels  for a general treatise about standard channels and the behaviour of the Tcl library
       with regard to them.

TCL_UNREGISTERCHANNEL

       Tcl_UnregisterChannel removes a channel from the set of channels accessible in interp. After  this  call,
       Tcl  programs  will  no  longer  be  able  to  use  the  channel's  name  to refer to the channel in that
       interpreter.  If this operation removed the last registration of the  channel  in  any  interpreter,  the
       channel is also closed and destroyed.

       Code  not  associated  with  a  Tcl  interpreter  can  call Tcl_UnregisterChannel with interp as NULL, to
       indicate to Tcl that it no longer holds a reference to that channel. If this is the last reference to the
       channel,  it  will now be closed.  Tcl_UnregisterChannel is very similar to Tcl_DetachChannel except that
       it will also close the channel if no further references to it exist.

TCL_DETACHCHANNEL

       Tcl_DetachChannel removes a channel from the set of channels accessible in interp. After this  call,  Tcl
       programs  will  no  longer be able to use the channel's name to refer to the channel in that interpreter.
       Beyond that, this command has no further effect.  It cannot be used on  the  standard  channels  (stdout,
       stderr, stdin), and will return TCL_ERROR if passed one of those channels.

       Code not associated with a Tcl interpreter can call Tcl_DetachChannel with interp as NULL, to indicate to
       Tcl that it no longer holds a reference to that channel. If this is the last reference  to  the  channel,
       unlike Tcl_UnregisterChannel, it will not be closed.

TCL_ISSTANDARDCHANNEL

       Tcl_IsStandardChannel  tests  whether  a  channel is one of the three standard channels, stdin, stdout or
       stderr.  If so, it returns 1, otherwise 0.

       No attempt is made to check whether the given  channel  or  the  standard  channels  are  initialized  or
       otherwise valid.

TCL_CLOSE

       Tcl_Close  destroys  the  channel channel, which must denote a currently open channel. The channel should
       not be registered in any interpreter when  Tcl_Close  is  called.  Buffered  output  is  flushed  to  the
       channel's output device prior to destroying the channel, and any buffered input is discarded.  If this is
       a blocking channel, the call does not return  until  all  buffered  data  is  successfully  sent  to  the
       channel's  output  device.   If this is a nonblocking channel and there is buffered output that cannot be
       written without blocking, the call returns immediately; output is  flushed  in  the  background  and  the
       channel  will  be  closed  once  all  of  the  buffered data has been output.  In this case errors during
       flushing are not reported.

       If the channel was closed successfully, Tcl_Close returns TCL_OK.  If an error occurs, Tcl_Close  returns
       TCL_ERROR  and  records  a  POSIX  error code that can be retrieved with Tcl_GetErrno.  If the channel is
       being closed synchronously and an error occurs during closing of the channel and interp is not  NULL,  an
       error message is left in the interpreter's result.

       Note:  it  is not safe to call Tcl_Close on a channel that has been registered using Tcl_RegisterChannel;
       see the documentation for Tcl_RegisterChannel, above, for details. If the channel has ever been given  as
       the  chan  argument in a call to Tcl_RegisterChannel, you should instead use Tcl_UnregisterChannel, which
       will internally call Tcl_Close when all calls to Tcl_RegisterChannel have been matched  by  corresponding
       calls to Tcl_UnregisterChannel.

TCL_READCHARS AND TCL_READTcl_ReadChars  consumes bytes from channel, converting the bytes to UTF-8 based on the channel's encoding │
       and storing the produced data in readObjPtr's string representation.  The return value  of  Tcl_ReadChars │
       is the number of characters, up to charsToRead, that were stored in readObjPtr.  If an error occurs while │
       reading, the return value is -1 and Tcl_ReadChars records a POSIX error code that can be  retrieved  with │
       Tcl_GetErrno.                                                                                             │

       Setting  charsToRead  to  -1  will  cause  the  command  to read all characters currently available (non- │
       blocking) or everything until eof (blocking mode).                                                        │

       The return value may be smaller than the value to read, indicating that  less  data  than  requested  was │
       available.   This  is called a short read.  In blocking mode, this can only happen on an end-of-file.  In │
       nonblocking mode, a short read can  also  occur  if  there  is  not  enough  input  currently  available: │
       Tcl_ReadChars returns a short count rather than waiting for more data.                                    │

       If  the  channel  is in blocking mode, a return value of zero indicates an end-of-file condition.  If the │
       channel is in nonblocking mode, a return value of zero  indicates  either  that  no  input  is  currently │
       available  or  an  end-of-file  condition.   Use  Tcl_Eof  and  Tcl_InputBlocked  to  tell which of these │
       conditions actually occurred.                                                                             │

       Tcl_ReadChars  translates  the  various  end-of-line  representations  into  the  canonical  \n  internal │
       representation  according  to  the current end-of-line recognition mode.  End-of-line recognition and the │
       various platform-specific modes are described in the manual entry for the Tcl fconfigure command.         │

       As a performance optimization, when reading from a channel with the encoding binary, the  bytes  are  not │
       converted to UTF-8 as they are read.  Instead, they are stored in readObjPtr's internal representation as │
       a byte-array object.  The string representation of this object will only be constructed if it  is  needed │
       (e.g.,  because  of  a call to Tcl_GetStringFromObj).  In this way, byte-oriented data can be read from a │
       channel, manipulated by calling Tcl_GetByteArrayFromObj and related functions,  and  then  written  to  a │
       channel without the expense of ever converting to or from UTF-8.                                          │

       Tcl_Read  is  similar to Tcl_ReadChars, except that it doesn't do encoding conversions, regardless of the │
       channel's encoding.  It is deprecated and exists for backwards compatibility  with  non-internationalized │
       Tcl  extensions.   It  consumes  bytes  from  channel  and stores them in readBuf, performing end-of-line │
       translations on the way.  The return value of Tcl_Read is the number of bytes, up to bytesToRead, written │
       in  readBuf.   The  buffer  produced by Tcl_Read is not null-terminated.  Its contents are valid from the │
       zeroth position up to and excluding the position indicated by the return value.                           │

       Tcl_ReadRaw is the same as Tcl_Read but does not compensate for stacking. While Tcl_Read (and  the  other │
       functions in the API) always get their data from the topmost channel in the stack the supplied channel is │
       part of, Tcl_ReadRaw does not. Thus this function is only usable for  transformational  channel  drivers, │
       i.e.  drivers  used  in  the  middle of a stack of channels, to move data from the channel below into the │
       transformation.                                                                                           │

TCL_GETSOBJ AND TCL_GETSTcl_GetsObj consumes bytes from channel, converting the bytes to UTF-8 based on the  channel's  encoding, │
       until  a  full line of input has been seen.  If the channel's encoding is binary, each byte read from the │
       channel is treated as an individual Unicode character.  All of the characters of the line except for  the │
       terminating end-of-line character(s) are appended to lineObjPtr's string representation.  The end-of-line │
       character(s) are read and discarded.                                                                      │

       If a line was successfully read, the return value is greater than or equal  to  zero  and  indicates  the │
       number  of  bytes  stored  in lineObjPtr.  If an error occurs, Tcl_GetsObj returns -1 and records a POSIX │
       error code that can be retrieved with Tcl_GetErrno.  Tcl_GetsObj also returns -1 if the end of  the  file │
       is reached; the Tcl_Eof procedure can be used to distinguish an error from an end-of-file condition.      │

       If  the  channel  is in nonblocking mode, the return value can also be -1 if no data was available or the │
       data  that  was  available  did  not  contain  an  end-of-line  character.   When  -1  is  returned,  the │
       Tcl_InputBlocked  procedure  may  be  invoked  to  determine  if  the channel is blocked because of input │
       unavailability.                                                                                           │

       Tcl_Gets is the same as Tcl_GetsObj except the resulting characters are appended to  the  dynamic  string │
       given by lineRead rather than a Tcl object.                                                               │

TCL_UNGETSTcl_Ungets  is used to add data to the input queue of a channel, at either the head or tail of the queue. │
       The pointer input points to the data that is to be added.  The length of the input to  add  is  given  by │
       inputLen.   A  non-zero  value  of  addAtEnd  indicates that the data is to be added at the end of queue; │
       otherwise it will be added at the head of the queue.  If channel has a "sticky" EOF set, no data will  be │
       added to the input queue.  Tcl_Ungets returns inputLen or -1 if an error occurs.                          │

TCL_WRITECHARS, TCL_WRITEOBJ, AND TCL_WRITETcl_WriteChars  accepts  bytesToWrite  bytes  of  character data at charBuf.  The UTF-8 characters in the │
       buffer are converted to the channel's encoding and queued for output  to  channel.   If  bytesToWrite  is │
       negative, Tcl_WriteChars expects charBuf to be null-terminated and it outputs everything up to the null.  │

       Data  queued  for  output may not appear on the output device immediately, due to internal buffering.  If │
       the data should appear immediately,  call  Tcl_Flush  after  the  call  to  Tcl_WriteChars,  or  set  the │
       -buffering  option  on the channel to none.  If you wish the data to appear as soon as a complete line is │
       accepted for output, set the -buffering option on the channel to line mode.                               │

       The return value of Tcl_WriteChars is a count of how many bytes were accepted for output to the  channel. │
       This  is  either  greater  than zero to indicate success or -1 to indicate that an error occurred.  If an │
       error occurs, Tcl_WriteChars records a POSIX error code that may be retrieved with Tcl_GetErrno.          │

       Newline characters in the output data are translated to platform-specific end-of-line sequences according │
       to the -translation option for the channel.  This is done even if the channel has no encoding.            │

       Tcl_WriteObj is similar to Tcl_WriteChars except it accepts a Tcl object whose contents will be output to │
       the channel.  The UTF-8 characters in writeObjPtr's string representation are converted to the  channel's │
       encoding and queued for output to channel.  As a performance optimization, when writing to a channel with │
       the encoding binary, UTF-8 characters are not converted as they  are  written.   Instead,  the  bytes  in │
       writeObjPtr's  internal representation as a byte-array object are written to the channel.  The byte-array │
       representation of the object will be constructed if it is needed.  In this way, byte-oriented data can be │
       read  from  a  channel,  manipulated  by  calling Tcl_GetByteArrayFromObj and related functions, and then │
       written to a channel without the expense of ever converting to or from UTF-8.                             │

       Tcl_Write is similar to Tcl_WriteChars except that it doesn't do encoding conversions, regardless of  the │
       channel's  encoding.   It is deprecated and exists for backwards compatibility with non-internationalized │
       Tcl extensions.  It accepts bytesToWrite bytes of data at byteBuf and queues them for output to  channel. │
       If bytesToWrite is negative, Tcl_Write expects byteBuf to be null-terminated and it outputs everything up │
       to the null.                                                                                              │

       Tcl_WriteRaw is the same as Tcl_Write but does not compensate for  stacking.  While  Tcl_Write  (and  the │
       other  functions  in  the  API)  always feed their input to the topmost channel in the stack the supplied │
       channel is part of, Tcl_WriteRaw does not. Thus this function is only usable for transformational channel │
       drivers,  i.e.  drivers  used  in the middle of a stack of channels, to move data from the transformation │
       into the channel below it.

TCL_FLUSH

       Tcl_Flush causes all of the buffered output data for channel to be written  to  its  underlying  file  or
       device  as  soon as possible.  If the channel is in blocking mode, the call does not return until all the
       buffered data has been sent to the channel or some error occurred.  The call returns immediately  if  the
       channel  is  nonblocking;  it  starts a background flush that will write the buffered data to the channel
       eventually, as fast as the channel is able to absorb it.

       The return value is normally TCL_OK.  If an error occurs, Tcl_Flush returns TCL_ERROR and records a POSIX
       error code that can be retrieved with Tcl_GetErrno.

TCL_SEEK

       Tcl_Seek moves the access point in channel where subsequent data will be read or written. Buffered output
       is flushed to the channel and buffered input is discarded, prior to the seek operation.

       Tcl_Seek normally returns the new access point.  If an error occurs, Tcl_Seek returns -1  and  records  a
       POSIX  error  code  that can be retrieved with Tcl_GetErrno.  After an error, the access point may or may
       not have been moved.

TCL_TELL

       Tcl_Tell returns the current access point for a channel. The returned value is -1 if the channel does not
       support seeking.

TCL_GETCHANNELOPTION

       Tcl_GetChannelOption retrieves, in optionValue, the value of one of the options currently in effect for a
       channel, or a list of all options and their values.  The channel  argument  identifies  the  channel  for
       which  to query an option or retrieve all options and their values.  If optionName is not NULL, it is the
       name of the option to query; the  option's  value  is  copied  to  the  Tcl  dynamic  string  denoted  by
       optionValue.  If  optionName  is  NULL, the function stores an alternating list of option names and their
       values in optionValue, using a series of  calls  to  Tcl_DStringAppendElement.  The  various  preexisting
       options and their possible values are described in the manual entry for the Tcl fconfigure command. Other
       options can be added by each channel type.  These channel type specific  options  are  described  in  the
       manual entry for the Tcl command that creates a channel of that type; for example, the additional options
       for TCP based channels are described in the manual entry for  the  Tcl  socket  command.   The  procedure
       normally  returns  TCL_OK.  If  an  error occurs, it returns TCL_ERROR and calls Tcl_SetErrno to store an
       appropriate POSIX error code.

TCL_SETCHANNELOPTION

       Tcl_SetChannelOption sets a new value newValue for  an  option  optionName  on  channel.   The  procedure
       normally  returns TCL_OK.  If an error occurs, it returns TCL_ERROR;  in addition, if interp is non-NULL,
       Tcl_SetChannelOption leaves an error message in the interpreter's result.

TCL_EOF

       Tcl_Eof returns a nonzero value if channel encountered an end of file during the last input operation.

TCL_INPUTBLOCKED

       Tcl_InputBlocked returns a nonzero value if channel is in nonblocking mode and the last  input  operation
       returned less data than requested because there was insufficient data available.  The call always returns
       zero if the channel is in blocking mode.

TCL_INPUTBUFFERED

       Tcl_InputBuffered returns the number of bytes of input currently buffered in the internal buffers  for  a
       channel. If the channel is not open for reading, this function always returns zero.

TCL_OUTPUTBUFFERED

       Tcl_OutputBuffered returns the number of bytes of output currently buffered in the internal buffers for a │
       channel. If the channel is not open for writing, this function always returns zero.

PLATFORM ISSUES

       The handles returned from Tcl_GetChannelHandle depend on the platform and  the  channel  type.   On  Unix
       platforms, the handle is always a Unix file descriptor as returned from the open system call.  On Windows
       platforms, the  handle  is  a  file  HANDLE  when  the  channel  was  created  with  Tcl_OpenFileChannel,
       Tcl_OpenCommandChannel,  or  Tcl_MakeFileChannel.   Other  channel  types  may return a different type of
       handle on Windows platforms.

SEE ALSO

       DString(3tcl), fconfigure(3tcl), filename(3tcl), fopen(3), Tcl_CreateChannel(3tcl)

KEYWORDS

       access point, blocking, buffered I/O, channel, channel driver, end of file,  flush,  input,  nonblocking,
       output, read, seek, write