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
4 years ago
|
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
|
||
|
}
|
||
|
|