vitess.io/vitess@v0.16.2/go/mysql/collations/internal/charset/korean/euckr.go (about) 1 /* 2 Copyright 2021 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package korean 18 19 import ( 20 "unicode/utf8" 21 22 "vitess.io/vitess/go/mysql/collations/internal/charset/types" 23 ) 24 25 type Charset_euckr struct{} 26 27 func (Charset_euckr) Name() string { 28 return "euckr" 29 } 30 31 func (Charset_euckr) IsSuperset(other types.Charset) bool { 32 switch other.(type) { 33 case Charset_euckr: 34 return true 35 default: 36 return false 37 } 38 } 39 40 func (Charset_euckr) SupportsSupplementaryChars() bool { 41 return false 42 } 43 44 func (Charset_euckr) EncodeRune(dst []byte, r rune) int { 45 _ = dst[1] 46 47 switch { 48 case r < utf8.RuneSelf: 49 dst[0] = byte(r) 50 return 1 51 case encode0Low <= r && r < encode0High: 52 if r = rune(encode0[r-encode0Low]); r != 0 { 53 goto write2 54 } 55 case encode1Low <= r && r < encode1High: 56 if r = rune(encode1[r-encode1Low]); r != 0 { 57 goto write2 58 } 59 case encode2Low <= r && r < encode2High: 60 if r = rune(encode2[r-encode2Low]); r != 0 { 61 goto write2 62 } 63 case encode3Low <= r && r < encode3High: 64 if r = rune(encode3[r-encode3Low]); r != 0 { 65 goto write2 66 } 67 case encode4Low <= r && r < encode4High: 68 if r = rune(encode4[r-encode4Low]); r != 0 { 69 goto write2 70 } 71 case encode5Low <= r && r < encode5High: 72 if r = rune(encode5[r-encode5Low]); r != 0 { 73 goto write2 74 } 75 case encode6Low <= r && r < encode6High: 76 if r = rune(encode6[r-encode6Low]); r != 0 { 77 goto write2 78 } 79 } 80 return -1 81 82 write2: 83 dst[0] = uint8(r >> 8) 84 dst[1] = uint8(r) 85 return 2 86 } 87 88 func (Charset_euckr) DecodeRune(src []byte) (rune, int) { 89 if len(src) < 1 { 90 return utf8.RuneError, 0 91 } 92 93 switch c0 := src[0]; { 94 case c0 < utf8.RuneSelf: 95 return rune(c0), 1 96 97 case 0x81 <= c0 && c0 < 0xff: 98 if len(src) < 2 { 99 return utf8.RuneError, 1 100 } 101 var r rune 102 c1 := src[1] 103 if c0 < 0xc7 { 104 r = 178 * rune(c0-0x81) 105 switch { 106 case 0x41 <= c1 && c1 < 0x5b: 107 r += rune(c1) - (0x41 - 0*26) 108 case 0x61 <= c1 && c1 < 0x7b: 109 r += rune(c1) - (0x61 - 1*26) 110 case 0x81 <= c1 && c1 < 0xff: 111 r += rune(c1) - (0x81 - 2*26) 112 default: 113 goto decError 114 } 115 } else if 0xa1 <= c1 && c1 < 0xff { 116 r = 178*(0xc7-0x81) + rune(c0-0xc7)*94 + rune(c1-0xa1) 117 } else { 118 goto decError 119 } 120 if int(r) < len(decode) { 121 r = rune(decode[r]) 122 if r != 0 { 123 return r, 2 124 } 125 } 126 127 decError: 128 if c1 < utf8.RuneSelf { 129 return utf8.RuneError, 1 130 } 131 return utf8.RuneError, 2 132 133 default: 134 return utf8.RuneError, 1 135 } 136 137 }