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 | ||
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 */ |