-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreader.go
93 lines (81 loc) · 1.87 KB
/
reader.go
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Provide a way to get cbreak! input easily
package cbrk
import (
"bufio"
"fmt"
"os"
"os/exec"
"strconv"
)
// A cbrk.Reader object tied to os.Stdin
var Stdin = Reader{bufio.NewReader(os.Stdin)}
// Call Cbreak(true) to enter cbreak mode, and call Cbreak(false) to exit
func Cbreak(on bool) {
var err error
var output []byte
var command *exec.Cmd
if !on {
command = exec.Command("stty", "sane")
command.Stdin = os.Stdin
err = command.Run()
if err != nil {
fmt.Println(err)
return
}
return
}
command = exec.Command("stty", "cbreak")
command.Stdin = os.Stdin
err = command.Run()
if err != nil {
fmt.Println(err)
return
}
command = exec.Command("stty", "-echo")
command.Stdin = os.Stdin
err = command.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + string(output))
panic(err)
}
}
// The type of cbrk.Stdin
type Reader struct {
in *bufio.Reader
}
// Get a single cbrk.Char, block until present
// If it recieves \x1b it will block until it recieves one of the programmed valid escape codes.
func (r *Reader) Get() Char {
char, err := r.in.ReadByte()
if err != nil {
fmt.Println(err)
return LiteralChar{}
}
if char == '\x1b' {
char, err = r.in.ReadByte()
if err != nil {
panic(err)
}
output := []byte{char}
for validChar[string(output)].Kind() == Special && validChar[string(output)].String() == strconv.Itoa(Partial) {
char, err = r.in.ReadByte()
if err != nil {
panic(err)
}
output = append(output, char)
}
return EscapeChar{sequence: "\x1b" + string(output)}
}
return LiteralChar{value: char}
}
// Block until the given reader has a \n in it and return the entire line, including the newline
// Using cbrk.Reader.Get
func (r *Reader) Getln() []Char {
var char Char = LiteralChar{value: ' '}
output := []Char{}
for !char.Equals("\n") {
char = r.Get()
output = append(output, char)
}
return output
}