81 lines
1.5 KiB
Go
81 lines
1.5 KiB
Go
|
package io
|
||
|
|
||
|
import (
|
||
|
"golang.org/x/text/transform"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
linefeed = '\n'
|
||
|
LineFeedRemover linefeedRemover = iota
|
||
|
)
|
||
|
|
||
|
type linefeedRemover int
|
||
|
|
||
|
func (linefeedRemover) Reset() {}
|
||
|
func (linefeedRemover) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||
|
cur, start := 0, 0
|
||
|
for ; cur < len(src); {
|
||
|
if src[cur] == linefeed {
|
||
|
if nDst+1 > len(dst) {
|
||
|
err = transform.ErrShortDst
|
||
|
return
|
||
|
}
|
||
|
nSrc += cur - start
|
||
|
nDst += copy(dst[nDst:], src[start:cur])
|
||
|
cur++
|
||
|
start = cur
|
||
|
} else {
|
||
|
cur++
|
||
|
}
|
||
|
}
|
||
|
if remain := cur - start; remain == 0 {
|
||
|
} else if nDst+1 > len(dst) {
|
||
|
err = transform.ErrShortDst
|
||
|
} else {
|
||
|
nSrc += remain
|
||
|
nDst += copy(dst[nDst:], src[start:cur])
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type Remover struct {
|
||
|
Removes []byte
|
||
|
}
|
||
|
|
||
|
func (r *Remover) Reset() {}
|
||
|
func (r *Remover) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||
|
cur, start := 0, 0
|
||
|
|
||
|
for ; cur < len(src); {
|
||
|
var (
|
||
|
curData = src[cur]
|
||
|
matched = false
|
||
|
)
|
||
|
for i := 0; i < len(r.Removes); i++ {
|
||
|
if matched = r.Removes[i] == curData; matched {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if matched {
|
||
|
if nDst+1 > len(dst) {
|
||
|
err = transform.ErrShortDst
|
||
|
return
|
||
|
}
|
||
|
nSrc += cur - start
|
||
|
nDst += copy(dst[nDst:], src[start:cur])
|
||
|
cur++
|
||
|
start = cur
|
||
|
} else {
|
||
|
cur++
|
||
|
}
|
||
|
}
|
||
|
if remain := cur - start; remain == 0 {
|
||
|
} else if nDst+1 > len(dst) {
|
||
|
err = transform.ErrShortDst
|
||
|
} else {
|
||
|
nSrc += remain
|
||
|
nDst += copy(dst[nDst:], src[start:cur])
|
||
|
}
|
||
|
return
|
||
|
}
|