parser_actions.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package ansiterm
  2. import (
  3. "fmt"
  4. )
  5. func (ap *AnsiParser) collectParam() error {
  6. currChar := ap.context.currentChar
  7. logger.Infof("collectParam %#x", currChar)
  8. ap.context.paramBuffer = append(ap.context.paramBuffer, currChar)
  9. return nil
  10. }
  11. func (ap *AnsiParser) collectInter() error {
  12. currChar := ap.context.currentChar
  13. logger.Infof("collectInter %#x", currChar)
  14. ap.context.paramBuffer = append(ap.context.interBuffer, currChar)
  15. return nil
  16. }
  17. func (ap *AnsiParser) escDispatch() error {
  18. cmd, _ := parseCmd(*ap.context)
  19. intermeds := ap.context.interBuffer
  20. logger.Infof("escDispatch currentChar: %#x", ap.context.currentChar)
  21. logger.Infof("escDispatch: %v(%v)", cmd, intermeds)
  22. switch cmd {
  23. case "D": // IND
  24. return ap.eventHandler.IND()
  25. case "E": // NEL, equivalent to CRLF
  26. err := ap.eventHandler.Execute(ANSI_CARRIAGE_RETURN)
  27. if err == nil {
  28. err = ap.eventHandler.Execute(ANSI_LINE_FEED)
  29. }
  30. return err
  31. case "M": // RI
  32. return ap.eventHandler.RI()
  33. }
  34. return nil
  35. }
  36. func (ap *AnsiParser) csiDispatch() error {
  37. cmd, _ := parseCmd(*ap.context)
  38. params, _ := parseParams(ap.context.paramBuffer)
  39. logger.Infof("csiDispatch: %v(%v)", cmd, params)
  40. switch cmd {
  41. case "@":
  42. return ap.eventHandler.ICH(getInt(params, 1))
  43. case "A":
  44. return ap.eventHandler.CUU(getInt(params, 1))
  45. case "B":
  46. return ap.eventHandler.CUD(getInt(params, 1))
  47. case "C":
  48. return ap.eventHandler.CUF(getInt(params, 1))
  49. case "D":
  50. return ap.eventHandler.CUB(getInt(params, 1))
  51. case "E":
  52. return ap.eventHandler.CNL(getInt(params, 1))
  53. case "F":
  54. return ap.eventHandler.CPL(getInt(params, 1))
  55. case "G":
  56. return ap.eventHandler.CHA(getInt(params, 1))
  57. case "H":
  58. ints := getInts(params, 2, 1)
  59. x, y := ints[0], ints[1]
  60. return ap.eventHandler.CUP(x, y)
  61. case "J":
  62. param := getEraseParam(params)
  63. return ap.eventHandler.ED(param)
  64. case "K":
  65. param := getEraseParam(params)
  66. return ap.eventHandler.EL(param)
  67. case "L":
  68. return ap.eventHandler.IL(getInt(params, 1))
  69. case "M":
  70. return ap.eventHandler.DL(getInt(params, 1))
  71. case "P":
  72. return ap.eventHandler.DCH(getInt(params, 1))
  73. case "S":
  74. return ap.eventHandler.SU(getInt(params, 1))
  75. case "T":
  76. return ap.eventHandler.SD(getInt(params, 1))
  77. case "c":
  78. return ap.eventHandler.DA(params)
  79. case "d":
  80. return ap.eventHandler.VPA(getInt(params, 1))
  81. case "f":
  82. ints := getInts(params, 2, 1)
  83. x, y := ints[0], ints[1]
  84. return ap.eventHandler.HVP(x, y)
  85. case "h":
  86. return ap.hDispatch(params)
  87. case "l":
  88. return ap.lDispatch(params)
  89. case "m":
  90. return ap.eventHandler.SGR(getInts(params, 1, 0))
  91. case "r":
  92. ints := getInts(params, 2, 1)
  93. top, bottom := ints[0], ints[1]
  94. return ap.eventHandler.DECSTBM(top, bottom)
  95. default:
  96. logger.Errorf(fmt.Sprintf("Unsupported CSI command: '%s', with full context: %v", cmd, ap.context))
  97. return nil
  98. }
  99. }
  100. func (ap *AnsiParser) print() error {
  101. return ap.eventHandler.Print(ap.context.currentChar)
  102. }
  103. func (ap *AnsiParser) clear() error {
  104. ap.context = &ansiContext{}
  105. return nil
  106. }
  107. func (ap *AnsiParser) execute() error {
  108. return ap.eventHandler.Execute(ap.context.currentChar)
  109. }