| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-30 10:08:18 -04:00
										 |  |  | 	if (boundlen <= 0) | 
					
						
							|  |  |  | 		return -ENAMETOOLONG; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n = utf32_to_utf8(uni, out, boundlen); | 
					
						
							|  |  |  | 	if (n < 0) { | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 		*out = '?'; | 
					
						
							|  |  |  | 		return -EINVAL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return n; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int n; | 
					
						
							| 
									
										
										
										
											2009-04-30 10:08:18 -04:00
										 |  |  | 	unicode_t u; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-30 10:08:18 -04:00
										 |  |  | 	n = utf8_to_utf32(rawstring, boundlen, &u); | 
					
						
							|  |  |  | 	if (n < 0 || u > MAX_WCHAR_T) { | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 		*uni = 0x003f;	/* ? */ | 
					
						
							| 
									
										
										
										
											2009-04-30 10:08:18 -04:00
										 |  |  | 		return -EINVAL; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-04-30 10:08:18 -04:00
										 |  |  | 	*uni = (wchar_t) u; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	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"); |