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
|
|
}
|