...
1 package term
2
3 import (
4 "io"
5 )
6
7
8
9 type EscapeError struct{}
10
11 func (EscapeError) Error() string {
12 return "read escape sequence"
13 }
14
15
16
17
18 type escapeProxy struct {
19 escapeKeys []byte
20 escapeKeyPos int
21 r io.Reader
22 buf []byte
23 }
24
25
26
27
28 func NewEscapeProxy(r io.Reader, escapeKeys []byte) io.Reader {
29 return &escapeProxy{
30 escapeKeys: escapeKeys,
31 r: r,
32 }
33 }
34
35 func (r *escapeProxy) Read(buf []byte) (n int, err error) {
36 if len(r.escapeKeys) > 0 && r.escapeKeyPos == len(r.escapeKeys) {
37 return 0, EscapeError{}
38 }
39
40 if len(r.buf) > 0 {
41 n = copy(buf, r.buf)
42 r.buf = r.buf[n:]
43 }
44
45 nr, err := r.r.Read(buf[n:])
46 n += nr
47 if len(r.escapeKeys) == 0 {
48 return n, err
49 }
50
51 for i := 0; i < n; i++ {
52 if buf[i] == r.escapeKeys[r.escapeKeyPos] {
53 r.escapeKeyPos++
54
55
56 if r.escapeKeyPos == len(r.escapeKeys) {
57 n = i + 1 - r.escapeKeyPos
58 if n < 0 {
59 n = 0
60 }
61 return n, EscapeError{}
62 }
63 continue
64 }
65
66
67
68
69 if i < r.escapeKeyPos {
70 preserve := make([]byte, 0, r.escapeKeyPos+n)
71 preserve = append(preserve, r.escapeKeys[:r.escapeKeyPos]...)
72 preserve = append(preserve, buf[:n]...)
73 n = copy(buf, preserve)
74 i += r.escapeKeyPos
75 r.buf = append(r.buf, preserve[n:]...)
76 }
77 r.escapeKeyPos = 0
78 }
79
80
81
82
83 n -= r.escapeKeyPos
84 if n < 0 {
85 n = 0
86 }
87 return n, err
88 }
89
View as plain text