forked from Qortal/Brooklyn
7d3018da4c
* NVME, SATA NAND Security added * Qortal Core exception fetcher is now redone. * Update DT overlays for firmware * Fix for bvb clockj settings * Fix for no audio for sissy desktop porn watchers -_- ( thanks crowetic for watching gay porn and reporting me that bug asshat ) * Normalize the fetch() stream while doing a peer to peer handshake for nodes * Fix for RNG token editing error while performing a SHA256 encryption * Now under voltage errors will blink red led constantly for 5 minutes then go solid. * Improve kernel thread scaling for Qortal 2.0 core * HDMI circuit is now enabled at power up instead. * Added KMS * Added line replication instead of interpolation for VC4 GPU resulting in slightly better frame rates * Fix for long and doubles * Backplane clock is now set at standard rate * Capped HVEC clocks * Add support for Creative Cinema webcam for donkers who like sharing dick pics. *looks at crowetic* * More scanline XGA modes for people who have weird ass monitors of all sorts. * TX/RX flow control support is now 100% stable. No lags over 1Gbps ethernet. ( Hello Qortal 3.0 ) * Using flush cache instead of fetch for QC 2.0 resulting in performance gains * VC4 clock is now enforced for desktop oriented images. * Ondemand governor now waits for 2 seconds instead of 0.5ms to scale down to the lowest safest clock freq preventing lags to the core. * Timeout of OC set at 35ms from 90ms resulting in way better clocks and sync for Qortal 2.0 core
105 lines
2.1 KiB
C
105 lines
2.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
*
|
|
* Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "ntfs_fs.h"
|
|
|
|
static inline u16 upcase_unicode_char(const u16 *upcase, u16 chr)
|
|
{
|
|
if (chr < 'a')
|
|
return chr;
|
|
|
|
if (chr <= 'z')
|
|
return chr - ('a' - 'A');
|
|
|
|
return upcase[chr];
|
|
}
|
|
|
|
/*
|
|
* ntfs_cmp_names
|
|
*
|
|
* Thanks Kari Argillander <kari.argillander@gmail.com> for idea and implementation 'bothcase'
|
|
*
|
|
* Straight way to compare names:
|
|
* - Case insensitive
|
|
* - If name equals and 'bothcases' then
|
|
* - Case sensitive
|
|
* 'Straight way' code scans input names twice in worst case.
|
|
* Optimized code scans input names only once.
|
|
*/
|
|
int ntfs_cmp_names(const __le16 *s1, size_t l1, const __le16 *s2, size_t l2,
|
|
const u16 *upcase, bool bothcase)
|
|
{
|
|
int diff1 = 0;
|
|
int diff2;
|
|
size_t len = min(l1, l2);
|
|
|
|
if (!bothcase && upcase)
|
|
goto case_insentive;
|
|
|
|
for (; len; s1++, s2++, len--) {
|
|
diff1 = le16_to_cpu(*s1) - le16_to_cpu(*s2);
|
|
if (diff1) {
|
|
if (bothcase && upcase)
|
|
goto case_insentive;
|
|
|
|
return diff1;
|
|
}
|
|
}
|
|
return l1 - l2;
|
|
|
|
case_insentive:
|
|
for (; len; s1++, s2++, len--) {
|
|
diff2 = upcase_unicode_char(upcase, le16_to_cpu(*s1)) -
|
|
upcase_unicode_char(upcase, le16_to_cpu(*s2));
|
|
if (diff2)
|
|
return diff2;
|
|
}
|
|
|
|
diff2 = l1 - l2;
|
|
return diff2 ? diff2 : diff1;
|
|
}
|
|
|
|
int ntfs_cmp_names_cpu(const struct cpu_str *uni1, const struct le_str *uni2,
|
|
const u16 *upcase, bool bothcase)
|
|
{
|
|
const u16 *s1 = uni1->name;
|
|
const __le16 *s2 = uni2->name;
|
|
size_t l1 = uni1->len;
|
|
size_t l2 = uni2->len;
|
|
size_t len = min(l1, l2);
|
|
int diff1 = 0;
|
|
int diff2;
|
|
|
|
if (!bothcase && upcase)
|
|
goto case_insentive;
|
|
|
|
for (; len; s1++, s2++, len--) {
|
|
diff1 = *s1 - le16_to_cpu(*s2);
|
|
if (diff1) {
|
|
if (bothcase && upcase)
|
|
goto case_insentive;
|
|
|
|
return diff1;
|
|
}
|
|
}
|
|
return l1 - l2;
|
|
|
|
case_insentive:
|
|
for (; len; s1++, s2++, len--) {
|
|
diff2 = upcase_unicode_char(upcase, *s1) -
|
|
upcase_unicode_char(upcase, le16_to_cpu(*s2));
|
|
if (diff2)
|
|
return diff2;
|
|
}
|
|
|
|
diff2 = l1 - l2;
|
|
return diff2 ? diff2 : diff1;
|
|
}
|