| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | package mahoniaimport "unicode/utf8"// Translate enables a Decoder to implement go-charset's Translator interface.func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) {	cdata = make([]byte, len(data)+1)	destPos := 0	for n < len(data) {		rune, size, status := d(data[n:])		switch status {		case STATE_ONLY:			n += size			continue		case NO_ROOM:			if !eof {				return n, cdata[:destPos], nil			}			rune = 0xfffd			n = len(data)		default:			n += size		}		if rune < 128 {			if destPos >= len(cdata) {				cdata = doubleLength(cdata)			}			cdata[destPos] = byte(rune)			destPos++		} else {			if destPos+utf8.RuneLen(rune) > len(cdata) {				cdata = doubleLength(cdata)			}			destPos += utf8.EncodeRune(cdata[destPos:], rune)		}	}	return n, cdata[:destPos], nil}func doubleLength(b []byte) []byte {	b2 := make([]byte, 2*len(b))	copy(b2, b)	return b2}
 |