bytes, strings: allow -1 in Map to mean "drop this character".

xml: drop invalid characters in attribute names
    when constructing struct field names.

R=rsc
CC=r
https://golang.org/cl/157104
This commit is contained in:
Kei Son 2009-12-11 10:37:48 -08:00 committed by Russ Cox
parent 67aa1399d6
commit 128974adfd
6 changed files with 91 additions and 26 deletions

View file

@ -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];