def filter_in(str)
buf = ""
str.each_byte do |b|
case mode?
when :ground
case b
when 0x20..0x7e
buf << b.chr
when ESC
log.debug("(#{@pstack.conn.object_id}) ESC found")
@collect = ""
set_mode :escape
when ENQ, BEL, BS, TAB, VT, FF, SO, SI, DC1, DC3, CAN, SUB, DEL
case b
when BS, DEL
log.debug("(#{@pstack.conn.object_id}) BS, DEL found")
buf.slice!(-1) || @pstack.conn.inbuffer.slice!(-1)
when CAN, SUB
@collect = ""
set_mode :ground
else
buf << execute(b)
end
else
buf << b.chr
end
when :escape
case b
when ?[
log.debug("(#{@pstack.conn.object_id}) CSI sequence found")
set_mode :csi
when ?]
log.debug("(#{@pstack.conn.object_id}) OSC/XTERM sequence found")
set_mode :xterm
when ?P
log.debug("(#{@pstack.conn.object_id}) DCS sequence found")
set_mode :dcs
when ?O
log.debug("(#{@pstack.conn.object_id}) SS3 sequence found")
set_mode :ss3
when ?X, ?^, ?_
log.debug("(#{@pstack.conn.object_id}) SOS/PM/APC sequence found")
set_mode :sospmapc
when ?D
buf << "[SCROLLDOWN]"
set_mode :ground
when ?M
buf << "[SCROLLUP]"
set_mode :ground
when ?A
buf << "[UP 1]"
set_mode :ground
when ?B
buf << "[DOWN 1]"
set_mode :ground
when ?C
buf << "[RIGHT 1]"
set_mode :ground
when ?D
buf << "[LEFT 1]"
set_mode :ground
when ENQ, BEL, BS, TAB, VT, FF, SO, SI, DC1, DC3, CAN, SUB, DEL
case b
when BS, DEL
log.debug("(#{@pstack.conn.object_id}) BS, DEL found")
buf.slice!(-1) || @pstack.conn.inbuffer.slice!(-1)
when CAN, SUB
@collect = ""
set_mode :ground
else
buf << execute(b)
end
when 0x20..0x2F
@collect << b.chr
set_mode :escint
else
set_mode :ground
end
when :escint
set_mode :ground
when :dcs
when :xterm
set_mode :ground
when :sospmapc
set_mode :ground
when :csi
case b
when ?A
buf << "[UP #{@collect.to_i == 0 ? 1 : @collect.to_i}]"
set_mode :ground
when ?B
buf << "[DOWN #{@collect.to_i == 0 ? 1 : @collect.to_i}]"
set_mode :ground
when ?C
buf << "[RIGHT #{@collect.to_i == 0 ? 1 : @collect.to_i}]"
set_mode :ground
when ?D
buf << "[LEFT #{@collect.to_i == 0 ? 1 : @collect.to_i}]"
set_mode :ground
when ?H, ?f
a = @collect.split(";")
a = ["1","1"] if a.empty?
buf << "[HOME #{a[0]},#{a[1]}]"
set_mode :ground
when ?R
a = @collect.split(";")
a = ["1","1"] if a.empty?
buf << "[CURSOR #{a[0]},#{a[1]}]"
set_mode :ground
when ?r
a = @collect.split(";")
if a.empty?
buf << "[SCRRESET]"
else
buf << "[SCRREG #{a[0]},#{a[1]}]"
end
set_mode :ground
when ?J
if @collect.to_i == 2
buf << "[CLEAR]"
end
set_mode :ground
when ?K
if @collect.to_i == 2
buf << "[CLEARLINE]"
end
set_mode :ground
when ?G
buf << "[POS #{@collect.to_i == 0 ? 1 : @collect.to_i}]"
set_mode :ground
when ?g, ?c, ?h, ?l, ?s, ?u, ?x, ?y, ?q, ?i, ?p
set_mode :ground
when ?n
i = @collect.to_i
if i == 6
buf << "[CURREPT]"
end
set_mode :ground
when ?m
a = @collect.split(";")
a.each do |cd|
s = SGR2CODE[cd]
buf << s if s
end
set_mode :ground
when ?z
buf << "[MXP @collect.to_i]"
set_mode :ground
when ?~
i = @collect.to_i
case i
when 1, 7
buf << "[HOME 1,1]"
when 2
buf << "[INSERT]"
when 3
log.debug("(#{@pstack.conn.object_id}) BS, DEL found")
buf.slice!(-1) || @pstack.conn.inbuffer.slice!(-1)
echo(BS.chr)
when 4, 8
buf << "[END]"
when 5
buf << "[PAGEUP]"
when 6
buf << "[PAGEDOWN]"
when 11
buf << "[F1]"
when 12
buf << "[F2]"
when 13
buf << "[F3]"
when 14
buf << "[F4]"
when 15
buf << "[F5]"
when 17
buf << "[F6]"
when 18
buf << "[F7]"
when 19
buf << "[F8]"
when 20
buf << "[F9]"
when 21
buf << "[F10]"
end
set_mode :ground
when ENQ, BEL, BS, TAB, VT, FF, SO, SI, DC1, DC3, CAN, SUB, DEL
case b
when BS, DEL
log.debug("(#{@pstack.conn.object_id}) BS, DEL found")
buf.slice!(-1) || @pstack.conn.inbuffer.slice!(-1)
when CAN, SUB
@collect = ""
set_mode :ground
else
buf << execute(b)
end
else
@collect << b.chr
end
when :ss3
case b
when ?P
buf << "[F1]"
when ?Q
buf << "[F2]"
when ?R
buf << "[F3]"
when ?S
buf << "[F4]"
when ?A
buf << "[UP 1]"
when ?B
buf << "[DOWN 1]"
when ?C
buf << "[RIGHT 1]"
when ?D
buf << "[LEFT 1]"
when ENQ, BEL, BS, TAB, VT, FF, SO, SI, DC1, DC3, CAN, SUB, DEL
case b
when BS, DEL
log.debug("(#{@pstack.conn.object_id}) BS, DEL found")
buf.slice!(-1) || @pstack.conn.inbuffer.slice!(-1)
when CAN, SUB
@collect = ""
set_mode :ground
else
buf << execute(b)
end
end
set_mode :ground
end
end
buf
end