jfs_unicode.h (3133B)
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 "jfs_types.h" 12 13typedef struct { 14 wchar_t start; 15 wchar_t end; 16 signed char *table; 17} UNICASERANGE; 18 19extern signed char UniUpperTable[512]; 20extern UNICASERANGE UniUpperRange[]; 21extern int get_UCSname(struct component_name *, struct dentry *); 22extern int jfs_strfromUCS_le(char *, const __le16 *, int, struct nls_table *); 23 24#define free_UCSname(COMP) kfree((COMP)->name) 25 26/* 27 * UniStrcpy: Copy a string 28 */ 29static inline wchar_t *UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) 30{ 31 wchar_t *anchor = ucs1; /* save the start of result string */ 32 33 while ((*ucs1++ = *ucs2++)); 34 return anchor; 35} 36 37 38 39/* 40 * UniStrncpy: Copy length limited string with pad 41 */ 42static inline __le16 *UniStrncpy_le(__le16 * ucs1, const __le16 * ucs2, 43 size_t n) 44{ 45 __le16 *anchor = ucs1; 46 47 while (n-- && *ucs2) /* Copy the strings */ 48 *ucs1++ = *ucs2++; 49 50 n++; 51 while (n--) /* Pad with nulls */ 52 *ucs1++ = 0; 53 return anchor; 54} 55 56/* 57 * UniStrncmp_le: Compare length limited string - native to little-endian 58 */ 59static inline int UniStrncmp_le(const wchar_t * ucs1, const __le16 * ucs2, 60 size_t n) 61{ 62 if (!n) 63 return 0; /* Null strings are equal */ 64 while ((*ucs1 == __le16_to_cpu(*ucs2)) && *ucs1 && --n) { 65 ucs1++; 66 ucs2++; 67 } 68 return (int) *ucs1 - (int) __le16_to_cpu(*ucs2); 69} 70 71/* 72 * UniStrncpy_to_le: Copy length limited string with pad to little-endian 73 */ 74static inline __le16 *UniStrncpy_to_le(__le16 * ucs1, const wchar_t * ucs2, 75 size_t n) 76{ 77 __le16 *anchor = ucs1; 78 79 while (n-- && *ucs2) /* Copy the strings */ 80 *ucs1++ = cpu_to_le16(*ucs2++); 81 82 n++; 83 while (n--) /* Pad with nulls */ 84 *ucs1++ = 0; 85 return anchor; 86} 87 88/* 89 * UniStrncpy_from_le: Copy length limited string with pad from little-endian 90 */ 91static inline wchar_t *UniStrncpy_from_le(wchar_t * ucs1, const __le16 * ucs2, 92 size_t n) 93{ 94 wchar_t *anchor = ucs1; 95 96 while (n-- && *ucs2) /* Copy the strings */ 97 *ucs1++ = __le16_to_cpu(*ucs2++); 98 99 n++; 100 while (n--) /* Pad with nulls */ 101 *ucs1++ = 0; 102 return anchor; 103} 104 105/* 106 * UniToupper: Convert a unicode character to upper case 107 */ 108static inline wchar_t UniToupper(wchar_t uc) 109{ 110 UNICASERANGE *rp; 111 112 if (uc < sizeof(UniUpperTable)) { /* Latin characters */ 113 return uc + UniUpperTable[uc]; /* Use base tables */ 114 } else { 115 rp = UniUpperRange; /* Use range tables */ 116 while (rp->start) { 117 if (uc < rp->start) /* Before start of range */ 118 return uc; /* Uppercase = input */ 119 if (uc <= rp->end) /* In range */ 120 return uc + rp->table[uc - rp->start]; 121 rp++; /* Try next range */ 122 } 123 } 124 return uc; /* Past last range */ 125} 126 127 128/* 129 * UniStrupr: Upper case a unicode string 130 */ 131static inline wchar_t *UniStrupr(wchar_t * upin) 132{ 133 wchar_t *up; 134 135 up = upin; 136 while (*up) { /* For all characters */ 137 *up = UniToupper(*up); 138 up++; 139 } 140 return upin; /* Return input pointer */ 141} 142 143#endif /* !_H_JFS_UNICODE */