/usr/lib/ruby/vendor_ruby/highline/system_extensions.rb is in ruby-highline 1.6.20-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | # system_extensions.rb
#
# Created by James Edward Gray II on 2006-06-14.
# Copyright 2006 Gray Productions. All rights reserved.
#
# This is Free Software. See LICENSE and COPYING for details.
require "highline/compatibility"
class HighLine
module SystemExtensions
JRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
if JRUBY
def initialize_system_extensions
require 'java'
require 'readline'
if JRUBY_VERSION =~ /^1.7/
java_import 'jline.console.ConsoleReader'
input = @input && @input.to_inputstream
output = @output && @output.to_outputstream
@java_console = ConsoleReader.new(input, output)
@java_console.set_history_enabled(false)
@java_console.set_bell_enabled(true)
@java_console.set_pagination_enabled(false)
@java_terminal = @java_console.getTerminal
elsif JRUBY_VERSION =~ /^1.6/
java_import 'java.io.OutputStreamWriter'
java_import 'java.nio.channels.Channels'
java_import 'jline.ConsoleReader'
java_import 'jline.Terminal'
@java_input = Channels.newInputStream(@input.to_channel)
@java_output = OutputStreamWriter.new(Channels.newOutputStream(@output.to_channel))
@java_terminal = Terminal.getTerminal
@java_console = ConsoleReader.new(@java_input, @java_output)
@java_console.setUseHistory(false)
@java_console.setBellEnabled(true)
@java_console.setUsePagination(false)
end
end
end
extend self
#
# This section builds character reading and terminal size functions
# to suit the proper platform we're running on. Be warned: Here be
# dragons!
#
if RUBY_PLATFORM =~ /mswin(?!ce)|mingw|bccwin/i
begin
require "fiddle"
module WinAPI
include Fiddle
Handle = RUBY_VERSION >= "2.0.0" ? Fiddle::Handle : DL::Handle
Kernel32 = Handle.new("kernel32")
Crt = Handle.new("msvcrt") rescue Handle.new("crtdll")
def self._getch
@@_m_getch ||= Function.new(Crt["_getch"], [], TYPE_INT)
@@_m_getch.call
end
def self.GetStdHandle(handle_type)
@@get_std_handle ||= Function.new(Kernel32["GetStdHandle"], [-TYPE_INT], -TYPE_INT)
@@get_std_handle.call(handle_type)
end
def self.GetConsoleScreenBufferInfo(cons_handle, lp_buffer)
@@get_console_screen_buffer_info ||=
Function.new(Kernel32["GetConsoleScreenBufferInfo"], [TYPE_LONG, TYPE_VOIDP], TYPE_INT)
@@get_console_screen_buffer_info.call(cons_handle, lp_buffer)
end
end
rescue LoadError
require "dl/import"
module WinAPI
extend DL::Importer rescue DL::Importable
begin
dlload "msvcrt", "kernel32"
rescue DL::DLError
dlload "crtdll", "kernel32"
end
extern "unsigned long _getch()"
extern "unsigned long GetConsoleScreenBufferInfo(unsigned long, void*)"
extern "unsigned long GetStdHandle(unsigned long)"
end
end
CHARACTER_MODE = "Win32API" # For Debugging purposes only.
#
# Windows savvy getc().
#
# *WARNING*: This method ignores <tt>input</tt> and reads one
# character from +STDIN+!
#
def get_character( input = STDIN )
WinAPI._getch
end
# We do not define a raw_no_echo_mode for Windows as _getch turns off echo
def raw_no_echo_mode
end
def restore_mode
end
# A Windows savvy method to fetch the console columns, and rows.
def terminal_size
format = 'SSSSSssssSS'
buf = ([0] * format.size).pack(format)
stdout_handle = WinAPI.GetStdHandle(0xFFFFFFF5)
WinAPI.GetConsoleScreenBufferInfo(stdout_handle, buf)
_, _, _, _, _,
left, top, right, bottom, _, _ = buf.unpack(format)
return right - left + 1, bottom - top + 1
end
else # If we're not on Windows try...
begin
require "termios" # Unix, first choice termios.
CHARACTER_MODE = "termios" # For Debugging purposes only.
def raw_no_echo_mode
@state = Termios.getattr(@input)
new_settings = @state.dup
new_settings.c_lflag &= ~(Termios::ECHO | Termios::ICANON)
new_settings.c_cc[Termios::VMIN] = 1
Termios.setattr(@input, Termios::TCSANOW, new_settings)
end
def restore_mode
Termios.setattr(@input, Termios::TCSANOW, @state)
end
rescue LoadError # If our first choice fails, try using JLine
if JRUBY # if we are on JRuby. JLine is bundled with JRuby.
CHARACTER_MODE = "jline" # For Debugging purposes only.
def terminal_size
if JRUBY_VERSION =~ /^1.7/
[ @java_terminal.get_width, @java_terminal.get_height ]
else
[ @java_terminal.getTerminalWidth, @java_terminal.getTerminalHeight ]
end
end
def raw_no_echo_mode
@state = @java_console.getEchoCharacter
@java_console.setEchoCharacter 0
end
def restore_mode
@java_console.setEchoCharacter @state
end
else # If we are not on JRuby, try ncurses
begin
require 'ffi-ncurses'
CHARACTER_MODE = "ncurses" # For Debugging purposes only.
def raw_no_echo_mode
FFI::NCurses.initscr
FFI::NCurses.cbreak
end
def restore_mode
FFI::NCurses.endwin
end
#
# A ncurses savvy method to fetch the console columns, and rows.
#
def terminal_size
size = [80, 40]
FFI::NCurses.initscr
begin
size = FFI::NCurses.getmaxyx(FFI::NCurses.stdscr).reverse
ensure
FFI::NCurses.endwin
end
size
end
rescue LoadError # Finally, if all else fails, use stty
# *WARNING*: This requires the external "stty" program!
CHARACTER_MODE = "stty" # For Debugging purposes only.
def raw_no_echo_mode
@state = `stty -g`
system "stty raw -echo -icanon isig"
end
def restore_mode
system "stty #{@state}"
end
end
end
end
# For termios and stty
if not method_defined?(:terminal_size)
# A Unix savvy method using stty to fetch the console columns, and rows.
# ... stty does not work in JRuby
def terminal_size
if /solaris/ =~ RUBY_PLATFORM and
`stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/
[$2, $1].map { |c| x.to_i }
else
`stty size`.split.map { |x| x.to_i }.reverse
end
end
end
end
if not method_defined?(:get_character)
def get_character( input = STDIN )
input.getbyte
end
end
end
end
|