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  }