in plugins/inputs/logfile/tail/tail.go [263:327]
func (tail *Tail) readlineUtf16() (string, error) {
tail.lk.Lock()
defer tail.lk.Unlock()
var cur []byte
var err error
var res [][]byte
var resSize int
for {
// Check LF
cur, err = tail.readSlice('\n')
// buffer size is even
if err == bufio.ErrBufferFull {
// Handle the case where "\r\n" straddles the buffer.
if len(cur) > 1 && cur[len(cur)-1] == '\x00' && cur[len(cur)-2] == '\r' {
tail.unreadByte()
tail.unreadByte()
cur = cur[:len(cur)-2]
}
err = nil
break
}
if err != nil {
break
}
// We only care about 0a00
if len(cur)%2 != 0 {
var nextByte byte
nextByte, err = tail.readByte()
if err != nil {
break
}
if nextByte == '\x00' {
// confirmed it's LF, check for Carriage Return
if len(cur) >= 3 && cur[len(cur)-2] == '\x00' && cur[len(cur)-3] == '\r' {
cur = cur[:len(cur)-3]
} else {
cur = cur[:len(cur)-1]
}
break
}
cur = append(cur, nextByte)
}
// 262144 => 256KB
if resSize+len(cur) >= 262144 {
break
}
buf := make([]byte, len(cur))
copy(buf, cur)
res = append(res, buf)
resSize += len(buf)
}
resSize += len(cur)
res = append(res, cur)
finalRes := make([]byte, resSize)
n := 0
for i := range res {
n += copy(finalRes[n:], res[i])
}
return string(finalRes), err
}