This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.

Determining Terminal Size
CodeExpectedActual
Curses.program do |scr|
  max_y, max_x = scr.maxy, scr.maxx
  scr.setpos(0, 0)
  scr.addstr("Your terminal size is #{max_x}x#{max_y}. Press any key to exit.")
  scr.getch
end
Ncurses.program do |scr|
  max_y, max_x = [], []
  scr.getmaxyx(max_y, max_x)
  max_y, max_x = max_y[0], max_x[0]
  str = "Your terminal size is #{max_x}x#{max_y}. Press any key to exit."
  scr.mvaddstr(0, 0, str)
  scr.getch
end
TIOCGWINSZ = 0x5413                 # For an Intel processor
TIOCGWINSZ = 0x40087468           # For a PowerPC processor
NameError: uninitialized constant Curses
	from (irb):1
NameError: uninitialized constant Ncurses
	from (irb):7
def terminal_size  
 rows, cols = 25, 80
  buf = [ 0, 0, 0, 0 ].pack("SSSS")
  if STDOUT.ioctl(TIOCGWINSZ, buf) >= 0 then
    rows, cols, row_pixels, col_pixels = buf.unpack("SSSS")[0..1]
  end
  return rows, cols
end
terminal_size
[21, 80]
Error! (Exception?) Here's stdout:
Errno::EINVAL: Invalid argument
	from (irb):19:in `ioctl'
	from (irb):19:in `terminal_size'
	from (irb):24
STDOUT_HANDLE = 0xFFFFFFF5
def terminal_size
  m_GetStdHandle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L')
  m_GetConsoleScreenBufferInfo = Win32API.new ('kernel32', 
                                               'GetConsoleScreenBufferInfo', 
                                               ['L', 'P'], 'L' )
  format = 'SSSSSssssSS'
  buf = ([0] * format.size).pack(format)
  stdout_handle = m_GetStdHandle.call(STDOUT_HANDLE)
  m_GetConsoleScreenBufferInfo.call(stdout_handle, buf)
  (bufx, bufy, curx, cury, wattr, 
   left, top, right, bottom, maxx, maxy) = buf.unpack(format)
  return bottom - top + 1, right - left + 1
end
terminal_size
[25, 80]
Error! (Exception?) Here's stdout:
NameError: uninitialized constant Win32API
	from (irb):27:in `terminal_size'
	from (irb):39
def terminal_size
  %x{stty size}.split.collect { |x| x.to_i }
end
terminal_size
[21, 80] []