Source File
profile.go
Belonging Package
golang.org/x/text/secure/precis
package precis
import (
)
var (
errDisallowedRune = errors.New("precis: disallowed rune encountered")
)
var dpTrie = newDerivedPropertiesTrie(0)
func ( *Profile) () *Transformer {
var []transform.Transformer
:= 1
if .options.repeat {
= 4
}
for ; > 0; -- {
if .options.foldWidth {
= append(, width.Fold)
}
for , := range .options.additional {
= append(, ())
}
if .options.cases != nil {
= append(, .options.cases)
}
= append(, .options.norm)
if .options.bidiRule {
= append(, bidirule.New())
}
= append(, &checker{p: , allowed: .Allowed()})
}
return &Transformer{transform.Chain(...)}
}
var errEmptyString = errors.New("precis: transformation resulted in empty string")
type buffers struct {
src []byte
buf [2][]byte
next int
}
func ( *buffers) ( transform.SpanningTransformer) ( error) {
, := .Span(.src, true)
if != transform.ErrEndOfSpan {
return
}
:= .next & 1
if .buf[] == nil {
.buf[] = make([]byte, 0, 8+len(.src)+len(.src)>>2)
}
:= append(.buf[][:0], .src[:]...)
.src, _, = transform.Append(, , .src[:])
.buf[] = .src
.next++
return
}
if {
for , := range .options.additional {
if = .apply(()); != nil {
return nil,
}
}
switch {
case .options.asciiLower || ( && .options.ignorecase):
for , := range .src {
if 'A' <= && <= 'Z' {
.src[] = ^ 1<<5
}
}
case .options.cases != nil:
.apply(.options.cases)
}
:= checker{p: }
if , := .span(.src, true); != nil {
return nil,
}
if .disallow != nil {
for , := range .src {
if .disallow.Contains(rune()) {
return nil, errDisallowedRune
}
}
}
if .options.disallowEmpty && len(.src) == 0 {
return nil, errEmptyString
}
return .src, nil
}
if .options.foldWidth || (.options.ignorecase && ) {
.apply(foldWidthT)
}
for , := range .options.additional {
if = .apply(()); != nil {
return nil,
}
}
if .options.cases != nil {
.apply(.options.cases)
}
if && .options.ignorecase {
.apply(lowerCaseT)
}
.apply(.norm)
if .options.bidiRule && !bidirule.Valid(.src) {
return nil, bidirule.ErrInvalid
}
:= checker{p: }
if , := .span(.src, true); != nil {
return nil,
}
if .disallow != nil {
for := 0; < len(.src); {
, := utf8.DecodeRune(.src[:])
if .disallow.Contains() {
return nil, errDisallowedRune
}
+=
}
}
if .options.disallowEmpty && len(.src) == 0 {
return nil, errEmptyString
}
}
return .src, nil
}
func ( *Profile) (, []byte) ([]byte, error) {
var buffers
, := .enforce(, , false)
if != nil {
return nil,
}
return append(, ...), nil
}
func ( *Profile, []byte, bool) ([]byte, error) {
var buffers
, := .enforce(, , )
if != nil {
return nil,
}
if .next == 0 {
:= make([]byte, len())
copy(, )
return , nil
}
return , nil
}
func ( *Profile) () runes.Set {
if .options.disallow != nil {
return runes.Predicate(func( rune) bool {
return .class.Contains() && !.options.disallow.Contains()
})
}
return .class
}
type checker struct {
p *Profile
allowed runes.Set
beforeBits catBitmap
termBits catBitmap
acceptBits catBitmap
}
func ( *checker) () {
.beforeBits = 0
.termBits = 0
.acceptBits = 0
}
func ( *checker) ( []byte, bool) ( int, error) {
for < len() {
, := dpTrie.lookup([:])
:= categoryTransitions[category(&catMask)]
if == 0 {
if ! {
return , transform.ErrShortSrc
}
return , errDisallowedRune
}
:= false
if property() < .p.class.validFrom {
if .rule == nil {
return , errDisallowedRune
}
, = .rule(.beforeBits)
if != nil {
return ,
}
}
.beforeBits &= .keep
.beforeBits |= .set
if .beforeBits&.termBits != 0 {
.termBits = 0
.acceptBits = 0
return , errContext
}
}
if {
return , errContext
}
.termBits = .term
.acceptBits = .accept
}
+=
}
if := .beforeBits >> finalShift; .beforeBits& != || .termBits != 0 {
= errContext
}
return ,
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |