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  }