|
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
|
@@ -372,17 +363,18 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) {
|
372 | 363 | // number of bytes successfully written and CorruptInputError.
|
373 | 364 | // New line characters (\r and \n) are ignored.
|
374 | 365 | func (enc *Encoding) Decode(dst, src []byte) (n int, err error) {
|
375 |
| - src = bytes.Map(removeNewlinesMapper, src) |
376 |
| - n, _, err = enc.decode(dst, src) |
| 366 | + buf := make([]byte, len(src)) |
| 367 | + l := stripNewlines(buf, src) |
| 368 | + n, _, err = enc.decode(dst, buf[:l]) |
377 | 369 | return
|
378 | 370 | }
|
379 | 371 |
|
380 | 372 | // DecodeString returns the bytes represented by the base32 string s.
|
381 | 373 | func (enc *Encoding) DecodeString(s string) ([]byte, error) {
|
382 |
| - s = strings.Map(removeNewlinesMapper, s) |
383 |
| - dbuf := make([]byte, enc.DecodedLen(len(s))) |
384 |
| - n, _, err := enc.decode(dbuf, []byte(s)) |
385 |
| - return dbuf[:n], err |
| 374 | + buf := []byte(s) |
| 375 | + l := stripNewlines(buf, buf) |
| 376 | + n, _, err := enc.decode(buf, buf[:l]) |
| 377 | + return buf[:n], err |
386 | 378 | }
|
387 | 379 |
|
388 | 380 | type decoder struct {
|
@@ -497,18 +489,25 @@ type newlineFilteringReader struct {
|
497 | 489 | wrapped io.Reader
|
498 | 490 | }
|
499 | 491 |
|
| 492 | +// stripNewlines removes newline characters and returns the number |
| 493 | +// of non-newline characters copied to dst. |
| 494 | +func stripNewlines(dst, src []byte) int { |
| 495 | + offset := 0 |
| 496 | + for _, b := range src { |
| 497 | + if b == '\r' || b == '\n' { |
| 498 | + continue |
| 499 | + } |
| 500 | + dst[offset] = b |
| 501 | + offset++ |
| 502 | + } |
| 503 | + return offset |
| 504 | +} |
| 505 | + |
500 | 506 | func (r *newlineFilteringReader) Read(p []byte) (int, error) {
|
501 | 507 | n, err := r.wrapped.Read(p)
|
502 | 508 | for n > 0 {
|
503 |
| - offset := 0 |
504 |
| - for i, b := range p[0:n] { |
505 |
| - if b != '\r' && b != '\n' { |
506 |
| - if i != offset { |
507 |
| - p[offset] = b |
508 |
| - } |
509 |
| - offset++ |
510 |
| - } |
511 |
| - } |
| 509 | + s := p[0:n] |
| 510 | + offset := stripNewlines(s, s) |
512 | 511 | if err != nil || offset > 0 {
|
513 | 512 | return offset, err
|
514 | 513 | }
|
|
0 commit comments