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 | |
18 | if (boundlen <= 0) |
19 | return -ENAMETOOLONG; |
20 | |
21 | n = utf32_to_utf8(u: uni, s: out, maxlen: boundlen); |
22 | if (n < 0) { |
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; |
32 | unicode_t u; |
33 | |
34 | n = utf8_to_utf32(s: rawstring, len: boundlen, pu: &u); |
35 | if (n < 0 || u > MAX_WCHAR_T) { |
36 | *uni = 0x003f; /* ? */ |
37 | return -EINVAL; |
38 | } |
39 | *uni = (wchar_t) u; |
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, |
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" ); |
68 | |