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 5package ianaindex 6 7import ( 8 "unicode" 9 "unicode/utf8" 10 11 "golang.org/x/text/encoding" 12 "golang.org/x/text/encoding/internal" 13 "golang.org/x/text/transform" 14 "golang.org/x/text/encoding/internal/identifier" 15) 16 17type asciiDecoder struct { 18 transform.NopResetter 19} 20 21func (d asciiDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { 22 for _, c := range src { 23 if c > unicode.MaxASCII { 24 r := unicode.ReplacementChar 25 if nDst + utf8.RuneLen(r) > len(dst) { 26 err = transform.ErrShortDst 27 break 28 } 29 nDst += utf8.EncodeRune(dst[nDst:], r) 30 nSrc++ 31 continue 32 } 33 34 if nDst >= len(dst) { 35 err = transform.ErrShortDst 36 break 37 } 38 dst[nDst] = c 39 nDst++ 40 nSrc++ 41 } 42 return nDst, nSrc, err 43} 44 45type asciiEncoder struct { 46 transform.NopResetter 47} 48 49func (d asciiEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { 50 for _, c := range src { 51 if c > unicode.MaxASCII { 52 err = internal.RepertoireError(encoding.ASCIISub) 53 break 54 } 55 56 if nDst >= len(dst) { 57 err = transform.ErrShortDst 58 break 59 } 60 dst[nDst] = c 61 nDst++ 62 nSrc++ 63 } 64 return nDst, nSrc, err 65} 66 67var asciiEnc = &internal.Encoding{ 68 Encoding: &internal.SimpleEncoding{ 69 asciiDecoder{}, 70 asciiEncoder{}, 71 }, 72 Name: "US-ASCII", 73 MIB: identifier.ASCII, 74} 75