diff options
Diffstat (limited to 'fs/nls/nls_utf8.c')
-rw-r--r-- | fs/nls/nls_utf8.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/fs/nls/nls_utf8.c b/fs/nls/nls_utf8.c new file mode 100644 index 000000000000..aa2c42fdd977 --- /dev/null +++ b/fs/nls/nls_utf8.c | |||
@@ -0,0 +1,61 @@ | |||
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"); | ||