]>
git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - fs/ntfs3/upcase.c
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');
31 * Thanks Kari Argillander <kari.argillander@gmail.com> for idea and implementation 'bothcase'
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
;