ascii.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ianaindex
  5. import (
  6. "unicode"
  7. "unicode/utf8"
  8. "golang.org/x/text/encoding"
  9. "golang.org/x/text/encoding/internal"
  10. "golang.org/x/text/transform"
  11. "golang.org/x/text/encoding/internal/identifier"
  12. )
  13. type asciiDecoder struct {
  14. transform.NopResetter
  15. }
  16. func (d asciiDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
  17. for _, c := range src {
  18. if c > unicode.MaxASCII {
  19. r := unicode.ReplacementChar
  20. if nDst + utf8.RuneLen(r) > len(dst) {
  21. err = transform.ErrShortDst
  22. break
  23. }
  24. nDst += utf8.EncodeRune(dst[nDst:], r)
  25. nSrc++
  26. continue
  27. }
  28. if nDst >= len(dst) {
  29. err = transform.ErrShortDst
  30. break
  31. }
  32. dst[nDst] = c
  33. nDst++
  34. nSrc++
  35. }
  36. return nDst, nSrc, err
  37. }
  38. type asciiEncoder struct {
  39. transform.NopResetter
  40. }
  41. func (d asciiEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
  42. for _, c := range src {
  43. if c > unicode.MaxASCII {
  44. err = internal.RepertoireError(encoding.ASCIISub)
  45. break
  46. }
  47. if nDst >= len(dst) {
  48. err = transform.ErrShortDst
  49. break
  50. }
  51. dst[nDst] = c
  52. nDst++
  53. nSrc++
  54. }
  55. return nDst, nSrc, err
  56. }
  57. var asciiEnc = &internal.Encoding{
  58. Encoding: &internal.SimpleEncoding{
  59. asciiDecoder{},
  60. asciiEncoder{},
  61. },
  62. Name: "US-ASCII",
  63. MIB: identifier.ASCII,
  64. }