mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 df96f994f1
			
		
	
	
		df96f994f1
		
	
	
	
	
		
			
			expression interpolation. * pack.c (pack_unpack): should give length to utf8_to_uv(). * pack.c (utf8_to_uv): add length check. * massages: replace "wrong #" by "wrong number". * marshal.c (w_float): output Infinity and NaN explicitly. * marshal.c (r_object): support new explicit float format. * eval.c (rb_thread_wait_for): select may cause ERESTART on Solaris. * eval.c (rb_thread_select): ditto. * array.c (rb_ary_join): dumped core if sep is not T_STRING nor T_NIL. * array.c (rb_ary_join): buffer size calculattion was wrong. * array.c (rb_ary_to_s): if rb_output_fs is nil, insert newlines between array elements (use rb_default_rs as newline litral) [experimental]. * gc.c (init_mark_stack): no need to clear mark_stack. * gc.c (gc_mark_all): need to handle finalizer mark. * gc.c (gc_mark_rest): use MEMCPY instead of memcpy. * gc.c (rb_gc_mark): earlier const check to avoid pusing special constants into mark stack. * numeric.c (fix_to_s): 'to_s' now takes optional argument to specify radix. [new] * bignum.c (rb_big_to_s): ditto. [new] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| #
 | |
| #  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
 |