-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconsole_windows.go
148 lines (127 loc) · 2.25 KB
/
console_windows.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package unbuffered
import (
"golang.org/x/sys/windows"
)
const CONSOLE_MODE uint32 = windows.ENABLE_WINDOW_INPUT | windows.ENABLE_MOUSE_INPUT | windows.ENABLE_PROCESSED_INPUT |
windows.ENABLE_VIRTUAL_TERMINAL_INPUT
var (
Stdin = windows.Stdin
)
func SetUpConsole() (reset func(), err error) {
var mode uint32 = 503
_ = windows.GetConsoleMode(windows.Stdin, &mode)
return ResetConsole(mode), windows.SetConsoleMode(Stdin, CONSOLE_MODE)
}
func ResetConsole(mode uint32) func() {
return func() {
_ = windows.SetConsoleMode(windows.Stdin, mode)
}
}
func ReadChar() (buf uint16, err error) {
var (
toread uint32 = 1
read uint32
inputControl byte
)
err = windows.ReadConsole(windows.Stdin, &buf, toread, &read, &inputControl)
return
}
func Byte(b *byte) (err error) {
buf, err := ReadChar()
*b = byte(buf)
return
}
func Rune(r *rune) (err error) {
buf, err := ReadChar()
*r = rune(buf)
return
}
func RuneStream() (ch chan rune, cancel func()) {
ch = make(chan rune)
quit := make(chan struct{})
cancel = func() {
close(quit)
}
go func() {
defer close(ch)
var r rune
for Rune(&r) == nil {
select {
case <-quit:
return
default:
ch <- r
}
}
}()
return
}
func ReadRune() (r rune, err error) {
err = Rune(&r)
return
}
func ReadRunes(delim rune) chan rune {
ch := make(chan rune)
go func() {
defer close(ch)
var r rune
for Rune(&r) == nil && r != delim {
ch <- r
}
}()
return ch
}
func ByteStream() (ch chan byte, cancel func()) {
ch = make(chan byte)
quit := make(chan struct{})
cancel = func() {
close(quit)
}
go func() {
defer close(ch)
var b byte
for Byte(&b) == nil {
select {
case <-quit:
return
default:
ch <- b
}
}
}()
return
}
func ReadByte() (b byte, err error) {
err = Byte(&b)
return
}
func ReadBytes(delim byte) chan byte {
ch := make(chan byte)
go func() {
defer close(ch)
var b byte
for Byte(&b) == nil && b != delim {
ch <- b
}
}()
return ch
}
type Stream struct {
v uint16
err error
}
func NewStream() *Stream {
return &Stream{}
}
func (s *Stream) Next() {
s.v, s.err = ReadChar()
}
func (s *Stream) Rune() rune {
return rune(s.v)
}
func (s *Stream) Byte() byte {
return byte(s.v)
}
func (s *Stream) Err() error {
return s.err
}