60 lines
930 B
Go
60 lines
930 B
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
func decodeVarint(r *bufio.Reader) (n uint64, err error) {
|
|
var value uint64
|
|
var shift uint16
|
|
for {
|
|
c, err := r.ReadByte()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
value |= (uint64(c) & 0x7f) << shift
|
|
if c & 0x80 == 0 {
|
|
return value, nil
|
|
}
|
|
shift += 7
|
|
if shift > 21 {
|
|
return 0, errors.New("invalid varint")
|
|
}
|
|
}
|
|
}
|
|
|
|
func readInput() {
|
|
r := bufio.NewReader(os.Stdin)
|
|
for {
|
|
c, err := r.ReadByte()
|
|
if err != nil {
|
|
log.Printf("error: %v", err)
|
|
break
|
|
}
|
|
if c != 0x0a {
|
|
log.Printf("invalid message type: %v", c)
|
|
break
|
|
}
|
|
msglen, err := decodeVarint(r)
|
|
if err != nil {
|
|
log.Printf("error: %v", err)
|
|
break
|
|
}
|
|
buf := make([]byte, msglen)
|
|
n, err := r.Read(buf)
|
|
if err != nil {
|
|
log.Printf("error: %v", err)
|
|
break
|
|
}
|
|
if uint64(n) != msglen {
|
|
log.Printf("short read")
|
|
break
|
|
}
|
|
log.Println(buf)
|
|
}
|
|
os.Exit(1)
|
|
}
|