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