|
@@ -3,6 +3,7 @@ package door
|
|
|
import (
|
|
|
"bufio"
|
|
|
"bytes"
|
|
|
+ "io"
|
|
|
"log"
|
|
|
"syscall"
|
|
|
"time"
|
|
@@ -24,43 +25,13 @@ func set(fdSetPtr *syscall.FdSet, fd int) {
|
|
|
(*fdSetPtr).Bits[fd/64] |= 1 << uint64(fd%64)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- func main() {
|
|
|
- var text string = "\x1b\u2415\xff"
|
|
|
- var buffer []byte = []byte(text)
|
|
|
- var readbuffer = bytes.NewBuffer(buffer)
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- var runeread = bufio.NewReaderSize(readbuffer, 1)
|
|
|
-
|
|
|
-
|
|
|
- for {
|
|
|
- r, _, err := runeread.ReadRune()
|
|
|
- if err != nil {
|
|
|
- break
|
|
|
- }
|
|
|
- if r == unicode.ReplacementChar {
|
|
|
- runeread.UnreadRune()
|
|
|
- b, _ := runeread.ReadByte()
|
|
|
- fmt.Printf("BYTE %#v\n", b)
|
|
|
- } else {
|
|
|
- fmt.Printf("%#v\n", r)
|
|
|
- }
|
|
|
- }
|
|
|
-*/
|
|
|
-const READ_SIZE = 16
|
|
|
+const READ_SIZE = 16
|
|
|
|
|
|
|
|
|
|
|
|
func Reader(d *Door) {
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
defer func() {
|
|
|
log.Printf("~Reader\n")
|
|
|
if d.ReaderCanClose {
|
|
@@ -74,12 +45,9 @@ func Reader(d *Door) {
|
|
|
}()
|
|
|
|
|
|
var fdset syscall.FdSet
|
|
|
- var readone []byte = make([]byte, READ_SIZE)
|
|
|
-
|
|
|
- var readbuffer bytes.Buffer
|
|
|
- var runeread = bufio.NewReaderSize(&readbuffer, 1)
|
|
|
-
|
|
|
-
|
|
|
+ var readbuffer [READ_SIZE]byte
|
|
|
+ var runebuffer bytes.Buffer
|
|
|
+ var runeread = bufio.NewReaderSize(&runebuffer, 1)
|
|
|
|
|
|
for {
|
|
|
clearAll(&fdset)
|
|
@@ -105,36 +73,14 @@ func Reader(d *Door) {
|
|
|
|
|
|
if v == 0 {
|
|
|
|
|
|
-
|
|
|
- if len(buffer) > 0 {
|
|
|
- timeoutCount++
|
|
|
-
|
|
|
- input, size = utf8.DecodeRune(buffer)
|
|
|
- if input != utf8.RuneError {
|
|
|
- d.readerChannel <- input
|
|
|
- for size > 0 {
|
|
|
- ArrayDelete(&buffer, 0)
|
|
|
- size--
|
|
|
- }
|
|
|
- timeoutCount = 0
|
|
|
-
|
|
|
- } else {
|
|
|
- b, _ := ArrayDelete(&buffer, 0)
|
|
|
- d.readerChannel <- rune(b)
|
|
|
- }
|
|
|
- } else {
|
|
|
- timeoutCount = 0
|
|
|
- }
|
|
|
- */
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
- log.Println("syscall.Read:", len(readone), cap(readone))
|
|
|
|
|
|
-
|
|
|
- r, err := syscall.Read(d.READFD, readone)
|
|
|
+
|
|
|
+ r, err := syscall.Read(d.READFD, readbuffer[:])
|
|
|
if r == -1 {
|
|
|
- log.Println("Read -1 (closed)")
|
|
|
+ log.Println("syscall.Read -1 (closed)")
|
|
|
d.readerMutex.Lock()
|
|
|
defer d.readerMutex.Unlock()
|
|
|
if !d.ReaderClosed {
|
|
@@ -155,41 +101,44 @@ func Reader(d *Door) {
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
|
|
|
if DEBUG_INPUT {
|
|
|
- log.Printf("Reader << %d, %#v\n", r, readone[:r])
|
|
|
+ log.Printf("Reader << %d, %#v\n", r, readbuffer[:r])
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- readbuffer.Write(readone[:r])
|
|
|
-
|
|
|
-
|
|
|
- log.Println("readone:", len(readone), cap(readone))
|
|
|
+ runebuffer.Write(readbuffer[:r])
|
|
|
var input rune
|
|
|
|
|
|
- RuneRead:
|
|
|
+
|
|
|
|
|
|
- input, _, err = runeread.ReadRune()
|
|
|
- if err != nil {
|
|
|
- log.Printf("ReadRune: %#v\n", err)
|
|
|
-
|
|
|
- continue
|
|
|
- }
|
|
|
- if input == unicode.ReplacementChar {
|
|
|
- runeread.UnreadRune()
|
|
|
- b, _ := runeread.ReadByte()
|
|
|
- if DEBUG_INPUT {
|
|
|
- log.Printf("Reader (byte) >> %x\n", b)
|
|
|
+ err = nil
|
|
|
+ for err == nil {
|
|
|
+
|
|
|
+
|
|
|
+ input, _, err = runeread.ReadRune()
|
|
|
+
|
|
|
+ if err == io.EOF {
|
|
|
+ continue
|
|
|
}
|
|
|
- d.readerChannel <- rune(b)
|
|
|
- } else {
|
|
|
- if DEBUG_INPUT {
|
|
|
- log.Printf("Reader >> %x\n", input)
|
|
|
+ if err != nil {
|
|
|
+ log.Printf("ReadRune: %#v\n", err)
|
|
|
+
|
|
|
+ continue
|
|
|
}
|
|
|
- d.readerChannel <- input
|
|
|
- }
|
|
|
- goto RuneRead
|
|
|
+ if input == unicode.ReplacementChar {
|
|
|
+ runeread.UnreadRune()
|
|
|
+ b, _ := runeread.ReadByte()
|
|
|
+ if DEBUG_INPUT {
|
|
|
+ log.Printf("Reader (byte) >> %x\n", b)
|
|
|
+ }
|
|
|
+ d.readerChannel <- rune(b)
|
|
|
+ } else {
|
|
|
+ if DEBUG_INPUT {
|
|
|
+ log.Printf("Reader >> %x\n", input)
|
|
|
+ }
|
|
|
+ d.readerChannel <- input
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|