|  | /* | 
|  | * Module for handling utf8 just like any other charset. | 
|  | * By Urban Widmark 2000 | 
|  | */ | 
|  |  | 
|  | #include <linux/module.h> | 
|  | #include <linux/kernel.h> | 
|  | #include <linux/string.h> | 
|  | #include <linux/nls.h> | 
|  | #include <linux/errno.h> | 
|  |  | 
|  | static unsigned char identity[256]; | 
|  |  | 
|  | static int uni2char(wchar_t uni, unsigned char *out, int boundlen) | 
|  | { | 
|  | int n; | 
|  |  | 
|  | if (boundlen <= 0) | 
|  | return -ENAMETOOLONG; | 
|  |  | 
|  | n = utf32_to_utf8(uni, out, boundlen); | 
|  | if (n < 0) { | 
|  | *out = '?'; | 
|  | return -EINVAL; | 
|  | } | 
|  | return n; | 
|  | } | 
|  |  | 
|  | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | 
|  | { | 
|  | int n; | 
|  | unicode_t u; | 
|  |  | 
|  | n = utf8_to_utf32(rawstring, boundlen, &u); | 
|  | if (n < 0 || u > MAX_WCHAR_T) { | 
|  | *uni = 0x003f;	/* ? */ | 
|  | return -EINVAL; | 
|  | } | 
|  | *uni = (wchar_t) u; | 
|  | return n; | 
|  | } | 
|  |  | 
|  | static struct nls_table table = { | 
|  | .charset	= "utf8", | 
|  | .uni2char	= uni2char, | 
|  | .char2uni	= char2uni, | 
|  | .charset2lower	= identity,	/* no conversion */ | 
|  | .charset2upper	= identity, | 
|  | .owner		= THIS_MODULE, | 
|  | }; | 
|  |  | 
|  | static int __init init_nls_utf8(void) | 
|  | { | 
|  | int i; | 
|  | for (i=0; i<256; i++) | 
|  | identity[i] = i; | 
|  |  | 
|  | return register_nls(&table); | 
|  | } | 
|  |  | 
|  | static void __exit exit_nls_utf8(void) | 
|  | { | 
|  | unregister_nls(&table); | 
|  | } | 
|  |  | 
|  | module_init(init_nls_utf8) | 
|  | module_exit(exit_nls_utf8) | 
|  | MODULE_LICENSE("Dual BSD/GPL"); |