}
func (r *byteReplacer) WriteString(w io.Writer, s string) (n int, err error) {
- // TODO(bradfitz): use io.WriteString with slices of s, avoiding allocation.
- bufsize := 32 << 10
- if len(s) < bufsize {
- bufsize = len(s)
- }
- buf := make([]byte, bufsize)
-
- for len(s) > 0 {
- ncopy := copy(buf, s)
- s = s[ncopy:]
- for i, b := range buf[:ncopy] {
- buf[i] = r[b]
+ sw := getStringWriter(w)
+ last := 0
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+ if r[b] == b {
+ continue
}
- wn, err := w.Write(buf[:ncopy])
- n += wn
+ if last != i {
+ wn, err := sw.WriteString(s[last:i])
+ n += wn
+ if err != nil {
+ return n, err
+ }
+ }
+ last = i + 1
+ nw, err := w.Write(r[b : int(b)+1])
+ n += nw
+ if err != nil {
+ return n, err
+ }
+ }
+ if last != len(s) {
+ nw, err := sw.WriteString(s[last:])
+ n += nw
if err != nil {
return n, err
}