vendor/golang.org/x/text/unicode/norm/transform.go
changeset 251 1c52a0eeb952
parent 242 2a9ec03fe5a1
equal deleted inserted replaced
250:c040f992052f 251:1c52a0eeb952
    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 	}