Skip to content

Commit 3a9ab89

Browse files
committed
Remove bytes/strings.Map() calls and reuse newline filter code
1 parent 679b51e commit 3a9ab89

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

src/encoding/base32/base32.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
package base32
77

88
import (
9-
"bytes"
109
"io"
1110
"strconv"
12-
"strings"
1311
)
1412

1513
/*
@@ -62,13 +60,6 @@ var StdEncoding = NewEncoding(encodeStd)
6260
// It is typically used in DNS.
6361
var HexEncoding = NewEncoding(encodeHex)
6462

65-
var removeNewlinesMapper = func(r rune) rune {
66-
if r == '\r' || r == '\n' {
67-
return -1
68-
}
69-
return r
70-
}
71-
7263
// WithPadding creates a new encoding identical to enc except
7364
// with a specified padding character, or NoPadding to disable padding.
7465
// The padding character must not be '\r' or '\n', must not
@@ -380,16 +371,20 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
380371
// number of bytes successfully written and CorruptInputError.
381372
// New line characters (\r and \n) are ignored.
382373
func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
383-
src = bytes.Map(removeNewlinesMapper, src)
384-
n, _, err = enc.decode(dst, src)
374+
buf := make([]byte, len(src))
375+
copy(buf, src)
376+
l := stripNewlines(buf, len(buf))
377+
n, _, err = enc.decode(dst, buf[:l])
385378
return
386379
}
387380

388381
// DecodeString returns the bytes represented by the base32 string s.
389382
func (enc *Encoding) DecodeString(s string) ([]byte, error) {
390-
s = strings.Map(removeNewlinesMapper, s)
391383
dbuf := make([]byte, enc.DecodedLen(len(s)))
392-
n, _, err := enc.decode(dbuf, []byte(s))
384+
src := make([]byte, len(s))
385+
copy(src, s)
386+
l := stripNewlines(src, len(src))
387+
n, _, err := enc.decode(dbuf, src[:l])
393388
return dbuf[:n], err
394389
}
395390

@@ -505,18 +500,23 @@ type newlineFilteringReader struct {
505500
wrapped io.Reader
506501
}
507502

503+
func stripNewlines(p []byte, n int) int {
504+
offset := 0
505+
for i, b := range p[0:n] {
506+
if b != '\r' && b != '\n' {
507+
if i != offset {
508+
p[offset] = b
509+
}
510+
offset++
511+
}
512+
}
513+
return offset
514+
}
515+
508516
func (r *newlineFilteringReader) Read(p []byte) (int, error) {
509517
n, err := r.wrapped.Read(p)
510518
for n > 0 {
511-
offset := 0
512-
for i, b := range p[0:n] {
513-
if b != '\r' && b != '\n' {
514-
if i != offset {
515-
p[offset] = b
516-
}
517-
offset++
518-
}
519-
}
519+
offset := stripNewlines(p, n)
520520
if err != nil || offset > 0 {
521521
return offset, err
522522
}

0 commit comments

Comments
 (0)