// readConsole reads utf16 characters from console File, // encodes them into utf8 and stores them in buffer b. // It returns the number of utf8 bytes read and an error, if any. func (f *File) readConsole(b []byte) (n int, err error) { if len(b) == 0 { return 0, nil } if len(f.readbuf) == 0 { // get more input data from os wchars := make([]uint16, len(b)) var p *uint16 if len(b) > 0 { p = &wchars[0] } var nw uint32 err := syscall.ReadConsole(f.fd, p, uint32(len(wchars)), &nw, nil) if err != nil { return 0, err } f.readbuf = utf16.Decode(wchars[:nw]) } for i, r := range f.readbuf { if utf8.RuneLen(r) > len(b) { f.readbuf = f.readbuf[i:] return n, nil } nr := utf8.EncodeRune(b, r) b = b[nr:] n += nr } f.readbuf = nil return n, nil }
// readConsole reads utf16 characters from console File, // encodes them into utf8 and stores them in buffer b. // It returns the number of utf8 bytes read and an error, if any. func (f *File) readConsole(b []byte) (n int, err error) { if len(b) == 0 { return 0, nil } if len(f.readbuf) == 0 { // syscall.ReadConsole seems to fail, if given large buffer. // So limit the buffer to 16000 characters. numBytes := len(b) if numBytes > 16000 { numBytes = 16000 } // get more input data from os wchars := make([]uint16, numBytes) var p *uint16 if len(b) > 0 { p = &wchars[0] } var nw uint32 err := syscall.ReadConsole(f.fd, p, uint32(len(wchars)), &nw, nil) if err != nil { return 0, err } f.readbuf = utf16.Decode(wchars[:nw]) } for i, r := range f.readbuf { if utf8.RuneLen(r) > len(b) { f.readbuf = f.readbuf[i:] return n, nil } nr := utf8.EncodeRune(b, r) b = b[nr:] n += nr } f.readbuf = nil return n, nil }