1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
8 #include <linux/blkdev.h>
9 #include <linux/buffer_head.h>
10 #include <linux/module.h>
11 #include <linux/nls.h>
17 static inline u16 upcase_unicode_char(const u16 *upcase, u16 chr)
23 return chr - ('a' - 'A');
33 * Straight way to compare names:
35 * - If name equals and 'bothcases' then
37 * 'Straight way' code scans input names twice in worst case.
38 * Optimized code scans input names only once.
40 int ntfs_cmp_names(const __le16 *s1, size_t l1, const __le16 *s2, size_t l2,
41 const u16 *upcase, bool bothcase)
45 size_t len = min(l1, l2);
47 if (!bothcase && upcase)
50 for (; len; s1++, s2++, len--) {
51 diff1 = le16_to_cpu(*s1) - le16_to_cpu(*s2);
53 if (bothcase && upcase)
62 for (; len; s1++, s2++, len--) {
63 diff2 = upcase_unicode_char(upcase, le16_to_cpu(*s1)) -
64 upcase_unicode_char(upcase, le16_to_cpu(*s2));
70 return diff2 ? diff2 : diff1;
73 int ntfs_cmp_names_cpu(const struct cpu_str *uni1, const struct le_str *uni2,
74 const u16 *upcase, bool bothcase)
76 const u16 *s1 = uni1->name;
77 const __le16 *s2 = uni2->name;
78 size_t l1 = uni1->len;
79 size_t l2 = uni2->len;
80 size_t len = min(l1, l2);
84 if (!bothcase && upcase)
87 for (; len; s1++, s2++, len--) {
88 diff1 = *s1 - le16_to_cpu(*s2);
90 if (bothcase && upcase)
99 for (; len; s1++, s2++, len--) {
100 diff2 = upcase_unicode_char(upcase, *s1) -
101 upcase_unicode_char(upcase, le16_to_cpu(*s2));
107 return diff2 ? diff2 : diff1;