You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
974 B
Go
70 lines
974 B
Go
package pio
|
|
|
|
func VecLen(vec [][]byte) (n int) {
|
|
for _, b := range vec {
|
|
n += len(b)
|
|
}
|
|
return
|
|
}
|
|
|
|
func VecSliceTo(in [][]byte, out [][]byte, s int, e int) (n int) {
|
|
if s < 0 {
|
|
s = 0
|
|
}
|
|
|
|
if e >= 0 && e < s {
|
|
panic("pio: VecSlice start > end")
|
|
}
|
|
|
|
i := 0
|
|
off := 0
|
|
for s > 0 && i < len(in) {
|
|
left := len(in[i])
|
|
read := s
|
|
if left < read {
|
|
read = left
|
|
}
|
|
left -= read
|
|
off += read
|
|
s -= read
|
|
e -= read
|
|
if left == 0 {
|
|
i++
|
|
off = 0
|
|
}
|
|
}
|
|
if s > 0 {
|
|
panic("pio: VecSlice start out of range")
|
|
}
|
|
|
|
for e != 0 && i < len(in) {
|
|
left := len(in[i])-off
|
|
read := left
|
|
if e > 0 && e < read {
|
|
read = e
|
|
}
|
|
out[n] = in[i][off:off+read]
|
|
n++
|
|
left -= read
|
|
e -= read
|
|
off += read
|
|
if left == 0 {
|
|
i++
|
|
off = 0
|
|
}
|
|
}
|
|
if e > 0 {
|
|
panic("pio: VecSlice end out of range")
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func VecSlice(in [][]byte, s int, e int) (out [][]byte) {
|
|
out = make([][]byte, len(in))
|
|
n := VecSliceTo(in, out, s, e)
|
|
out = out[:n]
|
|
return
|
|
}
|
|
|