| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | package mahoniaimport (	"unicode/utf8")// ConvertString converts a  string from UTF-8 to e's encoding.func (e Encoder) ConvertString(s string) string {	dest := make([]byte, len(s)+10)	destPos := 0	for _, rune := range s {	retry:		size, status := e(dest[destPos:], rune)		if status == NO_ROOM {			newDest := make([]byte, len(dest)*2)			copy(newDest, dest)			dest = newDest			goto retry		}		if status == STATE_ONLY {			destPos += size			goto retry		}		destPos += size	}	return string(dest[:destPos])}// ConvertString converts a string from d's encoding to UTF-8.func (d Decoder) ConvertString(s string) string {	bytes := []byte(s)	runes := make([]rune, len(s))	destPos := 0	for len(bytes) > 0 {		c, size, status := d(bytes)		if status == STATE_ONLY {			bytes = bytes[size:]			continue		}		if status == NO_ROOM {			c = 0xfffd			size = len(bytes)			status = INVALID_CHAR		}		bytes = bytes[size:]		runes[destPos] = c		destPos++	}	return string(runes[:destPos])}// ConvertStringOK converts a  string from UTF-8 to e's encoding. It also// returns a boolean indicating whether every character was converted// successfully.func (e Encoder) ConvertStringOK(s string) (result string, ok bool) {	dest := make([]byte, len(s)+10)	destPos := 0	ok = true	for i, r := range s {		// The following test is copied from utf8.ValidString.		if r == utf8.RuneError && ok {			_, size := utf8.DecodeRuneInString(s[i:])			if size == 1 {				ok = false			}		}	retry:		size, status := e(dest[destPos:], r)		switch status {		case NO_ROOM:			newDest := make([]byte, len(dest)*2)			copy(newDest, dest)			dest = newDest			goto retry		case STATE_ONLY:			destPos += size			goto retry		case INVALID_CHAR:			ok = false		}		destPos += size	}	return string(dest[:destPos]), ok}// ConvertStringOK converts a string from d's encoding to UTF-8.// It also returns a boolean indicating whether every character was converted// successfully.func (d Decoder) ConvertStringOK(s string) (result string, ok bool) {	bytes := []byte(s)	runes := make([]rune, len(s))	destPos := 0	ok = true	for len(bytes) > 0 {		c, size, status := d(bytes)		switch status {		case STATE_ONLY:			bytes = bytes[size:]			continue		case NO_ROOM:			c = 0xfffd			size = len(bytes)			ok = false		case INVALID_CHAR:			ok = false		}		bytes = bytes[size:]		runes[destPos] = c		destPos++	}	return string(runes[:destPos]), ok}
 |