[PSDK]
[reactos.git] / reactos / drivers / filesystems / ext2_new / src / nls / nls_utf8.c
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 /* .alias */ 0,
39 /* .uni2char */ uni2char,
40 /* .char2uni */ char2uni,
41 /* .charset2lower */ identity, /* no conversion */
42 /* .charset2upper */ identity,
43 /* .owner */ THIS_MODULE,
44 };
45
46 static int __init init_nls_utf8(void)
47 {
48 int i;
49 for (i=0; i<256; i++)
50 identity[i] = (unsigned char) i;
51
52 return register_nls(&table);
53 }
54
55 static void __exit exit_nls_utf8(void)
56 {
57 unregister_nls(&table);
58 }
59
60 module_init(init_nls_utf8)
61 module_exit(exit_nls_utf8)
62 MODULE_LICENSE("Dual BSD/GPL");