mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.2 KiB
67 lines
1.2 KiB
/* |
|
* 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");
|
|
|