xref: /linux/fs/jfs/jfs_unicode.h (revision a1c613ae4c322ddd58d5a8539dbfba2a0380a8c0)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  *   Copyright (C) International Business Machines Corp., 2000-2002
4  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
5  */
6 #ifndef _H_JFS_UNICODE
7 #define _H_JFS_UNICODE
8 
9 #include <linux/slab.h>
10 #include <asm/byteorder.h>
11 #include "../nls/nls_ucs2_data.h"
12 #include "jfs_types.h"
13 
14 extern int get_UCSname(struct component_name *, struct dentry *);
15 extern int jfs_strfromUCS_le(char *, const __le16 *, int, struct nls_table *);
16 
17 #define free_UCSname(COMP) kfree((COMP)->name)
18 
19 /*
20  * UniStrcpy:  Copy a string
21  */
UniStrcpy(wchar_t * ucs1,const wchar_t * ucs2)22 static inline wchar_t *UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2)
23 {
24 	wchar_t *anchor = ucs1;	/* save the start of result string */
25 
26 	while ((*ucs1++ = *ucs2++));
27 	return anchor;
28 }
29 
30 
31 
32 /*
33  * UniStrncpy:  Copy length limited string with pad
34  */
UniStrncpy_le(__le16 * ucs1,const __le16 * ucs2,size_t n)35 static inline __le16 *UniStrncpy_le(__le16 * ucs1, const __le16 * ucs2,
36 				  size_t n)
37 {
38 	__le16 *anchor = ucs1;
39 
40 	while (n-- && *ucs2)	/* Copy the strings */
41 		*ucs1++ = *ucs2++;
42 
43 	n++;
44 	while (n--)		/* Pad with nulls */
45 		*ucs1++ = 0;
46 	return anchor;
47 }
48 
49 /*
50  * UniStrncmp_le:  Compare length limited string - native to little-endian
51  */
UniStrncmp_le(const wchar_t * ucs1,const __le16 * ucs2,size_t n)52 static inline int UniStrncmp_le(const wchar_t * ucs1, const __le16 * ucs2,
53 				size_t n)
54 {
55 	if (!n)
56 		return 0;	/* Null strings are equal */
57 	while ((*ucs1 == __le16_to_cpu(*ucs2)) && *ucs1 && --n) {
58 		ucs1++;
59 		ucs2++;
60 	}
61 	return (int) *ucs1 - (int) __le16_to_cpu(*ucs2);
62 }
63 
64 /*
65  * UniStrncpy_to_le:  Copy length limited string with pad to little-endian
66  */
UniStrncpy_to_le(__le16 * ucs1,const wchar_t * ucs2,size_t n)67 static inline __le16 *UniStrncpy_to_le(__le16 * ucs1, const wchar_t * ucs2,
68 				       size_t n)
69 {
70 	__le16 *anchor = ucs1;
71 
72 	while (n-- && *ucs2)	/* Copy the strings */
73 		*ucs1++ = cpu_to_le16(*ucs2++);
74 
75 	n++;
76 	while (n--)		/* Pad with nulls */
77 		*ucs1++ = 0;
78 	return anchor;
79 }
80 
81 /*
82  * UniStrncpy_from_le:  Copy length limited string with pad from little-endian
83  */
UniStrncpy_from_le(wchar_t * ucs1,const __le16 * ucs2,size_t n)84 static inline wchar_t *UniStrncpy_from_le(wchar_t * ucs1, const __le16 * ucs2,
85 					  size_t n)
86 {
87 	wchar_t *anchor = ucs1;
88 
89 	while (n-- && *ucs2)	/* Copy the strings */
90 		*ucs1++ = __le16_to_cpu(*ucs2++);
91 
92 	n++;
93 	while (n--)		/* Pad with nulls */
94 		*ucs1++ = 0;
95 	return anchor;
96 }
97 
98 /*
99  * UniToupper:  Convert a unicode character to upper case
100  */
UniToupper(wchar_t uc)101 static inline wchar_t UniToupper(wchar_t uc)
102 {
103 	const struct UniCaseRange *rp;
104 
105 	if (uc < sizeof(NlsUniUpperTable)) {	/* Latin characters */
106 		return uc + NlsUniUpperTable[uc];	/* Use base tables */
107 	} else {
108 		rp = NlsUniUpperRange;	/* Use range tables */
109 		while (rp->start) {
110 			if (uc < rp->start)	/* Before start of range */
111 				return uc;	/* Uppercase = input */
112 			if (uc <= rp->end)	/* In range */
113 				return uc + rp->table[uc - rp->start];
114 			rp++;	/* Try next range */
115 		}
116 	}
117 	return uc;		/* Past last range */
118 }
119 
120 
121 /*
122  * UniStrupr:  Upper case a unicode string
123  */
UniStrupr(wchar_t * upin)124 static inline wchar_t *UniStrupr(wchar_t * upin)
125 {
126 	wchar_t *up;
127 
128 	up = upin;
129 	while (*up) {		/* For all characters */
130 		*up = UniToupper(*up);
131 		up++;
132 	}
133 	return upin;		/* Return input pointer */
134 }
135 
136 #endif				/* !_H_JFS_UNICODE */
137