OpenFileChnl.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:30k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1996-1997 Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '"
  7. '" RCS: @(#) $Id: OpenFileChnl.3,v 1.20.2.4 2004/07/16 22:22:15 andreas_kupries Exp $
  8. .so man.macros
  9. .TH Tcl_OpenFileChannel 3 8.3 Tcl "Tcl Library Procedures"
  10. .BS
  11. '" Note:  do not modify the .SH NAME line immediately below!
  12. .SH NAME
  13. 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
  14. .SH SYNOPSIS
  15. .nf
  16. fB#include <tcl.h>fR
  17. .sp
  18. Tcl_Channel
  19. fBTcl_OpenFileChannelfR(fIinterp, fileName, mode, permissionsfR)
  20. .sp
  21. Tcl_Channel
  22. fBTcl_OpenCommandChannelfR(fIinterp, argc, argv, flagsfR)
  23. .sp
  24. Tcl_Channel
  25. fBTcl_MakeFileChannelfR(fIhandle, readOrWritefR)
  26. .sp
  27. Tcl_Channel
  28. fBTcl_GetChannelfR(fIinterp, channelName, modePtrfR)
  29. .VS 8.3
  30. .sp
  31. int
  32. fBTcl_GetChannelNamesfR(fIinterpfR)
  33. .sp
  34. int
  35. fBTcl_GetChannelNamesExfR(fIinterp, patternfR)
  36. .VE
  37. .sp
  38. void
  39. fBTcl_RegisterChannelfR(fIinterp, channelfR)
  40. .sp
  41. int
  42. fBTcl_UnregisterChannelfR(fIinterp, channelfR)
  43. .sp
  44. int
  45. fBTcl_DetachChannelfR(fIinterp, channelfR)
  46. .sp
  47. int
  48. fBTcl_IsStandardChannelfR(fIchannelfR)
  49. .sp
  50. int
  51. fBTcl_ClosefR(fIinterp, channelfR)
  52. .sp
  53. .VS 8.1
  54. int
  55. fBTcl_ReadCharsfR(fIchannel, readObjPtr, charsToRead, appendFlagfR)
  56. .sp
  57. int
  58. fBTcl_ReadfR(fIchannel, readBuf, bytesToReadfR)
  59. .sp
  60. int
  61. fBTcl_GetsObjfR(fIchannel, lineObjPtrfR)
  62. .sp
  63. int
  64. fBTcl_GetsfR(fIchannel, lineReadfR)
  65. .sp
  66. int
  67. fBTcl_UngetsfR(fIchannel, input, inputLen, addAtEndfR)
  68. .sp
  69. int
  70. fBTcl_WriteObjfR(fIchannel, writeObjPtrfR)
  71. .sp
  72. int
  73. fBTcl_WriteCharsfR(fIchannel, charBuf, bytesToWritefR)
  74. .sp
  75. int
  76. fBTcl_WritefR(fIchannel, byteBuf, bytesToWritefR)
  77. .VE
  78. .VS 8.3.2
  79. .sp
  80. int
  81. fBTcl_ReadRawfR(fIchannel, readBuf, bytesToReadfR)
  82. .sp
  83. int
  84. fBTcl_WriteRawfR(fIchannel, byteBuf, bytesToWritefR)
  85. .VE
  86. .sp
  87. int
  88. fBTcl_EoffR(fIchannelfR)
  89. .sp
  90. int
  91. fBTcl_FlushfR(fIchannelfR)
  92. .sp
  93. int
  94. fBTcl_InputBlockedfR(fIchannelfR)
  95. .sp
  96. int
  97. fBTcl_InputBufferedfR(fIchannelfR)
  98. .VS 8.4
  99. .sp
  100. int
  101. fBTcl_OutputBufferedfR(fIchannelfR)
  102. .VE
  103. .sp
  104. .VS 8.4
  105. Tcl_WideInt
  106. fBTcl_SeekfR(fIchannel, offset, seekModefR)
  107. .sp
  108. Tcl_WideInt
  109. fBTcl_TellfR(fIchannelfR)
  110. .VE 8.4
  111. .sp
  112. int
  113. fBTcl_GetChannelOptionfR(fIinterp, channel, optionName, optionValuefR)
  114. .sp
  115. int
  116. fBTcl_SetChannelOptionfR(fIinterp, channel, optionName, newValuefR)
  117. .sp
  118. .SH ARGUMENTS
  119. .AS Tcl_ChannelType newClientProcPtr in
  120. .AP Tcl_Interp *interp in
  121. Used for error reporting and to look up a channel registered in it.
  122. .AP "CONST char" *fileName in
  123. The name of a local or network file.
  124. .AP "CONST char" *mode in
  125. Specifies how the file is to be accessed.  May have any of the values
  126. allowed for the fImodefR argument to the Tcl fBopenfR command.  
  127. .AP int permissions in
  128. POSIX-style permission flags such as 0644.  If a new file is created, these
  129. permissions will be set on the created file.
  130. .AP int argc in
  131. The number of elements in fIargvfR.
  132. .AP "CONST char" **argv in
  133. Arguments for constructing a command pipeline.  These values have the same
  134. meaning as the non-switch arguments to the Tcl fBexecfR command.
  135. .AP int flags in
  136. Specifies the disposition of the stdio handles in pipeline: OR-ed
  137. combination of fBTCL_STDINfR, fBTCL_STDOUTfR, fBTCL_STDERRfR, and
  138. fBTCL_ENFORCE_MODEfR. If fBTCL_STDINfR is set, stdin for the first child
  139. in the pipe is the pipe channel, otherwise it is the same as the standard
  140. input of the invoking process; likewise for fBTCL_STDOUTfR and
  141. fBTCL_STDERRfR. If fBTCL_ENFORCE_MODEfR is not set, then the pipe can
  142. redirect stdio handles to override the stdio handles for which
  143. fBTCL_STDINfR, fBTCL_STDOUTfR and fBTCL_STDERRfR have been set.  If it
  144. is set, then such redirections cause an error.
  145. .AP ClientData handle in
  146. Operating system specific handle for I/O to a file. For Unix this is a
  147. file descriptor, for Windows it is a HANDLE.
  148. .AP int readOrWrite in
  149. OR-ed combination of fBTCL_READABLEfR and fBTCL_WRITABLEfR to indicate
  150. what operations are valid on fIhandlefR.
  151. .AP "CONST char" *channelName in
  152. The name of the channel. 
  153. .AP int *modePtr out
  154. Points at an integer variable that will receive an OR-ed combination of
  155. fBTCL_READABLEfR and fBTCL_WRITABLEfR denoting whether the channel is
  156. open for reading and writing.
  157. .VS 8.3
  158. .AP "CONST char" *pattern in
  159. The pattern to match on, passed to Tcl_StringMatch, or NULL.
  160. .VE
  161. .AP Tcl_Channel channel in
  162. A Tcl channel for input or output.  Must have been the return value
  163. from a procedure such as fBTcl_OpenFileChannelfR.
  164. .VS 8.1 br
  165. .AP Tcl_Obj *readObjPtr in/out
  166. A pointer to a Tcl Object in which to store the characters read from the
  167. channel.
  168. .AP int charsToRead in
  169. The number of characters to read from the channel.  If the channel's encoding 
  170. is fBbinaryfR, this is equivalent to the number of bytes to read from the 
  171. channel.
  172. .AP int appendFlag in
  173. If non-zero, data read from the channel will be appended to the object.
  174. Otherwise, the data will replace the existing contents of the object.
  175. .AP char *readBuf out
  176. A buffer in which to store the bytes read from the channel.
  177. .AP int bytesToRead in
  178. The number of bytes to read from the channel.  The buffer fIreadBuffR must
  179. be large enough to hold this many bytes.
  180. .AP Tcl_Obj *lineObjPtr in/out
  181. A pointer to a Tcl object in which to store the line read from the
  182. channel.  The line read will be appended to the current value of the
  183. object. 
  184. .AP Tcl_DString *lineRead in/out
  185. A pointer to a Tcl dynamic string in which to store the line read from the
  186. channel.  Must have been initialized by the caller.  The line read will be
  187. appended to any data already in the dynamic string.
  188. .VS 8.3
  189. .AP "CONST char" *input in
  190. The input to add to a channel buffer.
  191. .AP int inputLen in
  192. Length of the input
  193. .AP int addAtEnd in
  194. Flag indicating whether the input should be added to the end or
  195. beginning of the channel buffer.
  196. .VE
  197. .AP Tcl_Obj *writeObjPtr in
  198. A pointer to a Tcl Object whose contents will be output to the channel.
  199. .AP "CONST char" *charBuf in
  200. A buffer containing the characters to output to the channel.
  201. .AP "CONST char" *byteBuf in
  202. A buffer containing the bytes to output to the channel.
  203. .AP int bytesToWrite in
  204. The number of bytes to consume from fIcharBuffR or fIbyteBuffR and
  205. output to the channel.
  206. .VE
  207. .AP Tcl_WideInt offset in
  208. How far to move the access point in the channel at which the next input or
  209. output operation will be applied, measured in bytes from the position
  210. given by fIseekModefR.  May be either positive or negative.
  211. .AP int seekMode in
  212. Relative to which point to seek; used with fIoffsetfR to calculate the new
  213. access point for the channel. Legal values are fBSEEK_SETfR,
  214. fBSEEK_CURfR, and fBSEEK_ENDfR.
  215. .AP "CONST char" *optionName in
  216. The name of an option applicable to this channel, such as fB-blockingfR.
  217. May have any of the values accepted by the fBfconfigurefR command.
  218. .AP Tcl_DString *optionValue in
  219. Where to store the value of an option or a list of all options and their
  220. values. Must have been initialized by the caller.
  221. .AP "CONST char" *newValue in
  222. New value for the option given by fIoptionNamefR.
  223. .BE
  224. .SH DESCRIPTION
  225. .PP
  226. The Tcl channel mechanism provides a device-independent and
  227. platform-independent mechanism for performing buffered input
  228. and output operations on a variety of file, socket, and device
  229. types.
  230. The channel mechanism is extensible to new channel types, by
  231. providing a low level channel driver for the new type; the channel driver
  232. interface is described in the manual entry for fBTcl_CreateChannelfR. The
  233. channel mechanism provides a buffering scheme modeled after
  234. Unix's standard I/O, and it also allows for nonblocking I/O on
  235. channels.
  236. .PP
  237. The procedures described in this manual entry comprise the C APIs of the
  238. generic layer of the channel architecture. For a description of the channel
  239. driver architecture and how to implement channel drivers for new types of
  240. channels, see the manual entry for fBTcl_CreateChannelfR.
  241. .SH TCL_OPENFILECHANNEL
  242. .PP
  243. fBTcl_OpenFileChannelfR opens a file specified by fIfileNamefR and
  244. returns a channel handle that can be used to perform input and output on
  245. the file. This API is modeled after the fBfopenfR procedure of
  246. the Unix standard I/O library.
  247. The syntax and meaning of all arguments is similar to those
  248. given in the Tcl fBopenfR command when opening a file.
  249. If an error occurs while opening the channel, fBTcl_OpenFileChannelfR
  250. returns NULL and records a POSIX error code that can be
  251. retrieved with fBTcl_GetErrnofR.
  252. In addition, if fIinterpfR is non-NULL, fBTcl_OpenFileChannelfR
  253. leaves an error message in fIinterpfR's result after any error.  
  254. As of Tcl 8.4, the object-based API fBTcl_FSOpenFileChannelfR should 
  255. be used in preference to fBTcl_OpenFileChannelfR wherever possible.
  256. .PP
  257. .PP
  258. The newly created channel is not registered in the supplied interpreter; to
  259. register it, use fBTcl_RegisterChannelfR, described below.
  260. If one of the standard channels, fBstdin, stdoutfR or fBstderrfR was
  261. previously closed, the act of creating the new channel also assigns it as a
  262. replacement for the standard channel.
  263. .SH TCL_OPENCOMMANDCHANNEL
  264. .PP
  265. fBTcl_OpenCommandChannelfR provides a C-level interface to the
  266. functions of the fBexecfR and fBopenfR commands.
  267. It creates a sequence of subprocesses specified
  268. by the fIargvfR and fIargcfR arguments and returns a channel that can
  269. be used to communicate with these subprocesses.
  270. The fIflagsfR argument indicates what sort of communication will
  271. exist with the command pipeline.
  272. .PP
  273. If the fBTCL_STDINfR flag is set then the standard input for the
  274. first subprocess will be tied to the channel: writing to the channel
  275. will provide input to the subprocess.  If fBTCL_STDINfR is not set,
  276. then standard input for the first subprocess will be the same as this
  277. application's standard input.  If fBTCL_STDOUTfR is set then
  278. standard output from the last subprocess can be read from the channel;
  279. otherwise it goes to this application's standard output.  If
  280. fBTCL_STDERRfR is set, standard error output for all subprocesses is
  281. returned to the channel and results in an error when the channel is
  282. closed; otherwise it goes to this application's standard error.  If
  283. fBTCL_ENFORCE_MODEfR is not set, then fIargcfR and fIargvfR can
  284. redirect the stdio handles to override fBTCL_STDINfR,
  285. fBTCL_STDOUTfR, and fBTCL_STDERRfR; if it is set, then it is an
  286. error for argc and argv to override stdio channels for which
  287. fBTCL_STDINfR, fBTCL_STDOUTfR, and fBTCL_STDERRfR have been set.
  288. .PP
  289. If an error occurs while opening the channel, fBTcl_OpenCommandChannelfR
  290. returns NULL and records a POSIX error code that can be retrieved with
  291. fBTcl_GetErrnofR.
  292. In addition, fBTcl_OpenCommandChannelfR leaves an error message in
  293. the interpreter's result if fIinterpfR is not NULL.
  294. .PP
  295. The newly created channel is not registered in the supplied interpreter; to
  296. register it, use fBTcl_RegisterChannelfR, described below.
  297. If one of the standard channels, fBstdin, stdoutfR or fBstderrfR was
  298. previously closed, the act of creating the new channel also assigns it as a
  299. replacement for the standard channel.
  300. .SH TCL_MAKEFILECHANNEL
  301. .PP
  302. fBTcl_MakeFileChannelfR makes a fBTcl_ChannelfR from an existing,
  303. platform-specific, file handle.
  304. The newly created channel is not registered in the supplied interpreter; to
  305. register it, use fBTcl_RegisterChannelfR, described below.
  306. If one of the standard channels, fBstdin, stdoutfR or fBstderrfR was
  307. previously closed, the act of creating the new channel also assigns it as a
  308. replacement for the standard channel.
  309. .SH TCL_GETCHANNEL
  310. .PP
  311. fBTcl_GetChannelfR returns a channel given the fIchannelNamefR used to
  312. create it with fBTcl_CreateChannelfR and a pointer to a Tcl interpreter in
  313. fIinterpfR. If a channel by that name is not registered in that interpreter,
  314. the procedure returns NULL. If the fImodePtrfR argument is not NULL, it
  315. points at an integer variable that will receive an OR-ed combination of
  316. fBTCL_READABLEfR and fBTCL_WRITABLEfR describing whether the channel is
  317. open for reading and writing.
  318. .PP
  319. fBTcl_GetChannelNamesfR and fBTcl_GetChannelNamesExfR write the
  320. names of the registered channels to the interpreter's result as a
  321. list object.  fBTcl_GetChannelNamesExfR will filter these names
  322. according to the fIpatternfR.  If fIpatternfR is NULL, then it
  323. will not do any filtering.  The return value is fBTCL_OKfR if no
  324. errors occurred writing to the result, otherwise it is fBTCL_ERRORfR,
  325. and the error message is left in the interpreter's result.
  326. .SH TCL_REGISTERCHANNEL
  327. .PP
  328. fBTcl_RegisterChannelfR adds a channel to the set of channels accessible
  329. in fIinterpfR. After this call, Tcl programs executing in that
  330. interpreter can refer to the channel in input or output operations using
  331. the name given in the call to fBTcl_CreateChannelfR.  After this call,
  332. the channel becomes the property of the interpreter, and the caller should
  333. not call fBTcl_ClosefR for the channel; the channel will be closed
  334. automatically when it is unregistered from the interpreter.
  335. .PP
  336. Code executing outside of any Tcl interpreter can call
  337. fBTcl_RegisterChannelfR with fIinterpfR as NULL, to indicate that it
  338. wishes to hold a reference to this channel. Subsequently, the channel can
  339. be registered in a Tcl interpreter and it will only be closed when the
  340. matching number of calls to fBTcl_UnregisterChannelfR have been made.
  341. This allows code executing outside of any interpreter to safely hold a
  342. reference to a channel that is also registered in a Tcl interpreter.
  343. .PP
  344. This procedure interacts with the code managing the standard
  345. channels. If no standard channels were initialized before the first
  346. call to fBTcl_RegisterChannelfR they will get initialized by that
  347. call. See fBTcl_StandardChannelsfR for a general treatise about
  348. standard channels and the behaviour of the Tcl library with regard to
  349. them.
  350. .SH TCL_UNREGISTERCHANNEL
  351. .PP
  352. fBTcl_UnregisterChannelfR removes a channel from the set of channels
  353. accessible in fIinterpfR. After this call, Tcl programs will no longer be
  354. able to use the channel's name to refer to the channel in that interpreter.
  355. If this operation removed the last registration of the channel in any
  356. interpreter, the channel is also closed and destroyed.
  357. .PP
  358. Code not associated with a Tcl interpreter can call
  359. fBTcl_UnregisterChannelfR with fIinterpfR as NULL, to indicate to Tcl
  360. that it no longer holds a reference to that channel. If this is the last
  361. reference to the channel, it will now be closed.  fBTcl_UnregisterChannelfR
  362. is very similar to fBTcl_DetachChannelfR except that it will also
  363. close the channel if no further references to it exist.
  364. .SH TCL_DETACHCHANNEL
  365. .PP
  366. fBTcl_DetachChannelfR removes a channel from the set of channels
  367. accessible in fIinterpfR. After this call, Tcl programs will no longer be
  368. able to use the channel's name to refer to the channel in that interpreter.
  369. Beyond that, this command has no further effect.  It cannot be used on
  370. the standard channels (stdout, stderr, stdin), and will return
  371. TCL_ERROR if passed one of those channels.
  372. .PP
  373. Code not associated with a Tcl interpreter can call
  374. fBTcl_DetachChannelfR with fIinterpfR as NULL, to indicate to Tcl
  375. that it no longer holds a reference to that channel. If this is the last
  376. reference to the channel, unlike fBTcl_UnregisterChannelfR, 
  377. it will not be closed.
  378. .SH TCL_ISSTANDARDCHANNEL
  379. .PP
  380. fBTcl_IsStandardChannelfR tests whether a channel is one of the
  381. three standard channels, stdin, stdout or stderr.  If so, it returns
  382. 1, otherwise 0.
  383. .PP
  384. No attempt is made to check whether the given channel or the standard 
  385. channels are initialized or otherwise valid.
  386. .SH TCL_CLOSE
  387. .PP
  388. fBTcl_ClosefR destroys the channel fIchannelfR, which must denote a
  389. currently open channel. The channel should not be registered in any
  390. interpreter when fBTcl_ClosefR is called. Buffered output is flushed to
  391. the channel's output device prior to destroying the channel, and any
  392. buffered input is discarded.  If this is a blocking channel, the call does
  393. not return until all buffered data is successfully sent to the channel's
  394. output device.  If this is a nonblocking channel and there is buffered
  395. output that cannot be written without blocking, the call returns
  396. immediately; output is flushed in the background and the channel will be
  397. closed once all of the buffered data has been output.  In this case errors
  398. during flushing are not reported.
  399. .PP
  400. If the channel was closed successfully, fBTcl_ClosefR returns fBTCL_OKfR.
  401. If an error occurs, fBTcl_ClosefR returns fBTCL_ERRORfR and records a
  402. POSIX error code that can be retrieved with fBTcl_GetErrnofR.
  403. If the channel is being closed synchronously and an error occurs during
  404. closing of the channel and fIinterpfR is not NULL, an error message is
  405. left in the interpreter's result.
  406. .PP
  407. Note: it is not safe to call fBTcl_ClosefR on a channel that has been
  408. registered using fBTcl_RegisterChannelfR; see the documentation for
  409. fBTcl_RegisterChannelfR, above, for details. If the channel has ever
  410. been given as the fBchanfR argument in a call to
  411. fBTcl_RegisterChannelfR, you should instead use
  412. fBTcl_UnregisterChannelfR, which will internally call fBTcl_ClosefR
  413. when all calls to fBTcl_RegisterChannelfR have been matched by
  414. corresponding calls to fBTcl_UnregisterChannelfR.
  415. .VS 8.1 br
  416. .SH "TCL_READCHARS AND TCL_READ"
  417. .PP
  418. fBTcl_ReadCharsfR consumes bytes from fIchannelfR, converting the bytes
  419. to UTF-8 based on the channel's encoding and storing the produced data in 
  420. fIreadObjPtrfR's string representation.  The return value of
  421. fBTcl_ReadCharsfR is the number of characters, up to fIcharsToReadfR,
  422. that were stored in fIreadObjPtrfR.  If an error occurs while reading, the
  423. return value is -1 and fBTcl_ReadCharsfR records a POSIX error code that
  424. can be retrieved with fBTcl_GetErrnofR.
  425. .PP
  426. Setting fIcharsToReadfR to fB-1fR will cause the command to read
  427. all characters currently available (non-blocking) or everything until
  428. eof (blocking mode).
  429. .PP
  430. The return value may be smaller than the value to read, indicating that less
  431. data than requested was available.  This is called a fIshort readfR.  In
  432. blocking mode, this can only happen on an end-of-file.  In nonblocking mode,
  433. a short read can also occur if there is not enough input currently
  434. available:  fBTcl_ReadCharsfR returns a short count rather than waiting
  435. for more data.
  436. .PP
  437. If the channel is in blocking mode, a return value of zero indicates an
  438. end-of-file condition.  If the channel is in nonblocking mode, a return
  439. value of zero indicates either that no input is currently available or an
  440. end-of-file condition.  Use fBTcl_EoffR and fBTcl_InputBlockedfR to tell
  441. which of these conditions actually occurred.
  442. .PP
  443. fBTcl_ReadCharsfR translates the various end-of-line representations into
  444. the canonical fBenfR internal representation according to the current
  445. end-of-line recognition mode.  End-of-line recognition and the various
  446. platform-specific modes are described in the manual entry for the Tcl
  447. fBfconfigurefR command.
  448. .PP
  449. As a performance optimization, when reading from a channel with the encoding
  450. fBbinaryfR, the bytes are not converted to UTF-8 as they are read.
  451. Instead, they are stored in fIreadObjPtrfR's internal representation as a
  452. byte-array object.  The string representation of this object will only be
  453. constructed if it is needed (e.g., because of a call to
  454. fBTcl_GetStringFromObjfR).  In this way, byte-oriented data can be read
  455. from a channel, manipulated by calling fBTcl_GetByteArrayFromObjfR and
  456. related functions, and then written to a channel without the expense of ever
  457. converting to or from UTF-8.
  458. .PP
  459. fBTcl_ReadfR is similar to fBTcl_ReadCharsfR, except that it doesn't do
  460. encoding conversions, regardless of the channel's encoding.  It is deprecated
  461. and exists for backwards compatibility with non-internationalized Tcl
  462. extensions.  It consumes bytes from fIchannelfR and stores them in
  463. fIreadBuffR, performing end-of-line translations on the way.  The return value
  464. of fBTcl_ReadfR is the number of bytes, up to fIbytesToReadfR, written in
  465. fIreadBuffR.  The buffer produced by fBTcl_ReadfR is not null-terminated.
  466. Its contents are valid from the zeroth position up to and excluding the
  467. position indicated by the return value.  
  468. .PP
  469. fBTcl_ReadRawfR is the same as fBTcl_ReadfR but does not
  470. compensate for stacking. While fBTcl_ReadfR (and the other functions
  471. in the API) always get their data from the topmost channel in the
  472. stack the supplied channel is part of, fBTcl_ReadRawfR does
  473. not. Thus this function is fBonlyfR usable for transformational
  474. channel drivers, i.e. drivers used in the middle of a stack of
  475. channels, to move data from the channel below into the transformation.
  476. .SH "TCL_GETSOBJ AND TCL_GETS"
  477. .PP
  478. fBTcl_GetsObjfR consumes bytes from fIchannelfR, converting the bytes to
  479. UTF-8 based on the channel's encoding, until a full line of input has been
  480. seen.  If the channel's encoding is fBbinaryfR, each byte read from the
  481. channel is treated as an individual Unicode character.  All of the
  482. characters of the line except for the terminating end-of-line character(s)
  483. are appended to fIlineObjPtrfR's string representation.  The end-of-line
  484. character(s) are read and discarded.
  485. .PP
  486. If a line was successfully read, the return value is greater than or equal
  487. to zero and indicates the number of bytes stored in fIlineObjPtrfR.  If an
  488. error occurs, fBTcl_GetsObjfR returns -1 and records a POSIX error code
  489. that can be retrieved with fBTcl_GetErrnofR.  fBTcl_GetsObjfR also
  490. returns -1 if the end of the file is reached; the fBTcl_EoffR procedure
  491. can be used to distinguish an error from an end-of-file condition.
  492. .PP
  493. If the channel is in nonblocking mode, the return value can also be -1 if
  494. no data was available or the data that was available did not contain an
  495. end-of-line character.  When -1 is returned, the fBTcl_InputBlockedfR
  496. procedure may be invoked to determine if the channel is blocked because
  497. of input unavailability.
  498. .PP
  499. fBTcl_GetsfR is the same as fBTcl_GetsObjfR except the resulting
  500. characters are appended to the dynamic string given by
  501. fIlineReadfR rather than a Tcl object.
  502. .SH "TCL_UNGETS"
  503. .PP
  504. fBTcl_UngetsfR is used to add data to the input queue of a channel,
  505. at either the head or tail of the queue.  The pointer fIinputfR points
  506. to the data that is to be added.  The length of the input to add is given
  507. by fIinputLenfR.  A non-zero value of fIaddAtEndfR indicates that the
  508. data is to be added at the end of queue; otherwise it will be added at the
  509. head of the queue.  If fIchannelfR has a "sticky" EOF set, no data will be
  510. added to the input queue.  fBTcl_UngetsfR returns fIinputLenfR or
  511. -1 if an error occurs.
  512. .SH "TCL_WRITECHARS, TCL_WRITEOBJ, AND TCL_WRITE"
  513. .PP
  514. fBTcl_WriteCharsfR accepts fIbytesToWritefR bytes of character data at
  515. fIcharBuffR.  The UTF-8 characters in the buffer are converted to the
  516. channel's encoding and queued for output to fIchannelfR.  If
  517. fIbytesToWritefR is negative, fBTcl_WriteCharsfR expects fIcharBuffR
  518. to be null-terminated and it outputs everything up to the null.
  519. .PP
  520. Data queued for output may not appear on the output device immediately, due
  521. to internal buffering.  If the data should appear immediately, call
  522. fBTcl_FlushfR after the call to fBTcl_WriteCharsfR, or set the 
  523. fB-bufferingfR option on the channel to fBnonefR.  If you wish the data
  524. to appear as soon as a complete line is accepted for output, set the
  525. fB-bufferingfR option on the channel to fBlinefR mode.
  526. .PP
  527. The return value of fBTcl_WriteCharsfR is a count of how many bytes were
  528. accepted for output to the channel.  This is either greater than zero to
  529. indicate success or -1 to indicate that an error occurred.  If an error
  530. occurs, fBTcl_WriteCharsfR records a POSIX error code that may be
  531. retrieved with fBTcl_GetErrnofR.
  532. .PP
  533. Newline characters in the output data are translated to platform-specific
  534. end-of-line sequences according to the fB-translationfR option for the
  535. channel.  This is done even if the channel has no encoding.
  536. .PP
  537. fBTcl_WriteObjfR is similar to fBTcl_WriteCharsfR except it
  538. accepts a Tcl object whose contents will be output to the channel.  The
  539. UTF-8 characters in fIwriteObjPtrfR's string representation are converted
  540. to the channel's encoding and queued for output to fIchannelfR.  
  541. As a performance optimization, when writing to a channel with the encoding
  542. fBbinaryfR, UTF-8 characters are not converted as they are written.
  543. Instead, the bytes in fIwriteObjPtrfR's internal representation as a
  544. byte-array object are written to the channel.  The byte-array representation
  545. of the object will be constructed if it is needed.  In this way,
  546. byte-oriented data can be read from a channel, manipulated by calling
  547. fBTcl_GetByteArrayFromObjfR and related functions, and then written to a
  548. channel without the expense of ever converting to or from UTF-8.
  549. .PP
  550. fBTcl_WritefR is similar to fBTcl_WriteCharsfR except that it doesn't do
  551. encoding conversions, regardless of the channel's encoding.  It is
  552. deprecated and exists for backwards compatibility with non-internationalized
  553. Tcl extensions.  It accepts fIbytesToWritefR bytes of data at
  554. fIbyteBuffR and queues them for output to fIchannelfR.  If
  555. fIbytesToWritefR is negative, fBTcl_WritefR expects fIbyteBuffR to be
  556. null-terminated and it outputs everything up to the null.
  557. .PP
  558. fBTcl_WriteRawfR is the same as fBTcl_WritefR but does not
  559. compensate for stacking. While fBTcl_WritefR (and the other
  560. functions in the API) always feed their input to the topmost channel
  561. in the stack the supplied channel is part of, fBTcl_WriteRawfR does
  562. not. Thus this function is fBonlyfR usable for transformational
  563. channel drivers, i.e. drivers used in the middle of a stack of
  564. channels, to move data from the transformation into the channel below
  565. it.
  566. .VE
  567. .SH TCL_FLUSH
  568. .PP
  569. fBTcl_FlushfR causes all of the buffered output data for fIchannelfR
  570. to be written to its underlying file or device as soon as possible.
  571. If the channel is in blocking mode, the call does not return until
  572. all the buffered data has been sent to the channel or some error occurred.
  573. The call returns immediately if the channel is nonblocking; it starts
  574. a background flush that will write the buffered data to the channel
  575. eventually, as fast as the channel is able to absorb it.
  576. .PP
  577. The return value is normally fBTCL_OKfR.
  578. If an error occurs, fBTcl_FlushfR returns fBTCL_ERRORfR and
  579. records a POSIX error code that can be retrieved with fBTcl_GetErrnofR.
  580. .SH TCL_SEEK
  581. .PP
  582. fBTcl_SeekfR moves the access point in fIchannelfR where subsequent
  583. data will be read or written. Buffered output is flushed to the channel and
  584. buffered input is discarded, prior to the seek operation.
  585. .PP
  586. fBTcl_SeekfR normally returns the new access point.
  587. If an error occurs, fBTcl_SeekfR returns -1 and records a POSIX error
  588. code that can be retrieved with fBTcl_GetErrnofR.
  589. After an error, the access point may or may not have been moved.
  590. .SH TCL_TELL
  591. .PP
  592. fBTcl_TellfR returns the current access point for a channel. The returned
  593. value is -1 if the channel does not support seeking.
  594. .SH TCL_GETCHANNELOPTION
  595. .PP
  596. fBTcl_GetChannelOptionfR retrieves, in fIoptionValuefR, the value of one of
  597. the options currently in effect for a channel, or a list of all options and
  598. their values.  The fIchannelfR argument identifies the channel for which
  599. to query an option or retrieve all options and their values.
  600. If fIoptionNamefR is not NULL, it is the name of the
  601. option to query; the option's value is copied to the Tcl dynamic string
  602. denoted by fIoptionValuefR. If
  603. fIoptionNamefR is NULL, the function stores an alternating list of option
  604. names and their values in fIoptionValuefR, using a series of calls to
  605. fBTcl_DStringAppendElementfR. The various preexisting options and
  606. their possible values are described in the manual entry for the Tcl
  607. fBfconfigurefR command. Other options can be added by each channel type.
  608. These channel type specific options are described in the manual entry for
  609. the Tcl command that creates a channel of that type; for example, the
  610. additional options for TCP based channels are described in the manual entry
  611. for the Tcl fBsocketfR command.
  612. The procedure normally returns fBTCL_OKfR. If an error occurs, it returns
  613. fBTCL_ERRORfR and calls fBTcl_SetErrnofR to store an appropriate POSIX
  614. error code.
  615. .SH TCL_SETCHANNELOPTION
  616. .PP
  617. fBTcl_SetChannelOptionfR sets a new value fInewValuefR
  618. for an option fIoptionNamefR on fIchannelfR.
  619. The procedure normally returns fBTCL_OKfR.  If an error occurs,
  620. it returns fBTCL_ERRORfR;  in addition, if fIinterpfR is non-NULL,
  621. fBTcl_SetChannelOptionfR leaves an error message in the interpreter's result.
  622. .SH TCL_EOF
  623. .PP
  624. fBTcl_EoffR returns a nonzero value if fIchannelfR encountered
  625. an end of file during the last input operation.
  626. .SH TCL_INPUTBLOCKED
  627. .PP
  628. fBTcl_InputBlockedfR returns a nonzero value if fIchannelfR is in
  629. nonblocking mode and the last input operation returned less data than
  630. requested because there was insufficient data available.
  631. The call always returns zero if the channel is in blocking mode.
  632. .SH TCL_INPUTBUFFERED
  633. .PP
  634. fBTcl_InputBufferedfR returns the number of bytes of input currently
  635. buffered in the internal buffers for a channel. If the channel is not open
  636. for reading, this function always returns zero.
  637. .SH TCL_OUTPUTBUFFERED
  638. .VS 8.4
  639. fBTcl_OutputBufferedfR returns the number of bytes of output
  640. currently buffered in the internal buffers for a channel. If the
  641. channel is not open for writing, this function always returns zero.
  642. .VE
  643. .SH "PLATFORM ISSUES"
  644. .PP
  645. The handles returned from fBTcl_GetChannelHandlefR depend on the
  646. platform and the channel type.  On Unix platforms, the handle is
  647. always a Unix file descriptor as returned from the fBopenfR system
  648. call.  On Windows platforms, the handle is a file fBHANDLEfR when
  649. the channel was created with fBTcl_OpenFileChannelfR,
  650. fBTcl_OpenCommandChannelfR, or fBTcl_MakeFileChannelfR.  Other
  651. channel types may return a different type of handle on Windows
  652. platforms.  On the Macintosh platform, the handle is a file reference
  653. number as returned from fBHOpenDFfR.
  654. .SH "SEE ALSO"
  655. DString(3), fconfigure(n), filename(n), fopen(3), Tcl_CreateChannel(3)
  656. .SH KEYWORDS
  657. access point, blocking, buffered I/O, channel, channel driver, end of file,
  658. flush, input, nonblocking, output, read, seek, write