From fe24d021b14b054b64dbb561fc340962be09c58e Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 4 Aug 2026 20:00:07 +0900 Subject: [PATCH] Clean up platform dispatch in the FFI version --- lib/ffi/io/console.rb | 59 ++++++++-------------------- lib/ffi/io/console/bsd_console.rb | 2 + lib/ffi/io/console/common.rb | 2 +- lib/ffi/io/console/linux_console.rb | 2 + lib/ffi/io/console/native_console.rb | 10 ----- 5 files changed, 22 insertions(+), 53 deletions(-) diff --git a/lib/ffi/io/console.rb b/lib/ffi/io/console.rb index 91d6632..fb69ff8 100644 --- a/lib/ffi/io/console.rb +++ b/lib/ffi/io/console.rb @@ -24,51 +24,26 @@ require_relative 'console/version' require_relative 'console/common' -case RbConfig::CONFIG['host_os'] -when /darwin|openbsd|freebsd|netbsd|linux/i - # If Linux or BSD, try to load the native version - - begin - - # Attempt to load the native Linux and BSD console logic - require_relative 'console/native_console' - - rescue Exception => ex - - warn "failed to load native console support: #{ex}" if $VERBOSE - - else - - # Native ready. - ready = true - - end - +libs = [] +# If Linux or BSD, try to load the native version +case RbConfig::CONFIG['host_os'].downcase +when /darwin|openbsd|freebsd|netbsd/ + libs << 'bsd' << 'stty' +when /linux/ + libs << 'linux' << 'stty' when /mswin|win32|ming/i # If Windows, stty is not possible, always use the stub version - - ready = false - +else + libs << 'stty' end -if ready.nil? - # Native is not ready, try to use stty - - begin - - require_relative 'console/stty_console' - ready = true - - rescue Exception => ex2 - - warn "failed to load stty console support: #{ex2}" if $VERBOSE - ready = false - - end +return if libs.any? do |lib| + require_relative "console/#{lib}_console" +rescue Exception => ex + warn "failed to load #{lib} console support: #{ex}" if $VERBOSE +else + true end -unless ready - # If still not ready, just use stubbed version - - require_relative 'console/stub_console' -end +# If still not ready, just use stubbed version +require_relative "console/stub_console" diff --git a/lib/ffi/io/console/bsd_console.rb b/lib/ffi/io/console/bsd_console.rb index 092f7e8..2785ef4 100644 --- a/lib/ffi/io/console/bsd_console.rb +++ b/lib/ffi/io/console/bsd_console.rb @@ -6,6 +6,8 @@ raise LoadError.new("native console on MacOS only supported on #{tested_platforms.join(', ')}") end +require_relative 'native_console' + module IO::LibC extend FFI::Library ffi_lib FFI::Library::LIBC diff --git a/lib/ffi/io/console/common.rb b/lib/ffi/io/console/common.rb index 832889a..47bbb24 100644 --- a/lib/ffi/io/console/common.rb +++ b/lib/ffi/io/console/common.rb @@ -67,7 +67,7 @@ def cursor syswrite "\e[6n" return nil if getbyte != 0x1b - return nil if getbyte != ?[.ord + return nil if getbyte != "[".ord num = 0 result = [] diff --git a/lib/ffi/io/console/linux_console.rb b/lib/ffi/io/console/linux_console.rb index ce71ecc..33bd672 100644 --- a/lib/ffi/io/console/linux_console.rb +++ b/lib/ffi/io/console/linux_console.rb @@ -6,6 +6,8 @@ warn "native console only tested on #{tested_platforms.join(', ')}" end +require_relative 'native_console' + module IO::LibC extend FFI::Library ffi_lib FFI::Library::LIBC diff --git a/lib/ffi/io/console/native_console.rb b/lib/ffi/io/console/native_console.rb index e5443c3..f0390bf 100644 --- a/lib/ffi/io/console/native_console.rb +++ b/lib/ffi/io/console/native_console.rb @@ -1,13 +1,3 @@ -# Load appropriate native bits for BSD or Linux -case RbConfig::CONFIG['host_os'].downcase -when /darwin|openbsd|freebsd|netbsd/ - require_relative 'bsd_console' -when /linux/ - require_relative 'linux_console' -else - raise LoadError.new("no native io/console support") -end - # Common logic that uses native calls for console class IO def ttymode