states.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package ansiterm
  2. type stateID int
  3. type state interface {
  4. Enter() error
  5. Exit() error
  6. Handle(byte) (state, error)
  7. Name() string
  8. Transition(state) error
  9. }
  10. type baseState struct {
  11. name string
  12. parser *AnsiParser
  13. }
  14. func (base baseState) Enter() error {
  15. return nil
  16. }
  17. func (base baseState) Exit() error {
  18. return nil
  19. }
  20. func (base baseState) Handle(b byte) (s state, e error) {
  21. switch {
  22. case b == CSI_ENTRY:
  23. return base.parser.csiEntry, nil
  24. case b == DCS_ENTRY:
  25. return base.parser.dcsEntry, nil
  26. case b == ANSI_ESCAPE_PRIMARY:
  27. return base.parser.escape, nil
  28. case b == OSC_STRING:
  29. return base.parser.oscString, nil
  30. case sliceContains(toGroundBytes, b):
  31. return base.parser.ground, nil
  32. }
  33. return nil, nil
  34. }
  35. func (base baseState) Name() string {
  36. return base.name
  37. }
  38. func (base baseState) Transition(s state) error {
  39. if s == base.parser.ground {
  40. execBytes := []byte{0x18}
  41. execBytes = append(execBytes, 0x1A)
  42. execBytes = append(execBytes, getByteRange(0x80, 0x8F)...)
  43. execBytes = append(execBytes, getByteRange(0x91, 0x97)...)
  44. execBytes = append(execBytes, 0x99)
  45. execBytes = append(execBytes, 0x9A)
  46. if sliceContains(execBytes, base.parser.context.currentChar) {
  47. return base.parser.execute()
  48. }
  49. }
  50. return nil
  51. }
  52. type dcsEntryState struct {
  53. baseState
  54. }
  55. type errorState struct {
  56. baseState
  57. }