termcap.go 1000 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package input
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. )
  6. // TermcapEvent represents a Termcap response event. Termcap responses are
  7. // generated by the terminal in response to RequestTermcap (XTGETTCAP)
  8. // requests.
  9. //
  10. // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands
  11. type TermcapEvent struct {
  12. Values map[string]string
  13. IsValid bool
  14. }
  15. func parseTermcap(data []byte) TermcapEvent {
  16. // XTGETTCAP
  17. if len(data) == 0 {
  18. return TermcapEvent{}
  19. }
  20. tc := TermcapEvent{Values: make(map[string]string)}
  21. split := bytes.Split(data, []byte{';'})
  22. for _, s := range split {
  23. parts := bytes.SplitN(s, []byte{'='}, 2)
  24. if len(parts) == 0 {
  25. return TermcapEvent{}
  26. }
  27. name, err := hex.DecodeString(string(parts[0]))
  28. if err != nil || len(name) == 0 {
  29. continue
  30. }
  31. var value []byte
  32. if len(parts) > 1 {
  33. value, err = hex.DecodeString(string(parts[1]))
  34. if err != nil {
  35. continue
  36. }
  37. }
  38. tc.Values[string(name)] = string(value)
  39. }
  40. return tc
  41. }