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