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 }