summaryrefslogtreecommitdiffstats
path: root/vendor/golang.org/x/text/encoding/charmap/charmap.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/text/encoding/charmap/charmap.go')
-rw-r--r--vendor/golang.org/x/text/encoding/charmap/charmap.go84
1 files changed, 62 insertions, 22 deletions
diff --git a/vendor/golang.org/x/text/encoding/charmap/charmap.go b/vendor/golang.org/x/text/encoding/charmap/charmap.go
index 6e62a837..e89ff073 100644
--- a/vendor/golang.org/x/text/encoding/charmap/charmap.go
+++ b/vendor/golang.org/x/text/encoding/charmap/charmap.go
@@ -33,32 +33,32 @@ var (
ISO8859_8I encoding.Encoding = &iso8859_8I
iso8859_6E = internal.Encoding{
- ISO8859_6,
- "ISO-8859-6E",
- identifier.ISO88596E,
+ Encoding: ISO8859_6,
+ Name: "ISO-8859-6E",
+ MIB: identifier.ISO88596E,
}
iso8859_6I = internal.Encoding{
- ISO8859_6,
- "ISO-8859-6I",
- identifier.ISO88596I,
+ Encoding: ISO8859_6,
+ Name: "ISO-8859-6I",
+ MIB: identifier.ISO88596I,
}
iso8859_8E = internal.Encoding{
- ISO8859_8,
- "ISO-8859-8E",
- identifier.ISO88598E,
+ Encoding: ISO8859_8,
+ Name: "ISO-8859-8E",
+ MIB: identifier.ISO88598E,
}
iso8859_8I = internal.Encoding{
- ISO8859_8,
- "ISO-8859-8I",
- identifier.ISO88598I,
+ Encoding: ISO8859_8,
+ Name: "ISO-8859-8I",
+ MIB: identifier.ISO88598I,
}
)
// All is a list of all defined encodings in this package.
-var All = listAll
+var All []encoding.Encoding = listAll
// TODO: implement these encodings, in order of importance.
// ASCII, ISO8859_1: Rather common. Close to Windows 1252.
@@ -70,8 +70,8 @@ type utf8Enc struct {
data [3]byte
}
-// charmap describes an 8-bit character set encoding.
-type charmap struct {
+// Charmap is an 8-bit character set encoding.
+type Charmap struct {
// name is the encoding's name.
name string
// mib is the encoding type of this encoder.
@@ -79,7 +79,7 @@ type charmap struct {
// asciiSuperset states whether the encoding is a superset of ASCII.
asciiSuperset bool
// low is the lower bound of the encoded byte for a non-ASCII rune. If
- // charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00.
+ // Charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00.
low uint8
// replacement is the encoded replacement character.
replacement byte
@@ -91,26 +91,30 @@ type charmap struct {
encode [256]uint32
}
-func (m *charmap) NewDecoder() *encoding.Decoder {
+// NewDecoder implements the encoding.Encoding interface.
+func (m *Charmap) NewDecoder() *encoding.Decoder {
return &encoding.Decoder{Transformer: charmapDecoder{charmap: m}}
}
-func (m *charmap) NewEncoder() *encoding.Encoder {
+// NewEncoder implements the encoding.Encoding interface.
+func (m *Charmap) NewEncoder() *encoding.Encoder {
return &encoding.Encoder{Transformer: charmapEncoder{charmap: m}}
}
-func (m *charmap) String() string {
+// String returns the Charmap's name.
+func (m *Charmap) String() string {
return m.name
}
-func (m *charmap) ID() (mib identifier.MIB, other string) {
+// ID implements an internal interface.
+func (m *Charmap) ID() (mib identifier.MIB, other string) {
return m.mib, ""
}
// charmapDecoder implements transform.Transformer by decoding to UTF-8.
type charmapDecoder struct {
transform.NopResetter
- charmap *charmap
+ charmap *Charmap
}
func (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
@@ -142,10 +146,22 @@ func (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int,
return nDst, nSrc, err
}
+// DecodeByte returns the Charmap's rune decoding of the byte b.
+func (m *Charmap) DecodeByte(b byte) rune {
+ switch x := &m.decode[b]; x.len {
+ case 1:
+ return rune(x.data[0])
+ case 2:
+ return rune(x.data[0]&0x1f)<<6 | rune(x.data[1]&0x3f)
+ default:
+ return rune(x.data[0]&0x0f)<<12 | rune(x.data[1]&0x3f)<<6 | rune(x.data[2]&0x3f)
+ }
+}
+
// charmapEncoder implements transform.Transformer by encoding from UTF-8.
type charmapEncoder struct {
transform.NopResetter
- charmap *charmap
+ charmap *Charmap
}
func (m charmapEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
@@ -207,3 +223,27 @@ loop:
}
return nDst, nSrc, err
}
+
+// EncodeRune returns the Charmap's byte encoding of the rune r. ok is whether
+// r is in the Charmap's repertoire. If not, b is set to the Charmap's
+// replacement byte. This is often the ASCII substitute character '\x1a'.
+func (m *Charmap) EncodeRune(r rune) (b byte, ok bool) {
+ if r < utf8.RuneSelf && m.asciiSuperset {
+ return byte(r), true
+ }
+ for low, high := int(m.low), 0x100; ; {
+ if low >= high {
+ return m.replacement, false
+ }
+ mid := (low + high) / 2
+ got := m.encode[mid]
+ gotRune := rune(got & (1<<24 - 1))
+ if gotRune < r {
+ low = mid + 1
+ } else if gotRune > r {
+ high = mid
+ } else {
+ return byte(got >> 24), true
+ }
+ }
+}