|
6 | 6 | package base32
|
7 | 7 |
|
8 | 8 | import (
|
9 |
| - "bytes" |
10 | 9 | "io"
|
11 | 10 | "strconv"
|
12 |
| - "strings" |
13 | 11 | )
|
14 | 12 |
|
15 | 13 | /*
|
@@ -62,13 +60,6 @@ var StdEncoding = NewEncoding(encodeStd)
|
62 | 60 | // It is typically used in DNS.
|
63 | 61 | var HexEncoding = NewEncoding(encodeHex)
|
64 | 62 |
|
65 |
| -var removeNewlinesMapper = func(r rune) rune { |
66 |
| - if r == '\r' || r == '\n' { |
67 |
| - return -1 |
68 |
| - } |
69 |
| - return r |
70 |
| -} |
71 |
| - |
72 | 63 | // WithPadding creates a new encoding identical to enc except
|
73 | 64 | // with a specified padding character, or NoPadding to disable padding.
|
74 | 65 | // 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) {
|
380 | 371 | // number of bytes successfully written and CorruptInputError.
|
381 | 372 | // New line characters (\r and \n) are ignored.
|
382 | 373 | 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]) |
385 | 378 | return
|
386 | 379 | }
|
387 | 380 |
|
388 | 381 | // DecodeString returns the bytes represented by the base32 string s.
|
389 | 382 | func (enc *Encoding) DecodeString(s string) ([]byte, error) {
|
390 |
| - s = strings.Map(removeNewlinesMapper, s) |
391 | 383 | 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]) |
393 | 388 | return dbuf[:n], err
|
394 | 389 | }
|
395 | 390 |
|
@@ -505,18 +500,23 @@ type newlineFilteringReader struct {
|
505 | 500 | wrapped io.Reader
|
506 | 501 | }
|
507 | 502 |
|
| 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 | + |
508 | 516 | func (r *newlineFilteringReader) Read(p []byte) (int, error) {
|
509 | 517 | n, err := r.wrapped.Read(p)
|
510 | 518 | 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) |
520 | 520 | if err != nil || offset > 0 {
|
521 | 521 | return offset, err
|
522 | 522 | }
|
|
0 commit comments