1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
package execclient
import (
"io"
)
type EscapeWatcher struct {
Cancel func()
Input io.Reader
state int
}
const (
escNormal = iota
escNewline
escTilde
)
func (ew *EscapeWatcher) Read(b []byte) (int, error) {
n, err := ew.Input.Read(b)
if err != nil {
return n, err
}
for _, r := range b[:n] {
switch ew.state {
case escNewline:
switch r {
case '~':
ew.state = escTilde
case '\n':
ew.state = escNewline
default:
ew.state = escNormal
}
case escTilde:
if r == '.' {
ew.Cancel()
} else {
ew.state = escNormal
}
case escNormal:
if r == '\n' {
ew.state = escNewline
}
}
}
return n, nil
}
|