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"); 63