| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Alan Stern | 74675a5 | 2009-04-30 10:08:18 -0400 | [diff] [blame] | 18 | 	if (boundlen <= 0) | 
 | 19 | 		return -ENAMETOOLONG; | 
 | 20 |  | 
 | 21 | 	n = utf32_to_utf8(uni, out, boundlen); | 
 | 22 | 	if (n < 0) { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 | 		*out = '?'; | 
 | 24 | 		return -EINVAL; | 
 | 25 | 	} | 
 | 26 | 	return n; | 
 | 27 | } | 
 | 28 |  | 
 | 29 | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | 
 | 30 | { | 
 | 31 | 	int n; | 
| Alan Stern | 74675a5 | 2009-04-30 10:08:18 -0400 | [diff] [blame] | 32 | 	unicode_t u; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 33 |  | 
| Alan Stern | 74675a5 | 2009-04-30 10:08:18 -0400 | [diff] [blame] | 34 | 	n = utf8_to_utf32(rawstring, boundlen, &u); | 
 | 35 | 	if (n < 0 || u > MAX_WCHAR_T) { | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | 		*uni = 0x003f;	/* ? */ | 
| Alan Stern | 74675a5 | 2009-04-30 10:08:18 -0400 | [diff] [blame] | 37 | 		return -EINVAL; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | 	} | 
| Alan Stern | 74675a5 | 2009-04-30 10:08:18 -0400 | [diff] [blame] | 39 | 	*uni = (wchar_t) u; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 | 	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 | 	.owner		= THIS_MODULE, | 
 | 50 | }; | 
 | 51 |  | 
 | 52 | static int __init init_nls_utf8(void) | 
 | 53 | { | 
 | 54 | 	int i; | 
 | 55 | 	for (i=0; i<256; i++) | 
 | 56 | 		identity[i] = i; | 
 | 57 |  | 
 | 58 |         return register_nls(&table); | 
 | 59 | } | 
 | 60 |  | 
 | 61 | static void __exit exit_nls_utf8(void) | 
 | 62 | { | 
 | 63 |         unregister_nls(&table); | 
 | 64 | } | 
 | 65 |  | 
 | 66 | module_init(init_nls_utf8) | 
 | 67 | module_exit(exit_nls_utf8) | 
 | 68 | MODULE_LICENSE("Dual BSD/GPL"); |