blob: 7b197ecd6fca3c4a0a7569afa5cc69febb469674 [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Returns true if [a] and [b] are the same ignoring case and all instances of
/// `-` and `_`.
///
/// This is specialized code for comparing enum names.
/// Works only for ascii strings containing letters and `_` and `-`.
bool permissiveCompare(String a, String b) {
const dash = 45;
const underscore = 95;
var i = 0;
var j = 0;
while (true) {
int ca, cb;
do {
ca = i < a.length ? a.codeUnitAt(i++) : -1;
} while (ca == dash || ca == underscore);
do {
cb = j < b.length ? b.codeUnitAt(j++) : -1;
} while (cb == dash || cb == underscore);
if (ca == cb) {
if (ca == -1) return true; // Both at end
continue;
}
if (ca ^ cb != 0x20 || !_isAsciiLetter(ca)) {
return false;
}
}
}
bool _isAsciiLetter(int char) {
const lowerA = 97;
const lowerZ = 122;
const capitalA = 65;
char |= lowerA ^ capitalA;
return lowerA <= char && char <= lowerZ;
}