xref: /illumos-gate/usr/src/uts/common/sys/kiconv.h (revision 581cede61ac9c14d8d4ea452562a567189eead78)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_KICONV_H
27 #define	_SYS_KICONV_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 
37 #ifdef	_KERNEL
38 
39 /*
40  * Supported fromcode/tocode values are saved in the following component type
41  * of (name, id) pair. The id values of fromcode and tocode are used to
42  * find out the corresponding code conversions.
43  */
44 typedef struct {
45 	char		*name;
46 	size_t		id;
47 } kiconv_code_list_t;
48 
49 /*
50  * Each unique kiconv code conversion identified by tocode and fromcode ids
51  * have corresponding module id and internal function pointers to open(),
52  * kiconv(), close(), and kiconvstr().
53  */
54 typedef struct {
55 	uint16_t	tid;		/* tocode id. */
56 	uint16_t	fid;		/* fromcode id. */
57 	uint16_t	mid;		/* module id. */
58 	void		*(*open)(void);
59 	size_t		(*kiconv)(void *, char **, size_t *, char **, size_t *,
60 			int *);
61 	int		(*close)(void *);
62 	size_t		(*kiconvstr)(char *, size_t *, char *, size_t *, int,
63 			int *);
64 } kiconv_conv_list_t;
65 
66 /*
67  * Each module id has a corresponding module name that is used to load
68  * the module as needed and a reference counter.
69  */
70 typedef struct {
71 	char		*name;
72 	uint_t		refcount;
73 } kiconv_mod_list_t;
74 
75 /*
76  * The following two data structures are being used to transfer information
77  * on the supported kiconv code conversions from a module to the framework.
78  *
79  * Details can be found from kiconv_ops(9S) and kiconv_module_info(9S)
80  * man pages at PSARC/2007/173.
81  */
82 typedef struct {
83 	char		*tocode;
84 	char		*fromcode;
85 	void		*(*kiconv_open)(void);
86 	size_t		(*kiconv)(void *, char **, size_t *, char **, size_t *,
87 			int *);
88 	int		(*kiconv_close)(void *);
89 	size_t		(*kiconvstr)(char *, size_t *, char *, size_t *, int,
90 			int *);
91 } kiconv_ops_t;
92 
93 typedef struct kiconv_mod_info {
94 	char		*module_name;
95 	size_t		kiconv_num_convs;
96 	kiconv_ops_t	*kiconv_ops_tbl;
97 	size_t		kiconv_num_aliases;
98 	char		**aliases;
99 	char		**canonicals;
100 	int		nowait;
101 } kiconv_module_info_t;
102 
103 /* The kiconv code conversion descriptor data structure. */
104 typedef struct {
105 	void		*handle;	/* Handle from the actual open(). */
106 	size_t		id;		/* Index to the conv_list[]. */
107 } kiconv_data_t, *kiconv_t;
108 
109 /* Common conversion state data structure. */
110 typedef struct {
111 	uint8_t		id;
112 	uint8_t		bom_processed;
113 } kiconv_state_data_t, *kiconv_state_t;
114 
115 /* Common component types for possible code conversion mapping tables. */
116 typedef struct {
117 	uchar_t		u8[3];
118 } kiconv_to_utf8_tbl_comp_t;
119 
120 typedef struct {
121 	uint32_t	u8:24;
122 	uint32_t	sb:8;
123 } kiconv_to_sb_tbl_comp_t;
124 
125 /*
126  * The maximum name length for any given codeset or alias names; the following
127  * should be plenty big enough.
128  */
129 #define	KICONV_MAX_CODENAME_LEN		63
130 
131 /* The following characters do not exist in the normalized code names. */
132 #define	KICONV_SKIPPABLE_CHAR(c)	\
133 	((c) == '-' || (c) == '_' || (c) == '.' || (c) == '@')
134 
135 /*
136  * When we encounter non-identical characters, as like iconv(3C) we have,
137  * map them into either one of the replacement characters based on what is
138  * the current target tocde.
139  *
140  * The 0xefbfdb in UTF-8 is U+FFFD in Unicode scalar value.
141  */
142 #define	KICONV_ASCII_REPLACEMENT_CHAR	('?')
143 #define	KICONV_UTF8_REPLACEMENT_CHAR	(0xefbfbd)
144 
145 /* Numeric ids for kiconv modules. */
146 #define	KICONV_EMBEDDED			(0)
147 #define	KICONV_MODULE_ID_JA		(1)
148 #define	KICONV_MODULE_ID_SC		(2)
149 #define	KICONV_MODULE_ID_KO		(3)
150 #define	KICONV_MODULE_ID_TC		(4)
151 #define	KICONV_MODULE_ID_EMEA		(5)
152 
153 #define	KICONV_MAX_MODULE_ID		KICONV_MODULE_ID_EMEA
154 
155 /* Functions used in kiconv conversion and module management. */
156 extern void	kiconv_init();
157 extern int	kiconv_register_module(kiconv_module_info_t *);
158 extern int	kiconv_unregister_module(kiconv_module_info_t *);
159 extern size_t	kiconv_module_ref_count(size_t);
160 
161 #endif	/* _KERNEL */
162 
163 #ifdef __cplusplus
164 }
165 #endif
166 
167 #endif /* _SYS_KICONV_H */
168