122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
|
/**
|
||
|
* Copyright 2014 Paul Querna
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/* Portions of this file are on Go stdlib's encoding/json/fold.go */
|
||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package v1
|
||
|
|
||
|
import (
|
||
|
"unicode/utf8"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
caseMask = ^byte(0x20) // Mask to ignore case in ASCII.
|
||
|
kelvin = '\u212a'
|
||
|
smallLongEss = '\u017f'
|
||
|
)
|
||
|
|
||
|
// equalFoldRight is a specialization of bytes.EqualFold when s is
|
||
|
// known to be all ASCII (including punctuation), but contains an 's',
|
||
|
// 'S', 'k', or 'K', requiring a Unicode fold on the bytes in t.
|
||
|
// See comments on foldFunc.
|
||
|
func EqualFoldRight(s, t []byte) bool {
|
||
|
for _, sb := range s {
|
||
|
if len(t) == 0 {
|
||
|
return false
|
||
|
}
|
||
|
tb := t[0]
|
||
|
if tb < utf8.RuneSelf {
|
||
|
if sb != tb {
|
||
|
sbUpper := sb & caseMask
|
||
|
if 'A' <= sbUpper && sbUpper <= 'Z' {
|
||
|
if sbUpper != tb&caseMask {
|
||
|
return false
|
||
|
}
|
||
|
} else {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
t = t[1:]
|
||
|
continue
|
||
|
}
|
||
|
// sb is ASCII and t is not. t must be either kelvin
|
||
|
// sign or long s; sb must be s, S, k, or K.
|
||
|
tr, size := utf8.DecodeRune(t)
|
||
|
switch sb {
|
||
|
case 's', 'S':
|
||
|
if tr != smallLongEss {
|
||
|
return false
|
||
|
}
|
||
|
case 'k', 'K':
|
||
|
if tr != kelvin {
|
||
|
return false
|
||
|
}
|
||
|
default:
|
||
|
return false
|
||
|
}
|
||
|
t = t[size:]
|
||
|
|
||
|
}
|
||
|
if len(t) > 0 {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// asciiEqualFold is a specialization of bytes.EqualFold for use when
|
||
|
// s is all ASCII (but may contain non-letters) and contains no
|
||
|
// special-folding letters.
|
||
|
// See comments on foldFunc.
|
||
|
func AsciiEqualFold(s, t []byte) bool {
|
||
|
if len(s) != len(t) {
|
||
|
return false
|
||
|
}
|
||
|
for i, sb := range s {
|
||
|
tb := t[i]
|
||
|
if sb == tb {
|
||
|
continue
|
||
|
}
|
||
|
if ('a' <= sb && sb <= 'z') || ('A' <= sb && sb <= 'Z') {
|
||
|
if sb&caseMask != tb&caseMask {
|
||
|
return false
|
||
|
}
|
||
|
} else {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// simpleLetterEqualFold is a specialization of bytes.EqualFold for
|
||
|
// use when s is all ASCII letters (no underscores, etc) and also
|
||
|
// doesn't contain 'k', 'K', 's', or 'S'.
|
||
|
// See comments on foldFunc.
|
||
|
func SimpleLetterEqualFold(s, t []byte) bool {
|
||
|
if len(s) != len(t) {
|
||
|
return false
|
||
|
}
|
||
|
for i, b := range s {
|
||
|
if b&caseMask != t[i]&caseMask {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|