Blame view

fs/nls/nls_utf8.c 1.21 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
   * 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;
74675a585   Alan Stern   NLS: update handl...
17
18
19
20
21
  	if (boundlen <= 0)
  		return -ENAMETOOLONG;
  
  	n = utf32_to_utf8(uni, out, boundlen);
  	if (n < 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
26
27
28
29
30
  		*out = '?';
  		return -EINVAL;
  	}
  	return n;
  }
  
  static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
  {
  	int n;
74675a585   Alan Stern   NLS: update handl...
31
  	unicode_t u;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32

74675a585   Alan Stern   NLS: update handl...
33
34
  	n = utf8_to_utf32(rawstring, boundlen, &u);
  	if (n < 0 || u > MAX_WCHAR_T) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  		*uni = 0x003f;	/* ? */
74675a585   Alan Stern   NLS: update handl...
36
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
  	}
74675a585   Alan Stern   NLS: update handl...
38
  	*uni = (wchar_t) u;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  	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");