package width
import (
)
type foldTransform struct {
transform.NopResetter
}
func (foldTransform) ( []byte, bool) ( int, error) {
for < len() {
if [] < utf8.RuneSelf {
for ++; < len() && [] < utf8.RuneSelf; ++ {
}
continue
}
, := trie.lookup([:])
if == 0 {
if ! {
= transform.ErrShortSrc
} else {
= len()
}
break
}
if elem()&tagNeedsFold != 0 {
= transform.ErrEndOfSpan
break
}
+=
}
return ,
}
func (foldTransform) (, []byte, bool) (, int, error) {
for < len() {
if [] < utf8.RuneSelf {
, := , len()
if := len() - ; < - {
= +
}
for ++; < && [] < utf8.RuneSelf; ++ {
}
:= copy([:], [:])
if += ; == len() {
= +
if == len() {
return , , nil
}
if [] < utf8.RuneSelf {
return , , transform.ErrShortDst
}
}
continue
}
, := trie.lookup([:])
if == 0 {
if ! {
return , , transform.ErrShortSrc
}
= 1
}
if elem()&tagNeedsFold == 0 {
if != copy([:], [:+]) {
return , , transform.ErrShortDst
}
+=
} else {
:= inverseData[byte()]
if len()- < int([0]) {
return , , transform.ErrShortDst
}
:= 1
for := int([0]); < ; ++ {
[] = []
++
}
[] = [] ^ [+-1]
++
}
+=
}
return , , nil
}
type narrowTransform struct {
transform.NopResetter
}
func (narrowTransform) ( []byte, bool) ( int, error) {
for < len() {
if [] < utf8.RuneSelf {
for ++; < len() && [] < utf8.RuneSelf; ++ {
}
continue
}
, := trie.lookup([:])
if == 0 {
if ! {
= transform.ErrShortSrc
} else {
= len()
}
break
}
if := elem().kind(); byte() == 0 || != EastAsianFullwidth && != EastAsianWide && != EastAsianAmbiguous {
} else {
= transform.ErrEndOfSpan
break
}
+=
}
return ,
}
func (narrowTransform) (, []byte, bool) (, int, error) {
for < len() {
if [] < utf8.RuneSelf {
, := , len()
if := len() - ; < - {
= +
}
for ++; < && [] < utf8.RuneSelf; ++ {
}
:= copy([:], [:])
if += ; == len() {
= +
if == len() {
return , , nil
}
if [] < utf8.RuneSelf {
return , , transform.ErrShortDst
}
}
continue
}
, := trie.lookup([:])
if == 0 {
if ! {
return , , transform.ErrShortSrc
}
= 1
}
if := elem().kind(); byte() == 0 || != EastAsianFullwidth && != EastAsianWide && != EastAsianAmbiguous {
if != copy([:], [:+]) {
return , , transform.ErrShortDst
}
+=
} else {
:= inverseData[byte()]
if len()- < int([0]) {
return , , transform.ErrShortDst
}
:= 1
for := int([0]); < ; ++ {
[] = []
++
}
[] = [] ^ [+-1]
++
}
+=
}
return , , nil
}
type wideTransform struct {
transform.NopResetter
}
func (wideTransform) ( []byte, bool) ( int, error) {
for < len() {
, := trie.lookup([:])
if == 0 {
if ! {
= transform.ErrShortSrc
} else {
= len()
}
break
}
if := elem().kind(); byte() == 0 || != EastAsianHalfwidth && != EastAsianNarrow {
} else {
= transform.ErrEndOfSpan
break
}
+=
}
return ,
}
func (wideTransform) (, []byte, bool) (, int, error) {
for < len() {
, := trie.lookup([:])
if == 0 {
if ! {
return , , transform.ErrShortSrc
}
= 1
}
if := elem().kind(); byte() == 0 || != EastAsianHalfwidth && != EastAsianNarrow {
if != copy([:], [:+]) {
return , , transform.ErrShortDst
}
+=
} else {
:= inverseData[byte()]
if len()- < int([0]) {
return , , transform.ErrShortDst
}
:= 1
for := int([0]); < ; ++ {
[] = []
++
}
[] = [] ^ [+-1]
++
}
+=
}
return , , nil
}