]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
63f83c9f DK |
2 | * Copyright (C) International Business Machines Corp., 2000-2002 |
3 | * Portions Copyright (C) Christoph Hellwig, 2001-2002 | |
1da177e4 LT |
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 | |
63f83c9f | 7 | * the Free Software Foundation; either version 2 of the License, or |
1da177e4 | 8 | * (at your option) any later version. |
63f83c9f | 9 | * |
1da177e4 LT |
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 | |
63f83c9f | 16 | * along with this program; if not, write to the Free Software |
1da177e4 LT |
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 | ||
5a0e3ad6 | 22 | #include <linux/slab.h> |
1da177e4 LT |
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 */ |