diff options
Diffstat (limited to 'src/pkg/bytes/bytes.go')
-rw-r--r-- | src/pkg/bytes/bytes.go | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go index 9ab199ceb..85d4f9fd7 100644 --- a/src/pkg/bytes/bytes.go +++ b/src/pkg/bytes/bytes.go @@ -207,7 +207,8 @@ func HasSuffix(s, suffix []byte) bool { } // Map returns a copy of the byte array s with all its characters modified -// according to the mapping function. +// according to the mapping function. If mapping returns a negative value, the character is +// dropped from the string with no replacement. func Map(mapping func(rune int) int, s []byte) []byte { // In the worst case, the array can grow when mapped, making // things unpleasant. But it's so rare we barge in assuming it's @@ -222,16 +223,18 @@ func Map(mapping func(rune int) int, s []byte) []byte { rune, wid = utf8.DecodeRune(s[i:]) } rune = mapping(rune); - if nbytes+utf8.RuneLen(rune) > maxbytes { - // Grow the buffer. - maxbytes = maxbytes*2 + utf8.UTFMax; - nb := make([]byte, maxbytes); - for i, c := range b[0:nbytes] { - nb[i] = c + if rune >= 0 { + if nbytes+utf8.RuneLen(rune) > maxbytes { + // Grow the buffer. + maxbytes = maxbytes*2 + utf8.UTFMax; + nb := make([]byte, maxbytes); + for i, c := range b[0:nbytes] { + nb[i] = c + } + b = nb; } - b = nb; + nbytes += utf8.EncodeRune(rune, b[nbytes:maxbytes]); } - nbytes += utf8.EncodeRune(rune, b[nbytes:maxbytes]); i += wid; } return b[0:nbytes]; |