1 /* 2 * Copyright (C) International Business Machines Corp., 2000-2002 3 * Portions Copyright (C) Christoph Hellwig, 2001-2002 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13 * the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 */ 19 #ifndef _H_JFS_UNICODE 20 #define _H_JFS_UNICODE 21 22 #include <linux/slab.h> 23 #include <asm/byteorder.h> 24 #include "jfs_types.h" 25 26 typedef struct { 27 wchar_t start; 28 wchar_t end; 29 signed char *table; 30 } UNICASERANGE; 31 32 extern signed char UniUpperTable[512]; 33 extern UNICASERANGE UniUpperRange[]; 34 extern int get_UCSname(struct component_name *, struct dentry *); 35 extern int jfs_strfromUCS_le(char *, const __le16 *, int, struct nls_table *); 36 37 #define free_UCSname(COMP) kfree((COMP)->name) 38 39 /* 40 * UniStrcpy: Copy a string 41 */ 42 static inline wchar_t *UniStrcpy(wchar_t * ucs1, const wchar_t * ucs2) 43 { 44 wchar_t *anchor = ucs1; /* save the start of result string */ 45 46 while ((*ucs1++ = *ucs2++)); 47 return anchor; 48 } 49 50 51 52 /* 53 * UniStrncpy: Copy length limited string with pad 54 */ 55 static inline __le16 *UniStrncpy_le(__le16 * ucs1, const __le16 * ucs2, 56 size_t n) 57 { 58 __le16 *anchor = ucs1; 59 60 while (n-- && *ucs2) /* Copy the strings */ 61 *ucs1++ = *ucs2++; 62 63 n++; 64 while (n--) /* Pad with nulls */ 65 *ucs1++ = 0; 66 return anchor; 67 } 68 69 /* 70 * UniStrncmp_le: Compare length limited string - native to little-endian 71 */ 72 static inline int UniStrncmp_le(const wchar_t * ucs1, const __le16 * ucs2, 73 size_t n) 74 { 75 if (!n) 76 return 0; /* Null strings are equal */ 77 while ((*ucs1 == __le16_to_cpu(*ucs2)) && *ucs1 && --n) { 78 ucs1++; 79 ucs2++; 80 } 81 return (int) *ucs1 - (int) __le16_to_cpu(*ucs2); 82 } 83 84 /* 85 * UniStrncpy_to_le: Copy length limited string with pad to little-endian 86 */ 87 static inline __le16 *UniStrncpy_to_le(__le16 * ucs1, const wchar_t * ucs2, 88 size_t n) 89 { 90 __le16 *anchor = ucs1; 91 92 while (n-- && *ucs2) /* Copy the strings */ 93 *ucs1++ = cpu_to_le16(*ucs2++); 94 95 n++; 96 while (n--) /* Pad with nulls */ 97 *ucs1++ = 0; 98 return anchor; 99 } 100 101 /* 102 * UniStrncpy_from_le: Copy length limited string with pad from little-endian 103 */ 104 static inline wchar_t *UniStrncpy_from_le(wchar_t * ucs1, const __le16 * ucs2, 105 size_t n) 106 { 107 wchar_t *anchor = ucs1; 108 109 while (n-- && *ucs2) /* Copy the strings */ 110 *ucs1++ = __le16_to_cpu(*ucs2++); 111 112 n++; 113 while (n--) /* Pad with nulls */ 114 *ucs1++ = 0; 115 return anchor; 116 } 117 118 /* 119 * UniToupper: Convert a unicode character to upper case 120 */ 121 static inline wchar_t UniToupper(wchar_t uc) 122 { 123 UNICASERANGE *rp; 124 125 if (uc < sizeof(UniUpperTable)) { /* Latin characters */ 126 return uc + UniUpperTable[uc]; /* Use base tables */ 127 } else { 128 rp = UniUpperRange; /* Use range tables */ 129 while (rp->start) { 130 if (uc < rp->start) /* Before start of range */ 131 return uc; /* Uppercase = input */ 132 if (uc <= rp->end) /* In range */ 133 return uc + rp->table[uc - rp->start]; 134 rp++; /* Try next range */ 135 } 136 } 137 return uc; /* Past last range */ 138 } 139 140 141 /* 142 * UniStrupr: Upper case a unicode string 143 */ 144 static inline wchar_t *UniStrupr(wchar_t * upin) 145 { 146 wchar_t *up; 147 148 up = upin; 149 while (*up) { /* For all characters */ 150 *up = UniToupper(*up); 151 up++; 152 } 153 return upin; /* Return input pointer */ 154 } 155 156 #endif /* !_H_JFS_UNICODE */ 157