| /* | 
 |  * 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, | 
 | }; | 
 |  | 
 | 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"); |