mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
bump(golang.org/x/text): 2910a502d2bf9e43193af9d68ca516529614eed3
This commit is contained in:
parent
7e1cacaa91
commit
7201562cc3
20
Godeps/Godeps.json
generated
20
Godeps/Godeps.json
generated
@ -2448,10 +2448,30 @@
|
|||||||
"ImportPath": "golang.org/x/text/cases",
|
"ImportPath": "golang.org/x/text/cases",
|
||||||
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/text/encoding",
|
||||||
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/text/encoding/internal",
|
||||||
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/text/encoding/internal/identifier",
|
||||||
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/text/encoding/unicode",
|
||||||
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "golang.org/x/text/internal/tag",
|
"ImportPath": "golang.org/x/text/internal/tag",
|
||||||
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "golang.org/x/text/internal/utf8internal",
|
||||||
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "golang.org/x/text/language",
|
"ImportPath": "golang.org/x/text/language",
|
||||||
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
"Rev": "2910a502d2bf9e43193af9d68ca516529614eed3"
|
||||||
|
335
vendor/golang.org/x/text/encoding/encoding.go
generated
vendored
Normal file
335
vendor/golang.org/x/text/encoding/encoding.go
generated
vendored
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
// Copyright 2013 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 encoding defines an interface for character encodings, such as Shift
|
||||||
|
// JIS and Windows 1252, that can convert to and from UTF-8.
|
||||||
|
//
|
||||||
|
// Encoding implementations are provided in other packages, such as
|
||||||
|
// golang.org/x/text/encoding/charmap and
|
||||||
|
// golang.org/x/text/encoding/japanese.
|
||||||
|
package encoding
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"strconv"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"golang.org/x/text/encoding/internal/identifier"
|
||||||
|
"golang.org/x/text/transform"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// - There seems to be some inconsistency in when decoders return errors
|
||||||
|
// and when not. Also documentation seems to suggest they shouldn't return
|
||||||
|
// errors at all (except for UTF-16).
|
||||||
|
// - Encoders seem to rely on or at least benefit from the input being in NFC
|
||||||
|
// normal form. Perhaps add an example how users could prepare their output.
|
||||||
|
|
||||||
|
// Encoding is a character set encoding that can be transformed to and from
|
||||||
|
// UTF-8.
|
||||||
|
type Encoding interface {
|
||||||
|
// NewDecoder returns a Decoder.
|
||||||
|
NewDecoder() *Decoder
|
||||||
|
|
||||||
|
// NewEncoder returns an Encoder.
|
||||||
|
NewEncoder() *Encoder
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Decoder converts bytes to UTF-8. It implements transform.Transformer.
|
||||||
|
//
|
||||||
|
// Transforming source bytes that are not of that encoding will not result in an
|
||||||
|
// error per se. Each byte that cannot be transcoded will be represented in the
|
||||||
|
// output by the UTF-8 encoding of '\uFFFD', the replacement rune.
|
||||||
|
type Decoder struct {
|
||||||
|
transform.Transformer
|
||||||
|
|
||||||
|
// This forces external creators of Decoders to use names in struct
|
||||||
|
// initializers, allowing for future extendibility without having to break
|
||||||
|
// code.
|
||||||
|
_ struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes converts the given encoded bytes to UTF-8. It returns the converted
|
||||||
|
// bytes or 0, err if any error occurred.
|
||||||
|
func (d *Decoder) Bytes(b []byte) ([]byte, error) {
|
||||||
|
b, _, err := transform.Bytes(d, b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String converts the given encoded string to UTF-8. It returns the converted
|
||||||
|
// string or 0, err if any error occurred.
|
||||||
|
func (d *Decoder) String(s string) (string, error) {
|
||||||
|
s, _, err := transform.String(d, s)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reader wraps another Reader to decode its bytes.
|
||||||
|
//
|
||||||
|
// The Decoder may not be used for any other operation as long as the returned
|
||||||
|
// Reader is in use.
|
||||||
|
func (d *Decoder) Reader(r io.Reader) io.Reader {
|
||||||
|
return transform.NewReader(r, d)
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Encoder converts bytes from UTF-8. It implements transform.Transformer.
|
||||||
|
//
|
||||||
|
// Each rune that cannot be transcoded will result in an error. In this case,
|
||||||
|
// the transform will consume all source byte up to, not including the offending
|
||||||
|
// rune. Transforming source bytes that are not valid UTF-8 will be replaced by
|
||||||
|
// `\uFFFD`. To return early with an error instead, use transform.Chain to
|
||||||
|
// preprocess the data with a UTF8Validator.
|
||||||
|
type Encoder struct {
|
||||||
|
transform.Transformer
|
||||||
|
|
||||||
|
// This forces external creators of Encoders to use names in struct
|
||||||
|
// initializers, allowing for future extendibility without having to break
|
||||||
|
// code.
|
||||||
|
_ struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bytes converts bytes from UTF-8. It returns the converted bytes or 0, err if
|
||||||
|
// any error occurred.
|
||||||
|
func (e *Encoder) Bytes(b []byte) ([]byte, error) {
|
||||||
|
b, _, err := transform.Bytes(e, b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String converts a string from UTF-8. It returns the converted string or
|
||||||
|
// 0, err if any error occurred.
|
||||||
|
func (e *Encoder) String(s string) (string, error) {
|
||||||
|
s, _, err := transform.String(e, s)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writer wraps another Writer to encode its UTF-8 output.
|
||||||
|
//
|
||||||
|
// The Encoder may not be used for any other operation as long as the returned
|
||||||
|
// Writer is in use.
|
||||||
|
func (e *Encoder) Writer(w io.Writer) io.Writer {
|
||||||
|
return transform.NewWriter(w, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ASCIISub is the ASCII substitute character, as recommended by
|
||||||
|
// http://unicode.org/reports/tr36/#Text_Comparison
|
||||||
|
const ASCIISub = '\x1a'
|
||||||
|
|
||||||
|
// Nop is the nop encoding. Its transformed bytes are the same as the source
|
||||||
|
// bytes; it does not replace invalid UTF-8 sequences.
|
||||||
|
var Nop Encoding = nop{}
|
||||||
|
|
||||||
|
type nop struct{}
|
||||||
|
|
||||||
|
func (nop) NewDecoder() *Decoder {
|
||||||
|
return &Decoder{Transformer: transform.Nop}
|
||||||
|
}
|
||||||
|
func (nop) NewEncoder() *Encoder {
|
||||||
|
return &Encoder{Transformer: transform.Nop}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replacement is the replacement encoding. Decoding from the replacement
|
||||||
|
// encoding yields a single '\uFFFD' replacement rune. Encoding from UTF-8 to
|
||||||
|
// the replacement encoding yields the same as the source bytes except that
|
||||||
|
// invalid UTF-8 is converted to '\uFFFD'.
|
||||||
|
//
|
||||||
|
// It is defined at http://encoding.spec.whatwg.org/#replacement
|
||||||
|
var Replacement Encoding = replacement{}
|
||||||
|
|
||||||
|
type replacement struct{}
|
||||||
|
|
||||||
|
func (replacement) NewDecoder() *Decoder {
|
||||||
|
return &Decoder{Transformer: replacementDecoder{}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (replacement) NewEncoder() *Encoder {
|
||||||
|
return &Encoder{Transformer: replacementEncoder{}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (replacement) ID() (mib identifier.MIB, other string) {
|
||||||
|
return identifier.Replacement, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type replacementDecoder struct{ transform.NopResetter }
|
||||||
|
|
||||||
|
func (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
if len(dst) < 3 {
|
||||||
|
return 0, 0, transform.ErrShortDst
|
||||||
|
}
|
||||||
|
if atEOF {
|
||||||
|
const fffd = "\ufffd"
|
||||||
|
dst[0] = fffd[0]
|
||||||
|
dst[1] = fffd[1]
|
||||||
|
dst[2] = fffd[2]
|
||||||
|
nDst = 3
|
||||||
|
}
|
||||||
|
return nDst, len(src), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type replacementEncoder struct{ transform.NopResetter }
|
||||||
|
|
||||||
|
func (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
r, size := rune(0), 0
|
||||||
|
|
||||||
|
for ; nSrc < len(src); nSrc += size {
|
||||||
|
r = rune(src[nSrc])
|
||||||
|
|
||||||
|
// Decode a 1-byte rune.
|
||||||
|
if r < utf8.RuneSelf {
|
||||||
|
size = 1
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Decode a multi-byte rune.
|
||||||
|
r, size = utf8.DecodeRune(src[nSrc:])
|
||||||
|
if size == 1 {
|
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
if !atEOF && !utf8.FullRune(src[nSrc:]) {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
r = '\ufffd'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if nDst+utf8.RuneLen(r) > len(dst) {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
break
|
||||||
|
}
|
||||||
|
nDst += utf8.EncodeRune(dst[nDst:], r)
|
||||||
|
}
|
||||||
|
return nDst, nSrc, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTMLEscapeUnsupported wraps encoders to replace source runes outside the
|
||||||
|
// repertoire of the destination encoding with HTML escape sequences.
|
||||||
|
//
|
||||||
|
// This wrapper exists to comply to URL and HTML forms requiring a
|
||||||
|
// non-terminating legacy encoder. The produced sequences may lead to data
|
||||||
|
// loss as they are indistinguishable from legitimate input. To avoid this
|
||||||
|
// issue, use UTF-8 encodings whenever possible.
|
||||||
|
func HTMLEscapeUnsupported(e *Encoder) *Encoder {
|
||||||
|
return &Encoder{Transformer: &errorHandler{e, errorToHTML}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReplaceUnsupported wraps encoders to replace source runes outside the
|
||||||
|
// repertoire of the destination encoding with an encoding-specific
|
||||||
|
// replacement.
|
||||||
|
//
|
||||||
|
// This wrapper is only provided for backwards compatibility and legacy
|
||||||
|
// handling. Its use is strongly discouraged. Use UTF-8 whenever possible.
|
||||||
|
func ReplaceUnsupported(e *Encoder) *Encoder {
|
||||||
|
return &Encoder{Transformer: &errorHandler{e, errorToReplacement}}
|
||||||
|
}
|
||||||
|
|
||||||
|
type errorHandler struct {
|
||||||
|
*Encoder
|
||||||
|
handler func(dst []byte, r rune, err repertoireError) (n int, ok bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: consider making this error public in some form.
|
||||||
|
type repertoireError interface {
|
||||||
|
Replacement() byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
nDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF)
|
||||||
|
for err != nil {
|
||||||
|
rerr, ok := err.(repertoireError)
|
||||||
|
if !ok {
|
||||||
|
return nDst, nSrc, err
|
||||||
|
}
|
||||||
|
r, sz := utf8.DecodeRune(src[nSrc:])
|
||||||
|
n, ok := h.handler(dst[nDst:], r, rerr)
|
||||||
|
if !ok {
|
||||||
|
return nDst, nSrc, transform.ErrShortDst
|
||||||
|
}
|
||||||
|
err = nil
|
||||||
|
nDst += n
|
||||||
|
if nSrc += sz; nSrc < len(src) {
|
||||||
|
var dn, sn int
|
||||||
|
dn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF)
|
||||||
|
nDst += dn
|
||||||
|
nSrc += sn
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nDst, nSrc, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) {
|
||||||
|
buf := [8]byte{}
|
||||||
|
b := strconv.AppendUint(buf[:0], uint64(r), 10)
|
||||||
|
if n = len(b) + len("&#;"); n >= len(dst) {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
dst[0] = '&'
|
||||||
|
dst[1] = '#'
|
||||||
|
dst[copy(dst[2:], b)+2] = ';'
|
||||||
|
return n, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) {
|
||||||
|
if len(dst) == 0 {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
dst[0] = err.Replacement()
|
||||||
|
return 1, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8.
|
||||||
|
var ErrInvalidUTF8 = errors.New("encoding: invalid UTF-8")
|
||||||
|
|
||||||
|
// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first
|
||||||
|
// input byte that is not valid UTF-8.
|
||||||
|
var UTF8Validator transform.Transformer = utf8Validator{}
|
||||||
|
|
||||||
|
type utf8Validator struct{ transform.NopResetter }
|
||||||
|
|
||||||
|
func (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
n := len(src)
|
||||||
|
if n > len(dst) {
|
||||||
|
n = len(dst)
|
||||||
|
}
|
||||||
|
for i := 0; i < n; {
|
||||||
|
if c := src[i]; c < utf8.RuneSelf {
|
||||||
|
dst[i] = c
|
||||||
|
i++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
_, size := utf8.DecodeRune(src[i:])
|
||||||
|
if size == 1 {
|
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
err = ErrInvalidUTF8
|
||||||
|
if !atEOF && !utf8.FullRune(src[i:]) {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
}
|
||||||
|
return i, i, err
|
||||||
|
}
|
||||||
|
if i+size > len(dst) {
|
||||||
|
return i, i, transform.ErrShortDst
|
||||||
|
}
|
||||||
|
for ; size > 0; size-- {
|
||||||
|
dst[i] = src[i]
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(src) > len(dst) {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
}
|
||||||
|
return n, n, err
|
||||||
|
}
|
137
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
generated
vendored
Normal file
137
vendor/golang.org/x/text/encoding/internal/identifier/gen.go
generated
vendored
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
// Copyright 2015 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.
|
||||||
|
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/text/internal/gen"
|
||||||
|
)
|
||||||
|
|
||||||
|
type registry struct {
|
||||||
|
XMLName xml.Name `xml:"registry"`
|
||||||
|
Updated string `xml:"updated"`
|
||||||
|
Registry []struct {
|
||||||
|
ID string `xml:"id,attr"`
|
||||||
|
Record []struct {
|
||||||
|
Name string `xml:"name"`
|
||||||
|
Xref []struct {
|
||||||
|
Type string `xml:"type,attr"`
|
||||||
|
Data string `xml:"data,attr"`
|
||||||
|
} `xml:"xref"`
|
||||||
|
Desc struct {
|
||||||
|
Data string `xml:",innerxml"`
|
||||||
|
// Any []struct {
|
||||||
|
// Data string `xml:",chardata"`
|
||||||
|
// } `xml:",any"`
|
||||||
|
// Data string `xml:",chardata"`
|
||||||
|
} `xml:"description,"`
|
||||||
|
MIB string `xml:"value"`
|
||||||
|
Alias []string `xml:"alias"`
|
||||||
|
MIME string `xml:"preferred_alias"`
|
||||||
|
} `xml:"record"`
|
||||||
|
} `xml:"registry"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml")
|
||||||
|
reg := ®istry{}
|
||||||
|
if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF {
|
||||||
|
log.Fatalf("Error decoding charset registry: %v", err)
|
||||||
|
}
|
||||||
|
if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" {
|
||||||
|
log.Fatalf("Unexpected ID %s", reg.Registry[0].ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
w := &bytes.Buffer{}
|
||||||
|
fmt.Fprintf(w, "const (\n")
|
||||||
|
for _, rec := range reg.Registry[0].Record {
|
||||||
|
constName := ""
|
||||||
|
for _, a := range rec.Alias {
|
||||||
|
if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 {
|
||||||
|
// Some of the constant definitions have comments in them. Strip those.
|
||||||
|
constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if constName == "" {
|
||||||
|
switch rec.MIB {
|
||||||
|
case "2085":
|
||||||
|
constName = "HZGB2312" // Not listed as alias for some reason.
|
||||||
|
default:
|
||||||
|
log.Fatalf("No cs alias defined for %s.", rec.MIB)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if rec.MIME != "" {
|
||||||
|
rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME)
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME)
|
||||||
|
if len(rec.Desc.Data) > 0 {
|
||||||
|
fmt.Fprint(w, "// ")
|
||||||
|
d := xml.NewDecoder(strings.NewReader(rec.Desc.Data))
|
||||||
|
inElem := true
|
||||||
|
attr := ""
|
||||||
|
for {
|
||||||
|
t, err := d.Token()
|
||||||
|
if err != nil {
|
||||||
|
if err != io.EOF {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
switch x := t.(type) {
|
||||||
|
case xml.CharData:
|
||||||
|
attr = "" // Don't need attribute info.
|
||||||
|
a := bytes.Split([]byte(x), []byte("\n"))
|
||||||
|
for i, b := range a {
|
||||||
|
if b = bytes.TrimSpace(b); len(b) != 0 {
|
||||||
|
if !inElem && i > 0 {
|
||||||
|
fmt.Fprint(w, "\n// ")
|
||||||
|
}
|
||||||
|
inElem = false
|
||||||
|
fmt.Fprintf(w, "%s ", string(b))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case xml.StartElement:
|
||||||
|
if x.Name.Local == "xref" {
|
||||||
|
inElem = true
|
||||||
|
use := false
|
||||||
|
for _, a := range x.Attr {
|
||||||
|
if a.Name.Local == "type" {
|
||||||
|
use = use || a.Value != "person"
|
||||||
|
}
|
||||||
|
if a.Name.Local == "data" && use {
|
||||||
|
attr = a.Value + " "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case xml.EndElement:
|
||||||
|
inElem = false
|
||||||
|
fmt.Fprint(w, attr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Fprint(w, "\n")
|
||||||
|
}
|
||||||
|
for _, x := range rec.Xref {
|
||||||
|
switch x.Type {
|
||||||
|
case "rfc":
|
||||||
|
fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data))
|
||||||
|
case "uri":
|
||||||
|
fmt.Fprintf(w, "// Reference: %s\n", x.Data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB)
|
||||||
|
fmt.Fprintln(w)
|
||||||
|
}
|
||||||
|
fmt.Fprintln(w, ")")
|
||||||
|
|
||||||
|
gen.WriteGoFile("mib.go", "identifier", w.Bytes())
|
||||||
|
}
|
81
vendor/golang.org/x/text/encoding/internal/identifier/identifier.go
generated
vendored
Normal file
81
vendor/golang.org/x/text/encoding/internal/identifier/identifier.go
generated
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
// Copyright 2015 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.
|
||||||
|
|
||||||
|
//go:generate go run gen.go
|
||||||
|
|
||||||
|
// Package identifier defines the contract between implementations of Encoding
|
||||||
|
// and Index by defining identifiers that uniquely identify standardized coded
|
||||||
|
// character sets (CCS) and character encoding schemes (CES), which we will
|
||||||
|
// together refer to as encodings, for which Encoding implementations provide
|
||||||
|
// converters to and from UTF-8. This package is typically only of concern to
|
||||||
|
// implementers of Indexes and Encodings.
|
||||||
|
//
|
||||||
|
// One part of the identifier is the MIB code, which is defined by IANA and
|
||||||
|
// uniquely identifies a CCS or CES. Each code is associated with data that
|
||||||
|
// references authorities, official documentation as well as aliases and MIME
|
||||||
|
// names.
|
||||||
|
//
|
||||||
|
// Not all CESs are covered by the IANA registry. The "other" string that is
|
||||||
|
// returned by ID can be used to identify other character sets or versions of
|
||||||
|
// existing ones.
|
||||||
|
//
|
||||||
|
// It is recommended that each package that provides a set of Encodings provide
|
||||||
|
// the All and Common variables to reference all supported encodings and
|
||||||
|
// commonly used subset. This allows Index implementations to include all
|
||||||
|
// available encodings without explicitly referencing or knowing about them.
|
||||||
|
package identifier
|
||||||
|
|
||||||
|
// Note: this package is internal, but could be made public if there is a need
|
||||||
|
// for writing third-party Indexes and Encodings.
|
||||||
|
|
||||||
|
// References:
|
||||||
|
// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt
|
||||||
|
// - http://www.iana.org/assignments/character-sets/character-sets.xhtml
|
||||||
|
// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib
|
||||||
|
// - http://www.ietf.org/rfc/rfc2978.txt
|
||||||
|
// - http://www.unicode.org/reports/tr22/
|
||||||
|
// - http://www.w3.org/TR/encoding/
|
||||||
|
// - http://www.w3.org/TR/encoding/indexes/encodings.json
|
||||||
|
// - https://encoding.spec.whatwg.org/
|
||||||
|
// - https://tools.ietf.org/html/rfc6657#section-5
|
||||||
|
|
||||||
|
// Interface can be implemented by Encodings to define the CCS or CES for which
|
||||||
|
// it implements conversions.
|
||||||
|
type Interface interface {
|
||||||
|
// ID returns an encoding identifier. Exactly one of the mib and other
|
||||||
|
// values should be non-zero.
|
||||||
|
//
|
||||||
|
// In the usual case it is only necessary to indicate the MIB code. The
|
||||||
|
// other string can be used to specify encodings for which there is no MIB,
|
||||||
|
// such as "x-mac-dingbat".
|
||||||
|
//
|
||||||
|
// The other string may only contain the characters a-z, A-Z, 0-9, - and _.
|
||||||
|
ID() (mib MIB, other string)
|
||||||
|
|
||||||
|
// NOTE: the restrictions on the encoding are to allow extending the syntax
|
||||||
|
// with additional information such as versions, vendors and other variants.
|
||||||
|
}
|
||||||
|
|
||||||
|
// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds
|
||||||
|
// some identifiers for some encodings that are not covered by the IANA
|
||||||
|
// standard.
|
||||||
|
//
|
||||||
|
// See http://www.iana.org/assignments/ianacharset-mib.
|
||||||
|
type MIB uint16
|
||||||
|
|
||||||
|
// These additional MIB types are not defined in IANA. They are added because
|
||||||
|
// they are common and defined within the text repo.
|
||||||
|
const (
|
||||||
|
// Unofficial marks the start of encodings not registered by IANA.
|
||||||
|
Unofficial MIB = 10000 + iota
|
||||||
|
|
||||||
|
// Replacement is the WhatWG replacement encoding.
|
||||||
|
Replacement
|
||||||
|
|
||||||
|
// XUserDefined is the code for x-user-defined.
|
||||||
|
XUserDefined
|
||||||
|
|
||||||
|
// MacintoshCyrillic is the code for x-mac-cyrillic.
|
||||||
|
MacintoshCyrillic
|
||||||
|
)
|
1621
vendor/golang.org/x/text/encoding/internal/identifier/mib.go
generated
vendored
Normal file
1621
vendor/golang.org/x/text/encoding/internal/identifier/mib.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
75
vendor/golang.org/x/text/encoding/internal/internal.go
generated
vendored
Normal file
75
vendor/golang.org/x/text/encoding/internal/internal.go
generated
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
// Copyright 2015 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 internal contains code that is shared among encoding implementations.
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/text/encoding"
|
||||||
|
"golang.org/x/text/encoding/internal/identifier"
|
||||||
|
"golang.org/x/text/transform"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Encoding is an implementation of the Encoding interface that adds the String
|
||||||
|
// and ID methods to an existing encoding.
|
||||||
|
type Encoding struct {
|
||||||
|
encoding.Encoding
|
||||||
|
Name string
|
||||||
|
MIB identifier.MIB
|
||||||
|
}
|
||||||
|
|
||||||
|
// _ verifies that Encoding implements identifier.Interface.
|
||||||
|
var _ identifier.Interface = (*Encoding)(nil)
|
||||||
|
|
||||||
|
func (e *Encoding) String() string {
|
||||||
|
return e.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Encoding) ID() (mib identifier.MIB, other string) {
|
||||||
|
return e.MIB, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// SimpleEncoding is an Encoding that combines two Transformers.
|
||||||
|
type SimpleEncoding struct {
|
||||||
|
Decoder transform.Transformer
|
||||||
|
Encoder transform.Transformer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *SimpleEncoding) NewDecoder() *encoding.Decoder {
|
||||||
|
return &encoding.Decoder{Transformer: e.Decoder}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *SimpleEncoding) NewEncoder() *encoding.Encoder {
|
||||||
|
return &encoding.Encoder{Transformer: e.Encoder}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FuncEncoding is an Encoding that combines two functions returning a new
|
||||||
|
// Transformer.
|
||||||
|
type FuncEncoding struct {
|
||||||
|
Decoder func() transform.Transformer
|
||||||
|
Encoder func() transform.Transformer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e FuncEncoding) NewDecoder() *encoding.Decoder {
|
||||||
|
return &encoding.Decoder{Transformer: e.Decoder()}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e FuncEncoding) NewEncoder() *encoding.Encoder {
|
||||||
|
return &encoding.Encoder{Transformer: e.Encoder()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A RepertoireError indicates a rune is not in the repertoire of a destination
|
||||||
|
// encoding. It is associated with an encoding-specific suggested replacement
|
||||||
|
// byte.
|
||||||
|
type RepertoireError byte
|
||||||
|
|
||||||
|
// Error implements the error interrface.
|
||||||
|
func (r RepertoireError) Error() string {
|
||||||
|
return "encoding: rune not supported by encoding."
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replacement returns the replacement string associated with this error.
|
||||||
|
func (r RepertoireError) Replacement() byte { return byte(r) }
|
||||||
|
|
||||||
|
var ErrASCIIReplacement = RepertoireError(encoding.ASCIISub)
|
82
vendor/golang.org/x/text/encoding/unicode/override.go
generated
vendored
Normal file
82
vendor/golang.org/x/text/encoding/unicode/override.go
generated
vendored
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// Copyright 2015 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 unicode
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/text/transform"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BOMOverride returns a new decoder transformer that is identical to fallback,
|
||||||
|
// except that the presence of a Byte Order Mark at the start of the input
|
||||||
|
// causes it to switch to the corresponding Unicode decoding. It will only
|
||||||
|
// consider BOMs for UTF-8, UTF-16BE, and UTF-16LE.
|
||||||
|
//
|
||||||
|
// This differs from using ExpectBOM by allowing a BOM to switch to UTF-8, not
|
||||||
|
// just UTF-16 variants, and allowing falling back to any encoding scheme.
|
||||||
|
//
|
||||||
|
// This technique is recommended by the W3C for use in HTML 5: "For
|
||||||
|
// compatibility with deployed content, the byte order mark (also known as BOM)
|
||||||
|
// is considered more authoritative than anything else."
|
||||||
|
// http://www.w3.org/TR/encoding/#specification-hooks
|
||||||
|
//
|
||||||
|
// Using BOMOverride is mostly intended for use cases where the first characters
|
||||||
|
// of a fallback encoding are known to not be a BOM, for example, for valid HTML
|
||||||
|
// and most encodings.
|
||||||
|
func BOMOverride(fallback transform.Transformer) transform.Transformer {
|
||||||
|
// TODO: possibly allow a variadic argument of unicode encodings to allow
|
||||||
|
// specifying details of which fallbacks are supported as well as
|
||||||
|
// specifying the details of the implementations. This would also allow for
|
||||||
|
// support for UTF-32, which should not be supported by default.
|
||||||
|
return &bomOverride{fallback: fallback}
|
||||||
|
}
|
||||||
|
|
||||||
|
type bomOverride struct {
|
||||||
|
fallback transform.Transformer
|
||||||
|
current transform.Transformer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *bomOverride) Reset() {
|
||||||
|
d.current = nil
|
||||||
|
d.fallback.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// TODO: we could use decode functions here, instead of allocating a new
|
||||||
|
// decoder on every NewDecoder as IgnoreBOM decoders can be stateless.
|
||||||
|
utf16le = UTF16(LittleEndian, IgnoreBOM)
|
||||||
|
utf16be = UTF16(BigEndian, IgnoreBOM)
|
||||||
|
)
|
||||||
|
|
||||||
|
const utf8BOM = "\ufeff"
|
||||||
|
|
||||||
|
func (d *bomOverride) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
if d.current != nil {
|
||||||
|
return d.current.Transform(dst, src, atEOF)
|
||||||
|
}
|
||||||
|
if len(src) < 3 && !atEOF {
|
||||||
|
return 0, 0, transform.ErrShortSrc
|
||||||
|
}
|
||||||
|
d.current = d.fallback
|
||||||
|
bomSize := 0
|
||||||
|
if len(src) >= 2 {
|
||||||
|
if src[0] == 0xFF && src[1] == 0xFE {
|
||||||
|
d.current = utf16le.NewDecoder()
|
||||||
|
bomSize = 2
|
||||||
|
} else if src[0] == 0xFE && src[1] == 0xFF {
|
||||||
|
d.current = utf16be.NewDecoder()
|
||||||
|
bomSize = 2
|
||||||
|
} else if len(src) >= 3 &&
|
||||||
|
src[0] == utf8BOM[0] &&
|
||||||
|
src[1] == utf8BOM[1] &&
|
||||||
|
src[2] == utf8BOM[2] {
|
||||||
|
d.current = transform.Nop
|
||||||
|
bomSize = 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if bomSize < len(src) {
|
||||||
|
nDst, nSrc, err = d.current.Transform(dst, src[bomSize:], atEOF)
|
||||||
|
}
|
||||||
|
return nDst, nSrc + bomSize, err
|
||||||
|
}
|
434
vendor/golang.org/x/text/encoding/unicode/unicode.go
generated
vendored
Normal file
434
vendor/golang.org/x/text/encoding/unicode/unicode.go
generated
vendored
Normal file
@ -0,0 +1,434 @@
|
|||||||
|
// Copyright 2013 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 unicode provides Unicode encodings such as UTF-16.
|
||||||
|
package unicode
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"unicode/utf16"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
|
"golang.org/x/text/encoding"
|
||||||
|
"golang.org/x/text/encoding/internal"
|
||||||
|
"golang.org/x/text/encoding/internal/identifier"
|
||||||
|
"golang.org/x/text/internal/utf8internal"
|
||||||
|
"golang.org/x/text/runes"
|
||||||
|
"golang.org/x/text/transform"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: I think the Transformers really should return errors on unmatched
|
||||||
|
// surrogate pairs and odd numbers of bytes. This is not required by RFC 2781,
|
||||||
|
// which leaves it open, but is suggested by WhatWG. It will allow for all error
|
||||||
|
// modes as defined by WhatWG: fatal, HTML and Replacement. This would require
|
||||||
|
// the introduction of some kind of error type for conveying the erroneous code
|
||||||
|
// point.
|
||||||
|
|
||||||
|
// UTF8 is the UTF-8 encoding.
|
||||||
|
var UTF8 encoding.Encoding = utf8enc
|
||||||
|
|
||||||
|
var utf8enc = &internal.Encoding{
|
||||||
|
&internal.SimpleEncoding{utf8Decoder{}, runes.ReplaceIllFormed()},
|
||||||
|
"UTF-8",
|
||||||
|
identifier.UTF8,
|
||||||
|
}
|
||||||
|
|
||||||
|
type utf8Decoder struct{ transform.NopResetter }
|
||||||
|
|
||||||
|
func (utf8Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
var pSrc int // point from which to start copy in src
|
||||||
|
var accept utf8internal.AcceptRange
|
||||||
|
|
||||||
|
// The decoder can only make the input larger, not smaller.
|
||||||
|
n := len(src)
|
||||||
|
if len(dst) < n {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
n = len(dst)
|
||||||
|
atEOF = false
|
||||||
|
}
|
||||||
|
for nSrc < n {
|
||||||
|
c := src[nSrc]
|
||||||
|
if c < utf8.RuneSelf {
|
||||||
|
nSrc++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
first := utf8internal.First[c]
|
||||||
|
size := int(first & utf8internal.SizeMask)
|
||||||
|
if first == utf8internal.FirstInvalid {
|
||||||
|
goto handleInvalid // invalid starter byte
|
||||||
|
}
|
||||||
|
accept = utf8internal.AcceptRanges[first>>utf8internal.AcceptShift]
|
||||||
|
if nSrc+size > n {
|
||||||
|
if !atEOF {
|
||||||
|
// We may stop earlier than necessary here if the short sequence
|
||||||
|
// has invalid bytes. Not checking for this simplifies the code
|
||||||
|
// and may avoid duplicate computations in certain conditions.
|
||||||
|
if err == nil {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Determine the maximal subpart of an ill-formed subsequence.
|
||||||
|
switch {
|
||||||
|
case nSrc+1 >= n || src[nSrc+1] < accept.Lo || accept.Hi < src[nSrc+1]:
|
||||||
|
size = 1
|
||||||
|
case nSrc+2 >= n || src[nSrc+2] < utf8internal.LoCB || utf8internal.HiCB < src[nSrc+2]:
|
||||||
|
size = 2
|
||||||
|
default:
|
||||||
|
size = 3 // As we are short, the maximum is 3.
|
||||||
|
}
|
||||||
|
goto handleInvalid
|
||||||
|
}
|
||||||
|
if c = src[nSrc+1]; c < accept.Lo || accept.Hi < c {
|
||||||
|
size = 1
|
||||||
|
goto handleInvalid // invalid continuation byte
|
||||||
|
} else if size == 2 {
|
||||||
|
} else if c = src[nSrc+2]; c < utf8internal.LoCB || utf8internal.HiCB < c {
|
||||||
|
size = 2
|
||||||
|
goto handleInvalid // invalid continuation byte
|
||||||
|
} else if size == 3 {
|
||||||
|
} else if c = src[nSrc+3]; c < utf8internal.LoCB || utf8internal.HiCB < c {
|
||||||
|
size = 3
|
||||||
|
goto handleInvalid // invalid continuation byte
|
||||||
|
}
|
||||||
|
nSrc += size
|
||||||
|
continue
|
||||||
|
|
||||||
|
handleInvalid:
|
||||||
|
// Copy the scanned input so far.
|
||||||
|
nDst += copy(dst[nDst:], src[pSrc:nSrc])
|
||||||
|
|
||||||
|
// Append RuneError to the destination.
|
||||||
|
const runeError = "\ufffd"
|
||||||
|
if nDst+len(runeError) > len(dst) {
|
||||||
|
return nDst, nSrc, transform.ErrShortDst
|
||||||
|
}
|
||||||
|
nDst += copy(dst[nDst:], runeError)
|
||||||
|
|
||||||
|
// Skip the maximal subpart of an ill-formed subsequence according to
|
||||||
|
// the W3C standard way instead of the Go way. This Transform is
|
||||||
|
// probably the only place in the text repo where it is warranted.
|
||||||
|
nSrc += size
|
||||||
|
pSrc = nSrc
|
||||||
|
|
||||||
|
// Recompute the maximum source length.
|
||||||
|
if sz := len(dst) - nDst; sz < len(src)-nSrc {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
n = nSrc + sz
|
||||||
|
atEOF = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nDst + copy(dst[nDst:], src[pSrc:nSrc]), nSrc, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTF16 returns a UTF-16 Encoding for the given default endianness and byte
|
||||||
|
// order mark (BOM) policy.
|
||||||
|
//
|
||||||
|
// When decoding from UTF-16 to UTF-8, if the BOMPolicy is IgnoreBOM then
|
||||||
|
// neither BOMs U+FEFF nor noncharacters U+FFFE in the input stream will affect
|
||||||
|
// the endianness used for decoding, and will instead be output as their
|
||||||
|
// standard UTF-8 encodings: "\xef\xbb\xbf" and "\xef\xbf\xbe". If the BOMPolicy
|
||||||
|
// is UseBOM or ExpectBOM a staring BOM is not written to the UTF-8 output.
|
||||||
|
// Instead, it overrides the default endianness e for the remainder of the
|
||||||
|
// transformation. Any subsequent BOMs U+FEFF or noncharacters U+FFFE will not
|
||||||
|
// affect the endianness used, and will instead be output as their standard
|
||||||
|
// UTF-8 encodings. For UseBOM, if there is no starting BOM, it will proceed
|
||||||
|
// with the default Endianness. For ExpectBOM, in that case, the transformation
|
||||||
|
// will return early with an ErrMissingBOM error.
|
||||||
|
//
|
||||||
|
// When encoding from UTF-8 to UTF-16, a BOM will be inserted at the start of
|
||||||
|
// the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM will not
|
||||||
|
// be inserted. The UTF-8 input does not need to contain a BOM.
|
||||||
|
//
|
||||||
|
// There is no concept of a 'native' endianness. If the UTF-16 data is produced
|
||||||
|
// and consumed in a greater context that implies a certain endianness, use
|
||||||
|
// IgnoreBOM. Otherwise, use ExpectBOM and always produce and consume a BOM.
|
||||||
|
//
|
||||||
|
// In the language of http://www.unicode.org/faq/utf_bom.html#bom10, IgnoreBOM
|
||||||
|
// corresponds to "Where the precise type of the data stream is known... the
|
||||||
|
// BOM should not be used" and ExpectBOM corresponds to "A particular
|
||||||
|
// protocol... may require use of the BOM".
|
||||||
|
func UTF16(e Endianness, b BOMPolicy) encoding.Encoding {
|
||||||
|
return utf16Encoding{config{e, b}, mibValue[e][b&bomMask]}
|
||||||
|
}
|
||||||
|
|
||||||
|
// mibValue maps Endianness and BOMPolicy settings to MIB constants. Note that
|
||||||
|
// some configurations map to the same MIB identifier. RFC 2781 has requirements
|
||||||
|
// and recommendations. Some of the "configurations" are merely recommendations,
|
||||||
|
// so multiple configurations could match.
|
||||||
|
var mibValue = map[Endianness][numBOMValues]identifier.MIB{
|
||||||
|
BigEndian: [numBOMValues]identifier.MIB{
|
||||||
|
IgnoreBOM: identifier.UTF16BE,
|
||||||
|
UseBOM: identifier.UTF16, // BigEnding default is preferred by RFC 2781.
|
||||||
|
// TODO: acceptBOM | strictBOM would map to UTF16BE as well.
|
||||||
|
},
|
||||||
|
LittleEndian: [numBOMValues]identifier.MIB{
|
||||||
|
IgnoreBOM: identifier.UTF16LE,
|
||||||
|
UseBOM: identifier.UTF16, // LittleEndian default is allowed and preferred on Windows.
|
||||||
|
// TODO: acceptBOM | strictBOM would map to UTF16LE as well.
|
||||||
|
},
|
||||||
|
// ExpectBOM is not widely used and has no valid MIB identifier.
|
||||||
|
}
|
||||||
|
|
||||||
|
// All lists a configuration for each IANA-defined UTF-16 variant.
|
||||||
|
var All = []encoding.Encoding{
|
||||||
|
UTF8,
|
||||||
|
UTF16(BigEndian, UseBOM),
|
||||||
|
UTF16(BigEndian, IgnoreBOM),
|
||||||
|
UTF16(LittleEndian, IgnoreBOM),
|
||||||
|
}
|
||||||
|
|
||||||
|
// BOMPolicy is a UTF-16 encoding's byte order mark policy.
|
||||||
|
type BOMPolicy uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
writeBOM BOMPolicy = 0x01
|
||||||
|
acceptBOM BOMPolicy = 0x02
|
||||||
|
requireBOM BOMPolicy = 0x04
|
||||||
|
bomMask BOMPolicy = 0x07
|
||||||
|
|
||||||
|
// HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a
|
||||||
|
// map of an array of length 8 of a type that is also used as a key or value
|
||||||
|
// in another map). See golang.org/issue/11354.
|
||||||
|
// TODO: consider changing this value back to 8 if the use of 1.4.* has
|
||||||
|
// been minimized.
|
||||||
|
numBOMValues = 8 + 1
|
||||||
|
|
||||||
|
// IgnoreBOM means to ignore any byte order marks.
|
||||||
|
IgnoreBOM BOMPolicy = 0
|
||||||
|
// Common and RFC 2781-compliant interpretation for UTF-16BE/LE.
|
||||||
|
|
||||||
|
// UseBOM means that the UTF-16 form may start with a byte order mark, which
|
||||||
|
// will be used to override the default encoding.
|
||||||
|
UseBOM BOMPolicy = writeBOM | acceptBOM
|
||||||
|
// Common and RFC 2781-compliant interpretation for UTF-16.
|
||||||
|
|
||||||
|
// ExpectBOM means that the UTF-16 form must start with a byte order mark,
|
||||||
|
// which will be used to override the default encoding.
|
||||||
|
ExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM
|
||||||
|
// Used in Java as Unicode (not to be confused with Java's UTF-16) and
|
||||||
|
// ICU's UTF-16,version=1. Not compliant with RFC 2781.
|
||||||
|
|
||||||
|
// TODO (maybe): strictBOM: BOM must match Endianness. This would allow:
|
||||||
|
// - UTF-16(B|L)E,version=1: writeBOM | acceptBOM | requireBOM | strictBOM
|
||||||
|
// (UnicodeBig and UnicodeLittle in Java)
|
||||||
|
// - RFC 2781-compliant, but less common interpretation for UTF-16(B|L)E:
|
||||||
|
// acceptBOM | strictBOM (e.g. assigned to CheckBOM).
|
||||||
|
// This addition would be consistent with supporting ExpectBOM.
|
||||||
|
)
|
||||||
|
|
||||||
|
// Endianness is a UTF-16 encoding's default endianness.
|
||||||
|
type Endianness bool
|
||||||
|
|
||||||
|
const (
|
||||||
|
// BigEndian is UTF-16BE.
|
||||||
|
BigEndian Endianness = false
|
||||||
|
// LittleEndian is UTF-16LE.
|
||||||
|
LittleEndian Endianness = true
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrMissingBOM means that decoding UTF-16 input with ExpectBOM did not find a
|
||||||
|
// starting byte order mark.
|
||||||
|
var ErrMissingBOM = errors.New("encoding: missing byte order mark")
|
||||||
|
|
||||||
|
type utf16Encoding struct {
|
||||||
|
config
|
||||||
|
mib identifier.MIB
|
||||||
|
}
|
||||||
|
|
||||||
|
type config struct {
|
||||||
|
endianness Endianness
|
||||||
|
bomPolicy BOMPolicy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u utf16Encoding) NewDecoder() *encoding.Decoder {
|
||||||
|
return &encoding.Decoder{Transformer: &utf16Decoder{
|
||||||
|
initial: u.config,
|
||||||
|
current: u.config,
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u utf16Encoding) NewEncoder() *encoding.Encoder {
|
||||||
|
return &encoding.Encoder{Transformer: &utf16Encoder{
|
||||||
|
endianness: u.endianness,
|
||||||
|
initialBOMPolicy: u.bomPolicy,
|
||||||
|
currentBOMPolicy: u.bomPolicy,
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u utf16Encoding) ID() (mib identifier.MIB, other string) {
|
||||||
|
return u.mib, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u utf16Encoding) String() string {
|
||||||
|
e, b := "B", ""
|
||||||
|
if u.endianness == LittleEndian {
|
||||||
|
e = "L"
|
||||||
|
}
|
||||||
|
switch u.bomPolicy {
|
||||||
|
case ExpectBOM:
|
||||||
|
b = "Expect"
|
||||||
|
case UseBOM:
|
||||||
|
b = "Use"
|
||||||
|
case IgnoreBOM:
|
||||||
|
b = "Ignore"
|
||||||
|
}
|
||||||
|
return "UTF-16" + e + "E (" + b + " BOM)"
|
||||||
|
}
|
||||||
|
|
||||||
|
type utf16Decoder struct {
|
||||||
|
initial config
|
||||||
|
current config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *utf16Decoder) Reset() {
|
||||||
|
u.current = u.initial
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *utf16Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
if len(src) == 0 {
|
||||||
|
if atEOF && u.current.bomPolicy&requireBOM != 0 {
|
||||||
|
return 0, 0, ErrMissingBOM
|
||||||
|
}
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
if u.current.bomPolicy&acceptBOM != 0 {
|
||||||
|
if len(src) < 2 {
|
||||||
|
return 0, 0, transform.ErrShortSrc
|
||||||
|
}
|
||||||
|
switch {
|
||||||
|
case src[0] == 0xfe && src[1] == 0xff:
|
||||||
|
u.current.endianness = BigEndian
|
||||||
|
nSrc = 2
|
||||||
|
case src[0] == 0xff && src[1] == 0xfe:
|
||||||
|
u.current.endianness = LittleEndian
|
||||||
|
nSrc = 2
|
||||||
|
default:
|
||||||
|
if u.current.bomPolicy&requireBOM != 0 {
|
||||||
|
return 0, 0, ErrMissingBOM
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u.current.bomPolicy = IgnoreBOM
|
||||||
|
}
|
||||||
|
|
||||||
|
var r rune
|
||||||
|
var dSize, sSize int
|
||||||
|
for nSrc < len(src) {
|
||||||
|
if nSrc+1 < len(src) {
|
||||||
|
x := uint16(src[nSrc+0])<<8 | uint16(src[nSrc+1])
|
||||||
|
if u.current.endianness == LittleEndian {
|
||||||
|
x = x>>8 | x<<8
|
||||||
|
}
|
||||||
|
r, sSize = rune(x), 2
|
||||||
|
if utf16.IsSurrogate(r) {
|
||||||
|
if nSrc+3 < len(src) {
|
||||||
|
x = uint16(src[nSrc+2])<<8 | uint16(src[nSrc+3])
|
||||||
|
if u.current.endianness == LittleEndian {
|
||||||
|
x = x>>8 | x<<8
|
||||||
|
}
|
||||||
|
// Save for next iteration if it is not a high surrogate.
|
||||||
|
if isHighSurrogate(rune(x)) {
|
||||||
|
r, sSize = utf16.DecodeRune(r, rune(x)), 4
|
||||||
|
}
|
||||||
|
} else if !atEOF {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if dSize = utf8.RuneLen(r); dSize < 0 {
|
||||||
|
r, dSize = utf8.RuneError, 3
|
||||||
|
}
|
||||||
|
} else if atEOF {
|
||||||
|
// Single trailing byte.
|
||||||
|
r, dSize, sSize = utf8.RuneError, 3, 1
|
||||||
|
} else {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if nDst+dSize > len(dst) {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
break
|
||||||
|
}
|
||||||
|
nDst += utf8.EncodeRune(dst[nDst:], r)
|
||||||
|
nSrc += sSize
|
||||||
|
}
|
||||||
|
return nDst, nSrc, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func isHighSurrogate(r rune) bool {
|
||||||
|
return 0xDC00 <= r && r <= 0xDFFF
|
||||||
|
}
|
||||||
|
|
||||||
|
type utf16Encoder struct {
|
||||||
|
endianness Endianness
|
||||||
|
initialBOMPolicy BOMPolicy
|
||||||
|
currentBOMPolicy BOMPolicy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *utf16Encoder) Reset() {
|
||||||
|
u.currentBOMPolicy = u.initialBOMPolicy
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *utf16Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
|
||||||
|
if u.currentBOMPolicy&writeBOM != 0 {
|
||||||
|
if len(dst) < 2 {
|
||||||
|
return 0, 0, transform.ErrShortDst
|
||||||
|
}
|
||||||
|
dst[0], dst[1] = 0xfe, 0xff
|
||||||
|
u.currentBOMPolicy = IgnoreBOM
|
||||||
|
nDst = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
r, size := rune(0), 0
|
||||||
|
for nSrc < len(src) {
|
||||||
|
r = rune(src[nSrc])
|
||||||
|
|
||||||
|
// Decode a 1-byte rune.
|
||||||
|
if r < utf8.RuneSelf {
|
||||||
|
size = 1
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Decode a multi-byte rune.
|
||||||
|
r, size = utf8.DecodeRune(src[nSrc:])
|
||||||
|
if size == 1 {
|
||||||
|
// All valid runes of size 1 (those below utf8.RuneSelf) were
|
||||||
|
// handled above. We have invalid UTF-8 or we haven't seen the
|
||||||
|
// full character yet.
|
||||||
|
if !atEOF && !utf8.FullRune(src[nSrc:]) {
|
||||||
|
err = transform.ErrShortSrc
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if r <= 0xffff {
|
||||||
|
if nDst+2 > len(dst) {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
break
|
||||||
|
}
|
||||||
|
dst[nDst+0] = uint8(r >> 8)
|
||||||
|
dst[nDst+1] = uint8(r)
|
||||||
|
nDst += 2
|
||||||
|
} else {
|
||||||
|
if nDst+4 > len(dst) {
|
||||||
|
err = transform.ErrShortDst
|
||||||
|
break
|
||||||
|
}
|
||||||
|
r1, r2 := utf16.EncodeRune(r)
|
||||||
|
dst[nDst+0] = uint8(r1 >> 8)
|
||||||
|
dst[nDst+1] = uint8(r1)
|
||||||
|
dst[nDst+2] = uint8(r2 >> 8)
|
||||||
|
dst[nDst+3] = uint8(r2)
|
||||||
|
nDst += 4
|
||||||
|
}
|
||||||
|
nSrc += size
|
||||||
|
}
|
||||||
|
|
||||||
|
if u.endianness == LittleEndian {
|
||||||
|
for i := 0; i < nDst; i += 2 {
|
||||||
|
dst[i], dst[i+1] = dst[i+1], dst[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nDst, nSrc, err
|
||||||
|
}
|
87
vendor/golang.org/x/text/internal/utf8internal/utf8internal.go
generated
vendored
Normal file
87
vendor/golang.org/x/text/internal/utf8internal/utf8internal.go
generated
vendored
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// Copyright 2015 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 utf8internal contains low-level utf8-related constants, tables, etc.
|
||||||
|
// that are used internally by the text package.
|
||||||
|
package utf8internal
|
||||||
|
|
||||||
|
// The default lowest and highest continuation byte.
|
||||||
|
const (
|
||||||
|
LoCB = 0x80 // 1000 0000
|
||||||
|
HiCB = 0xBF // 1011 1111
|
||||||
|
)
|
||||||
|
|
||||||
|
// Constants related to getting information of first bytes of UTF-8 sequences.
|
||||||
|
const (
|
||||||
|
// ASCII identifies a UTF-8 byte as ASCII.
|
||||||
|
ASCII = as
|
||||||
|
|
||||||
|
// FirstInvalid indicates a byte is invalid as a first byte of a UTF-8
|
||||||
|
// sequence.
|
||||||
|
FirstInvalid = xx
|
||||||
|
|
||||||
|
// SizeMask is a mask for the size bits. Use use x&SizeMask to get the size.
|
||||||
|
SizeMask = 7
|
||||||
|
|
||||||
|
// AcceptShift is the right-shift count for the first byte info byte to get
|
||||||
|
// the index into the AcceptRanges table. See AcceptRanges.
|
||||||
|
AcceptShift = 4
|
||||||
|
|
||||||
|
// The names of these constants are chosen to give nice alignment in the
|
||||||
|
// table below. The first nibble is an index into acceptRanges or F for
|
||||||
|
// special one-byte cases. The second nibble is the Rune length or the
|
||||||
|
// Status for the special one-byte case.
|
||||||
|
xx = 0xF1 // invalid: size 1
|
||||||
|
as = 0xF0 // ASCII: size 1
|
||||||
|
s1 = 0x02 // accept 0, size 2
|
||||||
|
s2 = 0x13 // accept 1, size 3
|
||||||
|
s3 = 0x03 // accept 0, size 3
|
||||||
|
s4 = 0x23 // accept 2, size 3
|
||||||
|
s5 = 0x34 // accept 3, size 4
|
||||||
|
s6 = 0x04 // accept 0, size 4
|
||||||
|
s7 = 0x44 // accept 4, size 4
|
||||||
|
)
|
||||||
|
|
||||||
|
// First is information about the first byte in a UTF-8 sequence.
|
||||||
|
var First = [256]uint8{
|
||||||
|
// 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F
|
||||||
|
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F
|
||||||
|
// 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF
|
||||||
|
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF
|
||||||
|
xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF
|
||||||
|
s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF
|
||||||
|
s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF
|
||||||
|
s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcceptRange gives the range of valid values for the second byte in a UTF-8
|
||||||
|
// sequence for any value for First that is not ASCII or FirstInvalid.
|
||||||
|
type AcceptRange struct {
|
||||||
|
Lo uint8 // lowest value for second byte.
|
||||||
|
Hi uint8 // highest value for second byte.
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcceptRanges is a slice of AcceptRange values. For a given byte sequence b
|
||||||
|
//
|
||||||
|
// AcceptRanges[First[b[0]]>>AcceptShift]
|
||||||
|
//
|
||||||
|
// will give the value of AcceptRange for the multi-byte UTF-8 sequence starting
|
||||||
|
// at b[0].
|
||||||
|
var AcceptRanges = [...]AcceptRange{
|
||||||
|
0: {LoCB, HiCB},
|
||||||
|
1: {0xA0, HiCB},
|
||||||
|
2: {LoCB, 0x9F},
|
||||||
|
3: {0x90, HiCB},
|
||||||
|
4: {LoCB, 0x8F},
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user