package cases
import "golang.org/x/text/transform"
type context struct {
dst, src []byte
atEOF bool
pDst int
pSrc int
nDst, nSrc int
err error
sz int
info info
isMidWord bool
}
func (c *context ) Reset () {
c .isMidWord = false
}
func (c *context ) ret () (nDst , nSrc int , err error ) {
if c .err != nil || c .nSrc == len (c .src ) {
return c .nDst , c .nSrc , c .err
}
if c .atEOF && c .pSrc == len (c .src ) {
return c .pDst , c .pSrc , nil
}
return c .nDst , c .nSrc , transform .ErrShortSrc
}
func (c *context ) retSpan () (n int , err error ) {
_ , nSrc , err := c .ret ()
return nSrc , err
}
func (c *context ) checkpoint () {
if c .err == nil {
c .nDst , c .nSrc = c .pDst , c .pSrc +c .sz
}
}
func (c *context ) unreadRune () {
c .sz = 0
}
func (c *context ) next () bool {
c .pSrc += c .sz
if c .pSrc == len (c .src ) || c .err != nil {
c .info , c .sz = 0 , 0
return false
}
v , sz := trie .lookup (c .src [c .pSrc :])
c .info , c .sz = info (v ), sz
if c .sz == 0 {
if c .atEOF {
c .sz = 1
} else {
c .err = transform .ErrShortSrc
return false
}
}
return true
}
func (c *context ) writeBytes (b []byte ) bool {
if len (c .dst )-c .pDst < len (b ) {
c .err = transform .ErrShortDst
return false
}
for _ , ch := range b {
c .dst [c .pDst ] = ch
c .pDst ++
}
return true
}
func (c *context ) writeString (s string ) bool {
if len (c .dst )-c .pDst < len (s ) {
c .err = transform .ErrShortDst
return false
}
for i := 0 ; i < len (s ); i ++ {
c .dst [c .pDst ] = s [i ]
c .pDst ++
}
return true
}
func (c *context ) copy () bool {
return c .writeBytes (c .src [c .pSrc : c .pSrc +c .sz ])
}
func (c *context ) copyXOR () bool {
if !c .copy () {
return false
}
if c .info &xorIndexBit == 0 {
c .dst [c .pDst -1 ] ^= byte (c .info >> xorShift )
} else {
idx := c .info >> xorShift
for p := c .pDst - 1 ; ; p -- {
c .dst [p ] ^= xorData [idx ]
idx --
if xorData [idx ] == 0 {
break
}
}
}
return true
}
func (c *context ) hasPrefix (s string ) bool {
b := c .src [c .pSrc :]
if len (b ) < len (s ) {
return false
}
for i , c := range b [:len (s )] {
if c != s [i ] {
return false
}
}
return true
}
func (c *context ) caseType () info {
cm := c .info & 0x7
if cm < 4 {
return cm
}
if cm >= cXORCase {
b := c .src [c .pSrc +c .sz -1 ]
return info (b &1 ) ^ cm &0x3
}
if cm == cIgnorableCased {
return cLower
}
return cUncased
}
func lower(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cLower {
return c .copy ()
}
if c .info &exceptionBit == 0 {
return c .copyXOR ()
}
e := exceptions [c .info >>exceptionShift :]
offset := 2 + e [0 ]&lengthMask
if nLower := (e [1 ] >> lengthBits ) & lengthMask ; nLower != noChange {
return c .writeString (e [offset : offset +nLower ])
}
return c .copy ()
}
func isLower(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cLower {
return true
}
if c .info &exceptionBit == 0 {
c .err = transform .ErrEndOfSpan
return false
}
e := exceptions [c .info >>exceptionShift :]
if nLower := (e [1 ] >> lengthBits ) & lengthMask ; nLower != noChange {
c .err = transform .ErrEndOfSpan
return false
}
return true
}
func upper(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cUpper {
return c .copy ()
}
if c .info &exceptionBit == 0 {
return c .copyXOR ()
}
e := exceptions [c .info >>exceptionShift :]
offset := 2 + e [0 ]&lengthMask
n := (e [1 ] >> lengthBits ) & lengthMask
if ct == cTitle {
if n == noChange {
n = 0
}
n , e = e [1 ]&lengthMask , e [n :]
}
if n != noChange {
return c .writeString (e [offset : offset +n ])
}
return c .copy ()
}
func isUpper(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cUpper {
return true
}
if c .info &exceptionBit == 0 {
c .err = transform .ErrEndOfSpan
return false
}
e := exceptions [c .info >>exceptionShift :]
n := (e [1 ] >> lengthBits ) & lengthMask
if ct == cTitle {
n = e [1 ] & lengthMask
}
if n != noChange {
c .err = transform .ErrEndOfSpan
return false
}
return true
}
func title(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cTitle {
return c .copy ()
}
if c .info &exceptionBit == 0 {
if ct == cLower {
return c .copyXOR ()
}
return c .copy ()
}
e := exceptions [c .info >>exceptionShift :]
offset := 2 + e [0 ]&lengthMask
nFirst := (e [1 ] >> lengthBits ) & lengthMask
if nTitle := e [1 ] & lengthMask ; nTitle != noChange {
if nFirst != noChange {
e = e [nFirst :]
}
return c .writeString (e [offset : offset +nTitle ])
}
if ct == cLower && nFirst != noChange {
return c .writeString (e [offset : offset +nFirst ])
}
return c .copy ()
}
func isTitle(c *context ) bool {
ct := c .caseType ()
if c .info &hasMappingMask == 0 || ct == cTitle {
return true
}
if c .info &exceptionBit == 0 {
if ct == cLower {
c .err = transform .ErrEndOfSpan
return false
}
return true
}
e := exceptions [c .info >>exceptionShift :]
if nTitle := e [1 ] & lengthMask ; nTitle != noChange {
c .err = transform .ErrEndOfSpan
return false
}
nFirst := (e [1 ] >> lengthBits ) & lengthMask
if ct == cLower && nFirst != noChange {
c .err = transform .ErrEndOfSpan
return false
}
return true
}
func foldFull(c *context ) bool {
if c .info &hasMappingMask == 0 {
return c .copy ()
}
ct := c .caseType ()
if c .info &exceptionBit == 0 {
if ct != cLower || c .info &inverseFoldBit != 0 {
return c .copyXOR ()
}
return c .copy ()
}
e := exceptions [c .info >>exceptionShift :]
n := e [0 ] & lengthMask
if n == 0 {
if ct == cLower {
return c .copy ()
}
n = (e [1 ] >> lengthBits ) & lengthMask
}
return c .writeString (e [2 : 2 +n ])
}
func isFoldFull(c *context ) bool {
if c .info &hasMappingMask == 0 {
return true
}
ct := c .caseType ()
if c .info &exceptionBit == 0 {
if ct != cLower || c .info &inverseFoldBit != 0 {
c .err = transform .ErrEndOfSpan
return false
}
return true
}
e := exceptions [c .info >>exceptionShift :]
n := e [0 ] & lengthMask
if n == 0 && ct == cLower {
return true
}
c .err = transform .ErrEndOfSpan
return false
}
The pages are generated with Golds v0.6.7 . (GOOS=linux 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 .