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 | ||
18 | if ( (n = utf8_wctomb(out, uni, boundlen)) == -1) { | |
19 | *out = '?'; | |
20 | return -EINVAL; | |
21 | } | |
22 | return n; | |
23 | } | |
24 | ||
25 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | |
26 | { | |
27 | int n; | |
28 | ||
29 | if ( (n = utf8_mbtowc(uni, rawstring, boundlen)) == -1) { | |
30 | *uni = 0x003f; /* ? */ | |
31 | n = -EINVAL; | |
32 | } | |
33 | return n; | |
34 | } | |
35 | ||
36 | static struct nls_table table = { | |
37 | .charset = "utf8", | |
38 | .uni2char = uni2char, | |
39 | .char2uni = char2uni, | |
40 | .charset2lower = identity, /* no conversion */ | |
41 | .charset2upper = identity, | |
42 | .owner = THIS_MODULE, | |
43 | }; | |
44 | ||
45 | static int __init init_nls_utf8(void) | |
46 | { | |
47 | int i; | |
48 | for (i=0; i<256; i++) | |
49 | identity[i] = i; | |
50 | ||
51 | return register_nls(&table); | |
52 | } | |
53 | ||
54 | static void __exit exit_nls_utf8(void) | |
55 | { | |
56 | unregister_nls(&table); | |
57 | } | |
58 | ||
59 | module_init(init_nls_utf8) | |
60 | module_exit(exit_nls_utf8) | |
61 | MODULE_LICENSE("Dual BSD/GPL"); |