72 lines
1.3 KiB
Go
72 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
|
||
|
}
|