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