<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>filter_in (TerminalFilter)</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" /> </head> <body class="standalone-code"> <pre><span class="ruby-comment cmt"># File lib/network/protocol/terminalfilter.rb, line 47</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">filter_in</span>(<span class="ruby-identifier">str</span>) <span class="ruby-identifier">buf</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">str</span>.<span class="ruby-identifier">each_byte</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">b</span><span class="ruby-operator">|</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">mode?</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">0x20</span><span class="ruby-operator">..</span><span class="ruby-value">0x7e</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">chr</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">ESC</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) ESC found"</span>) <span class="ruby-ivar">@collect</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:escape</span> <span class="ruby-comment cmt"># These cause immediate execution no matter what mode</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">ENQ</span>, <span class="ruby-constant">BEL</span>, <span class="ruby-constant">BS</span>, <span class="ruby-constant">TAB</span>, <span class="ruby-constant">VT</span>, <span class="ruby-constant">FF</span>, <span class="ruby-constant">SO</span>, <span class="ruby-constant">SI</span>, <span class="ruby-constant">DC1</span>, <span class="ruby-constant">DC3</span>, <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span>, <span class="ruby-constant">DEL</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">BS</span>, <span class="ruby-constant">DEL</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) BS, DEL found"</span>) <span class="ruby-comment cmt"># slice local buffer or connection buffer</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">conn</span>.<span class="ruby-identifier">inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-keyword kw">when</span> <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span> <span class="ruby-ivar">@collect</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">execute</span>(<span class="ruby-identifier">b</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">chr</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:escape</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?[</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) CSI sequence found"</span>) <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:csi</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?]</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) OSC/XTERM sequence found"</span>) <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:xterm</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?P</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) DCS sequence found"</span>) <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:dcs</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?O</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) SS3 sequence found"</span>) <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ss3</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?X</span>, <span class="ruby-value">?^</span>, <span class="ruby-value">?_</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) SOS/PM/APC sequence found"</span>) <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:sospmapc</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?D</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[SCROLLDOWN]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?M</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[SCROLLUP]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># VT52</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?A</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[UP 1]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?B</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[DOWN 1]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?C</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[RIGHT 1]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?D</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[LEFT 1]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># /VT52</span> <span class="ruby-comment cmt"># when ?H # Set tab at current position - ignored</span> <span class="ruby-comment cmt"># when ?E # Next line - like CRLF?</span> <span class="ruby-comment cmt"># when ?7 # Save cursor and attributes SCURA</span> <span class="ruby-comment cmt"># when ?8 # Restore cursor and attributes RCURA</span> <span class="ruby-comment cmt"># when ?c # reset device</span> <span class="ruby-comment cmt"># These cause immediate execution no matter what mode</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">ENQ</span>, <span class="ruby-constant">BEL</span>, <span class="ruby-constant">BS</span>, <span class="ruby-constant">TAB</span>, <span class="ruby-constant">VT</span>, <span class="ruby-constant">FF</span>, <span class="ruby-constant">SO</span>, <span class="ruby-constant">SI</span>, <span class="ruby-constant">DC1</span>, <span class="ruby-constant">DC3</span>, <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span>, <span class="ruby-constant">DEL</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">BS</span>, <span class="ruby-constant">DEL</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) BS, DEL found"</span>) <span class="ruby-comment cmt"># slice local buffer or connection buffer</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">conn</span>.<span class="ruby-identifier">inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-keyword kw">when</span> <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span> <span class="ruby-ivar">@collect</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">execute</span>(<span class="ruby-identifier">b</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">0x20</span><span class="ruby-operator">..</span><span class="ruby-value">0x2</span><span class="ruby-constant">F</span> <span class="ruby-comment cmt"># " !"#$%&'()*+,-./"</span> <span class="ruby-ivar">@collect</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">chr</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:escint</span> <span class="ruby-keyword kw">else</span> <span class="ruby-comment cmt"># These should all be immediately dispatched and sent to ground mode</span> <span class="ruby-comment cmt"># when "0123456789:;<=>?@ABCDEFGHIJKLMNO" 0x30..0x4F</span> <span class="ruby-comment cmt"># when "QRSTUVW" 0x51..0x57</span> <span class="ruby-comment cmt"># when "YZ" 0x59..0x5A</span> <span class="ruby-comment cmt"># when "\\" 0x5C</span> <span class="ruby-comment cmt"># when "`abcdefghijklmnopqrstuvwxyz{|}~" 0x60..0x7e</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:escint</span> <span class="ruby-comment cmt"># case b</span> <span class="ruby-comment cmt"># when ?( # Set default font</span> <span class="ruby-comment cmt"># when ?) # Set alternate font</span> <span class="ruby-comment cmt"># both ( and ) may be followed by A,B,0,1,2 !!</span> <span class="ruby-comment cmt"># end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:dcs</span> <span class="ruby-comment cmt"># terminated by ST or ESC set_mode :ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:xterm</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:sospmapc</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:csi</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?A</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[UP #{@collect.to_i == 0 ? 1 : @collect.to_i}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?B</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[DOWN #{@collect.to_i == 0 ? 1 : @collect.to_i}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?C</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[RIGHT #{@collect.to_i == 0 ? 1 : @collect.to_i}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?D</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[LEFT #{@collect.to_i == 0 ? 1 : @collect.to_i}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?H</span>, <span class="ruby-value">?f</span> <span class="ruby-comment cmt"># set cursor position \e[H or \e[<row>;<col>H</span> <span class="ruby-identifier">a</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">";"</span>) <span class="ruby-identifier">a</span> = [<span class="ruby-value str">"1"</span>,<span class="ruby-value str">"1"</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[HOME #{a[0]},#{a[1]}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?R</span> <span class="ruby-comment cmt"># report cursor pos</span> <span class="ruby-identifier">a</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">";"</span>) <span class="ruby-identifier">a</span> = [<span class="ruby-value str">"1"</span>,<span class="ruby-value str">"1"</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[CURSOR #{a[0]},#{a[1]}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?r</span> <span class="ruby-comment cmt"># Set scrolling region</span> <span class="ruby-comment cmt"># Enable scrolling entire display \e[r or just a region \e[<srow>;<erow>r</span> <span class="ruby-identifier">a</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">";"</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-comment cmt"># lines numbered from 1</span> <span class="ruby-comment cmt"># This should be 1 to n or the whole screen if no parms</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[SCRRESET]"</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[SCRREG #{a[0]},#{a[1]}]"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?J</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">==</span> <span class="ruby-value">2</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[CLEAR]"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># Erase from cursor to end of screen Esc [ 0 J or Esc [ J</span> <span class="ruby-comment cmt"># Erase from beginning of screen to cursor Esc [ 1 J</span> <span class="ruby-comment cmt"># Erase entire screen Esc [ 2 J</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?K</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">==</span> <span class="ruby-value">2</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[CLEARLINE]"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># when ?K Erase line</span> <span class="ruby-comment cmt"># Erase from cursor to end of line Esc [ 0 K or Esc [ K</span> <span class="ruby-comment cmt"># Erase from beginning of line to cursor Esc [ 1 K</span> <span class="ruby-comment cmt"># Erase line containing cursor Esc [ 2 K</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?G</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"[POS #{@collect.to_i == 0 ? 1 : @collect.to_i}]"</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># when ?G Set starting column of presentation</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?g</span>, <span class="ruby-value">?c</span>, <span class="ruby-value">?h</span>, <span class="ruby-value">?l</span>, <span class="ruby-value">?s</span>, <span class="ruby-value">?u</span>, <span class="ruby-value">?x</span>, <span class="ruby-value">?y</span>, <span class="ruby-value">?q</span>, <span class="ruby-value">?i</span>, <span class="ruby-value">?p</span> <span class="ruby-comment cmt"># unhandled</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># when ?c DA request/response - Device code - response is \e[<code>0c</span> <span class="ruby-comment cmt"># when ?g Tab clear at current position</span> <span class="ruby-comment cmt"># CSI 3 g is clear all tabs</span> <span class="ruby-comment cmt"># when ?h Set mode</span> <span class="ruby-comment cmt"># when ?l Reset mode</span> <span class="ruby-comment cmt"># Enable Line Wrap <ESC>[7h</span> <span class="ruby-comment cmt"># Disable Line Wrap <ESC>[7l</span> <span class="ruby-comment cmt"># when ?s save cursor</span> <span class="ruby-comment cmt"># when ?u unsave cursor</span> <span class="ruby-comment cmt"># Same as ESC7 and ESC8 but not attributes?</span> <span class="ruby-comment cmt"># when ?x Report terminal parameters</span> <span class="ruby-comment cmt"># when ?y Confidence test</span> <span class="ruby-comment cmt"># when ?q load LEDs</span> <span class="ruby-comment cmt"># when ?i printing</span> <span class="ruby-comment cmt"># when ?p Set Key Definition <ESC>[{key};"{string}"p</span> <span class="ruby-comment cmt"># when ?P # -> set_mode :dcs</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?n</span> <span class="ruby-comment cmt"># Device status request</span> <span class="ruby-identifier">i</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">==</span> <span class="ruby-value">6</span> <span class="ruby-comment cmt"># Query cursor position - response is \e[<row>;<col>R</span> <span class="ruby-comment cmt"># request for report cursor pos</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[CURREPT]"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?m</span> <span class="ruby-comment cmt"># SGR color</span> <span class="ruby-identifier">a</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">split</span>(<span class="ruby-value str">";"</span>) <span class="ruby-identifier">a</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">cd</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span> = <span class="ruby-constant">SGR2CODE</span>[<span class="ruby-identifier">cd</span>] <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?~</span> <span class="ruby-comment cmt"># keys</span> <span class="ruby-identifier">i</span> = <span class="ruby-ivar">@collect</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">i</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">1</span>, <span class="ruby-value">7</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[HOME 1,1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">2</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[INSERT]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">3</span> <span class="ruby-comment cmt"># delete</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) BS, DEL found"</span>) <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">conn</span>.<span class="ruby-identifier">inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-identifier">echo</span>(<span class="ruby-constant">BS</span>.<span class="ruby-identifier">chr</span>) <span class="ruby-keyword kw">when</span> <span class="ruby-value">4</span>, <span class="ruby-value">8</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[END]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">5</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[PAGEUP]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">6</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[PAGEDOWN]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">11</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">12</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F2]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">13</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F3]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">14</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F4]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">15</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F5]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">17</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F6]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">18</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F7]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">19</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F8]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">20</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F9]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">21</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F10]"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-comment cmt"># These cause immediate execution no matter what mode</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">ENQ</span>, <span class="ruby-constant">BEL</span>, <span class="ruby-constant">BS</span>, <span class="ruby-constant">TAB</span>, <span class="ruby-constant">VT</span>, <span class="ruby-constant">FF</span>, <span class="ruby-constant">SO</span>, <span class="ruby-constant">SI</span>, <span class="ruby-constant">DC1</span>, <span class="ruby-constant">DC3</span>, <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span>, <span class="ruby-constant">DEL</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">BS</span>, <span class="ruby-constant">DEL</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) BS, DEL found"</span>) <span class="ruby-comment cmt"># slice local buffer or connection buffer</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">conn</span>.<span class="ruby-identifier">inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-keyword kw">when</span> <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span> <span class="ruby-ivar">@collect</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">execute</span>(<span class="ruby-identifier">b</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">else</span> <span class="ruby-ivar">@collect</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">b</span>.<span class="ruby-identifier">chr</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:ss3</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-comment cmt"># Windows XP telnet</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?P</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?Q</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F2]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?R</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F3]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?S</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[F4]"</span> <span class="ruby-comment cmt"># /Windows XP telnet</span> <span class="ruby-comment cmt"># ANSI cursor key mode</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?A</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[UP 1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?B</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[DOWN 1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?C</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[RIGHT 1]"</span> <span class="ruby-keyword kw">when</span> <span class="ruby-value">?D</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-value str">"[LEFT 1]"</span> <span class="ruby-comment cmt"># /ANSI cursor key mode</span> <span class="ruby-comment cmt"># These cause immediate execution no matter what mode</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">ENQ</span>, <span class="ruby-constant">BEL</span>, <span class="ruby-constant">BS</span>, <span class="ruby-constant">TAB</span>, <span class="ruby-constant">VT</span>, <span class="ruby-constant">FF</span>, <span class="ruby-constant">SO</span>, <span class="ruby-constant">SI</span>, <span class="ruby-constant">DC1</span>, <span class="ruby-constant">DC3</span>, <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span>, <span class="ruby-constant">DEL</span> <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">b</span> <span class="ruby-keyword kw">when</span> <span class="ruby-constant">BS</span>, <span class="ruby-constant">DEL</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span>(<span class="ruby-node">"(#{@pstack.conn.object_id}) BS, DEL found"</span>) <span class="ruby-comment cmt"># slice local buffer or connection buffer</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">conn</span>.<span class="ruby-identifier">inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">-1</span>) <span class="ruby-keyword kw">when</span> <span class="ruby-constant">CAN</span>, <span class="ruby-constant">SUB</span> <span class="ruby-ivar">@collect</span> = <span class="ruby-value str">""</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">buf</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">execute</span>(<span class="ruby-identifier">b</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">set_mode</span> <span class="ruby-identifier">:ground</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># eachwhile b</span> <span class="ruby-identifier">buf</span> <span class="ruby-keyword kw">end</span></pre> </body> </html>