diff options
Diffstat (limited to 'ext/pty/lib/expect.rb')
| -rw-r--r-- | ext/pty/lib/expect.rb | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/ext/pty/lib/expect.rb b/ext/pty/lib/expect.rb index aa9ab895d3..22cbf54115 100644 --- a/ext/pty/lib/expect.rb +++ b/ext/pty/lib/expect.rb @@ -1,27 +1,63 @@ +# frozen_string_literal: true $expect_verbose = false class IO + # call-seq: + # IO#expect(pattern,timeout=9999999) -> Array + # IO#expect(pattern,timeout=9999999) { |result| ... } -> nil + # + # The +expect+ library adds instance method IO#expect, + # which is similar to the + # {TCL expect extension}[https://www.tcl.tk/man/expect5.31/expect.1.html]. + # + # To use this method, you must require +expect+: + # + # require 'expect' + # + # Reads from the IO until the given +pattern+ matches or the +timeout+ is over. + # + # It returns an array with the read buffer, followed by the matches. + # If a block is given, the result is yielded to the block and returns nil. + # + # When called without a block, it waits until the input that matches the + # given +pattern+ is obtained from the IO or the time specified as the + # timeout passes. An array is returned when the pattern is obtained from the + # IO. The first element of the array is the entire string obtained from the + # IO until the pattern matches, followed by elements indicating which the + # pattern which matched to the anchor in the regular expression. + # + # The optional timeout parameter defines, in seconds, the total time to wait + # for the pattern. If the timeout expires or eof is found, nil is returned + # or yielded. However, the buffer in a timeout session is kept for the next + # expect call. The default timeout is 9999999 seconds. def expect(pat,timeout=9999999) - buf = '' + buf = ''.dup case pat when String e_pat = Regexp.new(Regexp.quote(pat)) when Regexp e_pat = pat + else + raise TypeError, "unsupported pattern class: #{pat.class}" end + @unusedBuf ||= '' while true - if IO.select([self],nil,nil,timeout).nil? then + if not @unusedBuf.empty? + c = @unusedBuf.slice!(0) + elsif !IO.select([self],nil,nil,timeout) or eof? then result = nil + @unusedBuf = buf break + else + c = getc end - c = getc.chr buf << c if $expect_verbose STDOUT.print c STDOUT.flush end if mat=e_pat.match(buf) then - result = [buf,*mat.to_a[1..-1]] + result = [buf,*mat.captures] break end end @@ -33,4 +69,3 @@ class IO nil end end - |
