github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/mahonia/translate.go (about) 1 package mahonia 2 3 import "unicode/utf8" 4 5 // Translate enables a Decoder to implement go-charset's Translator interface. 6 func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) { 7 cdata = make([]byte, len(data)+1) 8 destPos := 0 9 10 for n < len(data) { 11 rune, size, status := d(data[n:]) 12 13 switch status { 14 case STATE_ONLY: 15 n += size 16 continue 17 18 case NO_ROOM: 19 if !eof { 20 return n, cdata[:destPos], nil 21 } 22 rune = 0xfffd 23 n = len(data) 24 25 default: 26 n += size 27 } 28 29 if rune < 128 { 30 if destPos >= len(cdata) { 31 cdata = doubleLength(cdata) 32 } 33 cdata[destPos] = byte(rune) 34 destPos++ 35 } else { 36 if destPos+utf8.RuneLen(rune) > len(cdata) { 37 cdata = doubleLength(cdata) 38 } 39 destPos += utf8.EncodeRune(cdata[destPos:], rune) 40 } 41 } 42 43 return n, cdata[:destPos], nil 44 } 45 46 func doubleLength(b []byte) []byte { 47 b2 := make([]byte, 2*len(b)) 48 copy(b2, b) 49 return b2 50 }