]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Module for handling utf8 just like any other charset. | |
3 | * By Urban Widmark 2000 | |
4 | */ | |
5 | ||
6 | #include <linux/module.h> | |
7 | #include <linux/kernel.h> | |
8 | #include <linux/string.h> | |
9 | #include <linux/nls.h> | |
10 | #include <linux/errno.h> | |
11 | ||
12 | static unsigned char identity[256]; | |
13 | ||
14 | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | |
15 | { | |
16 | int n; | |
17 | ||
74675a58 AS |
18 | if (boundlen <= 0) |
19 | return -ENAMETOOLONG; | |
20 | ||
21 | n = utf32_to_utf8(uni, out, boundlen); | |
22 | if (n < 0) { | |
1da177e4 LT |
23 | *out = '?'; |
24 | return -EINVAL; | |
25 | } | |
26 | return n; | |
27 | } | |
28 | ||
29 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | |
30 | { | |
31 | int n; | |
74675a58 | 32 | unicode_t u; |
1da177e4 | 33 | |
74675a58 AS |
34 | n = utf8_to_utf32(rawstring, boundlen, &u); |
35 | if (n < 0 || u > MAX_WCHAR_T) { | |
1da177e4 | 36 | *uni = 0x003f; /* ? */ |
74675a58 | 37 | return -EINVAL; |
1da177e4 | 38 | } |
74675a58 | 39 | *uni = (wchar_t) u; |
1da177e4 LT |
40 | return n; |
41 | } | |
42 | ||
43 | static struct nls_table table = { | |
44 | .charset = "utf8", | |
45 | .uni2char = uni2char, | |
46 | .char2uni = char2uni, | |
47 | .charset2lower = identity, /* no conversion */ | |
48 | .charset2upper = identity, | |
1da177e4 LT |
49 | }; |
50 | ||
51 | static int __init init_nls_utf8(void) | |
52 | { | |
53 | int i; | |
54 | for (i=0; i<256; i++) | |
55 | identity[i] = i; | |
56 | ||
57 | return register_nls(&table); | |
58 | } | |
59 | ||
60 | static void __exit exit_nls_utf8(void) | |
61 | { | |
62 | unregister_nls(&table); | |
63 | } | |
64 | ||
65 | module_init(init_nls_utf8) | |
66 | module_exit(exit_nls_utf8) | |
67 | MODULE_LICENSE("Dual BSD/GPL"); |