16 // Transform implements the Transform method of the transform.Transformer |
16 // Transform implements the Transform method of the transform.Transformer |
17 // interface. It may need to write segments of up to MaxSegmentSize at once. |
17 // interface. It may need to write segments of up to MaxSegmentSize at once. |
18 // Users should either catch ErrShortDst and allow dst to grow or have dst be at |
18 // Users should either catch ErrShortDst and allow dst to grow or have dst be at |
19 // least of size MaxTransformChunkSize to be guaranteed of progress. |
19 // least of size MaxTransformChunkSize to be guaranteed of progress. |
20 func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
20 func (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
21 n := 0 |
|
22 // Cap the maximum number of src bytes to check. |
21 // Cap the maximum number of src bytes to check. |
23 b := src |
22 b := src |
24 eof := atEOF |
23 eof := atEOF |
25 if ns := len(dst); ns < len(b) { |
24 if ns := len(dst); ns < len(b) { |
26 err = transform.ErrShortDst |
25 err = transform.ErrShortDst |
27 eof = false |
26 eof = false |
28 b = b[:ns] |
27 b = b[:ns] |
29 } |
28 } |
30 i, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof) |
29 i, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), eof) |
31 n += copy(dst[n:], b[n:i]) |
30 n := copy(dst, b[:i]) |
32 if !ok { |
31 if !ok { |
33 nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF) |
32 nDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF) |
34 return nDst + n, nSrc + n, err |
33 return nDst + n, nSrc + n, err |
35 } |
34 } |
36 if n < len(src) && !atEOF { |
35 |
|
36 if err == nil && n < len(src) && !atEOF { |
37 err = transform.ErrShortSrc |
37 err = transform.ErrShortSrc |
38 } |
38 } |
39 return n, n, err |
39 return n, n, err |
40 } |
40 } |
41 |
41 |
77 end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof) |
77 end, ok := rb.f.quickSpan(rb.src, nSrc, end, eof) |
78 n := copy(dst[nDst:], rb.src.bytes[nSrc:end]) |
78 n := copy(dst[nDst:], rb.src.bytes[nSrc:end]) |
79 nSrc += n |
79 nSrc += n |
80 nDst += n |
80 nDst += n |
81 if ok { |
81 if ok { |
82 if n < rb.nsrc && !atEOF { |
82 if err == nil && n < rb.nsrc && !atEOF { |
83 err = transform.ErrShortSrc |
83 err = transform.ErrShortSrc |
84 } |
84 } |
85 return nDst, nSrc, err |
85 return nDst, nSrc, err |
86 } |
86 } |
87 } |
87 } |