Blame view

include/linux/nls.h 3.08 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
  #ifndef _LINUX_NLS_H
  #define _LINUX_NLS_H
  
  #include <linux/init.h>
74675a585   Alan Stern   NLS: update handl...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  /* Unicode has changed over the years.  Unicode code points no longer
   * fit into 16 bits; as of Unicode 5 valid code points range from 0
   * to 0x10ffff (17 planes, where each plane holds 65536 code points).
   *
   * The original decision to represent Unicode characters as 16-bit
   * wchar_t values is now outdated.  But plane 0 still includes the
   * most commonly used characters, so we will retain it.  The newer
   * 32-bit unicode_t type can be used when it is necessary to
   * represent the full Unicode character set.
   */
  
  /* Plane-0 Unicode character */
  typedef u16 wchar_t;
  #define MAX_WCHAR_T	0xffff
  
  /* Arbitrary Unicode character */
  typedef u32 unicode_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
  
  struct nls_table {
b9ec0339d   Denys Vlasenko   add consts where ...
25
26
  	const char *charset;
  	const char *alias;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
  	int (*uni2char) (wchar_t uni, unsigned char *out, int boundlen);
  	int (*char2uni) (const unsigned char *rawstring, int boundlen,
  			 wchar_t *uni);
b9ec0339d   Denys Vlasenko   add consts where ...
30
31
  	const unsigned char *charset2lower;
  	const unsigned char *charset2upper;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
33
34
35
36
37
  	struct module *owner;
  	struct nls_table *next;
  };
  
  /* this value hold the maximum octet of charset */
  #define NLS_MAX_CHARSET_SIZE 6 /* for UTF-8 */
74675a585   Alan Stern   NLS: update handl...
38
39
40
41
42
43
  /* Byte order for UTF-16 strings */
  enum utf16_endian {
  	UTF16_HOST_ENDIAN,
  	UTF16_LITTLE_ENDIAN,
  	UTF16_BIG_ENDIAN
  };
0720a06a7   Alan Stern   NLS: improve UTF8...
44
  /* nls_base.c */
479e64c21   Al Viro   nls: have registe...
45
  extern int __register_nls(struct nls_table *, struct module *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
  extern int unregister_nls(struct nls_table *);
  extern struct nls_table *load_nls(char *);
  extern void unload_nls(struct nls_table *);
  extern struct nls_table *load_nls_default(void);
479e64c21   Al Viro   nls: have registe...
50
  #define register_nls(nls) __register_nls((nls), THIS_MODULE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51

74675a585   Alan Stern   NLS: update handl...
52
53
  extern int utf8_to_utf32(const u8 *s, int len, unicode_t *pu);
  extern int utf32_to_utf8(unicode_t u, u8 *s, int maxlen);
0720a06a7   Alan Stern   NLS: improve UTF8...
54
55
  extern int utf8s_to_utf16s(const u8 *s, int len,
  		enum utf16_endian endian, wchar_t *pwcs, int maxlen);
74675a585   Alan Stern   NLS: update handl...
56
57
  extern int utf16s_to_utf8s(const wchar_t *pwcs, int len,
  		enum utf16_endian endian, u8 *s, int maxlen);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  
  static inline unsigned char nls_tolower(struct nls_table *t, unsigned char c)
  {
  	unsigned char nc = t->charset2lower[c];
  
  	return nc ? nc : c;
  }
  
  static inline unsigned char nls_toupper(struct nls_table *t, unsigned char c)
  {
  	unsigned char nc = t->charset2upper[c];
  
  	return nc ? nc : c;
  }
  
  static inline int nls_strnicmp(struct nls_table *t, const unsigned char *s1,
  		const unsigned char *s2, int len)
  {
  	while (len--) {
  		if (nls_tolower(t, *s1++) != nls_tolower(t, *s2++))
  			return 1;
  	}
  
  	return 0;
  }
d37dc42ab   Jeff Layton   nls: add a nls_nu...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  /*
   * nls_nullsize - return length of null character for codepage
   * @codepage - codepage for which to return length of NULL terminator
   *
   * Since we can't guarantee that the null terminator will be a particular
   * length, we have to check against the codepage. If there's a problem
   * determining it, assume a single-byte NULL terminator.
   */
  static inline int
  nls_nullsize(const struct nls_table *codepage)
  {
  	int charlen;
  	char tmp[NLS_MAX_CHARSET_SIZE];
  
  	charlen = codepage->uni2char(0, tmp, NLS_MAX_CHARSET_SIZE);
  
  	return charlen > 0 ? charlen : 1;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  #define MODULE_ALIAS_NLS(name)	MODULE_ALIAS("nls_" __stringify(name))
  
  #endif /* _LINUX_NLS_H */