infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/io/remover.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
}