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 }