| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ianaindex |
| |
| import ( |
| "unicode" |
| "unicode/utf8" |
| |
| "golang.org/x/text/encoding" |
| "golang.org/x/text/encoding/internal" |
| "golang.org/x/text/encoding/internal/identifier" |
| "golang.org/x/text/transform" |
| ) |
| |
| type asciiDecoder struct { |
| transform.NopResetter |
| } |
| |
| func (d asciiDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
| for _, c := range src { |
| if c > unicode.MaxASCII { |
| r := unicode.ReplacementChar |
| if nDst+utf8.RuneLen(r) > len(dst) { |
| err = transform.ErrShortDst |
| break |
| } |
| nDst += utf8.EncodeRune(dst[nDst:], r) |
| nSrc++ |
| continue |
| } |
| |
| if nDst >= len(dst) { |
| err = transform.ErrShortDst |
| break |
| } |
| dst[nDst] = c |
| nDst++ |
| nSrc++ |
| } |
| return nDst, nSrc, err |
| } |
| |
| type asciiEncoder struct { |
| transform.NopResetter |
| } |
| |
| func (d asciiEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { |
| for _, c := range src { |
| if c > unicode.MaxASCII { |
| err = internal.RepertoireError(encoding.ASCIISub) |
| break |
| } |
| |
| if nDst >= len(dst) { |
| err = transform.ErrShortDst |
| break |
| } |
| dst[nDst] = c |
| nDst++ |
| nSrc++ |
| } |
| return nDst, nSrc, err |
| } |
| |
| var asciiEnc = &internal.Encoding{ |
| Encoding: &internal.SimpleEncoding{ |
| asciiDecoder{}, |
| asciiEncoder{}, |
| }, |
| Name: "US-ASCII", |
| MIB: identifier.ASCII, |
| } |