summaryrefslogtreecommitdiff
path: root/ext/pty/shl.rb
blob: cdaf8d7398eb496bbf2a26f3470777ace5d90838 (plain)
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
#
#  old-fashioned 'shl' like program
#  by A. Ito
#
#  commands:
#     c        creates new shell
#     C-z      suspends shell
#     p        lists all shell
#     0,1,...  choose shell
#     q        quit

require 'pty'

$shells = []
$n_shells = 0

$r_pty = nil
$w_pty = nil

def writer
  system "stty -echo raw"
  begin
    while true
      c = STDIN.getc
      if c == 26 then # C-z
        $reader.raise(nil)
        return 'Suspend'
      end
      $w_pty.print c.chr
      $w_pty.flush
    end
  rescue
    $reader.raise(nil)
    return 'Exit'
  ensure
    system "stty echo -raw"
  end
end

$reader = Thread.new {
  while true
    begin
      next if $r_pty.nil?
      c = $r_pty.getc
      if c.nil? then
        Thread.stop
      end
      print c.chr
      STDOUT.flush
    rescue
      Thread.stop
    end
  end
}

# $reader.raise(nil)


while true
  print ">> "
  STDOUT.flush
  case gets
  when /^c/i
    $shells[$n_shells] = PTY.spawn("/bin/csh")
    $r_pty,$w_pty = $shells[$n_shells]
    $n_shells += 1
    $reader.run
    if writer == 'Exit'
      $n_shells -= 1
      $shells[$n_shells] = nil
    end
  when /^p/i
    for i in 0..$n_shells
      unless $shells[i].nil?
        print i,"\n"
      end
    end
  when /^([0-9]+)/
    n = $1.to_i
    if $shells[n].nil?
      print "\##{i} doesn't exist\n"
    else
      $r_pty,$w_pty = $shells[n]
      $reader.run
      if writer == 'Exit' then
        $shells[n] = nil
      end
    end
  when /^q/i
    exit
  end
end