xref: /openbmc/linux/fs/jfs/jfs_unicode.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
363f83c9fSDave Kleikamp  *   Copyright (C) International Business Machines Corp., 2000-2002
463f83c9fSDave Kleikamp  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef _H_JFS_UNICODE
71da177e4SLinus Torvalds #define _H_JFS_UNICODE
81da177e4SLinus Torvalds 
95a0e3ad6STejun Heo #include <linux/slab.h>
101da177e4SLinus Torvalds #include <asm/byteorder.h>
11*f3a9b375SDr. David Alan Gilbert #include "../nls/nls_ucs2_data.h"
121da177e4SLinus Torvalds #include "jfs_types.h"
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds extern int get_UCSname(struct component_name *, struct dentry *);
151da177e4SLinus Torvalds extern int jfs_strfromUCS_le(char *, const __le16 *, int, struct nls_table *);
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds #define free_UCSname(COMP) kfree((COMP)->name)
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds /*
201da177e4SLinus Torvalds  * UniStrcpy:  Copy a string
211da177e4SLinus Torvalds  */
UniStrcpy(wchar_t * ucs1,const wchar_t * ucs2)221da177e4SLinus Torvalds static inline wchar_t *UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2)
231da177e4SLinus Torvalds {
241da177e4SLinus Torvalds 	wchar_t *anchor = ucs1;	/* save the start of result string */
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds 	while ((*ucs1++ = *ucs2++));
271da177e4SLinus Torvalds 	return anchor;
281da177e4SLinus Torvalds }
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds 
321da177e4SLinus Torvalds /*
331da177e4SLinus Torvalds  * UniStrncpy:  Copy length limited string with pad
341da177e4SLinus Torvalds  */
UniStrncpy_le(__le16 * ucs1,const __le16 * ucs2,size_t n)351da177e4SLinus Torvalds static inline __le16 *UniStrncpy_le(__le16 * ucs1, const __le16 * ucs2,
361da177e4SLinus Torvalds 				  size_t n)
371da177e4SLinus Torvalds {
381da177e4SLinus Torvalds 	__le16 *anchor = ucs1;
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds 	while (n-- && *ucs2)	/* Copy the strings */
411da177e4SLinus Torvalds 		*ucs1++ = *ucs2++;
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds 	n++;
441da177e4SLinus Torvalds 	while (n--)		/* Pad with nulls */
451da177e4SLinus Torvalds 		*ucs1++ = 0;
461da177e4SLinus Torvalds 	return anchor;
471da177e4SLinus Torvalds }
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds /*
501da177e4SLinus Torvalds  * UniStrncmp_le:  Compare length limited string - native to little-endian
511da177e4SLinus Torvalds  */
UniStrncmp_le(const wchar_t * ucs1,const __le16 * ucs2,size_t n)521da177e4SLinus Torvalds static inline int UniStrncmp_le(const wchar_t * ucs1, const __le16 * ucs2,
531da177e4SLinus Torvalds 				size_t n)
541da177e4SLinus Torvalds {
551da177e4SLinus Torvalds 	if (!n)
561da177e4SLinus Torvalds 		return 0;	/* Null strings are equal */
571da177e4SLinus Torvalds 	while ((*ucs1 == __le16_to_cpu(*ucs2)) && *ucs1 && --n) {
581da177e4SLinus Torvalds 		ucs1++;
591da177e4SLinus Torvalds 		ucs2++;
601da177e4SLinus Torvalds 	}
611da177e4SLinus Torvalds 	return (int) *ucs1 - (int) __le16_to_cpu(*ucs2);
621da177e4SLinus Torvalds }
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds /*
651da177e4SLinus Torvalds  * UniStrncpy_to_le:  Copy length limited string with pad to little-endian
661da177e4SLinus Torvalds  */
UniStrncpy_to_le(__le16 * ucs1,const wchar_t * ucs2,size_t n)671da177e4SLinus Torvalds static inline __le16 *UniStrncpy_to_le(__le16 * ucs1, const wchar_t * ucs2,
681da177e4SLinus Torvalds 				       size_t n)
691da177e4SLinus Torvalds {
701da177e4SLinus Torvalds 	__le16 *anchor = ucs1;
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	while (n-- && *ucs2)	/* Copy the strings */
731da177e4SLinus Torvalds 		*ucs1++ = cpu_to_le16(*ucs2++);
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds 	n++;
761da177e4SLinus Torvalds 	while (n--)		/* Pad with nulls */
771da177e4SLinus Torvalds 		*ucs1++ = 0;
781da177e4SLinus Torvalds 	return anchor;
791da177e4SLinus Torvalds }
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds /*
821da177e4SLinus Torvalds  * UniStrncpy_from_le:  Copy length limited string with pad from little-endian
831da177e4SLinus Torvalds  */
UniStrncpy_from_le(wchar_t * ucs1,const __le16 * ucs2,size_t n)841da177e4SLinus Torvalds static inline wchar_t *UniStrncpy_from_le(wchar_t * ucs1, const __le16 * ucs2,
851da177e4SLinus Torvalds 					  size_t n)
861da177e4SLinus Torvalds {
871da177e4SLinus Torvalds 	wchar_t *anchor = ucs1;
881da177e4SLinus Torvalds 
891da177e4SLinus Torvalds 	while (n-- && *ucs2)	/* Copy the strings */
901da177e4SLinus Torvalds 		*ucs1++ = __le16_to_cpu(*ucs2++);
911da177e4SLinus Torvalds 
921da177e4SLinus Torvalds 	n++;
931da177e4SLinus Torvalds 	while (n--)		/* Pad with nulls */
941da177e4SLinus Torvalds 		*ucs1++ = 0;
951da177e4SLinus Torvalds 	return anchor;
961da177e4SLinus Torvalds }
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds /*
991da177e4SLinus Torvalds  * UniToupper:  Convert a unicode character to upper case
1001da177e4SLinus Torvalds  */
UniToupper(wchar_t uc)1011da177e4SLinus Torvalds static inline wchar_t UniToupper(wchar_t uc)
1021da177e4SLinus Torvalds {
103*f3a9b375SDr. David Alan Gilbert 	const struct UniCaseRange *rp;
1041da177e4SLinus Torvalds 
105*f3a9b375SDr. David Alan Gilbert 	if (uc < sizeof(NlsUniUpperTable)) {	/* Latin characters */
106*f3a9b375SDr. David Alan Gilbert 		return uc + NlsUniUpperTable[uc];	/* Use base tables */
1071da177e4SLinus Torvalds 	} else {
108*f3a9b375SDr. David Alan Gilbert 		rp = NlsUniUpperRange;	/* Use range tables */
1091da177e4SLinus Torvalds 		while (rp->start) {
1101da177e4SLinus Torvalds 			if (uc < rp->start)	/* Before start of range */
1111da177e4SLinus Torvalds 				return uc;	/* Uppercase = input */
1121da177e4SLinus Torvalds 			if (uc <= rp->end)	/* In range */
1131da177e4SLinus Torvalds 				return uc + rp->table[uc - rp->start];
1141da177e4SLinus Torvalds 			rp++;	/* Try next range */
1151da177e4SLinus Torvalds 		}
1161da177e4SLinus Torvalds 	}
1171da177e4SLinus Torvalds 	return uc;		/* Past last range */
1181da177e4SLinus Torvalds }
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds 
1211da177e4SLinus Torvalds /*
1221da177e4SLinus Torvalds  * UniStrupr:  Upper case a unicode string
1231da177e4SLinus Torvalds  */
UniStrupr(wchar_t * upin)1241da177e4SLinus Torvalds static inline wchar_t *UniStrupr(wchar_t * upin)
1251da177e4SLinus Torvalds {
1261da177e4SLinus Torvalds 	wchar_t *up;
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds 	up = upin;
1291da177e4SLinus Torvalds 	while (*up) {		/* For all characters */
1301da177e4SLinus Torvalds 		*up = UniToupper(*up);
1311da177e4SLinus Torvalds 		up++;
1321da177e4SLinus Torvalds 	}
1331da177e4SLinus Torvalds 	return upin;		/* Return input pointer */
1341da177e4SLinus Torvalds }
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds #endif				/* !_H_JFS_UNICODE */
137