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

通讯编程

开发平台:

Visual C++

  1. # -*- tcl -*-
  2. # Functionality covered: operation of all IO commands, and all procedures
  3. # defined in generic/tclIO.c.
  4. #
  5. # This file contains a collection of tests for one or more of the Tcl
  6. # built-in commands.  Sourcing this file into Tcl runs the tests and
  7. # generates output for errors.  No output means no errors were found.
  8. #
  9. # Copyright (c) 1991-1994 The Regents of the University of California.
  10. # Copyright (c) 1994-1997 Sun Microsystems, Inc.
  11. # Copyright (c) 1998-1999 by Scriptics Corporation.
  12. #
  13. # See the file "license.terms" for information on usage and redistribution
  14. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15. #
  16. # RCS: @(#) $Id: io.test,v 1.40.2.12 2007/02/12 19:25:42 andreas_kupries Exp $
  17. if {[catch {package require tcltest 2}]} {
  18.     puts stderr "Skipping tests in [info script].  tcltest 2 required."
  19.     return
  20. }
  21. namespace eval ::tcl::test::io {
  22.     namespace import ::tcltest::cleanupTests
  23.     namespace import ::tcltest::interpreter
  24.     namespace import ::tcltest::makeFile
  25.     namespace import ::tcltest::removeFile
  26.     namespace import ::tcltest::test
  27.     namespace import ::tcltest::testConstraint
  28.     namespace import ::tcltest::viewFile
  29. testConstraint testchannel [llength [info commands testchannel]]
  30. testConstraint exec [llength [info commands exec]]
  31. testConstraint openpipe 1
  32. testConstraint fileevent [llength [info commands fileevent]]
  33. testConstraint fcopy [llength [info commands fcopy]]
  34. # You need a *very* special environment to do some tests.  In
  35. # particular, many file systems do not support large-files...
  36. testConstraint largefileSupport 0
  37. # set up a long data file for some of the following tests
  38. set path(longfile) [makeFile {} longfile]
  39. set f [open $path(longfile) w]
  40. fconfigure $f -eofchar {} -translation lf
  41. for { set i 0 } { $i < 100 } { incr i} {
  42.     puts $f "#123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
  43. #123456789abcdef01
  44. #"
  45.     }
  46. close $f
  47. set path(cat) [makeFile {
  48.     set f stdin
  49.     if {$argv != ""} {
  50. set f [open [lindex $argv 0]]
  51.     }
  52.     fconfigure $f -encoding binary -translation lf -blocking 0 -eofchar x1a
  53.     fconfigure stdout -encoding binary -translation lf -buffering none
  54.     fileevent $f readable "foo $f"
  55.     proc foo {f} {
  56. set x [read $f]
  57. catch {puts -nonewline $x}
  58. if {[eof $f]} {
  59.     close $f
  60.     exit 0
  61. }
  62.     }
  63.     vwait forever
  64. } cat]
  65. set thisScript [file join [pwd] [info script]]
  66. proc contents {file} {
  67.     set f [open $file]
  68.     fconfigure $f -translation binary
  69.     set a [read $f]
  70.     close $f
  71.     return $a
  72. }
  73. test io-1.5 {Tcl_WriteChars: CheckChannelErrors} {emptyTest} {
  74.     # no test, need to cause an async error.
  75. } {}
  76. set path(test1) [makeFile {} test1]
  77. test io-1.6 {Tcl_WriteChars: WriteBytes} {
  78.     set f [open $path(test1) w]
  79.     fconfigure $f -encoding binary
  80.     puts -nonewline $f "au4e4d"
  81.     close $f
  82.     contents $path(test1)
  83. } "ax4dx00"
  84. test io-1.7 {Tcl_WriteChars: WriteChars} {
  85.     set f [open $path(test1) w]
  86.     fconfigure $f -encoding shiftjis
  87.     puts -nonewline $f "au4e4d"
  88.     close $f
  89.     contents $path(test1)
  90. } "ax93xe1x00"
  91. set path(test2) [makeFile {} test2]
  92. test io-1.8 {Tcl_WriteChars: WriteChars} {
  93.     # This test written for SF bug #506297.
  94.     #
  95.     # Executing this test without the fix for the referenced bug
  96.     # applied to tcl will cause tcl, more specifically WriteChars, to
  97.     # go into an infinite loop.
  98.     set f [open $path(test2) w] 
  99.     fconfigure      $f -encoding iso2022-jp 
  100.     puts -nonewline $f [format %s%c [string repeat " " 4] 12399] 
  101.     close           $f 
  102.     contents $path(test2)
  103. } "    x1b$B$Ox1b(B"
  104. test io-1.9 {Tcl_WriteChars: WriteChars} {
  105.     # When closing a channel with an encoding that appends
  106.     # escape bytes, check for the case where the escape
  107.     # bytes overflow the current IO buffer. The bytes
  108.     # should be moved into a new buffer.
  109.     set data "1234567890 [format %c 12399]"
  110.     set sizes [list]
  111.     # With default buffer size
  112.     set f [open $path(test2) w]
  113.     fconfigure      $f -encoding iso2022-jp
  114.     puts -nonewline $f $data
  115.     close           $f
  116.     lappend sizes [file size $path(test2)]
  117.     # With buffer size equal to the length
  118.     # of the data, the escape bytes would
  119.     # go into the next buffer.
  120.     set f [open $path(test2) w]
  121.     fconfigure      $f -encoding iso2022-jp -buffersize 16
  122.     puts -nonewline $f $data
  123.     close           $f
  124.     lappend sizes [file size $path(test2)]
  125.     # With buffer size that is large enough
  126.     # to hold 1 byte of escaped data, but
  127.     # not all 3. This should not write
  128.     # the escape bytes to the first buffer
  129.     # and then again to the second buffer.
  130.     set f [open $path(test2) w]
  131.     fconfigure      $f -encoding iso2022-jp -buffersize 17
  132.     puts -nonewline $f $data
  133.     close           $f
  134.     lappend sizes [file size $path(test2)]
  135.     # With buffer size that can hold 2 out of
  136.     # 3 bytes of escaped data.
  137.     set f [open $path(test2) w]
  138.     fconfigure      $f -encoding iso2022-jp -buffersize 18
  139.     puts -nonewline $f $data
  140.     close           $f
  141.     lappend sizes [file size $path(test2)]
  142.     # With buffer size that can hold all the
  143.     # data and escape bytes.
  144.     set f [open $path(test2) w]
  145.     fconfigure      $f -encoding iso2022-jp -buffersize 19
  146.     puts -nonewline $f $data
  147.     close           $f
  148.     lappend sizes [file size $path(test2)]
  149.     set sizes
  150. } {19 19 19 19 19}
  151. test io-2.1 {WriteBytes} {
  152.     # loop until all bytes are written
  153.     
  154.     set f [open $path(test1) w]
  155.     fconfigure $f  -encoding binary -buffersize 16 -translation crlf
  156.     puts $f "abcdefghijklmnopqrstuvwxyz"
  157.     close $f
  158.     contents $path(test1)
  159. } "abcdefghijklmnopqrstuvwxyzrn"
  160. test io-2.2 {WriteBytes: savedLF > 0} {
  161.     # After flushing buffer, there was a n left over from the last
  162.     # n -> rn expansion.  It gets stuck at beginning of this buffer.
  163.     set f [open $path(test1) w]
  164.     fconfigure $f -encoding binary -buffersize 16 -translation crlf
  165.     puts -nonewline $f "123456789012345n12"
  166.     set x [list [contents $path(test1)]]
  167.     close $f
  168.     lappend x [contents $path(test1)]
  169. } [list "123456789012345r" "123456789012345rn12"]
  170. test io-2.3 {WriteBytes: flush on line} {
  171.     # Tcl "line" buffering has weird behavior: if current buffer contains
  172.     # a n, entire buffer gets flushed.  Logical behavior would be to flush
  173.     # only up to the n.
  174.     
  175.     set f [open $path(test1) w]
  176.     fconfigure $f -encoding binary -buffering line -translation crlf
  177.     puts -nonewline $f "n12"
  178.     set x [contents $path(test1)]
  179.     close $f
  180.     set x
  181. } "rn12"
  182. test io-2.4 {WriteBytes: reset sawLF after each buffer} {
  183.     set f [open $path(test1) w]
  184.      fconfigure $f -encoding binary -buffering line -translation lf 
  185.      -buffersize 16
  186.     puts -nonewline $f "abcdefgnhijklmnopqrstuvwxyz"
  187.     set x [list [contents $path(test1)]]
  188.     close $f
  189.     lappend x [contents $path(test1)]
  190. } [list "abcdefgnhijklmno" "abcdefgnhijklmnopqrstuvwxyz"]
  191. test io-3.1 {WriteChars: compatibility with WriteBytes} {
  192.     # loop until all bytes are written
  193.     
  194.     set f [open $path(test1) w]
  195.     fconfigure $f -encoding ascii -buffersize 16 -translation crlf
  196.     puts $f "abcdefghijklmnopqrstuvwxyz"
  197.     close $f
  198.     contents $path(test1)
  199. } "abcdefghijklmnopqrstuvwxyzrn"
  200. test io-3.2 {WriteChars: compatibility with WriteBytes: savedLF > 0} {
  201.     # After flushing buffer, there was a n left over from the last
  202.     # n -> rn expansion.  It gets stuck at beginning of this buffer.
  203.     set f [open $path(test1) w]
  204.     fconfigure $f -encoding ascii -buffersize 16 -translation crlf
  205.     puts -nonewline $f "123456789012345n12"
  206.     set x [list [contents $path(test1)]]
  207.     close $f
  208.     lappend x [contents $path(test1)]
  209. } [list "123456789012345r" "123456789012345rn12"]
  210. test io-3.3 {WriteChars: compatibility with WriteBytes: flush on line} {
  211.     # Tcl "line" buffering has weird behavior: if current buffer contains
  212.     # a n, entire buffer gets flushed.  Logical behavior would be to flush
  213.     # only up to the n.
  214.     
  215.     set f [open $path(test1) w]
  216.     fconfigure $f -encoding ascii -buffering line -translation crlf
  217.     puts -nonewline $f "n12"
  218.     set x [contents $path(test1)]
  219.     close $f
  220.     set x
  221. } "rn12"
  222. test io-3.4 {WriteChars: loop over stage buffer} {
  223.     # stage buffer maps to more than can be queued at once.
  224.     set f [open $path(test1) w]
  225.     fconfigure $f -encoding jis0208 -buffersize 16 
  226.     puts -nonewline $f "\\\\\\\\\\\\\\\"
  227.     set x [list [contents $path(test1)]]
  228.     close $f
  229.     lappend x [contents $path(test1)]
  230. } [list "!)!)!)!)!)!)!)!)" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
  231. test io-3.5 {WriteChars: saved != 0} {
  232.     # Bytes produced by UtfToExternal from end of last channel buffer
  233.     # had to be moved to beginning of next channel buffer to preserve
  234.     # requested buffersize.
  235.     set f [open $path(test1) w]
  236.     fconfigure $f -encoding jis0208 -buffersize 17 
  237.     puts -nonewline $f "\\\\\\\\\\\\\\\"
  238.     set x [list [contents $path(test1)]]
  239.     close $f
  240.     lappend x [contents $path(test1)]
  241. } [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
  242. test io-3.6 {WriteChars: (stageRead + dstWrote == 0)} {
  243.     # One incomplete UTF-8 character at end of staging buffer.  Backup
  244.     # in src to the beginning of that UTF-8 character and try again.
  245.     #
  246.     # Translate the first 16 bytes, produce 14 bytes of output, 2 left over
  247.     # (first two bytes of uff21 in UTF-8).  Given those two bytes try
  248.     # translating them again, find that no bytes are read produced, and break
  249.     # to outer loop where those two bytes will have the remaining 4 bytes
  250.     # (the last byte of uff21 plus the all of uff22) appended.
  251.     set f [open $path(test1) w]
  252.     fconfigure $f -encoding shiftjis -buffersize 16
  253.     puts -nonewline $f "12345678901234uff21uff22"
  254.     set x [list [contents $path(test1)]]
  255.     close $f
  256.     lappend x [contents $path(test1)]
  257. } [list "12345678901234x82x60" "12345678901234x82x60x82x61"]
  258. test io-3.7 {WriteChars: (bufPtr->nextAdded > bufPtr->length)} {
  259.     # When translating UTF-8 to external, the produced bytes went past end
  260.     # of the channel buffer.  This is done purpose -- we then truncate the
  261.     # bytes at the end of the partial character to preserve the requested
  262.     # blocksize on flush.  The truncated bytes are moved to the beginning
  263.     # of the next channel buffer.
  264.     set f [open $path(test1) w]
  265.     fconfigure $f -encoding jis0208 -buffersize 17 
  266.     puts -nonewline $f "\\\\\\\\\\\\\\\"
  267.     set x [list [contents $path(test1)]]
  268.     close $f
  269.     lappend x [contents $path(test1)]
  270. } [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
  271. test io-3.8 {WriteChars: reset sawLF after each buffer} {
  272.     set f [open $path(test1) w]
  273.     fconfigure $f -encoding ascii -buffering line -translation lf 
  274.      -buffersize 16
  275.     puts -nonewline $f "abcdefgnhijklmnopqrstuvwxyz"
  276.     set x [list [contents $path(test1)]]
  277.     close $f
  278.     lappend x [contents $path(test1)]
  279. } [list "abcdefgnhijklmno" "abcdefgnhijklmnopqrstuvwxyz"]
  280. test io-4.1 {TranslateOutputEOL: lf} {
  281.     # search for n
  282.     set f [open $path(test1) w]
  283.     fconfigure $f -buffering line -translation lf
  284.     puts $f "abcde"
  285.     set x [list [contents $path(test1)]]
  286.     close $f
  287.     lappend x [contents $path(test1)]
  288. } [list "abcden" "abcden"]
  289. test io-4.2 {TranslateOutputEOL: cr} {
  290.     # search for n, replace with r
  291.     set f [open $path(test1) w]
  292.     fconfigure $f -buffering line -translation cr
  293.     puts $f "abcde"
  294.     set x [list [contents $path(test1)]]
  295.     close $f
  296.     lappend x [contents $path(test1)]
  297. } [list "abcder" "abcder"]
  298. test io-4.3 {TranslateOutputEOL: crlf} {
  299.     # simple case: search for n, replace with r
  300.     set f [open $path(test1) w]
  301.     fconfigure $f -buffering line -translation crlf
  302.     puts $f "abcde"
  303.     set x [list [contents $path(test1)]]
  304.     close $f
  305.     lappend x [contents $path(test1)]
  306. } [list "abcdern" "abcdern"]
  307. test io-4.4 {TranslateOutputEOL: crlf} {
  308.     # keep storing more bytes in output buffer until output buffer is full.
  309.     # We have 13 bytes initially that would turn into 18 bytes.  Fill
  310.     # dest buffer while (dstEnd < dstMax).
  311.     set f [open $path(test1) w]
  312.     fconfigure $f -translation crlf -buffersize 16
  313.     puts -nonewline $f "1234567nnnnnA"
  314.     set x [list [contents $path(test1)]]
  315.     close $f
  316.     lappend x [contents $path(test1)]
  317. } [list "1234567rnrnrnrnr" "1234567rnrnrnrnrnA"]
  318. test io-4.5 {TranslateOutputEOL: crlf} {
  319.     # Check for overflow of the destination buffer
  320.     set f [open $path(test1) w]
  321.     fconfigure $f -translation crlf -buffersize 12
  322.     puts -nonewline $f "12345678901n456789012345678901234"
  323.     close $f
  324.     set x [contents $path(test1)]
  325. } "12345678901rn456789012345678901234"
  326. test io-5.1 {CheckFlush: not full} {
  327.     set f [open $path(test1) w]
  328.     fconfigure $f 
  329.     puts -nonewline $f "12345678901234567890"
  330.     set x [list [contents $path(test1)]]
  331.     close $f
  332.     lappend x [contents $path(test1)]
  333. } [list "" "12345678901234567890"]
  334. test io-5.2 {CheckFlush: full} {
  335.     set f [open $path(test1) w]
  336.     fconfigure $f -buffersize 16
  337.     puts -nonewline $f "12345678901234567890"
  338.     set x [list [contents $path(test1)]]
  339.     close $f
  340.     lappend x [contents $path(test1)]
  341. } [list "1234567890123456" "12345678901234567890"]
  342. test io-5.3 {CheckFlush: not line} {
  343.     set f [open $path(test1) w]
  344.     fconfigure $f -buffering line
  345.     puts -nonewline $f "12345678901234567890"
  346.     set x [list [contents $path(test1)]]
  347.     close $f
  348.     lappend x [contents $path(test1)]
  349. } [list "" "12345678901234567890"]
  350. test io-5.4 {CheckFlush: line} {
  351.     set f [open $path(test1) w]
  352.     fconfigure $f -buffering line -translation lf -encoding ascii
  353.     puts -nonewline $f "1234567890n1234567890"
  354.     set x [list [contents $path(test1)]]
  355.     close $f
  356.     lappend x [contents $path(test1)]
  357. } [list "1234567890n1234567890" "1234567890n1234567890"]
  358. test io-5.5 {CheckFlush: none} {
  359.     set f [open $path(test1) w]
  360.     fconfigure $f -buffering none
  361.     puts -nonewline $f "1234567890"
  362.     set x [list [contents $path(test1)]]
  363.     close $f
  364.     lappend x [contents $path(test1)]
  365. } [list "1234567890" "1234567890"]
  366. test io-6.1 {Tcl_GetsObj: working} {
  367.     set f [open $path(test1) w]
  368.     puts $f "foonboo"
  369.     close $f
  370.     set f [open $path(test1)]
  371.     set x [gets $f]
  372.     close $f
  373.     set x
  374. } {foo}
  375. test io-6.2 {Tcl_GetsObj: CheckChannelErrors() != 0} {
  376.     # no test, need to cause an async error.
  377. } {}
  378. test io-6.3 {Tcl_GetsObj: how many have we used?} {
  379.     # if (bufPtr != NULL) {oldRemoved = bufPtr->nextRemoved}
  380.     set f [open $path(test1) w]
  381.     fconfigure $f -translation crlf
  382.     puts $f "abcndefg"
  383.     close $f
  384.     set f [open $path(test1)]
  385.     set x [list [tell $f] [gets $f line] [tell $f] [gets $f line] $line]
  386.     close $f
  387.     set x
  388. } {0 3 5 4 defg}
  389. test io-6.4 {Tcl_GetsObj: encoding == NULL} {
  390.     set f [open $path(test1) w]
  391.     fconfigure $f -translation binary
  392.     puts $f "x81u1234"
  393.     close $f
  394.     set f [open $path(test1)]
  395.     fconfigure $f -translation binary
  396.     set x [list [gets $f line] $line]
  397.     close $f
  398.     set x
  399. } [list 3 "x81x34x00"]
  400. test io-6.5 {Tcl_GetsObj: encoding != NULL} {
  401.     set f [open $path(test1) w]
  402.     fconfigure $f -translation binary
  403.     puts $f "x88xeax92x9a"
  404.     close $f
  405.     set f [open $path(test1)]
  406.     fconfigure $f -encoding shiftjis
  407.     set x [list [gets $f line] $line]
  408.     close $f
  409.     set x
  410. } [list 2 "u4e00u4e01"]
  411. set a "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
  412. append a $a
  413. append a $a
  414. test io-6.6 {Tcl_GetsObj: loop test} {
  415.     # if (dst >= dstEnd) 
  416.     set f [open $path(test1) w]
  417.     puts $f $a
  418.     puts $f hi
  419.     close $f
  420.     set f [open $path(test1)]
  421.     set x [list [gets $f line] $line]
  422.     close $f
  423.     set x
  424. } [list 256 $a]
  425. test io-6.7 {Tcl_GetsObj: error in input} {stdio openpipe} {
  426.     # if (FilterInputBytes(chanPtr, &gs) != 0)
  427.     set f [open "|[list [interpreter] $path(cat)]" w+]
  428.     puts -nonewline $f "hinwould"
  429.     flush $f
  430.     gets $f
  431.     fconfigure $f -blocking 0
  432.     set x [gets $f line]
  433.     close $f
  434.     set x
  435. } {-1}
  436. test io-6.8 {Tcl_GetsObj: remember if EOF is seen} {
  437.     set f [open $path(test1) w]
  438.     puts $f "abcdefx1aghijknwombat"
  439.     close $f
  440.     set f [open $path(test1)]
  441.     fconfigure $f -eofchar x1a
  442.     set x [list [gets $f line] $line [gets $f line] $line]
  443.     close $f
  444.     set x
  445. } {6 abcdef -1 {}}
  446. test io-6.9 {Tcl_GetsObj: remember if EOF is seen} {
  447.     set f [open $path(test1) w]
  448.     puts $f "abcdefghijknwomu001abat"
  449.     close $f
  450.     set f [open $path(test1)]
  451.     fconfigure $f -eofchar x1a
  452.     set x [list [gets $f line] $line [gets $f line] $line]
  453.     close $f
  454.     set x
  455. } {11 abcdefghijk 3 wom}
  456. # Comprehensive tests
  457. test io-6.10 {Tcl_GetsObj: lf mode: no chars} {
  458.     set f [open $path(test1) w]
  459.     close $f
  460.     set f [open $path(test1)]
  461.     fconfigure $f -translation lf
  462.     set x [list [gets $f line] $line]
  463.     close $f
  464.     set x
  465. } {-1 {}}
  466. test io-6.11 {Tcl_GetsObj: lf mode: lone n} {
  467.     set f [open $path(test1) w]
  468.     fconfigure $f -translation lf
  469.     puts -nonewline $f "n"
  470.     close $f
  471.     set f [open $path(test1)]
  472.     fconfigure $f -translation lf
  473.     set x [list [gets $f line] $line [gets $f line] $line]
  474.     close $f
  475.     set x
  476. } {0 {} -1 {}}
  477. test io-6.12 {Tcl_GetsObj: lf mode: lone r} {
  478.     set f [open $path(test1) w]
  479.     fconfigure $f -translation lf
  480.     puts -nonewline $f "r"
  481.     close $f
  482.     set f [open $path(test1)]
  483.     fconfigure $f -translation lf
  484.     set x [list [gets $f line] $line [gets $f line] $line]
  485.     close $f
  486.     set x
  487. } [list 1 "r" -1 ""]
  488. test io-6.13 {Tcl_GetsObj: lf mode: 1 char} {
  489.     set f [open $path(test1) w]
  490.     fconfigure $f -translation lf
  491.     puts -nonewline $f a
  492.     close $f
  493.     set f [open $path(test1)]
  494.     fconfigure $f -translation lf
  495.     set x [list [gets $f line] $line [gets $f line] $line]
  496.     close $f
  497.     set x
  498. } {1 a -1 {}}
  499. test io-6.14 {Tcl_GetsObj: lf mode: 1 char followed by EOL} {
  500.     set f [open $path(test1) w]
  501.     fconfigure $f -translation lf
  502.     puts -nonewline $f "an"
  503.     close $f
  504.     set f [open $path(test1)]
  505.     fconfigure $f -translation lf
  506.     set x [list [gets $f line] $line [gets $f line] $line]
  507.     close $f
  508.     set x
  509. } {1 a -1 {}}
  510. test io-6.15 {Tcl_GetsObj: lf mode: several chars} {
  511.     set f [open $path(test1) w]
  512.     fconfigure $f -translation lf
  513.     puts -nonewline $f "abcdnefghrijklrnmnop"
  514.     close $f
  515.     set f [open $path(test1)]
  516.     fconfigure $f -translation lf
  517.     set x [list [gets $f line] $line [gets $f line] $line [gets $f line] $line [gets $f line] $line]
  518.     close $f
  519.     set x
  520. } [list 4 "abcd" 10 "efghrijklr" 4 "mnop" -1 ""]
  521. test io-6.16 {Tcl_GetsObj: cr mode: no chars} {
  522.     set f [open $path(test1) w]
  523.     close $f
  524.     set f [open $path(test1)]
  525.     fconfigure $f -translation cr
  526.     set x [list [gets $f line] $line]
  527.     close $f
  528.     set x
  529. } {-1 {}}
  530. test io-6.17 {Tcl_GetsObj: cr mode: lone n} {
  531.     set f [open $path(test1) w]
  532.     fconfigure $f -translation lf
  533.     puts -nonewline $f "n"
  534.     close $f
  535.     set f [open $path(test1)]
  536.     fconfigure $f -translation cr
  537.     set x [list [gets $f line] $line [gets $f line] $line]
  538.     close $f
  539.     set x
  540. } [list 1 "n" -1 ""]
  541. test io-6.18 {Tcl_GetsObj: cr mode: lone r} {
  542.     set f [open $path(test1) w]
  543.     fconfigure $f -translation lf
  544.     puts -nonewline $f "r"
  545.     close $f
  546.     set f [open $path(test1)]
  547.     fconfigure $f -translation cr
  548.     set x [list [gets $f line] $line [gets $f line] $line]
  549.     close $f
  550.     set x
  551. } {0 {} -1 {}}
  552. test io-6.19 {Tcl_GetsObj: cr mode: 1 char} {
  553.     set f [open $path(test1) w]
  554.     fconfigure $f -translation lf
  555.     puts -nonewline $f a
  556.     close $f
  557.     set f [open $path(test1)]
  558.     fconfigure $f -translation cr
  559.     set x [list [gets $f line] $line [gets $f line] $line]
  560.     close $f
  561.     set x
  562. } {1 a -1 {}}
  563. test io-6.20 {Tcl_GetsObj: cr mode: 1 char followed by EOL} {
  564.     set f [open $path(test1) w]
  565.     fconfigure $f -translation lf
  566.     puts -nonewline $f "ar"
  567.     close $f
  568.     set f [open $path(test1)]
  569.     fconfigure $f -translation cr
  570.     set x [list [gets $f line] $line [gets $f line] $line]
  571.     close $f
  572.     set x
  573. } {1 a -1 {}}
  574. test io-6.21 {Tcl_GetsObj: cr mode: several chars} {
  575.     set f [open $path(test1) w]
  576.     fconfigure $f -translation lf
  577.     puts -nonewline $f "abcdnefghrijklrnmnop"
  578.     close $f
  579.     set f [open $path(test1)]
  580.     fconfigure $f -translation cr
  581.     set x [list [gets $f line] $line [gets $f line] $line [gets $f line] $line [gets $f line] $line]
  582.     close $f
  583.     set x
  584. } [list 9 "abcdnefgh" 4 "ijkl" 5 "nmnop" -1 ""]
  585. test io-6.22 {Tcl_GetsObj: crlf mode: no chars} {
  586.     set f [open $path(test1) w]
  587.     close $f
  588.     set f [open $path(test1)]
  589.     fconfigure $f -translation crlf
  590.     set x [list [gets $f line] $line]
  591.     close $f
  592.     set x
  593. } {-1 {}}
  594. test io-6.23 {Tcl_GetsObj: crlf mode: lone n} {
  595.     set f [open $path(test1) w]
  596.     fconfigure $f -translation lf
  597.     puts -nonewline $f "n"
  598.     close $f
  599.     set f [open $path(test1)]
  600.     fconfigure $f -translation crlf
  601.     set x [list [gets $f line] $line [gets $f line] $line]
  602.     close $f
  603.     set x
  604. } [list 1 "n" -1 ""]
  605. test io-6.24 {Tcl_GetsObj: crlf mode: lone r} {
  606.     set f [open $path(test1) w]
  607.     fconfigure $f -translation lf
  608.     puts -nonewline $f "r"
  609.     close $f
  610.     set f [open $path(test1)]
  611.     fconfigure $f -translation crlf
  612.     set x [list [gets $f line] $line [gets $f line] $line]
  613.     close $f
  614.     set x
  615. } [list 1 "r" -1 ""]
  616. test io-6.25 {Tcl_GetsObj: crlf mode: rr} {
  617.     set f [open $path(test1) w]
  618.     fconfigure $f -translation lf
  619.     puts -nonewline $f "rr"
  620.     close $f
  621.     set f [open $path(test1)]
  622.     fconfigure $f -translation crlf
  623.     set x [list [gets $f line] $line [gets $f line] $line]
  624.     close $f
  625.     set x
  626. } [list 2 "rr" -1 ""]
  627. test io-6.26 {Tcl_GetsObj: crlf mode: rn} {
  628.     set f [open $path(test1) w]
  629.     fconfigure $f -translation lf
  630.     puts -nonewline $f "rn"
  631.     close $f
  632.     set f [open $path(test1)]
  633.     fconfigure $f -translation crlf
  634.     set x [list [gets $f line] $line [gets $f line] $line]
  635.     close $f
  636.     set x
  637. } [list 0 "" -1 ""]
  638. test io-6.27 {Tcl_GetsObj: crlf mode: 1 char} {
  639.     set f [open $path(test1) w]
  640.     fconfigure $f -translation lf
  641.     puts -nonewline $f a
  642.     close $f
  643.     set f [open $path(test1)]
  644.     fconfigure $f -translation crlf
  645.     set x [list [gets $f line] $line [gets $f line] $line]
  646.     close $f
  647.     set x
  648. } {1 a -1 {}}
  649. test io-6.28 {Tcl_GetsObj: crlf mode: 1 char followed by EOL} {
  650.     set f [open $path(test1) w]
  651.     fconfigure $f -translation lf
  652.     puts -nonewline $f "arn"
  653.     close $f
  654.     set f [open $path(test1)]
  655.     fconfigure $f -translation crlf
  656.     set x [list [gets $f line] $line [gets $f line] $line]
  657.     close $f
  658.     set x
  659. } {1 a -1 {}}
  660. test io-6.29 {Tcl_GetsObj: crlf mode: several chars} {
  661.     set f [open $path(test1) w]
  662.     fconfigure $f -translation lf
  663.     puts -nonewline $f "abcdnefghrijklrnmnop"
  664.     close $f
  665.     set f [open $path(test1)]
  666.     fconfigure $f -translation crlf
  667.     set x [list [gets $f line] $line [gets $f line] $line [gets $f line] $line]
  668.     close $f
  669.     set x
  670. } [list 14 "abcdnefghrijkl" 4 "mnop" -1 ""]
  671. test io-6.30 {Tcl_GetsObj: crlf mode: buffer exhausted} {testchannel} {
  672.     # if (eol >= dstEnd)
  673.     set f [open $path(test1) w]
  674.     fconfigure $f -translation lf
  675.     puts -nonewline $f "123456789012345rnabcdefghijklmnoprstuvwxyz"
  676.     close $f
  677.     set f [open $path(test1)]
  678.     fconfigure $f -translation crlf -buffersize 16
  679.     set x [list [gets $f line] $line [testchannel inputbuffered $f]]
  680.     close $f
  681.     set x
  682. } [list 15 "123456789012345" 15]
  683. test io-6.31 {Tcl_GetsObj: crlf mode: buffer exhausted, blocked} {stdio testchannel openpipe fileevent} {
  684.     # (FilterInputBytes() != 0)
  685.     set f [open "|[list [interpreter] $path(cat)]" w+]
  686.     fconfigure $f -translation {crlf lf} -buffering none
  687.     puts -nonewline $f "bbbbbbbbbbbbbbrn123456789012345r"
  688.     fconfigure $f -buffersize 16
  689.     set x [gets $f]
  690.     fconfigure $f -blocking 0
  691.     lappend x [gets $f line] $line [fblocked $f] [testchannel inputbuffered $f]
  692.     close $f
  693.     set x
  694. } [list "bbbbbbbbbbbbbb" -1 "" 1 16]
  695. test io-6.32 {Tcl_GetsObj: crlf mode: buffer exhausted, more data} {testchannel} {
  696.     # not (FilterInputBytes() != 0)
  697.     set f [open $path(test1) w]
  698.     fconfigure $f -translation lf
  699.     puts -nonewline $f "123456789012345rn123"
  700.     close $f
  701.     set f [open $path(test1)]
  702.     fconfigure $f -translation crlf -buffersize 16
  703.     set x [list [gets $f line] $line [tell $f] [testchannel inputbuffered $f]]
  704.     close $f
  705.     set x
  706. } [list 15 "123456789012345" 17 3]
  707. test io-6.33 {Tcl_GetsObj: crlf mode: buffer exhausted, at eof} {
  708.     # eol still equals dstEnd
  709.     
  710.     set f [open $path(test1) w]
  711.     fconfigure $f -translation lf
  712.     puts -nonewline $f "123456789012345r"
  713.     close $f
  714.     set f [open $path(test1)]
  715.     fconfigure $f -translation crlf -buffersize 16
  716.     set x [list [gets $f line] $line [eof $f]]
  717.     close $f
  718.     set x
  719. } [list 16 "123456789012345r" 1]
  720. test io-6.34 {Tcl_GetsObj: crlf mode: buffer exhausted, not followed by n} {
  721.     # not (*eol == 'n') 
  722.     
  723.     set f [open $path(test1) w]
  724.     fconfigure $f -translation lf
  725.     puts -nonewline $f "123456789012345rabcdrnefg"
  726.     close $f
  727.     set f [open $path(test1)]
  728.     fconfigure $f -translation crlf -buffersize 16
  729.     set x [list [gets $f line] $line [tell $f]]
  730.     close $f
  731.     set x
  732. } [list 20 "123456789012345rabcd" 22]
  733. test io-6.35 {Tcl_GetsObj: auto mode: no chars} {
  734.     set f [open $path(test1) w]
  735.     close $f
  736.     set f [open $path(test1)]
  737.     fconfigure $f -translation auto
  738.     set x [list [gets $f line] $line]
  739.     close $f
  740.     set x
  741. } {-1 {}}
  742. test io-6.36 {Tcl_GetsObj: auto mode: lone n} {
  743.     set f [open $path(test1) w]
  744.     fconfigure $f -translation lf
  745.     puts -nonewline $f "n"
  746.     close $f
  747.     set f [open $path(test1)]
  748.     fconfigure $f -translation auto
  749.     set x [list [gets $f line] $line [gets $f line] $line]
  750.     close $f
  751.     set x
  752. } [list 0 "" -1 ""]
  753. test io-6.37 {Tcl_GetsObj: auto mode: lone r} {
  754.     set f [open $path(test1) w]
  755.     fconfigure $f -translation lf
  756.     puts -nonewline $f "r"
  757.     close $f
  758.     set f [open $path(test1)]
  759.     fconfigure $f -translation auto
  760.     set x [list [gets $f line] $line [gets $f line] $line]
  761.     close $f
  762.     set x
  763. } [list 0 "" -1 ""]
  764. test io-6.38 {Tcl_GetsObj: auto mode: rr} {
  765.     set f [open $path(test1) w]
  766.     fconfigure $f -translation lf
  767.     puts -nonewline $f "rr"
  768.     close $f
  769.     set f [open $path(test1)]
  770.     fconfigure $f -translation auto
  771.     set x [list [gets $f line] $line [gets $f line] $line [gets $f line] $line]
  772.     close $f
  773.     set x
  774. } [list 0 "" 0 "" -1 ""]
  775. test io-6.39 {Tcl_GetsObj: auto mode: rn} {
  776.     set f [open $path(test1) w]
  777.     fconfigure $f -translation lf
  778.     puts -nonewline $f "rn"
  779.     close $f
  780.     set f [open $path(test1)]
  781.     fconfigure $f -translation auto
  782.     set x [list [gets $f line] $line [gets $f line] $line]
  783.     close $f
  784.     set x
  785. } [list 0 "" -1 ""]
  786. test io-6.40 {Tcl_GetsObj: auto mode: 1 char} {
  787.     set f [open $path(test1) w]
  788.     fconfigure $f -translation lf
  789.     puts -nonewline $f a
  790.     close $f
  791.     set f [open $path(test1)]
  792.     fconfigure $f -translation auto
  793.     set x [list [gets $f line] $line [gets $f line] $line]
  794.     close $f
  795.     set x
  796. } {1 a -1 {}}
  797. test io-6.41 {Tcl_GetsObj: auto mode: 1 char followed by EOL} {
  798.     set f [open $path(test1) w]
  799.     fconfigure $f -translation lf
  800.     puts -nonewline $f "arn"
  801.     close $f
  802.     set f [open $path(test1)]
  803.     fconfigure $f -translation auto
  804.     set x [list [gets $f line] $line [gets $f line] $line]
  805.     close $f
  806.     set x
  807. } {1 a -1 {}}
  808. test io-6.42 {Tcl_GetsObj: auto mode: several chars} {
  809.     set f [open $path(test1) w]
  810.     fconfigure $f -translation lf
  811.     puts -nonewline $f "abcdnefghrijklrnmnop"
  812.     close $f
  813.     set f [open $path(test1)]
  814.     fconfigure $f -translation auto
  815.     set x [list [gets $f line] $line [gets $f line] $line]
  816.     lappend x [gets $f line] $line [gets $f line] $line [gets $f line] $line
  817.     close $f
  818.     set x
  819. } [list 4 "abcd" 4 "efgh" 4 "ijkl" 4 "mnop" -1 ""]
  820. test io-6.43 {Tcl_GetsObj: input saw cr} {stdio testchannel openpipe fileevent} {
  821.     # if (chanPtr->flags & INPUT_SAW_CR)
  822.     set f [open "|[list [interpreter] $path(cat)]" w+]
  823.     fconfigure $f -translation {auto lf} -buffering none
  824.     puts -nonewline $f "bbbbbbbbbbbbbbbn123456789abcdefr"
  825.     fconfigure $f -buffersize 16
  826.     set x [list [gets $f]]
  827.     fconfigure $f -blocking 0
  828.     lappend x [gets $f line] $line [testchannel queuedcr $f] 
  829.     fconfigure $f -blocking 1
  830.     puts -nonewline $f "nabcdrefgx1a"
  831.     lappend x [gets $f line] $line [testchannel queuedcr $f]
  832.     lappend x [gets $f line] $line
  833.     close $f
  834.     set x
  835. } [list "bbbbbbbbbbbbbbb" 15 "123456789abcdef" 1 4 "abcd" 0 3 "efg"]
  836. test io-6.44 {Tcl_GetsObj: input saw cr, not followed by cr} {stdio testchannel openpipe fileevent} {
  837.     # not (*eol == 'n') 
  838.     set f [open "|[list [interpreter] $path(cat)]" w+]
  839.     fconfigure $f -translation {auto lf} -buffering none
  840.     puts -nonewline $f "bbbbbbbbbbbbbbbn123456789abcdefr"
  841.     fconfigure $f -buffersize 16
  842.     set x [list [gets $f]]
  843.     fconfigure $f -blocking 0
  844.     lappend x [gets $f line] $line [testchannel queuedcr $f] 
  845.     fconfigure $f -blocking 1
  846.     puts -nonewline $f "abcdrefgx1a"
  847.     lappend x [gets $f line] $line [testchannel queuedcr $f]
  848.     lappend x [gets $f line] $line
  849.     close $f
  850.     set x
  851. } [list "bbbbbbbbbbbbbbb" 15 "123456789abcdef" 1 4 "abcd" 0 3 "efg"]
  852. test io-6.45 {Tcl_GetsObj: input saw cr, skip right number of bytes} {stdio testchannel openpipe fileevent} {
  853.     # Tcl_ExternalToUtf()
  854.     set f [open "|[list [interpreter] $path(cat)]" w+]
  855.     fconfigure $f -translation {auto lf} -buffering none
  856.     fconfigure $f -encoding unicode
  857.     puts -nonewline $f "bbbbbbbbbbbbbbbn123456789abcdefr"
  858.     fconfigure $f -buffersize 16
  859.     gets $f
  860.     fconfigure $f -blocking 0
  861.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  862.     fconfigure $f -blocking 1
  863.     puts -nonewline $f "nabcdrefg"
  864.     lappend x [gets $f line] $line [testchannel queuedcr $f]
  865.     close $f
  866.     set x
  867. } [list 15 "123456789abcdef" 1 4 "abcd" 0]
  868. test io-6.46 {Tcl_GetsObj: input saw cr, followed by just n should give eof} {stdio testchannel openpipe fileevent} {
  869.     # memmove()
  870.     set f [open "|[list [interpreter] $path(cat)]" w+]
  871.     fconfigure $f -translation {auto lf} -buffering none
  872.     puts -nonewline $f "bbbbbbbbbbbbbbbn123456789abcdefr"
  873.     fconfigure $f -buffersize 16
  874.     gets $f
  875.     fconfigure $f -blocking 0
  876.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  877.     fconfigure $f -blocking 1
  878.     puts -nonewline $f "nx1a"
  879.     lappend x [gets $f line] $line [testchannel queuedcr $f]
  880.     close $f
  881.     set x
  882. } [list 15 "123456789abcdef" 1 -1 "" 0]
  883. test io-6.47 {Tcl_GetsObj: auto mode: r at end of buffer, peek for n} {testchannel} {
  884.     # (eol == dstEnd)
  885.     set f [open $path(test1) w]
  886.     fconfigure $f -translation lf
  887.     puts -nonewline $f "123456789012345rnabcdefghijklmnopq"
  888.     close $f
  889.     set f [open $path(test1)]
  890.     fconfigure $f -translation auto -buffersize 16
  891.     set x [list [gets $f] [testchannel inputbuffered $f]]
  892.     close $f
  893.     set x
  894. } [list "123456789012345" 15]    
  895. test io-6.48 {Tcl_GetsObj: auto mode: r at end of buffer, no more avail} {testchannel} {
  896.     # PeekAhead() did not get any, so (eol >= dstEnd)
  897.     
  898.     set f [open $path(test1) w]
  899.     fconfigure $f -translation lf
  900.     puts -nonewline $f "123456789012345r"
  901.     close $f
  902.     set f [open $path(test1)]
  903.     fconfigure $f -translation auto -buffersize 16
  904.     set x [list [gets $f] [testchannel queuedcr $f]]
  905.     close $f
  906.     set x
  907. } [list "123456789012345" 1]
  908. test io-6.49 {Tcl_GetsObj: auto mode: r followed by n} {testchannel} {
  909.     # if (*eol == 'n') {skip++}
  910.     
  911.     set f [open $path(test1) w]
  912.     fconfigure $f -translation lf
  913.     puts -nonewline $f "123456rn78901"
  914.     close $f
  915.     set f [open $path(test1)]
  916.     set x [list [gets $f] [testchannel queuedcr $f] [tell $f] [gets $f]]
  917.     close $f
  918.     set x
  919. } [list "123456" 0 8 "78901"]
  920. test io-6.50 {Tcl_GetsObj: auto mode: r not followed by n} {testchannel} {
  921.     # not (*eol == 'n') 
  922.     
  923.     set f [open $path(test1) w]
  924.     fconfigure $f -translation lf
  925.     puts -nonewline $f "123456r78901"
  926.     close $f
  927.     set f [open $path(test1)]
  928.     set x [list [gets $f] [testchannel queuedcr $f] [tell $f] [gets $f]]
  929.     close $f
  930.     set x
  931. } [list "123456" 0 7 "78901"]
  932. test io-6.51 {Tcl_GetsObj: auto mode: n} {
  933.     # else if (*eol == 'n') {goto gotoeol;}
  934.     
  935.     set f [open $path(test1) w]
  936.     fconfigure $f -translation lf
  937.     puts -nonewline $f "123456n78901"
  938.     close $f
  939.     set f [open $path(test1)]
  940.     set x [list [gets $f] [tell $f] [gets $f]]
  941.     close $f
  942.     set x
  943. } [list "123456" 7 "78901"]
  944. test io-6.52 {Tcl_GetsObj: saw EOF character} {testchannel} {
  945.     # if (eof != NULL)
  946.     set f [open $path(test1) w]
  947.     fconfigure $f -translation lf
  948.     puts -nonewline $f "123456x1ak9012345r"
  949.     close $f
  950.     set f [open $path(test1)]
  951.     fconfigure $f -eofchar x1a
  952.     set x [list [gets $f] [testchannel queuedcr $f] [tell $f] [gets $f]]
  953.     close $f
  954.     set x
  955. } [list "123456" 0 6 ""]
  956. test io-6.53 {Tcl_GetsObj: device EOF} {
  957.     # didn't produce any bytes
  958.     set f [open $path(test1) w]
  959.     close $f
  960.     set f [open $path(test1)]
  961.     set x [list [gets $f line] $line [eof $f]]
  962.     close $f
  963.     set x
  964. } {-1 {} 1}
  965. test io-6.54 {Tcl_GetsObj: device EOF} {
  966.     # got some bytes before EOF.
  967.     set f [open $path(test1) w]
  968.     puts -nonewline $f abc
  969.     close $f
  970.     set f [open $path(test1)]
  971.     set x [list [gets $f line] $line [eof $f]]
  972.     close $f
  973.     set x
  974. } {3 abc 1}
  975. test io-6.55 {Tcl_GetsObj: overconverted} {
  976.     # Tcl_ExternalToUtf(), make sure state updated
  977.     set f [open $path(test1) w]
  978.     fconfigure $f -encoding iso2022-jp
  979.     puts $f "thereu4e00oknu4e01more bytesnhere"
  980.     close $f
  981.     set f [open $path(test1)]
  982.     fconfigure $f -encoding iso2022-jp
  983.     set x [list [gets $f line] $line [gets $f line] $line [gets $f line] $line]
  984.     close $f
  985.     set x
  986. } [list 8 "thereu4e00ok" 11 "u4e01more bytes" 4 "here"]
  987. test io-6.56 {Tcl_GetsObj: incomplete lines should disable file events} {stdio openpipe fileevent} {
  988.     update
  989.     set f [open "|[list [interpreter] $path(cat)]" w+]
  990.     fconfigure $f -buffering none
  991.     puts -nonewline $f "foobar"
  992.     fconfigure $f -blocking 0
  993.     variable x {}
  994.     after 500 [namespace code { lappend x timeout }]
  995.     fileevent $f readable [namespace code { lappend x [gets $f] }]
  996.     vwait [namespace which -variable x]
  997.     vwait [namespace which -variable x]
  998.     fconfigure $f -blocking 1
  999.     puts -nonewline $f "bazn"
  1000.     after 500 [namespace code { lappend x timeout }]
  1001.     fconfigure $f -blocking 0
  1002.     vwait [namespace which -variable x]
  1003.     vwait [namespace which -variable x]
  1004.     close $f
  1005.     set x
  1006. } {{} timeout foobarbaz timeout}
  1007. test io-7.1 {FilterInputBytes: split up character at end of buffer} {
  1008.     # (result == TCL_CONVERT_MULTIBYTE)
  1009.     set f [open $path(test1) w]
  1010.     fconfigure $f -encoding shiftjis
  1011.     puts $f "1234567890123uff10uff11uff12uff13uff14nend"
  1012.     close $f
  1013.     set f [open $path(test1)]
  1014.     fconfigure $f -encoding shiftjis -buffersize 16
  1015.     set x [gets $f]
  1016.     close $f
  1017.     set x
  1018. } "1234567890123uff10uff11uff12uff13uff14"
  1019. test io-7.2 {FilterInputBytes: split up character in middle of buffer} {
  1020.     # (bufPtr->nextAdded < bufPtr->bufLength)
  1021.     
  1022.     set f [open $path(test1) w]
  1023.     fconfigure $f -encoding binary
  1024.     puts -nonewline $f "1234567890n123x82x4fx82x50x82"
  1025.     close $f
  1026.     set f [open $path(test1)]
  1027.     fconfigure $f -encoding shiftjis
  1028.     set x [list [gets $f line] $line [eof $f]]
  1029.     close $f
  1030.     set x
  1031. } [list 10 "1234567890" 0]
  1032. test io-7.3 {FilterInputBytes: split up character at EOF} {testchannel} {
  1033.     set f [open $path(test1) w]
  1034.     fconfigure $f -encoding binary
  1035.     puts -nonewline $f "1234567890123x82x4fx82x50x82"
  1036.     close $f
  1037.     set f [open $path(test1)]
  1038.     fconfigure $f -encoding shiftjis
  1039.     set x [list [gets $f line] $line]
  1040.     lappend x [tell $f] [testchannel inputbuffered $f] [eof $f]
  1041.     lappend x [gets $f line] $line
  1042.     close $f
  1043.     set x
  1044. } [list 15 "1234567890123uff10uff11" 18 0 1 -1 ""]
  1045. test io-7.4 {FilterInputBytes: recover from split up character} {stdio openpipe fileevent} {
  1046.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1047.     fconfigure $f -encoding binary -buffering none
  1048.     puts -nonewline $f "1234567890123x82x4fx82x50x82"
  1049.     fconfigure $f -encoding shiftjis -blocking 0
  1050.     fileevent $f read [namespace code "ready $f"]
  1051.     variable x {}
  1052.     proc ready {f} {
  1053. variable x
  1054. lappend x [gets $f line] $line [fblocked $f]
  1055.     }
  1056.     vwait [namespace which -variable x]
  1057.     fconfigure $f -encoding binary -blocking 1
  1058.     puts $f "x51x82x52"
  1059.     fconfigure $f -encoding shiftjis
  1060.     vwait [namespace which -variable x]
  1061.     close $f
  1062.     set x
  1063. } [list -1 "" 1 17 "1234567890123uff10uff11uff12uff13" 0]
  1064. test io-8.1 {PeekAhead: only go to device if no more cached data} {testchannel} {
  1065.     # (bufPtr->nextPtr == NULL)
  1066.     set f [open $path(test1) w]
  1067.     fconfigure $f -encoding ascii -translation lf
  1068.     puts -nonewline $f "123456789012345rn2345678"
  1069.     close $f
  1070.     set f [open $path(test1)]
  1071.     fconfigure $f -encoding ascii -translation auto -buffersize 16
  1072.     # here
  1073.     gets $f
  1074.     set x [testchannel inputbuffered $f]
  1075.     close $f
  1076.     set x
  1077. } "7"
  1078. test io-8.2 {PeekAhead: only go to device if no more cached data} {stdio testchannel openpipe fileevent} {
  1079.     # not (bufPtr->nextPtr == NULL)
  1080.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1081.     fconfigure $f -translation lf -encoding ascii -buffering none
  1082.     puts -nonewline $f "123456789012345rnbcdefghijklmnopqrstuvwxyz"
  1083.     variable x {}
  1084.     fileevent $f read [namespace code "ready $f"]
  1085.     proc ready {f} {
  1086. variable x
  1087. lappend x [gets $f line] $line [testchannel inputbuffered $f]
  1088.     }
  1089.     fconfigure $f -encoding unicode -buffersize 16 -blocking 0
  1090.     vwait [namespace which -variable x]
  1091.     fconfigure $f -translation auto -encoding ascii -blocking 1
  1092.     # here
  1093.     vwait [namespace which -variable x]
  1094.     close $f
  1095.     set x
  1096. } [list -1 "" 42 15 "123456789012345" 25]
  1097. test io-8.3 {PeekAhead: no cached data available} {stdio testchannel openpipe fileevent} {
  1098.     # (bytesLeft == 0)
  1099.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1100.     fconfigure $f -translation {auto binary}
  1101.     puts -nonewline $f "abcdefghijklmnor"
  1102.     flush $f
  1103.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  1104.     close $f
  1105.     set x
  1106. } [list 15 "abcdefghijklmno" 1]
  1107. set a "123456789012345678901234567890"
  1108. append a "123456789012345678901234567890"
  1109. append a "1234567890123456789012345678901"
  1110. test io-8.4 {PeekAhead: cached data available in this buffer} {
  1111.     # not (bytesLeft == 0)
  1112.     set f [open $path(test1) w+]
  1113.     fconfigure $f -translation binary
  1114.     puts $f "${a}rnabcdef"
  1115.     close $f
  1116.     set f [open $path(test1)]
  1117.     fconfigure $f -encoding binary -translation auto
  1118.     # "${a}r" was converted in one operation (because ENCODING_LINESIZE
  1119.     # is 30).  To check if "n" follows, calls PeekAhead and determines
  1120.     # that cached data is available in buffer w/o having to call driver.
  1121.     set x [gets $f]
  1122.     close $f
  1123.     set x    
  1124. } $a
  1125. unset a
  1126. test io-8.5 {PeekAhead: don't peek if last read was short} {stdio testchannel openpipe fileevent} {
  1127.     # (bufPtr->nextAdded < bufPtr->length)
  1128.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1129.     fconfigure $f -translation {auto binary}
  1130.     puts -nonewline $f "abcdefghijklmnor"
  1131.     flush $f
  1132.     # here
  1133.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  1134.     close $f
  1135.     set x
  1136. } {15 abcdefghijklmno 1}
  1137. test io-8.6 {PeekAhead: change to non-blocking mode} {stdio testchannel openpipe fileevent} {
  1138.     # ((chanPtr->flags & CHANNEL_NONBLOCKING) == 0) 
  1139.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1140.     fconfigure $f -translation {auto binary} -buffersize 16
  1141.     puts -nonewline $f "abcdefghijklmnor"
  1142.     flush $f
  1143.     # here
  1144.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  1145.     close $f
  1146.     set x
  1147. } {15 abcdefghijklmno 1}
  1148. test io-8.7 {PeekAhead: cleanup} {stdio testchannel openpipe fileevent} {
  1149.     # Make sure bytes are removed from buffer.
  1150.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1151.     fconfigure $f -translation {auto binary} -buffering none
  1152.     puts -nonewline $f "abcdefghijklmnor"
  1153.     # here
  1154.     set x [list [gets $f line] $line [testchannel queuedcr $f]]
  1155.     puts -nonewline $f "x1a"
  1156.     lappend x [gets $f line] $line
  1157.     close $f
  1158.     set x
  1159. } {15 abcdefghijklmno 1 -1 {}}
  1160.     
  1161. test io-9.1 {CommonGetsCleanup} {
  1162. } {}
  1163. test io-10.1 {Tcl_ReadChars: CheckChannelErrors} {
  1164.     # no test, need to cause an async error.
  1165. } {}
  1166. test io-10.2 {Tcl_ReadChars: loop until enough copied} {
  1167.     # one time
  1168.     # for (copied = 0; (unsigned) toRead > 0; )
  1169.     set f [open $path(test1) w]
  1170.     puts $f abcdefghijklmnop
  1171.     close $f
  1172.     set f [open $path(test1)]
  1173.     set x [read $f 5]
  1174.     close $f
  1175.     set x
  1176. } {abcde}
  1177. test io-10.3 {Tcl_ReadChars: loop until enough copied} {
  1178.     # multiple times
  1179.     # for (copied = 0; (unsigned) toRead > 0; )
  1180.     set f [open $path(test1) w]
  1181.     puts $f abcdefghijklmnopqrstuvwxyz
  1182.     close $f
  1183.     set f [open $path(test1)]
  1184.     fconfigure $f -buffersize 16
  1185.     # here
  1186.     set x [read $f 19]
  1187.     close $f
  1188.     set x
  1189. } {abcdefghijklmnopqrs}
  1190. test io-10.4 {Tcl_ReadChars: no more in channel buffer} {
  1191.     # (copiedNow < 0)
  1192.     set f [open $path(test1) w]
  1193.     puts -nonewline $f abcdefghijkl
  1194.     close $f
  1195.     set f [open $path(test1)]
  1196.     # here
  1197.     set x [read $f 1000]
  1198.     close $f
  1199.     set x
  1200. } {abcdefghijkl}
  1201. test io-10.5 {Tcl_ReadChars: stop on EOF} {
  1202.     # (chanPtr->flags & CHANNEL_EOF)
  1203.     set f [open $path(test1) w]
  1204.     puts -nonewline $f abcdefghijkl
  1205.     close $f
  1206.     set f [open $path(test1)]
  1207.     # here
  1208.     set x [read $f 1000]
  1209.     close $f
  1210.     set x
  1211. } {abcdefghijkl}
  1212. test io-11.1 {ReadBytes: want to read a lot} {
  1213.     # ((unsigned) toRead > (unsigned) srcLen)
  1214.     set f [open $path(test1) w]
  1215.     puts -nonewline $f abcdefghijkl
  1216.     close $f
  1217.     set f [open $path(test1)]
  1218.     fconfigure $f -encoding binary
  1219.     # here
  1220.     set x [read $f 1000]
  1221.     close $f
  1222.     set x
  1223. } {abcdefghijkl}
  1224. test io-11.2 {ReadBytes: want to read all} {
  1225.     # ((unsigned) toRead > (unsigned) srcLen)
  1226.     set f [open $path(test1) w]
  1227.     puts -nonewline $f abcdefghijkl
  1228.     close $f
  1229.     set f [open $path(test1)]
  1230.     fconfigure $f -encoding binary
  1231.     # here
  1232.     set x [read $f]
  1233.     close $f
  1234.     set x
  1235. } {abcdefghijkl}
  1236. test io-11.3 {ReadBytes: allocate more space} {
  1237.     # (toRead > length - offset - 1)
  1238.     set f [open $path(test1) w]
  1239.     puts -nonewline $f abcdefghijklmnopqrstuvwxyz
  1240.     close $f
  1241.     set f [open $path(test1)]
  1242.     fconfigure $f -buffersize 16 -encoding binary
  1243.     # here
  1244.     set x [read $f]
  1245.     close $f
  1246.     set x
  1247. } {abcdefghijklmnopqrstuvwxyz}
  1248. test io-11.4 {ReadBytes: EOF char found} {
  1249.     # (TranslateInputEOL() != 0)
  1250.     set f [open $path(test1) w]
  1251.     puts $f abcdefghijklmnopqrstuvwxyz
  1252.     close $f
  1253.     set f [open $path(test1)]
  1254.     fconfigure $f -eofchar m -encoding binary
  1255.     # here
  1256.     set x [list [read $f] [eof $f] [read $f] [eof $f]]
  1257.     close $f
  1258.     set x
  1259. } [list "abcdefghijkl" 1 "" 1]
  1260.     
  1261. test io-12.1 {ReadChars: want to read a lot} {
  1262.     # ((unsigned) toRead > (unsigned) srcLen)
  1263.     set f [open $path(test1) w]
  1264.     puts -nonewline $f abcdefghijkl
  1265.     close $f
  1266.     set f [open $path(test1)]
  1267.     # here
  1268.     set x [read $f 1000]
  1269.     close $f
  1270.     set x
  1271. } {abcdefghijkl}
  1272. test io-12.2 {ReadChars: want to read all} {
  1273.     # ((unsigned) toRead > (unsigned) srcLen)
  1274.     set f [open $path(test1) w]
  1275.     puts -nonewline $f abcdefghijkl
  1276.     close $f
  1277.     set f [open $path(test1)]
  1278.     # here
  1279.     set x [read $f]
  1280.     close $f
  1281.     set x
  1282. } {abcdefghijkl}
  1283. test io-12.3 {ReadChars: allocate more space} {
  1284.     # (toRead > length - offset - 1)
  1285.     set f [open $path(test1) w]
  1286.     puts -nonewline $f abcdefghijklmnopqrstuvwxyz
  1287.     close $f
  1288.     set f [open $path(test1)]
  1289.     fconfigure $f -buffersize 16
  1290.     # here
  1291.     set x [read $f]
  1292.     close $f
  1293.     set x
  1294. } {abcdefghijklmnopqrstuvwxyz}
  1295. test io-12.4 {ReadChars: split-up char} {stdio testchannel openpipe fileevent} {
  1296.     # (srcRead == 0)
  1297.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1298.     fconfigure $f -encoding binary -buffering none -buffersize 16
  1299.     puts -nonewline $f "123456789012345x96"
  1300.     fconfigure $f -encoding shiftjis -blocking 0
  1301.     fileevent $f read [namespace code "ready $f"]
  1302.     proc ready {f} {
  1303. variable x
  1304. lappend x [read $f] [testchannel inputbuffered $f]
  1305.     }
  1306.     variable x {}
  1307.     fconfigure $f -encoding shiftjis
  1308.     vwait [namespace which -variable x]
  1309.     fconfigure $f -encoding binary -blocking 1
  1310.     puts -nonewline $f "x7b"
  1311.     after 500 ;# Give the cat process time to catch up
  1312.     fconfigure $f -encoding shiftjis -blocking 0
  1313.     vwait [namespace which -variable x]
  1314.     close $f
  1315.     set x
  1316. } [list "123456789012345" 1 "u672c" 0]
  1317. test io-12.5 {ReadChars: fileevents on partial characters} {stdio openpipe fileevent} {
  1318.     set path(test1) [makeFile {
  1319. fconfigure stdout -encoding binary -buffering none
  1320. gets stdin; puts -nonewline "xe7"
  1321. gets stdin; puts -nonewline "x89"
  1322. gets stdin; puts -nonewline "xa6"
  1323.     } test1]
  1324.     set f [open "|[list [interpreter] $path(test1)]" r+]
  1325.     fileevent $f readable [namespace code {
  1326. lappend x [read $f]
  1327. if {[eof $f]} {
  1328.     lappend x eof
  1329. }
  1330.     }]
  1331.     puts $f "go1"
  1332.     flush $f
  1333.     fconfigure $f -blocking 0 -encoding utf-8
  1334.     variable x {}
  1335.     vwait [namespace which -variable x]
  1336.     after 500 [namespace code { lappend x timeout }]
  1337.     vwait [namespace which -variable x]
  1338.     puts $f "go2"
  1339.     flush $f
  1340.     vwait [namespace which -variable x]
  1341.     after 500 [namespace code { lappend x timeout }]
  1342.     vwait [namespace which -variable x]
  1343.     puts $f "go3"
  1344.     flush $f
  1345.     vwait [namespace which -variable x]
  1346.     vwait [namespace which -variable x]
  1347.     lappend x [catch {close $f} msg] $msg
  1348.     set x
  1349. } "{} timeout {} timeout u7266 {} eof 0 {}"
  1350. test io-13.1 {TranslateInputEOL: cr mode} {} {
  1351.     set f [open $path(test1) w]
  1352.     fconfigure $f -translation lf
  1353.     puts -nonewline $f "abcdrdefr"
  1354.     close $f
  1355.     set f [open $path(test1)]
  1356.     fconfigure $f -translation cr
  1357.     set x [read $f]
  1358.     close $f
  1359.     set x
  1360. } "abcdndefn"
  1361. test io-13.2 {TranslateInputEOL: crlf mode} {
  1362.     set f [open $path(test1) w]
  1363.     fconfigure $f -translation lf
  1364.     puts -nonewline $f "abcdrndefrn"
  1365.     close $f
  1366.     set f [open $path(test1)]
  1367.     fconfigure $f -translation crlf
  1368.     set x [read $f]
  1369.     close $f
  1370.     set x
  1371. } "abcdndefn"
  1372. test io-13.3 {TranslateInputEOL: crlf mode: naked cr} {
  1373.     # (src >= srcMax) 
  1374.     set f [open $path(test1) w]
  1375.     fconfigure $f -translation lf
  1376.     puts -nonewline $f "abcdrndefr"
  1377.     close $f
  1378.     set f [open $path(test1)]
  1379.     fconfigure $f -translation crlf
  1380.     set x [read $f]
  1381.     close $f
  1382.     set x
  1383. } "abcdndefr"
  1384. test io-13.4 {TranslateInputEOL: crlf mode: cr followed by not n} {
  1385.     # (src >= srcMax) 
  1386.     set f [open $path(test1) w]
  1387.     fconfigure $f -translation lf
  1388.     puts -nonewline $f "abcdrndefrfgh"
  1389.     close $f
  1390.     set f [open $path(test1)]
  1391.     fconfigure $f -translation crlf
  1392.     set x [read $f]
  1393.     close $f
  1394.     set x
  1395. } "abcdndefrfgh"
  1396. test io-13.5 {TranslateInputEOL: crlf mode: naked lf} {
  1397.     # (src >= srcMax) 
  1398.     set f [open $path(test1) w]
  1399.     fconfigure $f -translation lf
  1400.     puts -nonewline $f "abcdrndefnfgh"
  1401.     close $f
  1402.     set f [open $path(test1)]
  1403.     fconfigure $f -translation crlf
  1404.     set x [read $f]
  1405.     close $f
  1406.     set x
  1407. } "abcdndefnfgh"
  1408. test io-13.6 {TranslateInputEOL: auto mode: saw cr in last segment} {stdio testchannel openpipe fileevent} {
  1409.     # (chanPtr->flags & INPUT_SAW_CR)
  1410.     # This test may fail on slower machines.
  1411.     set f [open "|[list [interpreter] $path(cat)]" w+]
  1412.     fconfigure $f -blocking 0 -buffering none -translation {auto lf}
  1413.     fileevent $f read [namespace code "ready $f"]
  1414.     proc ready {f} {
  1415. variable x
  1416. lappend x [read $f] [testchannel queuedcr $f]
  1417.     }
  1418.     variable x {}
  1419.     variable y {}
  1420.     puts -nonewline $f "abcdefghjr"
  1421.     after 500 [namespace code {set y ok}]
  1422.     vwait [namespace which -variable y]
  1423.     puts -nonewline $f "n01234"
  1424.     after 500 [namespace code {set y ok}]
  1425.     vwait [namespace which -variable y]
  1426.     close $f
  1427.     set x
  1428. } [list "abcdefghjn" 1 "01234" 0]
  1429. test io-13.7 {TranslateInputEOL: auto mode: naked r} {testchannel openpipe} {
  1430.     # (src >= srcMax)
  1431.     set f [open $path(test1) w]
  1432.     fconfigure $f -translation lf
  1433.     puts -nonewline $f "abcdr"
  1434.     close $f
  1435.     set f [open $path(test1)]
  1436.     fconfigure $f -translation auto
  1437.     set x [list [read $f] [testchannel queuedcr $f]]
  1438.     close $f
  1439.     set x
  1440. } [list "abcdn" 1]
  1441. test io-13.8 {TranslateInputEOL: auto mode: rn} {
  1442.     # (*src == 'n')
  1443.     set f [open $path(test1) w]
  1444.     fconfigure $f -translation lf
  1445.     puts -nonewline $f "abcdrndef"
  1446.     close $f
  1447.     set f [open $path(test1)]
  1448.     fconfigure $f -translation auto
  1449.     set x [read $f]
  1450.     close $f
  1451.     set x
  1452. } "abcdndef"
  1453. test io-13.9 {TranslateInputEOL: auto mode: r followed by not n} {
  1454.     set f [open $path(test1) w]
  1455.     fconfigure $f -translation lf
  1456.     puts -nonewline $f "abcdrdef"
  1457.     close $f
  1458.     set f [open $path(test1)]
  1459.     fconfigure $f -translation auto
  1460.     set x [read $f]
  1461.     close $f
  1462.     set x
  1463. } "abcdndef"
  1464. test io-13.10 {TranslateInputEOL: auto mode: n} {
  1465.     # not (*src == 'r') 
  1466.     set f [open $path(test1) w]
  1467.     fconfigure $f -translation lf
  1468.     puts -nonewline $f "abcdndef"
  1469.     close $f
  1470.     set f [open $path(test1)]
  1471.     fconfigure $f -translation auto
  1472.     set x [read $f]
  1473.     close $f
  1474.     set x
  1475. } "abcdndef"
  1476. test io-13.11 {TranslateInputEOL: EOF char} {
  1477.     # (*chanPtr->inEofChar != '')
  1478.     set f [open $path(test1) w]
  1479.     fconfigure $f -translation lf
  1480.     puts -nonewline $f "abcdndefgh"
  1481.     close $f
  1482.     set f [open $path(test1)]
  1483.     fconfigure $f -translation auto -eofchar e
  1484.     set x [read $f]
  1485.     close $f
  1486.     set x
  1487. } "abcdnd"
  1488. test io-13.12 {TranslateInputEOL: find EOF char in src} {
  1489.     # (*chanPtr->inEofChar != '')
  1490.     set f [open $path(test1) w]
  1491.     fconfigure $f -translation lf
  1492.     puts -nonewline $f "rnrnrnabrnrndefrnrnrn"
  1493.     close $f
  1494.     set f [open $path(test1)]
  1495.     fconfigure $f -translation auto -eofchar e
  1496.     set x [read $f]
  1497.     close $f
  1498.     set x
  1499. } "nnnabnnd"
  1500.     
  1501. # Test standard handle management. The functions tested are
  1502. # Tcl_SetStdChannel and Tcl_GetStdChannel. Incidentally we are
  1503. # also testing channel table management.
  1504. if {[info commands testchannel] != ""} {
  1505.     if {$tcl_platform(platform) == "macintosh"} {
  1506. set consoleFileNames [list console0 console1 console2]
  1507.     } else {
  1508. set consoleFileNames [lsort [testchannel open]]
  1509.     }
  1510. } else {
  1511.     # just to avoid an error
  1512.     set consoleFileNames [list]
  1513. }
  1514. test io-14.1 {Tcl_SetStdChannel and Tcl_GetStdChannel} {testchannel} {
  1515.     set l ""
  1516.     lappend l [fconfigure stdin -buffering]
  1517.     lappend l [fconfigure stdout -buffering]
  1518.     lappend l [fconfigure stderr -buffering]
  1519.     lappend l [lsort [testchannel open]]
  1520.     set l
  1521. } [list line line none $consoleFileNames]
  1522. test io-14.2 {Tcl_SetStdChannel and Tcl_GetStdChannel} {
  1523.     interp create x
  1524.     set l ""
  1525.     lappend l [x eval {fconfigure stdin -buffering}]
  1526.     lappend l [x eval {fconfigure stdout -buffering}]
  1527.     lappend l [x eval {fconfigure stderr -buffering}]
  1528.     interp delete x
  1529.     set l
  1530. } {line line none}
  1531. set path(test3) [makeFile {} test3]
  1532. test io-14.3 {Tcl_SetStdChannel & Tcl_GetStdChannel} {exec openpipe} {
  1533.     set f [open $path(test1) w]
  1534.     puts -nonewline $f {
  1535. close stdin
  1536. close stdout
  1537. close stderr
  1538. set f  [}
  1539.     puts $f [list open $path(test1) r]]
  1540.     puts $f "set f2 [[list open $path(test2) w]]"
  1541.     puts $f "set f3 [[list open $path(test3) w]]"
  1542.     puts $f { puts stdout [gets stdin]
  1543. puts stdout out
  1544. puts stderr err
  1545. close $f
  1546. close $f2
  1547. close $f3
  1548.     }
  1549.     close $f
  1550.     set result [exec [interpreter] $path(test1)]
  1551.     set f  [open $path(test2) r]
  1552.     set f2 [open $path(test3) r]
  1553.     lappend result [read $f] [read $f2]
  1554.     close $f
  1555.     close $f2
  1556.     set result
  1557. } {{
  1558. out
  1559. } {err
  1560. }}
  1561. # This test relies on the fact that the smallest available fd is used first.
  1562. test io-14.4 {Tcl_SetStdChannel & Tcl_GetStdChannel} {exec unixOnly} {
  1563.     set f [open $path(test1) w]
  1564.     puts -nonewline $f { close stdin
  1565. close stdout
  1566. close stderr
  1567. set f  [}
  1568.     puts $f [list open $path(test1) r]]
  1569.     puts $f "set f2 [[list open $path(test2) w]]"
  1570.     puts $f "set f3 [[list open $path(test3) w]]"
  1571.     puts $f { puts stdout [gets stdin]
  1572. puts stdout $f2
  1573. puts stderr $f3
  1574. close $f
  1575. close $f2
  1576. close $f3
  1577.     }
  1578.     close $f
  1579.     set result [exec [interpreter] $path(test1)]
  1580.     set f  [open $path(test2) r]
  1581.     set f2 [open $path(test3) r]
  1582.     lappend result [read $f] [read $f2]
  1583.     close $f
  1584.     close $f2
  1585.     set result
  1586. } {{ close stdin
  1587. file1
  1588. } {file2
  1589. }}
  1590. catch {interp delete z}
  1591. test io-14.5 {Tcl_GetChannel: stdio name translation} {
  1592.     interp create z
  1593.     eof stdin
  1594.     catch {z eval flush stdin} msg1
  1595.     catch {z eval close stdin} msg2
  1596.     catch {z eval flush stdin} msg3
  1597.     set result [list $msg1 $msg2 $msg3]
  1598.     interp delete z
  1599.     set result
  1600. } {{channel "stdin" wasn't opened for writing} {} {can not find channel named "stdin"}}
  1601. test io-14.6 {Tcl_GetChannel: stdio name translation} {
  1602.     interp create z
  1603.     eof stdout
  1604.     catch {z eval flush stdout} msg1
  1605.     catch {z eval close stdout} msg2
  1606.     catch {z eval flush stdout} msg3
  1607.     set result [list $msg1 $msg2 $msg3]
  1608.     interp delete z
  1609.     set result
  1610. } {{} {} {can not find channel named "stdout"}}
  1611. test io-14.7 {Tcl_GetChannel: stdio name translation} {
  1612.     interp create z
  1613.     eof stderr
  1614.     catch {z eval flush stderr} msg1
  1615.     catch {z eval close stderr} msg2
  1616.     catch {z eval flush stderr} msg3
  1617.     set result [list $msg1 $msg2 $msg3]
  1618.     interp delete z
  1619.     set result
  1620. } {{} {} {can not find channel named "stderr"}}
  1621. set path(script) [makeFile {} script]
  1622. test io-14.8 {reuse of stdio special channels} {stdio openpipe} {
  1623.     file delete $path(script)
  1624.     file delete $path(test1)
  1625.     set f [open $path(script) w]
  1626.     puts -nonewline $f {
  1627. close stderr
  1628. set f [}
  1629.     puts $f [list open $path(test1) w]]
  1630.     puts -nonewline $f {
  1631. puts stderr hello
  1632. close $f
  1633. set f [}
  1634.     puts $f [list open $path(test1) r]]
  1635.     puts $f {
  1636. puts [gets $f]
  1637.     }
  1638.     close $f
  1639.     set f [open "|[list [interpreter] $path(script)]" r]
  1640.     set c [gets $f]
  1641.     close $f
  1642.     set c
  1643. } hello
  1644. test io-14.9 {reuse of stdio special channels} {stdio openpipe fileevent} {
  1645.     file delete $path(script)
  1646.     file delete $path(test1)
  1647.     set f [open $path(script) w]
  1648.     puts $f {
  1649.         array set path [lindex $argv 0]
  1650. set f [open $path(test1) w]
  1651. puts $f hello
  1652. close $f
  1653. close stderr
  1654. set f [open "|[list [info nameofexecutable] $path(cat) $path(test1)]" r]
  1655. puts [gets $f]
  1656.     }
  1657.     close $f
  1658.     set f [open "|[list [interpreter] $path(script) [array get path]]" r]
  1659.     set c [gets $f]
  1660.     close $f
  1661.     # Added delay to give Windows time to stop the spawned process and clean
  1662.     # up its grip on the file test1. Added delete as proper test cleanup.
  1663.     # The failing tests were 18.1 and 18.2 as first re-users of file "test1".
  1664.     after 10000
  1665.     file delete $path(script)
  1666.     file delete $path(test1)
  1667.     set c
  1668. } hello
  1669. test io-15.1 {Tcl_CreateCloseHandler} {
  1670. } {}
  1671. test io-16.1 {Tcl_DeleteCloseHandler} {
  1672. } {}
  1673. # Test channel table management. The functions tested are
  1674. # GetChannelTable, DeleteChannelTable, Tcl_RegisterChannel,
  1675. # Tcl_UnregisterChannel, Tcl_GetChannel and Tcl_CreateChannel.
  1676. #
  1677. # These functions use "eof stdin" to ensure that the standard
  1678. # channels are added to the channel table of the interpreter.
  1679. test io-17.1 {GetChannelTable, DeleteChannelTable on std handles} {testchannel} {
  1680.     set l1 [testchannel refcount stdin]
  1681.     eof stdin
  1682.     interp create x
  1683.     set l ""
  1684.     lappend l [expr [testchannel refcount stdin] - $l1]
  1685.     x eval {eof stdin}
  1686.     lappend l [expr [testchannel refcount stdin] - $l1]
  1687.     interp delete x
  1688.     lappend l [expr [testchannel refcount stdin] - $l1]
  1689.     set l
  1690. } {0 1 0}
  1691. test io-17.2 {GetChannelTable, DeleteChannelTable on std handles} {testchannel} {
  1692.     set l1 [testchannel refcount stdout]
  1693.     eof stdin
  1694.     interp create x
  1695.     set l ""
  1696.     lappend l [expr [testchannel refcount stdout] - $l1]
  1697.     x eval {eof stdout}
  1698.     lappend l [expr [testchannel refcount stdout] - $l1]
  1699.     interp delete x
  1700.     lappend l [expr [testchannel refcount stdout] - $l1]
  1701.     set l
  1702. } {0 1 0}
  1703. test io-17.3 {GetChannelTable, DeleteChannelTable on std handles} {testchannel} {
  1704.     set l1 [testchannel refcount stderr]
  1705.     eof stdin
  1706.     interp create x
  1707.     set l ""
  1708.     lappend l [expr [testchannel refcount stderr] - $l1]
  1709.     x eval {eof stderr}
  1710.     lappend l [expr [testchannel refcount stderr] - $l1]
  1711.     interp delete x
  1712.     lappend l [expr [testchannel refcount stderr] - $l1]
  1713.     set l
  1714. } {0 1 0}
  1715. test io-18.1 {Tcl_RegisterChannel, Tcl_UnregisterChannel} {testchannel} {
  1716.     file delete $path(test1)
  1717.     set l ""
  1718.     set f [open $path(test1) w]
  1719.     lappend l [lindex [testchannel info $f] 15]
  1720.     close $f
  1721.     if {[catch {lindex [testchannel info $f] 15} msg]} {
  1722. lappend l $msg
  1723.     } else {
  1724. lappend l "very broken: $f found after being closed"
  1725.     }
  1726.     string compare [string tolower $l] 
  1727. [list 1 [format "can not find channel named "%s"" $f]]
  1728. } 0
  1729. test io-18.2 {Tcl_RegisterChannel, Tcl_UnregisterChannel} {testchannel} {
  1730.     file delete $path(test1)
  1731.     set l ""
  1732.     set f [open $path(test1) w]
  1733.     lappend l [lindex [testchannel info $f] 15]
  1734.     interp create x
  1735.     interp share "" $f x
  1736.     lappend l [lindex [testchannel info $f] 15]
  1737.     x eval close $f
  1738.     lappend l [lindex [testchannel info $f] 15]
  1739.     interp delete x
  1740.     lappend l [lindex [testchannel info $f] 15]
  1741.     close $f
  1742.     if {[catch {lindex [testchannel info $f] 15} msg]} {
  1743. lappend l $msg
  1744.     } else {
  1745. lappend l "very broken: $f found after being closed"
  1746.     }
  1747.     string compare [string tolower $l] 
  1748. [list 1 2 1 1 [format "can not find channel named "%s"" $f]]
  1749. } 0
  1750. test io-18.3 {Tcl_RegisterChannel, Tcl_UnregisterChannel} {testchannel} {
  1751.     file delete $path(test1)
  1752.     set l ""
  1753.     set f [open $path(test1) w]
  1754.     lappend l [lindex [testchannel info $f] 15]
  1755.     interp create x
  1756.     interp share "" $f x
  1757.     lappend l [lindex [testchannel info $f] 15]
  1758.     interp delete x
  1759.     lappend l [lindex [testchannel info $f] 15]
  1760.     close $f
  1761.     if {[catch {lindex [testchannel info $f] 15} msg]} {
  1762. lappend l $msg
  1763.     } else {
  1764. lappend l "very broken: $f found after being closed"
  1765.     }
  1766.     string compare [string tolower $l] 
  1767. [list 1 2 1 [format "can not find channel named "%s"" $f]]
  1768. } 0
  1769. test io-19.1 {Tcl_GetChannel->Tcl_GetStdChannel, standard handles} {
  1770.     eof stdin
  1771. } 0
  1772. test io-19.2 {testing Tcl_GetChannel, user opened handle} {
  1773.     file delete $path(test1)
  1774.     set f [open $path(test1) w]
  1775.     set x [eof $f]
  1776.     close $f
  1777.     set x
  1778. } 0
  1779. test io-19.3 {Tcl_GetChannel, channel not found} {
  1780.     list [catch {eof file34} msg] $msg
  1781. } {1 {can not find channel named "file34"}}
  1782. test io-19.4 {Tcl_CreateChannel, insertion into channel table} {testchannel} {
  1783.     file delete $path(test1)
  1784.     set f [open $path(test1) w]
  1785.     set l ""
  1786.     lappend l [eof $f]
  1787.     close $f
  1788.     if {[catch {lindex [testchannel info $f] 15} msg]} {
  1789. lappend l $msg
  1790.     } else {
  1791. lappend l "very broken: $f found after being closed"
  1792.     }
  1793.     string compare [string tolower $l] 
  1794. [list 0 [format "can not find channel named "%s"" $f]]
  1795. } 0
  1796. test io-20.1 {Tcl_CreateChannel: initial settings} {
  1797. set a [open $path(test2) w]
  1798.     set old [encoding system]
  1799.     encoding system ascii
  1800.     set f [open $path(test1) w]
  1801.     set x [fconfigure $f -encoding]
  1802.     close $f
  1803.     encoding system $old
  1804. close $a
  1805.     set x
  1806. } {ascii}    
  1807. test io-20.2 {Tcl_CreateChannel: initial settings} {pcOnly} {
  1808.     set f [open $path(test1) w+]
  1809.     set x [list [fconfigure $f -eofchar] [fconfigure $f -translation]]
  1810.     close $f
  1811.     set x
  1812. } [list [list x1a ""] {auto crlf}]
  1813. test io-20.3 {Tcl_CreateChannel: initial settings} {unixOnly} {
  1814.     set f [open $path(test1) w+]
  1815.     set x [list [fconfigure $f -eofchar] [fconfigure $f -translation]]
  1816.     close $f
  1817.     set x
  1818. } {{{} {}} {auto lf}}
  1819. test io-20.4 {Tcl_CreateChannel: initial settings} {macOnly} {
  1820.     set f [open $path(test1) w+]
  1821.     set x [list [fconfigure $f -eofchar] [fconfigure $f -translation]]
  1822.     close $f
  1823.     set x
  1824. } {{{} {}} {auto cr}}
  1825. set path(stdout) [makeFile {} stdout]
  1826. test io-20.5 {Tcl_CreateChannel: install channel in empty slot} {stdio openpipe} {
  1827.     set f [open $path(script) w]
  1828.     puts -nonewline $f {
  1829. close stdout
  1830. set f1 [}
  1831.     puts $f [list open $path(stdout) w]]
  1832.     puts $f {
  1833. fconfigure $f1 -buffersize 777
  1834. puts stderr [fconfigure stdout -buffersize]
  1835.     }
  1836.     close $f
  1837.     set f [open "|[list [interpreter] $path(script)]"]
  1838.     catch {close $f} msg
  1839.     set msg
  1840. } {777}
  1841. test io-21.1 {CloseChannelsOnExit} {
  1842. } {}
  1843.     
  1844. # Test management of attributes associated with a channel, such as
  1845. # its default translation, its name and type, etc. The functions
  1846. # tested in this group are Tcl_GetChannelName,
  1847. # Tcl_GetChannelType and Tcl_GetChannelFile. Tcl_GetChannelInstanceData
  1848. # not tested because files do not use the instance data.
  1849. test io-22.1 {Tcl_GetChannelMode} {
  1850.     # Not used anywhere in Tcl.
  1851. } {}
  1852. test io-23.1 {Tcl_GetChannelName} {testchannel} {
  1853.     file delete $path(test1)
  1854.     set f [open $path(test1) w]
  1855.     set n [testchannel name $f]
  1856.     close $f
  1857.     string compare $n $f
  1858. } 0
  1859. test io-24.1 {Tcl_GetChannelType} {testchannel} {
  1860.     file delete $path(test1)
  1861.     set f [open $path(test1) w]
  1862.     set t [testchannel type $f]
  1863.     close $f
  1864.     string compare $t file
  1865. } 0
  1866. test io-25.1 {Tcl_GetChannelHandle, input} {testchannel} {
  1867.     set f [open $path(test1) w]
  1868.     fconfigure $f -translation lf -eofchar {}
  1869.     puts $f "1234567890n098765432"
  1870.     close $f
  1871.     set f [open $path(test1) r]
  1872.     gets $f
  1873.     set l ""
  1874.     lappend l [testchannel inputbuffered $f]
  1875.     lappend l [tell $f]
  1876.     close $f
  1877.     set l
  1878. } {10 11}
  1879. test io-25.2 {Tcl_GetChannelHandle, output} {testchannel} {
  1880.     file delete $path(test1)
  1881.     set f [open $path(test1) w]
  1882.     fconfigure $f -translation lf
  1883.     puts $f hello
  1884.     set l ""
  1885.     lappend l [testchannel outputbuffered $f]
  1886.     lappend l [tell $f]
  1887.     flush $f
  1888.     lappend l [testchannel outputbuffered $f]
  1889.     lappend l [tell $f]
  1890.     close $f
  1891.     file delete $path(test1)
  1892.     set l
  1893. } {6 6 0 6}
  1894. test io-26.1 {Tcl_GetChannelInstanceData} {stdio openpipe} {
  1895.     # "pid" command uses Tcl_GetChannelInstanceData
  1896.     # Don't care what pid is (but must be a number), just want to exercise it.
  1897.     set f [open "|[list [interpreter] << exit]"]
  1898.     expr [pid $f]
  1899.     close $f
  1900. } {}    
  1901. # Test flushing. The functions tested here are FlushChannel.
  1902. test io-27.1 {FlushChannel, no output buffered} {
  1903.     file delete $path(test1)
  1904.     set f [open $path(test1) w]
  1905.     flush $f
  1906.     set s [file size $path(test1)]
  1907.     close $f
  1908.     set s
  1909. } 0
  1910. test io-27.2 {FlushChannel, some output buffered} {
  1911.     file delete $path(test1)
  1912.     set f [open $path(test1) w]
  1913.     fconfigure $f -translation lf -eofchar {}
  1914.     set l ""
  1915.     puts $f hello
  1916.     lappend l [file size $path(test1)]
  1917.     flush $f
  1918.     lappend l [file size $path(test1)]
  1919.     close $f
  1920.     lappend l [file size $path(test1)]
  1921.     set l
  1922. } {0 6 6}
  1923. test io-27.3 {FlushChannel, implicit flush on close} {
  1924.     file delete $path(test1)
  1925.     set f [open $path(test1) w]
  1926.     fconfigure $f -translation lf -eofchar {}
  1927.     set l ""
  1928.     puts $f hello
  1929.     lappend l [file size $path(test1)]
  1930.     close $f
  1931.     lappend l [file size $path(test1)]
  1932.     set l
  1933. } {0 6}
  1934. test io-27.4 {FlushChannel, implicit flush when buffer fills} {
  1935.     file delete $path(test1)
  1936.     set f [open $path(test1) w]
  1937.     fconfigure $f -translation lf -eofchar {}
  1938.     fconfigure $f -buffersize 60
  1939.     set l ""
  1940.     lappend l [file size $path(test1)]
  1941.     for {set i 0} {$i < 12} {incr i} {
  1942. puts $f hello
  1943.     }
  1944.     lappend l [file size $path(test1)]
  1945.     flush $f
  1946.     lappend l [file size $path(test1)]
  1947.     close $f
  1948.     set l
  1949. } {0 60 72}
  1950. test io-27.5 {FlushChannel, implicit flush when buffer fills and on close} 
  1951. {unixOrPc} {
  1952.     file delete $path(test1)
  1953.     set f [open $path(test1) w]
  1954.     fconfigure $f -translation lf -buffersize 60 -eofchar {}
  1955.     set l ""
  1956.     lappend l [file size $path(test1)]
  1957.     for {set i 0} {$i < 12} {incr i} {
  1958. puts $f hello
  1959.     }
  1960.     lappend l [file size $path(test1)]
  1961.     close $f
  1962.     lappend l [file size $path(test1)]
  1963.     set l
  1964. } {0 60 72}
  1965. set path(pipe)   [makeFile {} pipe]
  1966. set path(output) [makeFile {} output]
  1967. test io-27.6 {FlushChannel, async flushing, async close} 
  1968. {stdio asyncPipeClose openpipe} {
  1969.     file delete $path(pipe)
  1970.     file delete $path(output)
  1971.     set f [open $path(pipe) w]
  1972.     puts $f "set f [[list open $path(output) w]]"
  1973.     puts $f {
  1974. fconfigure $f -translation lf -buffering none -eofchar {}
  1975. while {![eof stdin]} {
  1976.     after 20
  1977.     puts -nonewline $f [read stdin 1024]
  1978. }
  1979. close $f
  1980.     }
  1981.     close $f
  1982.     set x 01234567890123456789012345678901
  1983.     for {set i 0} {$i < 11} {incr i} {
  1984.         set x "$x$x"
  1985.     }
  1986.     set f [open $path(output) w]
  1987.     close $f
  1988.     set f [open "|[list [interpreter] $path(pipe)]" w]
  1989.     fconfigure $f -blocking off
  1990.     puts -nonewline $f $x
  1991.     close $f
  1992.     set counter 0
  1993.     while {([file size $path(output)] < 65536) && ($counter < 1000)} {
  1994.         incr counter
  1995.         after 20
  1996.         update
  1997.     }
  1998.     if {$counter == 1000} {
  1999.         set result "file size only [file size $path(output)]"
  2000.     } else {
  2001.         set result ok
  2002.     }
  2003. } ok
  2004. # Tests closing a channel. The functions tested are CloseChannel and Tcl_Close.
  2005. test io-28.1 {CloseChannel called when all references are dropped} {testchannel} {
  2006.     file delete $path(test1)
  2007.     set f [open $path(test1) w]
  2008.     interp create x
  2009.     interp share "" $f x
  2010.     set l ""
  2011.     lappend l [testchannel refcount $f]
  2012.     x eval close $f
  2013.     interp delete x
  2014.     lappend l [testchannel refcount $f]
  2015.     close $f
  2016.     set l
  2017. } {2 1}
  2018. test io-28.2 {CloseChannel called when all references are dropped} {
  2019.     file delete $path(test1)
  2020.     set f [open $path(test1) w]
  2021.     interp create x
  2022.     interp share "" $f x
  2023.     puts -nonewline $f abc
  2024.     close $f
  2025.     x eval puts $f def
  2026.     x eval close $f
  2027.     interp delete x
  2028.     set f [open $path(test1) r]
  2029.     set l [gets $f]
  2030.     close $f
  2031.     set l
  2032. } abcdef
  2033. test io-28.3 {CloseChannel, not called before output queue is empty} 
  2034. {stdio asyncPipeClose nonPortable openpipe} {
  2035.     file delete $path(pipe)
  2036.     file delete $path(output)
  2037.     set f [open $path(pipe) w]
  2038.     puts $f {
  2039. # Need to not have eof char appended on close, because the other
  2040. # side of the pipe already closed, so that writing would cause an
  2041. # error "invalid file".
  2042. fconfigure stdout -eofchar {}
  2043. fconfigure stderr -eofchar {}
  2044. set f [open $path(output) w]
  2045. fconfigure $f -translation lf -buffering none
  2046. for {set x 0} {$x < 20} {incr x} {
  2047.     after 20
  2048.     puts -nonewline $f [read stdin 1024]
  2049. }
  2050. close $f
  2051.     }
  2052.     close $f
  2053.     set x 01234567890123456789012345678901
  2054.     for {set i 0} {$i < 11} {incr i} {
  2055.         set x "$x$x"
  2056.     }
  2057.     set f [open $path(output) w]
  2058.     close $f
  2059.     set f [open "|[list [interpreter] pipe]" r+]
  2060.     fconfigure $f -blocking off -eofchar {}
  2061.     puts -nonewline $f $x
  2062.     close $f
  2063.     set counter 0
  2064.     while {([file size $path(output)] < 20480) && ($counter < 1000)} {
  2065.         incr counter
  2066.         after 20
  2067.         update
  2068.     }
  2069.     if {$counter == 1000} {
  2070.         set result probably_broken
  2071.     } else {
  2072.         set result ok
  2073.     }
  2074. } ok
  2075. test io-28.4 {Tcl_Close} {testchannel} {
  2076.     file delete $path(test1)
  2077.     set l ""
  2078.     lappend l [lsort [testchannel open]]
  2079.     set f [open $path(test1) w]
  2080.     lappend l [lsort [testchannel open]]
  2081.     close $f
  2082.     lappend l [lsort [testchannel open]]
  2083.     set x [list $consoleFileNames 
  2084. [lsort [eval list $consoleFileNames $f]] 
  2085. $consoleFileNames]
  2086.     string compare $l $x
  2087. } 0
  2088. test io-28.5 {Tcl_Close vs standard handles} {stdio unixOnly testchannel openpipe} {
  2089.     file delete $path(script)
  2090.     set f [open $path(script) w]
  2091.     puts $f {
  2092. close stdin
  2093. puts [testchannel open]
  2094.     }
  2095.     close $f
  2096.     set f [open "|[list [interpreter] $path(script)]" r]
  2097.     set l [gets $f]
  2098.     close $f
  2099.     set l
  2100. } {file1 file2}
  2101. test io-29.1 {Tcl_WriteChars, channel not writable} {
  2102.     list [catch {puts stdin hello} msg] $msg
  2103. } {1 {channel "stdin" wasn't opened for writing}}
  2104. test io-29.2 {Tcl_WriteChars, empty string} {
  2105.     file delete $path(test1)
  2106.     set f [open $path(test1) w]
  2107.     fconfigure $f -eofchar {}
  2108.     puts -nonewline $f ""
  2109.     close $f
  2110.     file size $path(test1)
  2111. } 0
  2112. test io-29.3 {Tcl_WriteChars, nonempty string} {
  2113.     file delete $path(test1)
  2114.     set f [open $path(test1) w]
  2115.     fconfigure $f -eofchar {}
  2116.     puts -nonewline $f hello
  2117.     close $f
  2118.     file size $path(test1)
  2119. } 5
  2120. test io-29.4 {Tcl_WriteChars, buffering in full buffering mode} {testchannel} {
  2121.     file delete $path(test1)
  2122.     set f [open $path(test1) w]
  2123.     fconfigure $f -translation lf -buffering full -eofchar {}
  2124.     puts $f hello
  2125.     set l ""
  2126.     lappend l [testchannel outputbuffered $f]
  2127.     lappend l [file size $path(test1)]
  2128.     flush $f
  2129.     lappend l [testchannel outputbuffered $f]
  2130.     lappend l [file size $path(test1)]
  2131.     close $f
  2132.     set l
  2133. } {6 0 0 6}
  2134. test io-29.5 {Tcl_WriteChars, buffering in line buffering mode} {testchannel} {
  2135.     file delete $path(test1)
  2136.     set f [open $path(test1) w]
  2137.     fconfigure $f -translation lf -buffering line -eofchar {}
  2138.     puts -nonewline $f hello
  2139.     set l ""
  2140.     lappend l [testchannel outputbuffered $f]
  2141.     lappend l [file size $path(test1)]
  2142.     puts $f hello
  2143.     lappend l [testchannel outputbuffered $f]
  2144.     lappend l [file size $path(test1)]
  2145.     close $f
  2146.     set l
  2147. } {5 0 0 11}
  2148. test io-29.6 {Tcl_WriteChars, buffering in no buffering mode} {testchannel} {
  2149.     file delete $path(test1)
  2150.     set f [open $path(test1) w]
  2151.     fconfigure $f -translation lf -buffering none -eofchar {}
  2152.     puts -nonewline $f hello
  2153.     set l ""
  2154.     lappend l [testchannel outputbuffered $f]
  2155.     lappend l [file size $path(test1)]
  2156.     puts $f hello
  2157.     lappend l [testchannel outputbuffered $f]
  2158.     lappend l [file size $path(test1)]
  2159.     close $f
  2160.     set l
  2161. } {0 5 0 11}
  2162. test io-29.7 {Tcl_Flush, full buffering} {testchannel} {
  2163.     file delete $path(test1)
  2164.     set f [open $path(test1) w]
  2165.     fconfigure $f -translation lf -buffering full -eofchar {}
  2166.     puts -nonewline $f hello
  2167.     set l ""
  2168.     lappend l [testchannel outputbuffered $f]
  2169.     lappend l [file size $path(test1)]
  2170.     puts $f hello
  2171.     lappend l [testchannel outputbuffered $f]
  2172.     lappend l [file size $path(test1)]
  2173.     flush $f
  2174.     lappend l [testchannel outputbuffered $f]
  2175.     lappend l [file size $path(test1)]
  2176.     close $f
  2177.     set l
  2178. } {5 0 11 0 0 11}
  2179. test io-29.8 {Tcl_Flush, full buffering} {testchannel} {
  2180.     file delete $path(test1)
  2181.     set f [open $path(test1) w]
  2182.     fconfigure $f -translation lf -buffering line
  2183.     puts -nonewline $f hello
  2184.     set l ""
  2185.     lappend l [testchannel outputbuffered $f]
  2186.     lappend l [file size $path(test1)]
  2187.     flush $f
  2188.     lappend l [testchannel outputbuffered $f]
  2189.     lappend l [file size $path(test1)]
  2190.     puts $f hello
  2191.     lappend l [testchannel outputbuffered $f]
  2192.     lappend l [file size $path(test1)]
  2193.     flush $f
  2194.     lappend l [testchannel outputbuffered $f]
  2195.     lappend l [file size $path(test1)]
  2196.     close $f
  2197.     set l
  2198. } {5 0 0 5 0 11 0 11}
  2199. test io-29.9 {Tcl_Flush, channel not writable} {
  2200.     list [catch {flush stdin} msg] $msg
  2201. } {1 {channel "stdin" wasn't opened for writing}}
  2202. test io-29.10 {Tcl_WriteChars, looping and buffering} {
  2203.     file delete $path(test1)
  2204.     set f1 [open $path(test1) w]
  2205.     fconfigure $f1 -translation lf -eofchar {}
  2206.     set f2 [open $path(longfile) r]
  2207.     for {set x 0} {$x < 10} {incr x} {
  2208. puts $f1 [gets $f2]
  2209.     }
  2210.     close $f2
  2211.     close $f1
  2212.     file size $path(test1)
  2213. } 387
  2214. test io-29.11 {Tcl_WriteChars, no newline, implicit flush} {
  2215.     file delete $path(test1)
  2216.     set f1 [open $path(test1) w]
  2217.     fconfigure $f1 -eofchar {}
  2218.     set f2 [open $path(longfile) r]
  2219.     for {set x 0} {$x < 10} {incr x} {
  2220. puts -nonewline $f1 [gets $f2]
  2221.     }
  2222.     close $f1
  2223.     close $f2
  2224.     file size $path(test1)
  2225. } 377
  2226. test io-29.12 {Tcl_WriteChars on a pipe} {stdio openpipe} {
  2227.     file delete $path(test1)
  2228.     file delete $path(pipe)
  2229.     set f1 [open $path(pipe) w]
  2230.     puts $f1 "set f1 [[list open $path(longfile) r]]"
  2231.     puts $f1 {
  2232. for {set x 0} {$x < 10} {incr x} {
  2233.     puts [gets $f1]
  2234. }
  2235.     }
  2236.     close $f1
  2237.     set f1 [open "|[list [interpreter] $path(pipe)]" r]
  2238.     set f2 [open $path(longfile) r]
  2239.     set y ok
  2240.     for {set x 0} {$x < 10} {incr x} {
  2241. set l1 [gets $f1]
  2242. set l2 [gets $f2]
  2243. if {"$l1" != "$l2"} {
  2244.     set y broken
  2245. }
  2246.     }
  2247.     close $f1
  2248.     close $f2
  2249.     set y
  2250. } ok
  2251. test io-29.13 {Tcl_WriteChars to a pipe, line buffered} {stdio openpipe} {
  2252.     file delete $path(test1)
  2253.     file delete $path(pipe)
  2254.     set f1 [open $path(pipe) w]
  2255.     puts $f1 {
  2256. puts [gets stdin]
  2257. puts [gets stdin]
  2258.     }
  2259.     close $f1
  2260.     set y ok
  2261.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  2262.     fconfigure $f1 -buffering line
  2263.     set f2 [open $path(longfile) r]
  2264.     set line [gets $f2]
  2265.     puts $f1 $line
  2266.     set backline [gets $f1]
  2267.     if {"$line" != "$backline"} {
  2268. set y broken
  2269.     }
  2270.     set line [gets $f2]
  2271.     puts $f1 $line
  2272.     set backline [gets $f1]
  2273.     if {"$line" != "$backline"} {
  2274. set y broken
  2275.     }
  2276.     close $f1
  2277.     close $f2
  2278.     set y
  2279. } ok
  2280. test io-29.14 {Tcl_WriteChars, buffering and implicit flush at close} {
  2281.     file delete $path(test3)
  2282.     set f [open $path(test3) w]
  2283.     puts -nonewline $f "Text1"
  2284.     puts -nonewline $f " Text 2"
  2285.     puts $f " Text 3"
  2286.     close $f
  2287.     set f [open $path(test3) r]
  2288.     set x [gets $f]
  2289.     close $f
  2290.     set x
  2291. } {Text1 Text 2 Text 3}
  2292. test io-29.15 {Tcl_Flush, channel not open for writing} {
  2293.     file delete $path(test1)
  2294.     set fd [open $path(test1) w]
  2295.     close $fd
  2296.     set fd [open $path(test1) r]
  2297.     set x [list [catch {flush $fd} msg] $msg]
  2298.     close $fd
  2299.     string compare $x 
  2300. [list 1 "channel "$fd" wasn't opened for writing"]
  2301. } 0
  2302. test io-29.16 {Tcl_Flush on pipe opened only for reading} {stdio openpipe} {
  2303.     set fd [open "|[list [interpreter] cat longfile]" r]
  2304.     set x [list [catch {flush $fd} msg] $msg]
  2305.     catch {close $fd}
  2306.     string compare $x 
  2307. [list 1 "channel "$fd" wasn't opened for writing"]
  2308. } 0
  2309. test io-29.17 {Tcl_WriteChars buffers, then Tcl_Flush flushes} {
  2310.     file delete $path(test1)
  2311.     set f1 [open $path(test1) w]
  2312.     fconfigure $f1 -translation lf
  2313.     puts $f1 hello
  2314.     puts $f1 hello
  2315.     puts $f1 hello
  2316.     flush $f1
  2317.     set x [file size $path(test1)]
  2318.     close $f1
  2319.     set x
  2320. } 18
  2321. test io-29.18 {Tcl_WriteChars and Tcl_Flush intermixed} {
  2322.     file delete $path(test1)
  2323.     set x ""
  2324.     set f1 [open $path(test1) w]
  2325.     fconfigure $f1 -translation lf
  2326.     puts $f1 hello
  2327.     puts $f1 hello
  2328.     puts $f1 hello
  2329.     flush $f1
  2330.     lappend x [file size $path(test1)]
  2331.     puts $f1 hello
  2332.     flush $f1
  2333.     lappend x [file size $path(test1)]
  2334.     puts $f1 hello
  2335.     flush $f1
  2336.     lappend x [file size $path(test1)]
  2337.     close $f1
  2338.     set x
  2339. } {18 24 30}
  2340. test io-29.19 {Explicit and implicit flushes} {
  2341.     file delete $path(test1)
  2342.     set f1 [open $path(test1) w]
  2343.     fconfigure $f1 -translation lf -eofchar {}
  2344.     set x ""
  2345.     puts $f1 hello
  2346.     puts $f1 hello
  2347.     puts $f1 hello
  2348.     flush $f1
  2349.     lappend x [file size $path(test1)]
  2350.     puts $f1 hello
  2351.     flush $f1
  2352.     lappend x [file size $path(test1)]
  2353.     puts $f1 hello
  2354.     close $f1
  2355.     lappend x [file size $path(test1)]
  2356.     set x
  2357. } {18 24 30}
  2358. test io-29.20 {Implicit flush when buffer is full} {
  2359.     file delete $path(test1)
  2360.     set f1 [open $path(test1) w]
  2361.     fconfigure $f1 -translation lf -eofchar {}
  2362.     set line "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  2363.     for {set x 0} {$x < 100} {incr x} {
  2364.       puts $f1 $line
  2365.     }
  2366.     set z ""
  2367.     lappend z [file size $path(test1)]
  2368.     for {set x 0} {$x < 100} {incr x} {
  2369. puts $f1 $line
  2370.     }
  2371.     lappend z [file size $path(test1)]
  2372.     close $f1
  2373.     lappend z [file size $path(test1)]
  2374.     set z
  2375. } {4096 12288 12600}
  2376. test io-29.21 {Tcl_Flush to pipe} {stdio openpipe} {
  2377.     file delete $path(pipe)
  2378.     set f1 [open $path(pipe) w]
  2379.     puts $f1 {set x [read stdin 6]}
  2380.     puts $f1 {set cnt [string length $x]}
  2381.     puts $f1 {puts "read $cnt characters"}
  2382.     close $f1
  2383.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  2384.     puts $f1 hello
  2385.     flush $f1
  2386.     set x [gets $f1]
  2387.     catch {close $f1}
  2388.     set x
  2389. } "read 6 characters"
  2390. test io-29.22 {Tcl_Flush called at other end of pipe} {stdio openpipe} {
  2391.     file delete $path(pipe)
  2392.     set f1 [open $path(pipe) w]
  2393.     puts $f1 {
  2394. fconfigure stdout -buffering full
  2395. puts hello
  2396. puts hello
  2397. flush stdout
  2398. gets stdin
  2399. puts bye
  2400. flush stdout
  2401.     }
  2402.     close $f1
  2403.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  2404.     set x ""
  2405.     lappend x [gets $f1]
  2406.     lappend x [gets $f1]
  2407.     puts $f1 hello
  2408.     flush $f1
  2409.     lappend x [gets $f1]
  2410.     close $f1
  2411.     set x
  2412. } {hello hello bye}
  2413. test io-29.23 {Tcl_Flush and line buffering at end of pipe} {stdio openpipe} {
  2414.     file delete $path(pipe)
  2415.     set f1 [open $path(pipe) w]
  2416.     puts $f1 {
  2417. puts hello
  2418. puts hello
  2419. gets stdin
  2420. puts bye
  2421.     }
  2422.     close $f1
  2423.     set f1 [open "|[list [interpreter] $path(pipe)]" r+]
  2424.     set x ""
  2425.     lappend x [gets $f1]
  2426.     lappend x [gets $f1]
  2427.     puts $f1 hello
  2428.     flush $f1
  2429.     lappend x [gets $f1]
  2430.     close $f1
  2431.     set x
  2432. } {hello hello bye}
  2433. test io-29.24 {Tcl_WriteChars and Tcl_Flush move end of file} {
  2434.     set f [open $path(test3) w]
  2435.     puts $f "Line 1"
  2436.     puts $f "Line 2"
  2437.     set f2 [open $path(test3)]
  2438.     set x {}
  2439.     lappend x [read -nonewline $f2]
  2440.     close $f2
  2441.     flush $f
  2442.     set f2 [open $path(test3)]
  2443.     lappend x [read -nonewline $f2]
  2444.     close $f2
  2445.     close $f
  2446.     set x
  2447. } "{} {Line 1nLine 2}"
  2448. test io-29.25 {Implicit flush with Tcl_Flush to command pipelines} {stdio openpipe fileevent} {
  2449.     file delete $path(test3)
  2450.     set f [open "|[list [interpreter] $path(cat) | [interpreter] $path(cat) > $path(test3)]" w]
  2451.     puts $f "Line 1"
  2452.     puts $f "Line 2"
  2453.     close $f
  2454.     after 100
  2455.     set f [open $path(test3) r]
  2456.     set x [read $f]
  2457.     close $f
  2458.     set x
  2459. } "Line 1nLine 2n"
  2460. test io-29.26 {Tcl_Flush, Tcl_Write on bidirectional pipelines} {stdio unixExecs openpipe} {
  2461.     set f [open "|[list cat -u]" r+]
  2462.     puts $f "Line1"
  2463.     flush $f
  2464.     set x [gets $f]
  2465.     close $f
  2466.     set x
  2467. } {Line1}
  2468. test io-29.27 {Tcl_Flush on closed pipeline} {stdio openpipe} {
  2469.     file delete $path(pipe)
  2470.     set f [open $path(pipe) w]
  2471.     puts $f {exit}
  2472.     close $f
  2473.     set f [open "|[list [interpreter] $path(pipe)]" r+]
  2474.     gets $f
  2475.     puts $f output
  2476.     after 50
  2477.     #
  2478.     # The flush below will get a SIGPIPE. This is an expected part of
  2479.     # test and indicates that the test operates correctly. If you run
  2480.     # this test under a debugger, the signal will by intercepted unless
  2481.     # you disable the debugger's signal interception.
  2482.     #
  2483.     if {[catch {flush $f} msg]} {
  2484. set x [list 1 $msg $errorCode]
  2485. catch {close $f}
  2486.     } else {
  2487. if {[catch {close $f} msg]} {
  2488.     set x [list 1 $msg $errorCode]
  2489. } else {
  2490.     set x {this was supposed to fail and did not}
  2491. }
  2492.     }
  2493.     regsub {".*":} $x {"":} x
  2494.     string tolower $x
  2495. } {1 {error flushing "": broken pipe} {posix epipe {broken pipe}}}
  2496. test io-29.28 {Tcl_WriteChars, lf mode} {
  2497.     file delete $path(test1)
  2498.     set f [open $path(test1) w]
  2499.     fconfigure $f -translation lf -eofchar {}
  2500.     puts $f hellontherenandnhere
  2501.     flush $f
  2502.     set s [file size $path(test1)]
  2503.     close $f
  2504.     set s
  2505. } 21
  2506. test io-29.29 {Tcl_WriteChars, cr mode} {
  2507.     file delete $path(test1)
  2508.     set f [open $path(test1) w]
  2509.     fconfigure $f -translation cr -eofchar {}
  2510.     puts $f hellontherenandnhere
  2511.     close $f
  2512.     file size $path(test1)
  2513. } 21
  2514. test io-29.30 {Tcl_WriteChars, crlf mode} {
  2515.     file delete $path(test1)
  2516.     set f [open $path(test1) w]
  2517.     fconfigure $f -translation crlf -eofchar {}
  2518.     puts $f hellontherenandnhere
  2519.     close $f
  2520.     file size $path(test1)
  2521. } 25
  2522. test io-29.31 {Tcl_WriteChars, background flush} {stdio openpipe} {
  2523.     file delete $path(pipe)
  2524.     file delete $path(output)
  2525.     set f [open $path(pipe) w]
  2526.     puts $f "set f [[list open $path(output)  w]]"
  2527.     puts $f {fconfigure $f -translation lf}
  2528.     set x [list while {![eof stdin]}]
  2529.     set x "$x {"
  2530.     puts $f $x
  2531.     puts $f {  puts -nonewline $f [read stdin 4096]}
  2532.     puts $f {  flush $f}
  2533.     puts $f "}"
  2534.     puts $f {close $f}
  2535.     close $f
  2536.     set x 01234567890123456789012345678901
  2537.     for {set i 0} {$i < 11} {incr i} {
  2538. set x "$x$x"
  2539.     }
  2540.     set f [open $path(output) w]
  2541.     close $f
  2542.     set f [open "|[list [interpreter] $path(pipe)]" r+]
  2543.     fconfigure $f -blocking off
  2544.     puts -nonewline $f $x
  2545.     close $f
  2546.     set counter 0
  2547.     while {([file size $path(output)] < 65536) && ($counter < 1000)} {
  2548. incr counter
  2549. after 5
  2550. update
  2551.     }
  2552.     if {$counter == 1000} {
  2553. set result "file size only [file size $path(output)]"
  2554.     } else {
  2555. set result ok
  2556.     }
  2557. } ok
  2558. test io-29.32 {Tcl_WriteChars, background flush to slow reader} 
  2559. {stdio asyncPipeClose openpipe} {
  2560.     file delete $path(pipe)
  2561.     file delete $path(output)
  2562.     set f [open $path(pipe) w]
  2563.     puts $f "set f [[list open $path(output) w]]"
  2564.     puts $f {fconfigure $f -translation lf}
  2565.     set x [list while {![eof stdin]}]
  2566.     set x "$x {"
  2567.     puts $f $x
  2568.     puts $f {  after 20}
  2569.     puts $f {  puts -nonewline $f [read stdin 1024]}
  2570.     puts $f {  flush $f}
  2571.     puts $f "}"
  2572.     puts $f {close $f}
  2573.     close $f
  2574.     set x 01234567890123456789012345678901
  2575.     for {set i 0} {$i < 11} {incr i} {
  2576. set x "$x$x"
  2577.     }
  2578.     set f [open $path(output) w]
  2579.     close $f
  2580.     set f [open "|[list [interpreter] $path(pipe)]" r+]
  2581.     fconfigure $f -blocking off
  2582.     puts -nonewline $f $x
  2583.     close $f
  2584.     set counter 0
  2585.     while {([file size $path(output)] < 65536) && ($counter < 1000)} {
  2586. incr counter
  2587. after 20
  2588. update
  2589.     }
  2590.     if {$counter == 1000} {
  2591. set result "file size only [file size $path(output)]"
  2592.     } else {
  2593. set result ok
  2594.     }
  2595. } ok
  2596. test io-29.33 {Tcl_Flush, implicit flush on exit} {exec} {
  2597.     set f [open $path(script) w]
  2598.     puts $f "set f [[list open $path(test1) w]]"
  2599.     puts $f {fconfigure $f -translation lf
  2600. puts $f hello
  2601. puts $f bye
  2602. puts $f strange
  2603.     }
  2604.     close $f
  2605.     exec [interpreter] $path(script)
  2606.     set f [open $path(test1) r]
  2607.     set r [read $f]
  2608.     close $f
  2609.     set r
  2610. } "hellonbyenstrangen"
  2611. test io-29.34 {Tcl_Close, async flush on close, using sockets} {socket tempNotMac fileevent} {
  2612.     variable c 0
  2613.     variable x running
  2614.     set l abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  2615.     proc writelots {s l} {
  2616. for {set i 0} {$i < 2000} {incr i} {
  2617.     puts $s $l
  2618. }
  2619.     }
  2620.     proc accept {s a p} {
  2621. variable x
  2622. fileevent $s readable [namespace code [list readit $s]]
  2623. fconfigure $s -blocking off
  2624. set x accepted
  2625.     }
  2626.     proc readit {s} {
  2627. variable c
  2628. variable x
  2629. set l [gets $s]
  2630. if {[eof $s]} {
  2631.     close $s
  2632.     set x done
  2633. } elseif {([string length $l] > 0) || ![fblocked $s]} {
  2634.     incr c
  2635. }
  2636.     }
  2637.     set ss [socket -server [namespace code accept] 0]
  2638.     set cs [socket [info hostname] [lindex [fconfigure $ss -sockname] 2]]
  2639.     vwait [namespace which -variable x]
  2640.     fconfigure $cs -blocking off
  2641.     writelots $cs $l
  2642.     close $cs
  2643.     close $ss
  2644.     vwait [namespace which -variable x]
  2645.     set c
  2646. } 2000
  2647. test io-29.35 {Tcl_Close vs fileevent vs multiple interpreters} {socket tempNotMac fileevent} {
  2648.     # On Mac, this test screws up sockets such that subsequent tests using port 2828 
  2649.     # either cause errors or panic().
  2650.      
  2651.     catch {interp delete x}
  2652.     catch {interp delete y}
  2653.     interp create x
  2654.     interp create y
  2655.     set s [socket -server [namespace code accept] 0]
  2656.     proc accept {s a p} {
  2657. puts $s hello
  2658. close $s
  2659.     }
  2660.     set c [socket [info hostname] [lindex [fconfigure $s -sockname] 2]]
  2661.     interp share {} $c x
  2662.     interp share {} $c y
  2663.     close $c
  2664.     x eval {
  2665. proc readit {s} {
  2666.     gets $s
  2667.     if {[eof $s]} {
  2668. close $s
  2669.     }
  2670. }
  2671.     }
  2672.     y eval {
  2673. proc readit {s} {
  2674.     gets $s
  2675.     if {[eof $s]} {
  2676. close $s
  2677.     }
  2678. }
  2679.     }
  2680.     x eval "fileevent $c readable {readit $c}"
  2681.     y eval "fileevent $c readable {readit $c}"
  2682.     y eval [list close $c]
  2683.     update
  2684.     close $s
  2685.     interp delete x
  2686.     interp delete y
  2687. } ""
  2688. # Test end of line translations. Procedures tested are Tcl_Write, Tcl_Read.
  2689. test io-30.1 {Tcl_Write lf, Tcl_Read lf} {
  2690.     file delete $path(test1)
  2691.     set f [open $path(test1) w]
  2692.     fconfigure $f -translation lf
  2693.     puts $f hellontherenandnhere
  2694.     close $f
  2695.     set f [open $path(test1) r]
  2696.     fconfigure $f -translation lf
  2697.     set x [read $f]
  2698.     close $f
  2699.     set x
  2700. } "hellontherenandnheren"
  2701. test io-30.2 {Tcl_Write lf, Tcl_Read cr} {
  2702.     file delete $path(test1)
  2703.     set f [open $path(test1) w]
  2704.     fconfigure $f -translation lf
  2705.     puts $f hellontherenandnhere
  2706.     close $f
  2707.     set f [open $path(test1) r]
  2708.     fconfigure $f -translation cr
  2709.     set x [read $f]
  2710.     close $f
  2711.     set x
  2712. } "hellontherenandnheren"
  2713. test io-30.3 {Tcl_Write lf, Tcl_Read crlf} {
  2714.     file delete $path(test1)
  2715.     set f [open $path(test1) w]
  2716.     fconfigure $f -translation lf
  2717.     puts $f hellontherenandnhere
  2718.     close $f
  2719.     set f [open $path(test1) r]
  2720.     fconfigure $f -translation crlf
  2721.     set x [read $f]
  2722.     close $f
  2723.     set x
  2724. } "hellontherenandnheren"
  2725. test io-30.4 {Tcl_Write cr, Tcl_Read cr} {
  2726.     file delete $path(test1)
  2727.     set f [open $path(test1) w]
  2728.     fconfigure $f -translation cr
  2729.     puts $f hellontherenandnhere
  2730.     close $f
  2731.     set f [open $path(test1) r]
  2732.     fconfigure $f -translation cr
  2733.     set x [read $f]
  2734.     close $f
  2735.     set x
  2736. } "hellontherenandnheren"
  2737. test io-30.5 {Tcl_Write cr, Tcl_Read lf} {
  2738.     file delete $path(test1)
  2739.     set f [open $path(test1) w]
  2740.     fconfigure $f -translation cr
  2741.     puts $f hellontherenandnhere
  2742.     close $f
  2743.     set f [open $path(test1) r]
  2744.     fconfigure $f -translation lf
  2745.     set x [read $f]
  2746.     close $f
  2747.     set x
  2748. } "hellorthererandrherer"
  2749. test io-30.6 {Tcl_Write cr, Tcl_Read crlf} {
  2750.     file delete $path(test1)
  2751.     set f [open $path(test1) w]
  2752.     fconfigure $f -translation cr
  2753.     puts $f hellontherenandnhere
  2754.     close $f
  2755.     set f [open $path(test1) r]
  2756.     fconfigure $f -translation crlf
  2757.     set x [read $f]
  2758.     close $f
  2759.     set x 
  2760. } "hellorthererandrherer"
  2761. test io-30.7 {Tcl_Write crlf, Tcl_Read crlf} {
  2762.     file delete $path(test1)
  2763.     set f [open $path(test1) w]
  2764.     fconfigure $f -translation crlf
  2765.     puts $f hellontherenandnhere
  2766.     close $f
  2767.     set f [open $path(test1) r]
  2768.     fconfigure $f -translation crlf
  2769.     set x [read $f]
  2770.     close $f
  2771.     set x
  2772. } "hellontherenandnheren"
  2773. test io-30.8 {Tcl_Write crlf, Tcl_Read lf} {
  2774.     file delete $path(test1)
  2775.     set f [open $path(test1) w]
  2776.     fconfigure $f -translation crlf
  2777.     puts $f hellontherenandnhere
  2778.     close $f
  2779.     set f [open $path(test1) r]
  2780.     fconfigure $f -translation lf
  2781.     set x [read $f]
  2782.     close $f
  2783.     set x
  2784. } "hellorntherernandrnherern"
  2785. test io-30.9 {Tcl_Write crlf, Tcl_Read cr} {
  2786.     file delete $path(test1)
  2787.     set f [open $path(test1) w]
  2788.     fconfigure $f -translation crlf
  2789.     puts $f hellontherenandnhere
  2790.     close $f
  2791.     set f [open $path(test1) r]
  2792.     fconfigure $f -translation cr
  2793.     set x [read $f]
  2794.     close $f
  2795.     set x
  2796. } "hellonntherennandnnherenn"
  2797. test io-30.10 {Tcl_Write lf, Tcl_Read auto} {
  2798.     file delete $path(test1)
  2799.     set f [open $path(test1) w]
  2800.     fconfigure $f -translation lf
  2801.     puts $f hellontherenandnhere
  2802.     close $f
  2803.     set f [open $path(test1) r]
  2804.     set c [read $f]
  2805.     set x [fconfigure $f -translation]
  2806.     close $f
  2807.     list $c $x
  2808. } {{hello
  2809. there
  2810. and
  2811. here
  2812. } auto}
  2813. test io-30.11 {Tcl_Write cr, Tcl_Read auto} {
  2814.     file delete $path(test1)
  2815.     set f [open $path(test1) w]
  2816.     fconfigure $f -translation cr
  2817.     puts $f hellontherenandnhere
  2818.     close $f
  2819.     set f [open $path(test1) r]
  2820.     set c [read $f]
  2821.     set x [fconfigure $f -translation]
  2822.     close $f
  2823.     list $c $x
  2824. } {{hello
  2825. there
  2826. and
  2827. here
  2828. } auto}
  2829. test io-30.12 {Tcl_Write crlf, Tcl_Read auto} {
  2830.     file delete $path(test1)
  2831.     set f [open $path(test1) w]
  2832.     fconfigure $f -translation crlf
  2833.     puts $f hellontherenandnhere
  2834.     close $f
  2835.     set f [open $path(test1) r]
  2836.     set c [read $f]
  2837.     set x [fconfigure $f -translation]
  2838.     close $f
  2839.     list $c $x
  2840. } {{hello
  2841. there
  2842. and
  2843. here
  2844. } auto}
  2845. test io-30.13 {Tcl_Write crlf on block boundary, Tcl_Read auto} {
  2846.     file delete $path(test1)
  2847.     set f [open $path(test1) w]
  2848.     fconfigure $f -translation crlf
  2849.     set line "123456789ABCDE" ;# 14 char plus crlf
  2850.     puts -nonewline $f x ;# shift crlf across block boundary
  2851.     for {set i 0} {$i < 700} {incr i} {
  2852. puts $f $line
  2853.     }
  2854.     close $f
  2855.     set f [open $path(test1) r]
  2856.     fconfigure $f -translation auto
  2857.     set c [read $f]
  2858.     close $f
  2859.     string length $c
  2860. } [expr 700*15+1]
  2861. test io-30.14 {Tcl_Write crlf on block boundary, Tcl_Read crlf} {
  2862.     file delete $path(test1)
  2863.     set f [open $path(test1) w]
  2864.     fconfigure $f -translation crlf
  2865.     set line "123456789ABCDE" ;# 14 char plus crlf
  2866.     puts -nonewline $f x ;# shift crlf across block boundary
  2867.     for {set i 0} {$i < 700} {incr i} {
  2868. puts $f $line
  2869.     }
  2870.     close $f
  2871.     set f [open $path(test1) r]
  2872.     fconfigure $f -translation crlf
  2873.     set c [read $f]
  2874.     close $f
  2875.     string length $c
  2876. } [expr 700*15+1]
  2877. test io-30.15 {Tcl_Write mixed, Tcl_Read auto} {
  2878.     file delete $path(test1)
  2879.     set f [open $path(test1) w]
  2880.     fconfigure $f -translation lf
  2881.     puts $f hellontherenandrhere
  2882.     close $f
  2883.     set f [open $path(test1) r]
  2884.     fconfigure $f -translation auto
  2885.     set c [read $f]
  2886.     close $f
  2887.     set c
  2888. } {hello
  2889. there
  2890. and
  2891. here
  2892. }
  2893. test io-30.16 {Tcl_Write ^Z at end, Tcl_Read auto} {
  2894.     file delete $path(test1)
  2895.     set f [open $path(test1) w]
  2896.     fconfigure $f -translation lf
  2897.     puts -nonewline $f hellontherenandrherenx1a
  2898.     close $f
  2899.     set f [open $path(test1) r]
  2900.     fconfigure $f -eofchar x1a -translation auto
  2901.     set c [read $f]
  2902.     close $f
  2903.     set c
  2904. } {hello
  2905. there
  2906. and
  2907. here
  2908. }
  2909. test io-30.17 {Tcl_Write, implicit ^Z at end, Tcl_Read auto} {pcOnly} {
  2910.     file delete $path(test1)
  2911.     set f [open $path(test1) w]
  2912.     fconfigure $f -eofchar x1a -translation lf
  2913.     puts $f hellontherenandrhere
  2914.     close $f
  2915.     set f [open $path(test1) r]
  2916.     fconfigure $f -eofchar x1a -translation auto
  2917.     set c [read $f]
  2918.     close $f
  2919.     set c
  2920. } {hello
  2921. there
  2922. and
  2923. here
  2924. }
  2925. test io-30.18 {Tcl_Write, ^Z in middle, Tcl_Read auto} {
  2926.     file delete $path(test1)
  2927.     set f [open $path(test1) w]
  2928.     fconfigure $f -translation lf
  2929.     set s [format "abcndefn%cghinqrs" 26]
  2930.     puts $f $s
  2931.     close $f
  2932.     set f [open $path(test1) r]
  2933.     fconfigure $f -eofchar x1a -translation auto
  2934.     set l ""
  2935.     lappend l [gets $f]
  2936.     lappend l [gets $f]
  2937.     lappend l [eof $f]
  2938.     lappend l [gets $f]
  2939.     lappend l [eof $f]
  2940.     lappend l [gets $f]
  2941.     lappend l [eof $f]
  2942.     close $f
  2943.     set l
  2944. } {abc def 0 {} 1 {} 1}
  2945. test io-30.19 {Tcl_Write, ^Z no newline in middle, Tcl_Read auto} {
  2946.     file delete $path(test1)
  2947.     set f [open $path(test1) w]
  2948.     fconfigure $f -translation lf
  2949.     set s [format "abcndefn%cghinqrs" 26]
  2950.     puts $f $s
  2951.     close $f
  2952.     set f [open $path(test1) r]
  2953.     fconfigure $f -eofchar x1a -translation auto
  2954.     set l ""
  2955.     lappend l [gets $f]
  2956.     lappend l [gets $f]
  2957.     lappend l [eof $f]
  2958.     lappend l [gets $f]
  2959.     lappend l [eof $f]
  2960.     lappend l [gets $f]
  2961.     lappend l [eof $f]
  2962.     close $f
  2963.     set l
  2964. } {abc def 0 {} 1 {} 1}
  2965. test io-30.20 {Tcl_Write, ^Z in middle ignored, Tcl_Read lf} {
  2966.     file delete $path(test1)
  2967.     set f [open $path(test1) w]
  2968.     fconfigure $f -translation lf -eofchar {}
  2969.     set s [format "abcndefn%cghinqrs" 26]
  2970.     puts $f $s
  2971.     close $f
  2972.     set f [open $path(test1) r]
  2973.     fconfigure $f -translation lf -eofchar {}
  2974.     set l ""
  2975.     lappend l [gets $f]
  2976.     lappend l [gets $f]
  2977.     lappend l [eof $f]
  2978.     lappend l [gets $f]
  2979.     lappend l [eof $f]
  2980.     lappend l [gets $f]
  2981.     lappend l [eof $f]
  2982.     lappend l [gets $f]
  2983.     lappend l [eof $f]
  2984.     close $f
  2985.     set l
  2986. } "abc def 0 x1aghi 0 qrs 0 {} 1"
  2987. test io-30.21 {Tcl_Write, ^Z in middle ignored, Tcl_Read cr} {
  2988.     file delete $path(test1)
  2989.     set f [open $path(test1) w]
  2990.     fconfigure $f -translation lf -eofchar {}
  2991.     set s [format "abcndefn%cghinqrs" 26]
  2992.     puts $f $s
  2993.     close $f
  2994.     set f [open $path(test1) r]
  2995.     fconfigure $f -translation cr -eofchar {}
  2996.     set l ""
  2997.     set x [gets $f]
  2998.     lappend l [string compare $x "abcndefnx1aghinqrsn"]
  2999.     lappend l [eof $f]
  3000.     lappend l [gets $f]
  3001.     lappend l [eof $f]
  3002.     close $f
  3003.     set l
  3004. } {0 1 {} 1}
  3005. test io-30.22 {Tcl_Write, ^Z in middle ignored, Tcl_Read crlf} {
  3006.     file delete $path(test1)
  3007.     set f [open $path(test1) w]
  3008.     fconfigure $f -translation lf -eofchar {}
  3009.     set s [format "abcndefn%cghinqrs" 26]
  3010.     puts $f $s
  3011.     close $f
  3012.     set f [open $path(test1) r]
  3013.     fconfigure $f -translation crlf -eofchar {}
  3014.     set l ""
  3015.     set x [gets $f]
  3016.     lappend l [string compare $x "abcndefnx1aghinqrsn"]
  3017.     lappend l [eof $f]
  3018.     lappend l [gets $f]
  3019.     lappend l [eof $f]
  3020.     close $f
  3021.     set l
  3022. } {0 1 {} 1}
  3023. test io-30.23 {Tcl_Write lf, ^Z in middle, Tcl_Read auto} {
  3024.     file delete $path(test1)
  3025.     set f [open $path(test1) w]
  3026.     fconfigure $f -translation lf
  3027.     set c [format abcndefn%cqrsntuv 26]
  3028.     puts $f $c
  3029.     close $f
  3030.     set f [open $path(test1) r]
  3031.     fconfigure $f -translation auto -eofchar x1a
  3032.     set c [string length [read $f]]
  3033.     set e [eof $f]
  3034.     close $f
  3035.     list $c $e
  3036. } {8 1}
  3037. test io-30.24 {Tcl_Write lf, ^Z in middle, Tcl_Read lf} {
  3038.     file delete $path(test1)
  3039.     set f [open $path(test1) w]
  3040.     fconfigure $f -translation lf
  3041.     set c [format abcndefn%cqrsntuv 26]
  3042.     puts $f $c
  3043.     close $f
  3044.     set f [open $path(test1) r]
  3045.     fconfigure $f -translation lf -eofchar x1a
  3046.     set c [string length [read $f]]
  3047.     set e [eof $f]
  3048.     close $f
  3049.     list $c $e
  3050. } {8 1}
  3051. test io-30.25 {Tcl_Write cr, ^Z in middle, Tcl_Read auto} {
  3052.     file delete $path(test1)
  3053.     set f [open $path(test1) w]
  3054.     fconfigure $f -translation cr
  3055.     set c [format abcndefn%cqrsntuv 26]
  3056.     puts $f $c
  3057.     close $f
  3058.     set f [open $path(test1) r]
  3059.     fconfigure $f -translation auto -eofchar x1a
  3060.     set c [string length [read $f]]
  3061.     set e [eof $f]
  3062.     close $f
  3063.     list $c $e
  3064. } {8 1}
  3065. test io-30.26 {Tcl_Write cr, ^Z in middle, Tcl_Read cr} {
  3066.     file delete $path(test1)
  3067.     set f [open $path(test1) w]
  3068.     fconfigure $f -translation cr
  3069.     set c [format abcndefn%cqrsntuv 26]
  3070.     puts $f $c
  3071.     close $f
  3072.     set f [open $path(test1) r]
  3073.     fconfigure $f -translation cr -eofchar x1a
  3074.     set c [string length [read $f]]
  3075.     set e [eof $f]
  3076.     close $f
  3077.     list $c $e
  3078. } {8 1}
  3079. test io-30.27 {Tcl_Write crlf, ^Z in middle, Tcl_Read auto} {
  3080.     file delete $path(test1)
  3081.     set f [open $path(test1) w]
  3082.     fconfigure $f -translation crlf
  3083.     set c [format abcndefn%cqrsntuv 26]
  3084.     puts $f $c
  3085.     close $f
  3086.     set f [open $path(test1) r]
  3087.     fconfigure $f -translation auto -eofchar x1a
  3088.     set c [string length [read $f]]
  3089.     set e [eof $f]
  3090.     close $f
  3091.     list $c $e
  3092. } {8 1}
  3093. test io-30.28 {Tcl_Write crlf, ^Z in middle, Tcl_Read crlf} {
  3094.     file delete $path(test1)
  3095.     set f [open $path(test1) w]
  3096.     fconfigure $f -translation crlf
  3097.     set c [format abcndefn%cqrsntuv 26]
  3098.     puts $f $c
  3099.     close $f
  3100.     set f [open $path(test1) r]
  3101.     fconfigure $f -translation crlf -eofchar x1a
  3102.     set c [string length [read $f]]
  3103.     set e [eof $f]
  3104.     close $f
  3105.     list $c $e
  3106. } {8 1}
  3107. # Test end of line translations. Functions tested are Tcl_Write and Tcl_Gets.
  3108. test io-31.1 {Tcl_Write lf, Tcl_Gets auto} {
  3109.     file delete $path(test1)
  3110.     set f [open $path(test1) w]
  3111.     fconfigure $f -translation lf
  3112.     puts $f hellontherenandnhere
  3113.     close $f
  3114.     set f [open $path(test1) r]
  3115.     set l ""
  3116.     lappend l [gets $f]
  3117.     lappend l [tell $f]
  3118.     lappend l [fconfigure $f -translation]
  3119.     lappend l [gets $f]
  3120.     lappend l [tell $f]
  3121.     lappend l [fconfigure $f -translation]
  3122.     close $f
  3123.     set l
  3124. } {hello 6 auto there 12 auto}
  3125. test io-31.2 {Tcl_Write cr, Tcl_Gets auto} {
  3126.     file delete $path(test1)
  3127.     set f [open $path(test1) w]
  3128.     fconfigure $f -translation cr
  3129.     puts $f hellontherenandnhere
  3130.     close $f
  3131.     set f [open $path(test1) r]
  3132.     set l ""
  3133.     lappend l [gets $f]
  3134.     lappend l [tell $f]
  3135.     lappend l [fconfigure $f -translation]
  3136.     lappend l [gets $f]
  3137.     lappend l [tell $f]
  3138.     lappend l [fconfigure $f -translation]
  3139.     close $f
  3140.     set l
  3141. } {hello 6 auto there 12 auto}
  3142. test io-31.3 {Tcl_Write crlf, Tcl_Gets auto} {
  3143.     file delete $path(test1)
  3144.     set f [open $path(test1) w]
  3145.     fconfigure $f -translation crlf
  3146.     puts $f hellontherenandnhere
  3147.     close $f
  3148.     set f [open $path(test1) r]
  3149.     set l ""
  3150.     lappend l [gets $f]
  3151.     lappend l [tell $f]
  3152.     lappend l [fconfigure $f -translation]
  3153.     lappend l [gets $f]
  3154.     lappend l [tell $f]
  3155.     lappend l [fconfigure $f -translation]
  3156.     close $f
  3157.     set l
  3158. } {hello 7 auto there 14 auto}
  3159. test io-31.4 {Tcl_Write lf, Tcl_Gets lf} {
  3160.     file delete $path(test1)
  3161.     set f [open $path(test1) w]
  3162.     fconfigure $f -translation lf
  3163.     puts $f hellontherenandnhere
  3164.     close $f
  3165.     set f [open $path(test1) r]
  3166.     fconfigure $f -translation lf
  3167.     set l ""
  3168.     lappend l [gets $f]
  3169.     lappend l [tell $f]
  3170.     lappend l [fconfigure $f -translation]
  3171.     lappend l [gets $f]
  3172.     lappend l [tell $f]
  3173.     lappend l [fconfigure $f -translation]
  3174.     close $f
  3175.     set l
  3176. } {hello 6 lf there 12 lf}
  3177. test io-31.5 {Tcl_Write lf, Tcl_Gets cr} {
  3178.     file delete $path(test1)
  3179.     set f [open $path(test1) w]
  3180.     fconfigure $f -translation lf
  3181.     puts $f hellontherenandnhere
  3182.     close $f
  3183.     set f [open $path(test1) r]
  3184.     fconfigure $f -translation cr
  3185.     set l ""
  3186.     lappend l [string length [gets $f]]
  3187.     lappend l [tell $f]
  3188.     lappend l [fconfigure $f -translation]
  3189.     lappend l [eof $f]
  3190.     lappend l [gets $f]
  3191.     lappend l [tell $f]
  3192.     lappend l [fconfigure $f -translation]
  3193.     lappend l [eof $f]
  3194.     close $f
  3195.     set l
  3196. } {21 21 cr 1 {} 21 cr 1}
  3197. test io-31.6 {Tcl_Write lf, Tcl_Gets crlf} {
  3198.     file delete $path(test1)
  3199.     set f [open $path(test1) w]
  3200.     fconfigure $f -translation lf
  3201.     puts $f hellontherenandnhere
  3202.     close $f
  3203.     set f [open $path(test1) r]
  3204.     fconfigure $f -translation crlf
  3205.     set l ""
  3206.     lappend l [string length [gets $f]]
  3207.     lappend l [tell $f]
  3208.     lappend l [fconfigure $f -translation]
  3209.     lappend l [eof $f]
  3210.     lappend l [gets $f]
  3211.     lappend l [tell $f]
  3212.     lappend l [fconfigure $f -translation]
  3213.     lappend l [eof $f]
  3214.     close $f
  3215.     set l
  3216. } {21 21 crlf 1 {} 21 crlf 1}
  3217. test io-31.7 {Tcl_Write cr, Tcl_Gets cr} {
  3218.     file delete $path(test1)
  3219.     set f [open $path(test1) w]
  3220.     fconfigure $f -translation cr
  3221.     puts $f hellontherenandnhere
  3222.     close $f
  3223.     set f [open $path(test1) r]
  3224.     fconfigure $f -translation cr
  3225.     set l ""
  3226.     lappend l [gets $f]
  3227.     lappend l [tell $f]
  3228.     lappend l [fconfigure $f -translation]
  3229.     lappend l [eof $f]
  3230.     lappend l [gets $f]
  3231.     lappend l [tell $f]
  3232.     lappend l [fconfigure $f -translation]
  3233.     lappend l [eof $f]
  3234.     close $f
  3235.     set l
  3236. } {hello 6 cr 0 there 12 cr 0}
  3237. test io-31.8 {Tcl_Write cr, Tcl_Gets lf} {
  3238.     file delete $path(test1)
  3239.     set f [open $path(test1) w]
  3240.     fconfigure $f -translation cr
  3241.     puts $f hellontherenandnhere
  3242.     close $f
  3243.     set f [open $path(test1) r]
  3244.     fconfigure $f -translation lf
  3245.     set l ""
  3246.     lappend l [string length [gets $f]]
  3247.     lappend l [tell $f]
  3248.     lappend l [fconfigure $f -translation]
  3249.     lappend l [eof $f]
  3250.     lappend l [gets $f]
  3251.     lappend l [tell $f]
  3252.     lappend l [fconfigure $f -translation]
  3253.     lappend l [eof $f]
  3254.     close $f
  3255.     set l
  3256. } {21 21 lf 1 {} 21 lf 1}
  3257. test io-31.9 {Tcl_Write cr, Tcl_Gets crlf} {
  3258.     file delete $path(test1)
  3259.     set f [open $path(test1) w]
  3260.     fconfigure $f -translation cr
  3261.     puts $f hellontherenandnhere
  3262.     close $f
  3263.     set f [open $path(test1) r]
  3264.     fconfigure $f -translation crlf
  3265.     set l ""
  3266.     lappend l [string length [gets $f]]
  3267.     lappend l [tell $f]
  3268.     lappend l [fconfigure $f -translation]
  3269.     lappend l [eof $f]
  3270.     lappend l [gets $f]
  3271.     lappend l [tell $f]
  3272.     lappend l [fconfigure $f -translation]
  3273.     lappend l [eof $f]
  3274.     close $f
  3275.     set l
  3276. } {21 21 crlf 1 {} 21 crlf 1}
  3277. test io-31.10 {Tcl_Write crlf, Tcl_Gets crlf} {
  3278.     file delete $path(test1)
  3279.     set f [open $path(test1) w]
  3280.     fconfigure $f -translation crlf
  3281.     puts $f hellontherenandnhere
  3282.     close $f
  3283.     set f [open $path(test1) r]
  3284.     fconfigure $f -translation crlf
  3285.     set l ""
  3286.     lappend l [gets $f]
  3287.     lappend l [tell $f]
  3288.     lappend l [fconfigure $f -translation]
  3289.     lappend l [eof $f]
  3290.     lappend l [gets $f]
  3291.     lappend l [tell $f]
  3292.     lappend l [fconfigure $f -translation]
  3293.     lappend l [eof $f]
  3294.     close $f
  3295.     set l
  3296. } {hello 7 crlf 0 there 14 crlf 0}
  3297. test io-31.11 {Tcl_Write crlf, Tcl_Gets cr} {
  3298.     file delete $path(test1)
  3299.     set f [open $path(test1) w]
  3300.     fconfigure $f -translation crlf
  3301.     puts $f hellontherenandnhere
  3302.     close $f
  3303.     set f [open $path(test1) r]
  3304.     fconfigure $f -translation cr
  3305.     set l ""
  3306.     lappend l [gets $f]
  3307.     lappend l [tell $f]
  3308.     lappend l [fconfigure $f -translation]
  3309.     lappend l [eof $f]
  3310.     lappend l [string length [gets $f]]
  3311.     lappend l [tell $f]
  3312.     lappend l [fconfigure $f -translation]
  3313.     lappend l [eof $f]
  3314.     close $f
  3315.     set l
  3316. } {hello 6 cr 0 6 13 cr 0}
  3317. test io-31.12 {Tcl_Write crlf, Tcl_Gets lf} {
  3318.     file delete $path(test1)
  3319.     set f [open $path(test1) w]
  3320.     fconfigure $f -translation crlf
  3321.     puts $f hellontherenandnhere
  3322.     close $f
  3323.     set f [open $path(test1) r]
  3324.     fconfigure $f -translation lf
  3325.     set l ""
  3326.     lappend l [string length [gets $f]]
  3327.     lappend l [tell $f]
  3328.     lappend l [fconfigure $f -translation]
  3329.     lappend l [eof $f]
  3330.     lappend l [string length [gets $f]]
  3331.     lappend l [tell $f]
  3332.     lappend l [fconfigure $f -translation]
  3333.     lappend l [eof $f]
  3334.     close $f
  3335.     set l
  3336. } {6 7 lf 0 6 14 lf 0}
  3337. test io-31.13 {binary mode is synonym of lf mode} {
  3338.     file delete $path(test1)
  3339.     set f [open $path(test1) w]
  3340.     fconfigure $f -translation binary
  3341.     set x [fconfigure $f -translation]
  3342.     close $f
  3343.     set x
  3344. } lf
  3345. #
  3346. # Test io-9.14 has been removed because "auto" output translation mode is
  3347. # not supoprted.
  3348. #
  3349. test io-31.14 {Tcl_Write mixed, Tcl_Gets auto} {
  3350.     file delete $path(test1)
  3351.     set f [open $path(test1) w]
  3352.     fconfigure $f -translation lf
  3353.     puts $f hellonthererandrnhere
  3354.     close $f
  3355.     set f [open $path(test1) r]
  3356.     fconfigure $f -translation auto
  3357.     set l ""
  3358.     lappend l [gets $f]
  3359.     lappend l [gets $f]
  3360.     lappend l [gets $f]
  3361.     lappend l [gets $f]
  3362.     lappend l [eof $f]
  3363.     lappend l [gets $f]
  3364.     lappend l [eof $f]
  3365.     close $f
  3366.     set l
  3367. } {hello there and here 0 {} 1}
  3368. test io-31.15 {Tcl_Write mixed, Tcl_Gets auto} {
  3369.     file delete $path(test1)
  3370.     set f [open $path(test1) w]
  3371.     fconfigure $f -translation lf
  3372.     puts -nonewline $f hellonthererandrnherer
  3373.     close $f
  3374.     set f [open $path(test1) r]
  3375.     fconfigure $f -translation auto
  3376.     set l ""
  3377.     lappend l [gets $f]
  3378.     lappend l [gets $f]
  3379.     lappend l [gets $f]
  3380.     lappend l [gets $f]
  3381.     lappend l [eof $f]
  3382.     lappend l [gets $f]
  3383.     lappend l [eof $f]
  3384.     close $f
  3385.     set l
  3386. } {hello there and here 0 {} 1}
  3387. test io-31.16 {Tcl_Write mixed, Tcl_Gets auto} {
  3388.     file delete $path(test1)
  3389.     set f [open $path(test1) w]
  3390.     fconfigure $f -translation lf
  3391.     puts -nonewline $f hellonthererandrnheren
  3392.     close $f
  3393.     set f [open $path(test1) r]
  3394.     set l ""
  3395.     lappend l [gets $f]
  3396.     lappend l [gets $f]
  3397.     lappend l [gets $f]
  3398.     lappend l [gets $f]
  3399.     lappend l [eof $f]
  3400.     lappend l [gets $f]
  3401.     lappend l [eof $f]
  3402.     close $f
  3403.     set l
  3404. } {hello there and here 0 {} 1}
  3405. test io-31.17 {Tcl_Write mixed, Tcl_Gets auto} {
  3406.     file delete $path(test1)
  3407.     set f [open $path(test1) w]
  3408.     fconfigure $f -translation lf
  3409.     puts -nonewline $f hellonthererandrnherern
  3410.     close $f
  3411.     set f [open $path(test1) r]
  3412.     fconfigure $f -translation auto
  3413.     set l ""
  3414.     lappend l [gets $f]
  3415.     lappend l [gets $f]
  3416.     lappend l [gets $f]
  3417.     lappend l [gets $f]
  3418.     lappend l [eof $f]
  3419.     lappend l [gets $f]
  3420.     lappend l [eof $f]
  3421.     close $f
  3422.     set l
  3423. } {hello there and here 0 {} 1}
  3424. test io-31.18 {Tcl_Write ^Z at end, Tcl_Gets auto} {
  3425.     file delete $path(test1)
  3426.     set f [open $path(test1) w]
  3427.     fconfigure $f -translation lf
  3428.     set s [format "hellontherenandrheren%c" 26]
  3429.     puts $f $s
  3430.     close $f
  3431.     set f [open $path(test1) r]
  3432.     fconfigure $f -eofchar x1a -translation auto
  3433.     set l ""
  3434.     lappend l [gets $f]
  3435.     lappend l [gets $f]
  3436.     lappend l [gets $f]
  3437.     lappend l [gets $f]
  3438.     lappend l [eof $f]
  3439.     lappend l [gets $f]
  3440.     lappend l [eof $f]
  3441.     close $f
  3442.     set l
  3443. } {hello there and here 0 {} 1}
  3444. test io-31.19 {Tcl_Write, implicit ^Z at end, Tcl_Gets auto} {
  3445.     file delete $path(test1)
  3446.     set f [open $path(test1) w]
  3447.     fconfigure $f -eofchar x1a -translation lf
  3448.     puts $f hellontherenandrhere
  3449.     close $f
  3450.     set f [open $path(test1) r]
  3451.     fconfigure $f -eofchar x1a -translation auto
  3452.     set l ""
  3453.     lappend l [gets $f]
  3454.     lappend l [gets $f]
  3455.     lappend l [gets $f]
  3456.     lappend l [gets $f]
  3457.     lappend l [eof $f]
  3458.     lappend l [gets $f]
  3459.     lappend l [eof $f]
  3460.     close $f
  3461.     set l
  3462. } {hello there and here 0 {} 1}
  3463. test io-31.20 {Tcl_Write, ^Z in middle, Tcl_Gets auto, eofChar} {
  3464.     file delete $path(test1)
  3465.     set f [open $path(test1) w]
  3466.     fconfigure $f -translation lf