Branch data Line data Source code
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 : 0 : static int uni2char(wchar_t uni, unsigned char *out, int boundlen) 15 : : { 16 : 0 : int n; 17 : : 18 [ # # ]: 0 : if (boundlen <= 0) 19 : : return -ENAMETOOLONG; 20 : : 21 : 0 : n = utf32_to_utf8(uni, out, boundlen); 22 [ # # ]: 0 : if (n < 0) { 23 : 0 : *out = '?'; 24 : 0 : return -EINVAL; 25 : : } 26 : : return n; 27 : : } 28 : : 29 : 0 : static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) 30 : : { 31 : 0 : int n; 32 : 0 : unicode_t u; 33 : : 34 : 0 : n = utf8_to_utf32(rawstring, boundlen, &u); 35 [ # # # # ]: 0 : if (n < 0 || u > MAX_WCHAR_T) { 36 : 0 : *uni = 0x003f; /* ? */ 37 : 0 : return -EINVAL; 38 : : } 39 : 0 : *uni = (wchar_t) u; 40 : 0 : return n; 41 : : } 42 : : 43 : : static struct nls_table table = { 44 : : .charset = "utf8", 45 : : .uni2char = uni2char, 46 : : .char2uni = char2uni, 47 : : .charset2lower = identity, /* no conversion */ 48 : : .charset2upper = identity, 49 : : }; 50 : : 51 : 78 : static int __init init_nls_utf8(void) 52 : : { 53 : 78 : int i; 54 [ + + ]: 20046 : for (i=0; i<256; i++) 55 : 19968 : identity[i] = i; 56 : : 57 : 78 : return register_nls(&table); 58 : : } 59 : : 60 : 0 : static void __exit exit_nls_utf8(void) 61 : : { 62 : 0 : unregister_nls(&table); 63 : 0 : } 64 : : 65 : : module_init(init_nls_utf8) 66 : : module_exit(exit_nls_utf8) 67 : : MODULE_LICENSE("Dual BSD/GPL");