d5742209d3
Fixes #113 Signed-off-by: Marcos Lilljedahl <marcosnils@gmail.com>
71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package ansiterm
|
|
|
|
type StateId int
|
|
|
|
type State interface {
|
|
Enter() error
|
|
Exit() error
|
|
Handle(byte) (State, error)
|
|
Name() string
|
|
Transition(State) error
|
|
}
|
|
|
|
type BaseState struct {
|
|
name string
|
|
parser *AnsiParser
|
|
}
|
|
|
|
func (base BaseState) Enter() error {
|
|
return nil
|
|
}
|
|
|
|
func (base BaseState) Exit() error {
|
|
return nil
|
|
}
|
|
|
|
func (base BaseState) Handle(b byte) (s State, e error) {
|
|
|
|
switch {
|
|
case b == CSI_ENTRY:
|
|
return base.parser.CsiEntry, nil
|
|
case b == DCS_ENTRY:
|
|
return base.parser.DcsEntry, nil
|
|
case b == ANSI_ESCAPE_PRIMARY:
|
|
return base.parser.Escape, nil
|
|
case b == OSC_STRING:
|
|
return base.parser.OscString, nil
|
|
case sliceContains(ToGroundBytes, b):
|
|
return base.parser.Ground, nil
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func (base BaseState) Name() string {
|
|
return base.name
|
|
}
|
|
|
|
func (base BaseState) Transition(s State) error {
|
|
if s == base.parser.Ground {
|
|
execBytes := []byte{0x18}
|
|
execBytes = append(execBytes, 0x1A)
|
|
execBytes = append(execBytes, getByteRange(0x80, 0x8F)...)
|
|
execBytes = append(execBytes, getByteRange(0x91, 0x97)...)
|
|
execBytes = append(execBytes, 0x99)
|
|
execBytes = append(execBytes, 0x9A)
|
|
|
|
if sliceContains(execBytes, base.parser.context.currentChar) {
|
|
return base.parser.execute()
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type DcsEntryState struct {
|
|
BaseState
|
|
}
|
|
|
|
type ErrorState struct {
|
|
BaseState
|
|
}
|