mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2024-11-14 05:11:17 +08:00
35 lines
882 B
Go
35 lines
882 B
Go
package net
|
|
|
|
import (
|
|
"io"
|
|
"unsafe"
|
|
)
|
|
|
|
// bufioReader copy from stdlib bufio/bufio.go
|
|
// This structure has remained unchanged from go1.5 to go1.21.
|
|
type bufioReader struct {
|
|
buf []byte
|
|
rd io.Reader // reader provided by the client
|
|
r, w int // buf read and write positions
|
|
err error
|
|
lastByte int // last byte read for UnreadByte; -1 means invalid
|
|
lastRuneSize int // size of last rune read for UnreadRune; -1 means invalid
|
|
}
|
|
|
|
func (c *BufferedConn) AppendData(buf []byte) (ok bool) {
|
|
b := (*bufioReader)(unsafe.Pointer(c.r))
|
|
pos := len(b.buf) - b.w - len(buf)
|
|
if pos >= -b.r { // len(b.buf)-(b.w - b.r) >= len(buf)
|
|
if pos < 0 { // len(b.buf)-b.w < len(buf)
|
|
// Slide existing data to beginning.
|
|
copy(b.buf, b.buf[b.r:b.w])
|
|
b.w -= b.r
|
|
b.r = 0
|
|
}
|
|
|
|
b.w += copy(b.buf[b.w:], buf)
|
|
return true
|
|
}
|
|
return false
|
|
}
|