aboutsummaryrefslogtreecommitdiff
path: root/vendor/golang.org/x/text
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/text')
-rw-r--r--vendor/golang.org/x/text/AUTHORS3
-rw-r--r--vendor/golang.org/x/text/CONTRIBUTORS3
-rw-r--r--vendor/golang.org/x/text/LICENSE27
-rw-r--r--vendor/golang.org/x/text/PATENTS22
-rw-r--r--vendor/golang.org/x/text/secure/bidirule/bidirule.go336
-rw-r--r--vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go11
-rw-r--r--vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go14
-rw-r--r--vendor/golang.org/x/text/transform/transform.go705
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/bidi.go198
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/bracket.go335
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/core.go1058
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/prop.go206
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go1815
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go1781
-rw-r--r--vendor/golang.org/x/text/unicode/bidi/trieval.go60
-rw-r--r--vendor/golang.org/x/text/unicode/norm/composition.go508
-rw-r--r--vendor/golang.org/x/text/unicode/norm/forminfo.go259
-rw-r--r--vendor/golang.org/x/text/unicode/norm/input.go109
-rw-r--r--vendor/golang.org/x/text/unicode/norm/iter.go457
-rw-r--r--vendor/golang.org/x/text/unicode/norm/normalize.go609
-rw-r--r--vendor/golang.org/x/text/unicode/norm/readwriter.go125
-rw-r--r--vendor/golang.org/x/text/unicode/norm/tables10.0.0.go7653
-rw-r--r--vendor/golang.org/x/text/unicode/norm/tables9.0.0.go7633
-rw-r--r--vendor/golang.org/x/text/unicode/norm/transform.go88
-rw-r--r--vendor/golang.org/x/text/unicode/norm/trie.go54
-rw-r--r--vendor/golang.org/x/text/width/kind_string.go16
-rw-r--r--vendor/golang.org/x/text/width/tables10.0.0.go1318
-rw-r--r--vendor/golang.org/x/text/width/tables9.0.0.go1286
-rw-r--r--vendor/golang.org/x/text/width/transform.go239
-rw-r--r--vendor/golang.org/x/text/width/trieval.go30
-rw-r--r--vendor/golang.org/x/text/width/width.go206
31 files changed, 0 insertions, 27164 deletions
diff --git a/vendor/golang.org/x/text/AUTHORS b/vendor/golang.org/x/text/AUTHORS
deleted file mode 100644
index 15167cd..0000000
--- a/vendor/golang.org/x/text/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code refers to The Go Authors for copyright purposes.
-# The master list of authors is in the main Go distribution,
-# visible at http://tip.golang.org/AUTHORS.
diff --git a/vendor/golang.org/x/text/CONTRIBUTORS b/vendor/golang.org/x/text/CONTRIBUTORS
deleted file mode 100644
index 1c4577e..0000000
--- a/vendor/golang.org/x/text/CONTRIBUTORS
+++ /dev/null
@@ -1,3 +0,0 @@
-# This source code was written by the Go contributors.
-# The master list of contributors is in the main Go distribution,
-# visible at http://tip.golang.org/CONTRIBUTORS.
diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/golang.org/x/text/LICENSE
deleted file mode 100644
index 6a66aea..0000000
--- a/vendor/golang.org/x/text/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/golang.org/x/text/PATENTS b/vendor/golang.org/x/text/PATENTS
deleted file mode 100644
index 7330990..0000000
--- a/vendor/golang.org/x/text/PATENTS
+++ /dev/null
@@ -1,22 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the Go project.
-
-Google hereby grants to You a perpetual, worldwide, non-exclusive,
-no-charge, royalty-free, irrevocable (except as stated in this section)
-patent license to make, have made, use, offer to sell, sell, import,
-transfer and otherwise run, modify and propagate the contents of this
-implementation of Go, where such license applies only to those patent
-claims, both currently owned or controlled by Google and acquired in
-the future, licensable by Google that are necessarily infringed by this
-implementation of Go. This grant does not include claims that would be
-infringed only as a consequence of further modification of this
-implementation. If you or your agent or exclusive licensee institute or
-order or agree to the institution of patent litigation against any
-entity (including a cross-claim or counterclaim in a lawsuit) alleging
-that this implementation of Go or any code incorporated within this
-implementation of Go constitutes direct or contributory patent
-infringement, or inducement of patent infringement, then any patent
-rights granted to you under this License for this implementation of Go
-shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule.go b/vendor/golang.org/x/text/secure/bidirule/bidirule.go
deleted file mode 100644
index e2b70f7..0000000
--- a/vendor/golang.org/x/text/secure/bidirule/bidirule.go
+++ /dev/null
@@ -1,336 +0,0 @@
-// Copyright 2016 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 bidirule implements the Bidi Rule defined by RFC 5893.
-//
-// This package is under development. The API may change without notice and
-// without preserving backward compatibility.
-package bidirule
-
-import (
- "errors"
- "unicode/utf8"
-
- "golang.org/x/text/transform"
- "golang.org/x/text/unicode/bidi"
-)
-
-// This file contains an implementation of RFC 5893: Right-to-Left Scripts for
-// Internationalized Domain Names for Applications (IDNA)
-//
-// A label is an individual component of a domain name. Labels are usually
-// shown separated by dots; for example, the domain name "www.example.com" is
-// composed of three labels: "www", "example", and "com".
-//
-// An RTL label is a label that contains at least one character of class R, AL,
-// or AN. An LTR label is any label that is not an RTL label.
-//
-// A "Bidi domain name" is a domain name that contains at least one RTL label.
-//
-// The following guarantees can be made based on the above:
-//
-// o In a domain name consisting of only labels that satisfy the rule,
-// the requirements of Section 3 are satisfied. Note that even LTR
-// labels and pure ASCII labels have to be tested.
-//
-// o In a domain name consisting of only LDH labels (as defined in the
-// Definitions document [RFC5890]) and labels that satisfy the rule,
-// the requirements of Section 3 are satisfied as long as a label
-// that starts with an ASCII digit does not come after a
-// right-to-left label.
-//
-// No guarantee is given for other combinations.
-
-// ErrInvalid indicates a label is invalid according to the Bidi Rule.
-var ErrInvalid = errors.New("bidirule: failed Bidi Rule")
-
-type ruleState uint8
-
-const (
- ruleInitial ruleState = iota
- ruleLTR
- ruleLTRFinal
- ruleRTL
- ruleRTLFinal
- ruleInvalid
-)
-
-type ruleTransition struct {
- next ruleState
- mask uint16
-}
-
-var transitions = [...][2]ruleTransition{
- // [2.1] The first character must be a character with Bidi property L, R, or
- // AL. If it has the R or AL property, it is an RTL label; if it has the L
- // property, it is an LTR label.
- ruleInitial: {
- {ruleLTRFinal, 1 << bidi.L},
- {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL},
- },
- ruleRTL: {
- // [2.3] In an RTL label, the end of the label must be a character with
- // Bidi property R, AL, EN, or AN, followed by zero or more characters
- // with Bidi property NSM.
- {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN},
-
- // [2.2] In an RTL label, only characters with the Bidi properties R,
- // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
- // We exclude the entries from [2.3]
- {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
- },
- ruleRTLFinal: {
- // [2.3] In an RTL label, the end of the label must be a character with
- // Bidi property R, AL, EN, or AN, followed by zero or more characters
- // with Bidi property NSM.
- {ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM},
-
- // [2.2] In an RTL label, only characters with the Bidi properties R,
- // AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.
- // We exclude the entries from [2.3] and NSM.
- {ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
- },
- ruleLTR: {
- // [2.6] In an LTR label, the end of the label must be a character with
- // Bidi property L or EN, followed by zero or more characters with Bidi
- // property NSM.
- {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN},
-
- // [2.5] In an LTR label, only characters with the Bidi properties L,
- // EN, ES, CS, ET, ON, BN, or NSM are allowed.
- // We exclude the entries from [2.6].
- {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},
- },
- ruleLTRFinal: {
- // [2.6] In an LTR label, the end of the label must be a character with
- // Bidi property L or EN, followed by zero or more characters with Bidi
- // property NSM.
- {ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM},
-
- // [2.5] In an LTR label, only characters with the Bidi properties L,
- // EN, ES, CS, ET, ON, BN, or NSM are allowed.
- // We exclude the entries from [2.6].
- {ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},
- },
- ruleInvalid: {
- {ruleInvalid, 0},
- {ruleInvalid, 0},
- },
-}
-
-// [2.4] In an RTL label, if an EN is present, no AN may be present, and
-// vice versa.
-const exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN)
-
-// From RFC 5893
-// An RTL label is a label that contains at least one character of type
-// R, AL, or AN.
-//
-// An LTR label is any label that is not an RTL label.
-
-// Direction reports the direction of the given label as defined by RFC 5893.
-// The Bidi Rule does not have to be applied to labels of the category
-// LeftToRight.
-func Direction(b []byte) bidi.Direction {
- for i := 0; i < len(b); {
- e, sz := bidi.Lookup(b[i:])
- if sz == 0 {
- i++
- }
- c := e.Class()
- if c == bidi.R || c == bidi.AL || c == bidi.AN {
- return bidi.RightToLeft
- }
- i += sz
- }
- return bidi.LeftToRight
-}
-
-// DirectionString reports the direction of the given label as defined by RFC
-// 5893. The Bidi Rule does not have to be applied to labels of the category
-// LeftToRight.
-func DirectionString(s string) bidi.Direction {
- for i := 0; i < len(s); {
- e, sz := bidi.LookupString(s[i:])
- if sz == 0 {
- i++
- continue
- }
- c := e.Class()
- if c == bidi.R || c == bidi.AL || c == bidi.AN {
- return bidi.RightToLeft
- }
- i += sz
- }
- return bidi.LeftToRight
-}
-
-// Valid reports whether b conforms to the BiDi rule.
-func Valid(b []byte) bool {
- var t Transformer
- if n, ok := t.advance(b); !ok || n < len(b) {
- return false
- }
- return t.isFinal()
-}
-
-// ValidString reports whether s conforms to the BiDi rule.
-func ValidString(s string) bool {
- var t Transformer
- if n, ok := t.advanceString(s); !ok || n < len(s) {
- return false
- }
- return t.isFinal()
-}
-
-// New returns a Transformer that verifies that input adheres to the Bidi Rule.
-func New() *Transformer {
- return &Transformer{}
-}
-
-// Transformer implements transform.Transform.
-type Transformer struct {
- state ruleState
- hasRTL bool
- seen uint16
-}
-
-// A rule can only be violated for "Bidi Domain names", meaning if one of the
-// following categories has been observed.
-func (t *Transformer) isRTL() bool {
- const isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN
- return t.seen&isRTL != 0
-}
-
-// Reset implements transform.Transformer.
-func (t *Transformer) Reset() { *t = Transformer{} }
-
-// Transform implements transform.Transformer. This Transformer has state and
-// needs to be reset between uses.
-func (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- if len(dst) < len(src) {
- src = src[:len(dst)]
- atEOF = false
- err = transform.ErrShortDst
- }
- n, err1 := t.Span(src, atEOF)
- copy(dst, src[:n])
- if err == nil || err1 != nil && err1 != transform.ErrShortSrc {
- err = err1
- }
- return n, n, err
-}
-
-// Span returns the first n bytes of src that conform to the Bidi rule.
-func (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) {
- if t.state == ruleInvalid && t.isRTL() {
- return 0, ErrInvalid
- }
- n, ok := t.advance(src)
- switch {
- case !ok:
- err = ErrInvalid
- case n < len(src):
- if !atEOF {
- err = transform.ErrShortSrc
- break
- }
- err = ErrInvalid
- case !t.isFinal():
- err = ErrInvalid
- }
- return n, err
-}
-
-// Precomputing the ASCII values decreases running time for the ASCII fast path
-// by about 30%.
-var asciiTable [128]bidi.Properties
-
-func init() {
- for i := range asciiTable {
- p, _ := bidi.LookupRune(rune(i))
- asciiTable[i] = p
- }
-}
-
-func (t *Transformer) advance(s []byte) (n int, ok bool) {
- var e bidi.Properties
- var sz int
- for n < len(s) {
- if s[n] < utf8.RuneSelf {
- e, sz = asciiTable[s[n]], 1
- } else {
- e, sz = bidi.Lookup(s[n:])
- if sz <= 1 {
- if sz == 1 {
- // We always consider invalid UTF-8 to be invalid, even if
- // the string has not yet been determined to be RTL.
- // TODO: is this correct?
- return n, false
- }
- return n, true // incomplete UTF-8 encoding
- }
- }
- // TODO: using CompactClass would result in noticeable speedup.
- // See unicode/bidi/prop.go:Properties.CompactClass.
- c := uint16(1 << e.Class())
- t.seen |= c
- if t.seen&exclusiveRTL == exclusiveRTL {
- t.state = ruleInvalid
- return n, false
- }
- switch tr := transitions[t.state]; {
- case tr[0].mask&c != 0:
- t.state = tr[0].next
- case tr[1].mask&c != 0:
- t.state = tr[1].next
- default:
- t.state = ruleInvalid
- if t.isRTL() {
- return n, false
- }
- }
- n += sz
- }
- return n, true
-}
-
-func (t *Transformer) advanceString(s string) (n int, ok bool) {
- var e bidi.Properties
- var sz int
- for n < len(s) {
- if s[n] < utf8.RuneSelf {
- e, sz = asciiTable[s[n]], 1
- } else {
- e, sz = bidi.LookupString(s[n:])
- if sz <= 1 {
- if sz == 1 {
- return n, false // invalid UTF-8
- }
- return n, true // incomplete UTF-8 encoding
- }
- }
- // TODO: using CompactClass results in noticeable speedup.
- // See unicode/bidi/prop.go:Properties.CompactClass.
- c := uint16(1 << e.Class())
- t.seen |= c
- if t.seen&exclusiveRTL == exclusiveRTL {
- t.state = ruleInvalid
- return n, false
- }
- switch tr := transitions[t.state]; {
- case tr[0].mask&c != 0:
- t.state = tr[0].next
- case tr[1].mask&c != 0:
- t.state = tr[1].next
- default:
- t.state = ruleInvalid
- if t.isRTL() {
- return n, false
- }
- }
- n += sz
- }
- return n, true
-}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
deleted file mode 100644
index e4c6228..0000000
--- a/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 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 go1.10
-
-package bidirule
-
-func (t *Transformer) isFinal() bool {
- return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
-}
diff --git a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go b/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
deleted file mode 100644
index 02b9e1e..0000000
--- a/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 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 !go1.10
-
-package bidirule
-
-func (t *Transformer) isFinal() bool {
- if !t.isRTL() {
- return true
- }
- return t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial
-}
diff --git a/vendor/golang.org/x/text/transform/transform.go b/vendor/golang.org/x/text/transform/transform.go
deleted file mode 100644
index fe47b9b..0000000
--- a/vendor/golang.org/x/text/transform/transform.go
+++ /dev/null
@@ -1,705 +0,0 @@
-// 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 transform provides reader and writer wrappers that transform the
-// bytes passing through as well as various transformations. Example
-// transformations provided by other packages include normalization and
-// conversion between character sets.
-package transform // import "golang.org/x/text/transform"
-
-import (
- "bytes"
- "errors"
- "io"
- "unicode/utf8"
-)
-
-var (
- // ErrShortDst means that the destination buffer was too short to
- // receive all of the transformed bytes.
- ErrShortDst = errors.New("transform: short destination buffer")
-
- // ErrShortSrc means that the source buffer has insufficient data to
- // complete the transformation.
- ErrShortSrc = errors.New("transform: short source buffer")
-
- // ErrEndOfSpan means that the input and output (the transformed input)
- // are not identical.
- ErrEndOfSpan = errors.New("transform: input and output are not identical")
-
- // errInconsistentByteCount means that Transform returned success (nil
- // error) but also returned nSrc inconsistent with the src argument.
- errInconsistentByteCount = errors.New("transform: inconsistent byte count returned")
-
- // errShortInternal means that an internal buffer is not large enough
- // to make progress and the Transform operation must be aborted.
- errShortInternal = errors.New("transform: short internal buffer")
-)
-
-// Transformer transforms bytes.
-type Transformer interface {
- // Transform writes to dst the transformed bytes read from src, and
- // returns the number of dst bytes written and src bytes read. The
- // atEOF argument tells whether src represents the last bytes of the
- // input.
- //
- // Callers should always process the nDst bytes produced and account
- // for the nSrc bytes consumed before considering the error err.
- //
- // A nil error means that all of the transformed bytes (whether freshly
- // transformed from src or left over from previous Transform calls)
- // were written to dst. A nil error can be returned regardless of
- // whether atEOF is true. If err is nil then nSrc must equal len(src);
- // the converse is not necessarily true.
- //
- // ErrShortDst means that dst was too short to receive all of the
- // transformed bytes. ErrShortSrc means that src had insufficient data
- // to complete the transformation. If both conditions apply, then
- // either error may be returned. Other than the error conditions listed
- // here, implementations are free to report other errors that arise.
- Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)
-
- // Reset resets the state and allows a Transformer to be reused.
- Reset()
-}
-
-// SpanningTransformer extends the Transformer interface with a Span method
-// that determines how much of the input already conforms to the Transformer.
-type SpanningTransformer interface {
- Transformer
-
- // Span returns a position in src such that transforming src[:n] results in
- // identical output src[:n] for these bytes. It does not necessarily return
- // the largest such n. The atEOF argument tells whether src represents the
- // last bytes of the input.
- //
- // Callers should always account for the n bytes consumed before
- // considering the error err.
- //
- // A nil error means that all input bytes are known to be identical to the
- // output produced by the Transformer. A nil error can be be returned
- // regardless of whether atEOF is true. If err is nil, then then n must
- // equal len(src); the converse is not necessarily true.
- //
- // ErrEndOfSpan means that the Transformer output may differ from the
- // input after n bytes. Note that n may be len(src), meaning that the output
- // would contain additional bytes after otherwise identical output.
- // ErrShortSrc means that src had insufficient data to determine whether the
- // remaining bytes would change. Other than the error conditions listed
- // here, implementations are free to report other errors that arise.
- //
- // Calling Span can modify the Transformer state as a side effect. In
- // effect, it does the transformation just as calling Transform would, only
- // without copying to a destination buffer and only up to a point it can
- // determine the input and output bytes are the same. This is obviously more
- // limited than calling Transform, but can be more efficient in terms of
- // copying and allocating buffers. Calls to Span and Transform may be
- // interleaved.
- Span(src []byte, atEOF bool) (n int, err error)
-}
-
-// NopResetter can be embedded by implementations of Transformer to add a nop
-// Reset method.
-type NopResetter struct{}
-
-// Reset implements the Reset method of the Transformer interface.
-func (NopResetter) Reset() {}
-
-// Reader wraps another io.Reader by transforming the bytes read.
-type Reader struct {
- r io.Reader
- t Transformer
- err error
-
- // dst[dst0:dst1] contains bytes that have been transformed by t but
- // not yet copied out via Read.
- dst []byte
- dst0, dst1 int
-
- // src[src0:src1] contains bytes that have been read from r but not
- // yet transformed through t.
- src []byte
- src0, src1 int
-
- // transformComplete is whether the transformation is complete,
- // regardless of whether or not it was successful.
- transformComplete bool
-}
-
-const defaultBufSize = 4096
-
-// NewReader returns a new Reader that wraps r by transforming the bytes read
-// via t. It calls Reset on t.
-func NewReader(r io.Reader, t Transformer) *Reader {
- t.Reset()
- return &Reader{
- r: r,
- t: t,
- dst: make([]byte, defaultBufSize),
- src: make([]byte, defaultBufSize),
- }
-}
-
-// Read implements the io.Reader interface.
-func (r *Reader) Read(p []byte) (int, error) {
- n, err := 0, error(nil)
- for {
- // Copy out any transformed bytes and return the final error if we are done.
- if r.dst0 != r.dst1 {
- n = copy(p, r.dst[r.dst0:r.dst1])
- r.dst0 += n
- if r.dst0 == r.dst1 && r.transformComplete {
- return n, r.err
- }
- return n, nil
- } else if r.transformComplete {
- return 0, r.err
- }
-
- // Try to transform some source bytes, or to flush the transformer if we
- // are out of source bytes. We do this even if r.r.Read returned an error.
- // As the io.Reader documentation says, "process the n > 0 bytes returned
- // before considering the error".
- if r.src0 != r.src1 || r.err != nil {
- r.dst0 = 0
- r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF)
- r.src0 += n
-
- switch {
- case err == nil:
- if r.src0 != r.src1 {
- r.err = errInconsistentByteCount
- }
- // The Transform call was successful; we are complete if we
- // cannot read more bytes into src.
- r.transformComplete = r.err != nil
- continue
- case err == ErrShortDst && (r.dst1 != 0 || n != 0):
- // Make room in dst by copying out, and try again.
- continue
- case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil:
- // Read more bytes into src via the code below, and try again.
- default:
- r.transformComplete = true
- // The reader error (r.err) takes precedence over the
- // transformer error (err) unless r.err is nil or io.EOF.
- if r.err == nil || r.err == io.EOF {
- r.err = err
- }
- continue
- }
- }
-
- // Move any untransformed source bytes to the start of the buffer
- // and read more bytes.
- if r.src0 != 0 {
- r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1])
- }
- n, r.err = r.r.Read(r.src[r.src1:])
- r.src1 += n
- }
-}
-
-// TODO: implement ReadByte (and ReadRune??).
-
-// Writer wraps another io.Writer by transforming the bytes read.
-// The user needs to call Close to flush unwritten bytes that may
-// be buffered.
-type Writer struct {
- w io.Writer
- t Transformer
- dst []byte
-
- // src[:n] contains bytes that have not yet passed through t.
- src []byte
- n int
-}
-
-// NewWriter returns a new Writer that wraps w by transforming the bytes written
-// via t. It calls Reset on t.
-func NewWriter(w io.Writer, t Transformer) *Writer {
- t.Reset()
- return &Writer{
- w: w,
- t: t,
- dst: make([]byte, defaultBufSize),
- src: make([]byte, defaultBufSize),
- }
-}
-
-// Write implements the io.Writer interface. If there are not enough
-// bytes available to complete a Transform, the bytes will be buffered
-// for the next write. Call Close to convert the remaining bytes.
-func (w *Writer) Write(data []byte) (n int, err error) {
- src := data
- if w.n > 0 {
- // Append bytes from data to the last remainder.
- // TODO: limit the amount copied on first try.
- n = copy(w.src[w.n:], data)
- w.n += n
- src = w.src[:w.n]
- }
- for {
- nDst, nSrc, err := w.t.Transform(w.dst, src, false)
- if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
- return n, werr
- }
- src = src[nSrc:]
- if w.n == 0 {
- n += nSrc
- } else if len(src) <= n {
- // Enough bytes from w.src have been consumed. We make src point
- // to data instead to reduce the copying.
- w.n = 0
- n -= len(src)
- src = data[n:]
- if n < len(data) && (err == nil || err == ErrShortSrc) {
- continue
- }
- }
- switch err {
- case ErrShortDst:
- // This error is okay as long as we are making progress.
- if nDst > 0 || nSrc > 0 {
- continue
- }
- case ErrShortSrc:
- if len(src) < len(w.src) {
- m := copy(w.src, src)
- // If w.n > 0, bytes from data were already copied to w.src and n
- // was already set to the number of bytes consumed.
- if w.n == 0 {
- n += m
- }
- w.n = m
- err = nil
- } else if nDst > 0 || nSrc > 0 {
- // Not enough buffer to store the remainder. Keep processing as
- // long as there is progress. Without this case, transforms that
- // require a lookahead larger than the buffer may result in an
- // error. This is not something one may expect to be common in
- // practice, but it may occur when buffers are set to small
- // sizes during testing.
- continue
- }
- case nil:
- if w.n > 0 {
- err = errInconsistentByteCount
- }
- }
- return n, err
- }
-}
-
-// Close implements the io.Closer interface.
-func (w *Writer) Close() error {
- src := w.src[:w.n]
- for {
- nDst, nSrc, err := w.t.Transform(w.dst, src, true)
- if _, werr := w.w.Write(w.dst[:nDst]); werr != nil {
- return werr
- }
- if err != ErrShortDst {
- return err
- }
- src = src[nSrc:]
- }
-}
-
-type nop struct{ NopResetter }
-
-func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- n := copy(dst, src)
- if n < len(src) {
- err = ErrShortDst
- }
- return n, n, err
-}
-
-func (nop) Span(src []byte, atEOF bool) (n int, err error) {
- return len(src), nil
-}
-
-type discard struct{ NopResetter }
-
-func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
- return 0, len(src), nil
-}
-
-var (
- // Discard is a Transformer for which all Transform calls succeed
- // by consuming all bytes and writing nothing.
- Discard Transformer = discard{}
-
- // Nop is a SpanningTransformer that copies src to dst.
- Nop SpanningTransformer = nop{}
-)
-
-// chain is a sequence of links. A chain with N Transformers has N+1 links and
-// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst
-// buffers given to chain.Transform and the middle N-1 buffers are intermediate
-// buffers owned by the chain. The i'th link transforms bytes from the i'th
-// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer
-// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N).
-type chain struct {
- link []link
- err error
- // errStart is the index at which the error occurred plus 1. Processing
- // errStart at this level at the next call to Transform. As long as
- // errStart > 0, chain will not consume any more source bytes.
- errStart int
-}
-
-func (c *chain) fatalError(errIndex int, err error) {
- if i := errIndex + 1; i > c.errStart {
- c.errStart = i
- c.err = err
- }
-}
-