Source file src/vendor/golang.org/x/text/unicode/norm/input.go

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package norm
     6  
     7  import "unicode/utf8"
     8  
     9  type input struct {
    10  	str   string
    11  	bytes []byte
    12  }
    13  
    14  func inputBytes(str []byte) input {
    15  	return input{bytes: str}
    16  }
    17  
    18  func inputString(str string) input {
    19  	return input{str: str}
    20  }
    21  
    22  func (in *input) setBytes(str []byte) {
    23  	in.str = ""
    24  	in.bytes = str
    25  }
    26  
    27  func (in *input) setString(str string) {
    28  	in.str = str
    29  	in.bytes = nil
    30  }
    31  
    32  func (in *input) _byte(p int) byte {
    33  	if in.bytes == nil {
    34  		return in.str[p]
    35  	}
    36  	return in.bytes[p]
    37  }
    38  
    39  func (in *input) skipASCII(p, max int) int {
    40  	if in.bytes == nil {
    41  		for ; p < max && in.str[p] < utf8.RuneSelf; p++ {
    42  		}
    43  	} else {
    44  		for ; p < max && in.bytes[p] < utf8.RuneSelf; p++ {
    45  		}
    46  	}
    47  	return p
    48  }
    49  
    50  func (in *input) skipContinuationBytes(p int) int {
    51  	if in.bytes == nil {
    52  		for ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ {
    53  		}
    54  	} else {
    55  		for ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ {
    56  		}
    57  	}
    58  	return p
    59  }
    60  
    61  func (in *input) appendSlice(buf []byte, b, e int) []byte {
    62  	if in.bytes != nil {
    63  		return append(buf, in.bytes[b:e]...)
    64  	}
    65  	for i := b; i < e; i++ {
    66  		buf = append(buf, in.str[i])
    67  	}
    68  	return buf
    69  }
    70  
    71  func (in *input) copySlice(buf []byte, b, e int) int {
    72  	if in.bytes == nil {
    73  		return copy(buf, in.str[b:e])
    74  	}
    75  	return copy(buf, in.bytes[b:e])
    76  }
    77  
    78  func (in *input) charinfoNFC(p int) (uint16, int) {
    79  	if in.bytes == nil {
    80  		return nfcData.lookupString(in.str[p:])
    81  	}
    82  	return nfcData.lookup(in.bytes[p:])
    83  }
    84  
    85  func (in *input) charinfoNFKC(p int) (uint16, int) {
    86  	if in.bytes == nil {
    87  		return nfkcData.lookupString(in.str[p:])
    88  	}
    89  	return nfkcData.lookup(in.bytes[p:])
    90  }
    91  
    92  func (in *input) hangul(p int) (r rune) {
    93  	var size int
    94  	if in.bytes == nil {
    95  		if !isHangulString(in.str[p:]) {
    96  			return 0
    97  		}
    98  		r, size = utf8.DecodeRuneInString(in.str[p:])
    99  	} else {
   100  		if !isHangul(in.bytes[p:]) {
   101  			return 0
   102  		}
   103  		r, size = utf8.DecodeRune(in.bytes[p:])
   104  	}
   105  	if size != hangulUTF8Size {
   106  		return 0
   107  	}
   108  	return r
   109  }
   110  

View as plain text