1#!/usr/local/bin/ruby
2
3require "curses"
4include Curses
5
6#
7# main
8#
9
10if ARGV.size != 1 then
11  printf("usage: view file\n");
12  exit
13end
14begin
15  fp = open(ARGV[0], "r")
16rescue
17  raise "cannot open file: #{ARGV[1]}"
18end
19
20# signal(SIGINT, finish)
21
22init_screen
23#keypad(stdscr, TRUE)
24nonl
25cbreak
26noecho
27#scrollok(stdscr, TRUE)
28
29# slurp the file
30data_lines = []
31fp.each_line { |l|
32  data_lines.push(l)
33}
34fp.close
35
36
37lptr = 0
38while TRUE
39  i = 0
40  while i < lines
41    setpos(i, 0)
42    #clrtoeol
43    addstr(data_lines[lptr + i] || '')
44    i += 1
45  end
46  refresh
47
48  explicit = FALSE
49  n = 0
50  while TRUE
51    c = getch
52    if c =~ /[0-9]/
53      n = 10 * n + c.to_i
54    else
55      break
56    end
57  end
58
59  n = 1 if !explicit && n == 0
60
61  case c
62  when "n"  #when KEY_DOWN
63    i = 0
64    while i < n
65      if lptr + lines < data_lines.size then
66	lptr += 1
67      else
68	break
69      end
70      i += 1
71    end
72    #wscrl(i)
73
74  when "p"  #when KEY_UP
75    i = 0
76    while i < n
77      if lptr > 0 then
78	lptr -= 1
79      else
80	break
81      end
82      i += 1
83    end
84    #wscrl(-i)
85
86  when "q"
87    break
88  end
89
90end
91close_screen
92