summaryrefslogtreecommitdiff
path: root/ruby_2_2/lib/irb/input-method.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_2_2/lib/irb/input-method.rb')
-rw-r--r--ruby_2_2/lib/irb/input-method.rb191
1 files changed, 191 insertions, 0 deletions
diff --git a/ruby_2_2/lib/irb/input-method.rb b/ruby_2_2/lib/irb/input-method.rb
new file mode 100644
index 0000000000..4ea3f585f8
--- /dev/null
+++ b/ruby_2_2/lib/irb/input-method.rb
@@ -0,0 +1,191 @@
+#
+# irb/input-method.rb - input methods used irb
+# $Release Version: 0.9.6$
+# $Revision$
+# by Keiju ISHITSUKA(keiju@ruby-lang.org)
+#
+# --
+#
+#
+#
+require 'irb/src_encoding'
+require 'irb/magic-file'
+
+module IRB
+ STDIN_FILE_NAME = "(line)" # :nodoc:
+ class InputMethod
+
+ # Creates a new input method object
+ def initialize(file = STDIN_FILE_NAME)
+ @file_name = file
+ end
+ # The file name of this input method, usually given during initialization.
+ attr_reader :file_name
+
+ # The irb prompt associated with this input method
+ attr_accessor :prompt
+
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
+ def gets
+ IRB.fail NotImplementedError, "gets"
+ end
+ public :gets
+
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
+ def readable_after_eof?
+ false
+ end
+ end
+
+ class StdioInputMethod < InputMethod
+ # Creates a new input method object
+ def initialize
+ super
+ @line_no = 0
+ @line = []
+ @stdin = IO.open(STDIN.to_i, :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ @stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ end
+
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
+ def gets
+ print @prompt
+ line = @stdin.gets
+ @line[@line_no += 1] = line
+ end
+
+ # Whether the end of this input method has been reached, returns +true+ if
+ # there is no more data to read.
+ #
+ # See IO#eof? for more information.
+ def eof?
+ @stdin.eof?
+ end
+
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
+ def readable_after_eof?
+ true
+ end
+
+ # Returns the current line number for #io.
+ #
+ # #line counts the number of times #gets is called.
+ #
+ # See IO#lineno for more information.
+ def line(line_no)
+ @line[line_no]
+ end
+
+ # The external encoding for standard input.
+ def encoding
+ @stdin.external_encoding
+ end
+ end
+
+ # Use a File for IO with irb, see InputMethod
+ class FileInputMethod < InputMethod
+ # Creates a new input method object
+ def initialize(file)
+ super
+ @io = IRB::MagicFile.open(file)
+ end
+ # The file name of this input method, usually given during initialization.
+ attr_reader :file_name
+
+ # Whether the end of this input method has been reached, returns +true+ if
+ # there is no more data to read.
+ #
+ # See IO#eof? for more information.
+ def eof?
+ @io.eof?
+ end
+
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
+ def gets
+ print @prompt
+ l = @io.gets
+ l
+ end
+
+ # The external encoding for standard input.
+ def encoding
+ @io.external_encoding
+ end
+ end
+
+ begin
+ require "readline"
+ class ReadlineInputMethod < InputMethod
+ include Readline
+ # Creates a new input method object using Readline
+ def initialize
+ super
+
+ @line_no = 0
+ @line = []
+ @eof = false
+
+ @stdin = IO.open(STDIN.to_i, :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ @stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ end
+
+ # Reads the next line from this input method.
+ #
+ # See IO#gets for more information.
+ def gets
+ Readline.input = @stdin
+ Readline.output = @stdout
+ if l = readline(@prompt, false)
+ HISTORY.push(l) if !l.empty?
+ @line[@line_no += 1] = l + "\n"
+ else
+ @eof = true
+ l
+ end
+ end
+
+ # Whether the end of this input method has been reached, returns +true+
+ # if there is no more data to read.
+ #
+ # See IO#eof? for more information.
+ def eof?
+ @eof
+ end
+
+ # Whether this input method is still readable when there is no more data to
+ # read.
+ #
+ # See IO#eof for more information.
+ def readable_after_eof?
+ true
+ end
+
+ # Returns the current line number for #io.
+ #
+ # #line counts the number of times #gets is called.
+ #
+ # See IO#lineno for more information.
+ def line(line_no)
+ @line[line_no]
+ end
+
+ # The external encoding for standard input.
+ def encoding
+ @stdin.external_encoding
+ end
+ end
+ rescue LoadError
+ end
+end